Sterownik aabratek LM/VM- arduino
-
- Posty: 951
- Rejestracja: środa, 30 mar 2016, 18:43
- Podziękował: 9 razy
- Otrzymał podziękowanie: 134 razy
-
- Posty: 35
- Rejestracja: czwartek, 3 gru 2009, 18:16
- Krótko o sobie: Jestem fajnym człowiekiem:)
- Ulubiony Alkohol: Whisky,
- Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
- Lokalizacja: południowa Wielkopolska
- Podziękował: 2 razy
- Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino
Sorry, nie sledze watku na bieząco.
Ponizej kod - to moje pierwsze "podejscie" do Arduino wiec moze nie jest optymalny. Przepraszam za zamieszanie i posypuje niniejszym głowe popiołem. Od miesiaca jestem w praktycznie permamentnej podróży służbowej i trochę jestem rozkojarzony..
W załącznikach schemat połaczeń i płytka PCB. Zastrzzegam ze płytka nie jest zweryfikowana w praktyce i mogą być jakieś błędy (chociaż jest dość dokładnie sprawdzona )
Ponizej kod - to moje pierwsze "podejscie" do Arduino wiec moze nie jest optymalny. Przepraszam za zamieszanie i posypuje niniejszym głowe popiołem. Od miesiaca jestem w praktycznie permamentnej podróży służbowej i trochę jestem rozkojarzony..
W załącznikach schemat połaczeń i płytka PCB. Zastrzzegam ze płytka nie jest zweryfikowana w praktyce i mogą być jakieś błędy (chociaż jest dość dokładnie sprawdzona )
Kod: Zaznacz cały
//#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ile_czujnikow 2 //ilosc podlaczonych czujnikow
#define alarm_treshold 0.1
#define relay_treshold 0.3
#define ONE_WIRE_BUS 10 //maagistrala onewire pin 10
#define reference_pin 12 //klawisz ustawiania wartosci referencyjnej podpiety pod pin 12
#define reset_pin 11 //klawisz resetowania wartosci referencyjnej podpiety pod pin 7
#define relay_pin 9 //przekaznik elektrozaworu podpiety pod pin 9
#define buzzer_pin 8
OneWire magistrala(ONE_WIRE_BUS);
DallasTemperature sensors(&magistrala);
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
DeviceAddress adresy [ile_czujnikow] =
{ 0x28, 0xFF, 0x43, 0xB7, 0x82, 0x16, 0x3, 0x71, //adresy czujnikow - ustawic wlasne
0x28, 0xFF, 0x41, 0x58, 0x82, 0x16, 0x5, 0xFC
};
byte symbol[8] = {
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup() {
pinMode (reference_pin, INPUT_PULLUP);
pinMode (reset_pin, INPUT_PULLUP);
pinMode (relay_pin, OUTPUT);
pinMode (buzzer_pin, OUTPUT);
digitalWrite (relay_pin, LOW);
digitalWrite (buzzer_pin, LOW);
lcd.begin(20, 4);
lcd.createChar (0, symbol);
lcd.home();
lcd.print (F("10'th:")); //tu mozna wstawic wlasna nazwe czujnika //wyswietlenie stalych tekstĂłw na wyswietlaczu w celu oszczedzenia czasu procesora
lcd.setCursor (18, 0); //
lcd.print(char(0));
lcd.print(F("C"));
lcd.setCursor(0, 1);
lcd.print (F("Head:")); ////tu mozna wstawic wlasna nazwe czujnika
lcd.setCursor (18, 1);
lcd.print(char(0));
lcd.print(F("C"));
lcd.setCursor(0, 3);
lcd.print (F("Ref:")); ////tu mozna wstawic wlasna nazwe czujnika
lcd.setCursor (18, 3);
lcd.print(char(0));
lcd.print(F("C"));
sensors.begin();
sensors.setResolution (12);
}
void loop() {
float mean;
static float reference = 100;
byte wiersz = 0;
float temperatura;
sensors.requestTemperatures();
for (wiersz = 0; wiersz < ile_czujnikow; wiersz++)
{
temperatura = (sensors.getTempC(adresy [wiersz]));
display_temp (&temperatura, 12, wiersz);
if (wiersz == 0) {
mean = obliczSrednia(temperatura);
if (digitalRead(reference_pin) == LOW)
{
reference = mean;
// digitalWrite (relay_pin, LOW);
}
if (digitalRead (reset_pin) == LOW)
{
digitalWrite (buzzer_pin, LOW);
digitalWrite (relay_pin, LOW);
}
if (mean > (reference + alarm_treshold)) digitalWrite (buzzer_pin, HIGH);
if (mean > (reference + relay_treshold)) digitalWrite (relay_pin, HIGH);
//display_temp (&mean, 12, 2);
display_temp (&reference, 12, 3);
}
}
}
//delay (300);
void display_temp(float *value, byte column, byte row) //funkcja wyswietla wartosc value w kolumnie column i wierszu row
{
char outstr[9];
//value = value + corr[wiersz];
*value = round (*value * 100);
*value = (*value / 100.0);
dtostrf(*value, 6, 2, outstr); //wyswieltenie bo 2 miejsc po przecinku
lcd.setCursor(column, row);
lcd.print(outstr);
}
float obliczSrednia (float svalue) //svalue to wynik jednego pomiaru (SingleValue)
{
#define z_ilu_srednia 3
static byte k; //numer pomiaru, albo inaczej pozycja w tablicy
byte i;
float mvalue = 0.0; //zmienna przechowujaca wartosc sredniej
static float values [z_ilu_srednia]; //tablica przechowujaca wyniki n ostatnich pomiarow
if (k > (z_ilu_srednia - 1)) k = 0;
values [k] = svalue;
k++;
for (i = 0; i < z_ilu_srednia; i++)
mvalue = mvalue + values [i];
mvalue = mvalue / z_ilu_srednia;
return (mvalue);
}
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
A jak tam z reakcją na przyciski? Bo na moje oko to pętla trwa co najmniej 750ms. Jak się załączy alarm i mamy peszek to przycisk trza trzymać 3/4 sekundy, to już bardzo długo.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 35
- Rejestracja: czwartek, 3 gru 2009, 18:16
- Krótko o sobie: Jestem fajnym człowiekiem:)
- Ulubiony Alkohol: Whisky,
- Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
- Lokalizacja: południowa Wielkopolska
- Podziękował: 2 razy
- Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino
Retro, masz racje. Tak wlasnie jest. Po rozkazie rozpoczęcia konwersji uP czeka ok 750 ms i tu nic sie nie dzieje.
Pisałem przecież ze to moje pierwsze podejście. Kod jest otwarty i każdy może go sobie poprawiać wedle własnego uznania. Pewnie nawet sam algorytm trzeba by lekko zmodyfikować, ale od czegos trzeba zacząć.
Zaczalem juz pisac inną wersje, ale troche to potrwa .
Pisałem przecież ze to moje pierwsze podejście. Kod jest otwarty i każdy może go sobie poprawiać wedle własnego uznania. Pewnie nawet sam algorytm trzeba by lekko zmodyfikować, ale od czegos trzeba zacząć.
Zaczalem juz pisac inną wersje, ale troche to potrwa .
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
No trzeba by tam ustawić żeby konwertował asynchronicznie, tylko później trzeba trochę pomyśleć jak zrealizować czekanie na koniec konwersji. Pewnie jakiś timer i zaraz po konwersji trzeba by ustawić flagę i odpalić timer. Jak się timer odpali to flaga jest zerowana i można spokojnie zrealizować odczyt temperatury i obsługę wyświetlacza, a jak nie to tylko skanowanie klawiszy. Ja tam arduino szczególnie nie znam, ale takie rzeczy jak opóźnienia są zawsze słabe zwłaszcza jeżeli mamy do czynienia ze sterowaniem. Ale dramatu nie ma, bo już widziałem sterownik, co to miał tych opóźnień nasianych że główna pętla w porywach szła minutę .
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 35
- Rejestracja: czwartek, 3 gru 2009, 18:16
- Krótko o sobie: Jestem fajnym człowiekiem:)
- Ulubiony Alkohol: Whisky,
- Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
- Lokalizacja: południowa Wielkopolska
- Podziękował: 2 razy
- Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino
Tia, w arduino zapomnij o bezpośredniej obsłudze timerów. Ale jest metoda z wykorzystaniem time_milis() i włączeniem w bibliotece dallas_temperature opcji nie czekania na konwersje
W nowej wersji chce zrobić mniej wiecej tak
W takim układzie można się bawić w debounce, rozpoznawanie jak długo naciśnięty jest klawisz itd. Powolutku. W założeniach miał to być prymitywny dwukanałowy termometr, a obsługę zaworu dopisywałem później.( stad wynika sposób obliczania średniej - ma miejsce tylko gdy program sprawdza sensor o adresie czujnika z pierwszego wiersza tablicy adresów) Zgadzam się z Tobą ze można to znacznie ulepszyć, ale nie od razu Kraków zbudowano. Na szczęście platforma Arduino pozwala na śmiesznie łatwe zaktualizowanie kodu w procesorze.
Z doświadczenia (choć z zupelnie innej branży) powiem Ci,m ze wielu poległo stawiając sobie (albo innym) zbyt wysokie wymagania na początku. Ja jestem zwolennikiem pracy krok po kroku.
Na razie zrobiłem PCB i całość jest w zasadzie już polutowana. Jak wrócę do domu będę kończył hardware i pewnie znów wrócę do softu. Ostatni kontakt z programowaniem to miałem na studiach, ale frajda z samodzielnego stworzenia czegoś co działa jest niemała.
W nowej wersji chce zrobić mniej wiecej tak
Kod: Zaznacz cały
{
1. rozpocznij konwersje
2. zapisz bieżący stan time_milis()
{tutaj obsługa wyświetlacza, przycisków etc;
policzenie średnich, zapamiętanie wartości referencyjnej
sprawdź czy minęło 750 ms, jeśli nie, zajmuj sie dalej obsługą wyświetlacza etc.
}
odczytaj termometry, umieść wyniki w tablicy i wróć na początek.
}
Z doświadczenia (choć z zupelnie innej branży) powiem Ci,m ze wielu poległo stawiając sobie (albo innym) zbyt wysokie wymagania na początku. Ja jestem zwolennikiem pracy krok po kroku.
Na razie zrobiłem PCB i całość jest w zasadzie już polutowana. Jak wrócę do domu będę kończył hardware i pewnie znów wrócę do softu. Ostatni kontakt z programowaniem to miałem na studiach, ale frajda z samodzielnego stworzenia czegoś co działa jest niemała.
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
Nie no bez przesady, też się da w sumie całe to arduino to nic innego jak c opakowane w c++ do tego jest edytorek i biblioteki, na upartego pewnie da się nawet wstawki w asm porobić. Do timerów jest nawet lib TimerLibrary czy jakoś tak, wydaje się że to jest to co jest potrzebne do obsługi DS'a w trybie asynchronicznym.
https://github.com/JChristensen/Timer - szczególnie ciekawa jest metoda after z tego liba
https://github.com/JChristensen/Timer - szczególnie ciekawa jest metoda after z tego liba
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
Ten lib wydaje się fajny... robisz funkcję readTemp() {}, czytającą temperaturę, w główne pętli zlecasz konwersję do czujników w trybie async, zaraz potem after(750ms, readTemp) i to tyle, jak czas minie to zrobi się call do obsługi odczytu temperatury. Z drugiej strony ten timer raczej jest softwarowy i działa mniej więcej tak jak w twoim opisie.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
Ale jak nie czeka? To jak odczytujesz temperaturę? Bo to jest tak że zlecasz konwersję do czujnika, a następnie trzeba odczekać aż konwersja się zakończy. Sposoby są dwa albo czekasz aż konwersja się skończy i czytasz, albo nie czekasz i zajmujesz się innymi rzeczami a odczyt realizujesz za jakiś czas (albo liczysz czas z boku, albo używasz timera). Jak masz tak że używasz liba w ten sposób że zadajesz konwersję i potem odczyt i zaraz wyświetlasz to zwyczajnie nie wiesz że czekasz, ew. zwyczajnie nie wiesz że czekasz . Jak to tylko termometr to pół biedy, jak sterujesz elektrozaworem to też ujdzie, bo i tak musisz reagować na odczyt, ale jak wpadniesz na pomysł żeby dodać przycisk do alarmu to czas reakcji blisko sekundy będzie najwyżej irytujący. Ale jak będziesz chciał zrobić sterownik grupowy na SSR to się można nieco zdziwić że nie za bardzo działa.
a w środku blockTillConversionColmplete(... jest:
przy czym domyślnie waitForConversion jest ustawiane na true, a więc zwykle program czeka ile potrzeba, a że nas zwykle interesuje konwersja 12bit więc sam rozumiesz. Jak przestawisz tryb na async to czekanie musisz sobie zorganizować we własnym zakresie. Ale może znasz jakiś inny lib do ds'a, mi się nie udało znaleźć, ale też jakoś szczególnie nie przykładałem się do szukania czegoś innego.
Kod: Zaznacz cały
void DallasTemperature::requestTemperatures()
{
_wire->reset();
_wire->skip();
_wire->write(STARTCONVO, parasite);
// ASYNC mode?
if (!waitForConversion) return;
blockTillConversionComplete(&bitResolution, 0);
return;
}
Kod: Zaznacz cały
void DallasTemperature::blockTillConversionComplete(uint8_t* bitResolution, uint8_t* deviceAddress)
{
if(deviceAddress != 0 && checkForConversion && !parasite)
{
// Continue to check if the IC has responded with a temperature
// NB: Could cause issues with multiple devices (one device may respond faster)
unsigned long start = millis();
while(!isConversionAvailable(0) && ((millis() - start) < 750));
}
// Wait a fix number of cycles till conversion is complete (based on IC datasheet)
switch (*bitResolution)
{
case 9:
delay(94);
break;
case 10:
delay(188);
break;
case 11:
delay(375);
break;
case 12:
default:
delay(750);
break;
}
}
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
A możesz załączyć kawałek kodu, albo chociaż zdradzić co to za biblioteka? Jakoś nie bardzo sobie mogę wyobrazić jak ta biblioteka działa że w magiczny sposób przekazuje dane jak już konwersja się zakończy. Bo tu z kolegą Cressi kombinujemy, a może rozwiązanie jest pod ręką tylko nam umknęło.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 68
- Rejestracja: niedziela, 21 lut 2016, 19:55
- Podziękował: 2 razy
- Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino
chodzi o " sensors.setWaitForConversion(false); "
a i fakt pisałem ten program dawno odświeża temperatury co sekundę ....
cały program
a i fakt pisałem ten program dawno odświeża temperatury co sekundę ....
cały program
Kod: Zaznacz cały
#include <EEPROMex.h>
#include <EEPROMVar.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <avr/wdt.h>
#define ONE_WIRE_BUS 8
#define TEMPERATURE_PRECISION 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress czuj1, czuj2, czuj3;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
unsigned long previousMillis = 0;
//ZMIENNE WARTOSCI MENU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int menuin = 0;
int menu = 1;
float val = 0;
float valold = 0;
//#########################################################################################################################################################################################
//ZMIENNE KLAWIATURY /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int klaw;
int klawold;
int kwart;
int klawsek = 0;
//#########################################################################################################################################################################################
float temp1;
float temp1min = 20;
float temp1max = 90;
float temp2;
float temp2min = 30 ;
float temp2max = 100;
float temp3;
float temp3min = 40;
float temp3max = 110 ;
int al1 = 0;
int al2 = 0;
int al3 = 0;
int ton = 0;
int dzwiek = 0;
int al1stan = 0;
int al2stan = 0;
int al3stan = 0;
int al1min = 0;
int al1max = 0;
int al2min = 0;
int al2max = 0;
int al3min = 0;
int al3max = 0;
unsigned long czas;
int klawsek1;
byte st1[8] = {
0b01000,
0b10100,
0b01000,
0b00011,
0b00100,
0b00100,
0b00100,
0b00011
};
byte st2[8] = {
0b01110,
0b01110,
0b01110,
0b01110,
0b01110,
0b00000,
0b01110,
0b01110
};
byte al[8] = {
0b00010,
0b00101,
0b00111,
0b00101,
0b10000,
0b10000,
0b10000,
0b11100
};
byte b1[8] = {
0b00001,
0b00001,
0b00001,
0b00001,
0b00001,
0b00001,
0b00001,
0b00001
};
byte b2[8] = {
0b10000,
0b10000,
0b10000,
0b10000,
0b10000,
0b10000,
0b10000,
0b10000
};
byte b3[8] = {
0b01010,
0b01011,
0b01010,
0b01010,
0b01011,
0b01000,
0b01011,
0b01111
};
byte b4[8] = {
0b01010,
0b10010,
0b01010,
0b01010,
0b10010,
0b00010,
0b11010,
0b11110
};
void setup() {
wdt_enable(WDTO_4S);
sensors.begin();
sensors.getAddress(czuj1, 0);
sensors.getAddress(czuj2, 1);
sensors.getAddress(czuj3, 2);
sensors.setResolution(czuj1, TEMPERATURE_PRECISION);
sensors.setResolution(czuj2, TEMPERATURE_PRECISION);
sensors.setResolution(czuj3, TEMPERATURE_PRECISION);
sensors.setWaitForConversion(false);
lcd.begin(16, 2);
lcd.clear();
lcd.createChar(1, st1);
lcd.createChar(2, st2);
lcd.createChar(3, al);
lcd.createChar(4, b1);
lcd.createChar(5, b2);
lcd.createChar(6, b3);
lcd.createChar(7, b4);
czas = millis();
temp1min = EEPROM.readFloat(1);
temp1max = EEPROM.readFloat(10);
temp2min = EEPROM.readFloat(20);
temp2max = EEPROM.readFloat(30);
temp3min = EEPROM.readFloat(40);
temp3max = EEPROM.readFloat(50);
}
void loop() {
if ((millis()-czas) > 1000){ czas = millis(); klawsek = klawsek + 1; };
// ODCZYT Z A1 I USTALENIE KLAWISZA /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
kwart = analogRead(A1);
if (kwart > 1000 ) {klaw = 4;delay(200);}else
if (kwart > 500 & kwart < 520 ){klaw = 3;delay(200);}else
if (kwart > 330 & kwart < 350 ){klaw = 2;delay(200);}else
if (kwart > 240 & kwart < 270 ){klaw = 1;delay(200);} else {klaw = 0;};
if (klaw > 0) {klawsek = 0;};
if (klawsek > 2000){klawsek = 100;};
if (klawsek > 15){menuin = 0;};
// STEROWANIE MENU //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 0 && klaw == 1){menuin = 1; menu = 0;klaw = 0;lcd.clear();lcd.setCursor(0, 0); lcd.print(F("Menu"));lcd.setCursor(0, 1); lcd.print(F("Ustawien"));delay(1000);}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 0 && klaw == 2 && al1 == 0){al1=1;klaw = 0;} else if (menuin == 0 && klaw == 2 && al1 == 1){al1=0;}
if (menuin == 0 && klaw == 3 && al2 == 0){al2=1;klaw = 0;} else if (menuin == 0 && klaw == 3 && al2 == 1){al2=0;}
if (menuin == 0 && klaw == 4 && al3 == 0){al3=1;klaw = 0;} else if (menuin == 0 && klaw == 4 && al3 == 1){al3=0;}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 0 && al1==1) {
if (temp1min > 0 && temp1min >= temp1) {al1min = 1;} else {al1min = 0;};
if (temp1max > 0 && temp1max <= temp1) {al1max = 1;} else {al1max = 0;};
if (al1min == 1 || al1max == 1) {al1stan = 1;} else {al1stan = 0;};
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 0 && al2==1) {
if (temp2min > 0 && temp2min >= temp2) {al2min = 1;} else {al2min = 0;};
if (temp2max > 0 && temp2max <= temp2) {al2max = 1;} else {al2max = 0;};
if (al2min == 1 || al2max == 1) {al2stan = 1;} else {al2stan = 0;};
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 0 && al3==1) {
if (temp3min > 0 && temp3min >= temp3) {al3min = 1;} else {al3min = 0;};
if (temp3max > 0 && temp3max <= temp3) {al3max = 1;} else {al3max = 0;};
if (al3min == 1 || al3max == 1) {al3stan = 1;} else {al3stan = 0;};
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (menuin == 1){
if (klaw == 0){delay(100); ;}
lcd.clear();
if (klaw == 1 && menu < 9){menuin = 0;lcd.clear();menu = 0;}
if (klaw == 2 && menu < 99){menu = menu-1;}
if (klaw == 3 && menu < 99){menu = menu+1;}
if (klaw == 4 && menu < 99 ){menu = menu*10;klaw = 0;}
if (klaw == 1 && menu > 9){menu = menu/10;}
if (klaw == 1 && menu > 99){menu = menu/10;}
if (klaw == 2 && menu > 99){val = val - 0.1;}
if (klaw == 3 && menu > 99){val = val + 0.1;}
val=constrain(val,0,120);
switch (menu) {
case 0:
menu=1;
break;
case 1:
lcd.setCursor(0, 0); lcd.print(F("1. Ustaw. Al."));
lcd.setCursor(0, 1); lcd.print(F("Termometr 1"));
break;
case 9:
menu = 10;
break;
case 10:
lcd.setCursor(0, 0); lcd.print(F("1.1 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Min [ ] "));
lcd.setCursor(9, 1); lcd.print(temp1min,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 100:
val = temp1min;
menu = 101;
klaw = 0;
break;
case 101:
if (klaw == 4 && menu > 99){temp1min = val;menu = menu/10; EEPROM.writeFloat(1,val);}
lcd.setCursor(0, 0); lcd.print(F("1.1 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Min > < "));
lcd.setCursor(9, 1); lcd.print(val,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 11:
lcd.setCursor(0, 0); lcd.print(F("1.2 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Max [ ] "));
lcd.setCursor(9, 1); lcd.print(temp1max,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 110:
val = temp1max;
menu = 111;
klaw = 0;
break;
case 111:
if (klaw == 4 && menu > 99){temp1max = val;menu = menu/10;EEPROM.writeFloat(10,val);}
lcd.setCursor(0, 0); lcd.print(F("1.2 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Max > < "));
lcd.setCursor(9, 1); lcd.print(val,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 12:
menu = 11;
break;
case 2:
lcd.setCursor(0, 0); lcd.print(F("2. Ustaw. AL."));
lcd.setCursor(0, 1); lcd.print(F("Termometr 2"));
break;
case 19:
menu = 20;
break;
case 20:
lcd.setCursor(0, 0); lcd.print(F("2.1 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Min [ ] "));
lcd.setCursor(9, 1); lcd.print(temp2min,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 200:
val = temp2min;
menu = 201;
klaw = 0;
break;
case 201:
if (klaw == 4 && menu > 99){temp2min = val;menu = menu/10;EEPROM.writeFloat(20,val);}
lcd.setCursor(0, 0); lcd.print(F("2.1 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Min > < "));
lcd.setCursor(9, 1); lcd.print(val,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 21:
lcd.setCursor(0, 0); lcd.print(F("2.2 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Max [ ] "));
lcd.setCursor(9, 1); lcd.print(temp2max,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 210:
val = temp2max;
menu = 211;
klaw = 0;
break;
case 211:
if (klaw == 4 && menu > 99){temp2max = val;menu = menu/10;EEPROM.writeFloat(30,val);}
lcd.setCursor(0, 0); lcd.print(F("2.2 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Max > < "));
lcd.setCursor(9, 1); lcd.print(val,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 22:
menu = 21;
break;
case 3:
lcd.setCursor(0, 0); lcd.print(F("3. Ustaw. AL."));
lcd.setCursor(0, 1); lcd.print(F("Termometr 3"));
break;
case 29:
menu = 30;
break;
case 30:
lcd.setCursor(0, 0); lcd.print(F("3.1 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Min [ ] "));
lcd.setCursor(9, 1); lcd.print(temp3min,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 300:
val = temp3min;
menu = 301;
klaw = 0;
break;
case 301:
if (klaw == 4 && menu > 99){temp3min = val;menu = menu/10;EEPROM.writeFloat(40,val);}
lcd.setCursor(0, 0); lcd.print(F("3.1 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Min > < "));
lcd.setCursor(9, 1); lcd.print(val,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 31:
lcd.setCursor(0, 0); lcd.print(F("3.2 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Max [ ] "));
lcd.setCursor(9, 1); lcd.print(temp3max,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 310:
val = temp3max;
menu = 311;
klaw = 0;
break;
case 311:
if (klaw == 4 && menu > 99){temp3max = val;menu = menu/10;EEPROM.writeFloat(50,val);}
lcd.setCursor(0, 0); lcd.print(F("3.2 Ustaw. Alarmu."));
lcd.setCursor(0, 1); lcd.print(F("Max > < "));
lcd.setCursor(9, 1); lcd.print(val,1);
lcd.setCursor(15, 1); lcd.write(byte(1));
break;
case 32:
menu = 31;
break;
case 4:
menu=3;
break;
}}
if (menuin == 0){
delay(100);
lcd.clear();
//lcd.setCursor(8, 1); lcd.write(byte(5));
if (temp1 > 99) {lcd.setCursor(1, 0);} else {lcd.setCursor(2, 0);}
lcd.print(temp1,1);
lcd.setCursor(6, 0);
lcd.write(byte(1));
if (temp2 > 99) {lcd.setCursor(10, 0);} else {lcd.setCursor(11, 0);}
lcd.print(temp2,1);
lcd.setCursor(15, 0);
lcd.write(byte(1));
if (temp3 > 99) {lcd.setCursor(1, 1);} else {lcd.setCursor(2, 1);}
lcd.print(temp3,1);
lcd.setCursor(6, 1);
lcd.write(byte(1));
//lcd.setCursor(12, 1);
//lcd.print(klawsek);
dzwiek = 0;
if (al1stan == 0 && al1==1) {lcd.setCursor(0, 0);lcd.write(byte(3));};
if (al1stan == 1 && al1==1) {lcd.setCursor(0, 0);lcd.write(byte(2));dzwiek = 1;};
if (al2stan == 0 && al2==1) {lcd.setCursor(9, 0);lcd.write(byte(3));};
if (al2stan == 1 && al2==1) {lcd.setCursor(9, 0);lcd.write(byte(2));dzwiek = 1;};
if (al3stan == 0 && al3==1) {lcd.setCursor(0, 1);lcd.write(byte(3));};
if (al3stan == 1 && al3==1) {lcd.setCursor(0, 1);lcd.write(byte(2));dzwiek = 1;};
if (millis() - previousMillis > 1000)
{
temp1 = sensors.getTempC(czuj1);
temp2 = sensors.getTempC(czuj2);
temp3 = sensors.getTempC(czuj3);
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
previousMillis = millis();
}
}
if (dzwiek == 1) { if (ton==0){ton=1;tone(10,2000);} else if (ton==1){ton=0;tone(10,1000);};} else {noTone(10);}
wdt_reset();
}
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
E... tak to wiemy, tu magi żadnej nie ma, jest dokładnie tak jak proponował Cressi, aplikacja w pętli liczy sobie czas dokładnie tutaj
tylko tak,
Kod: Zaznacz cały
if (millis() - previousMillis > 1000)
{
temp1 = sensors.getTempC(czuj1);
temp2 = sensors.getTempC(czuj2);
temp3 = sensors.getTempC(czuj3);
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
previousMillis = millis();
}
- to: sensors.setWaitForConversion(false); bym wywalił do sekcji setup() bo po co tą flagę ustawiać za każdym razem?
- to: millis() - previousMillis > 1000 to bym zmienił na millis() - previousMillis > 750, bo tak jak jest odświeżanie jest poniżej sekundy, bo komunikacja z trzema czujnikami swoje zajmuje
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
Twoja wola, według specyfikacji czujnika jednak nie jest to potrzebne, zwyczajnie ja bym to zrobił inaczej, najważniejsze że działa i jesteś zadowolony
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 35
- Rejestracja: czwartek, 3 gru 2009, 18:16
- Krótko o sobie: Jestem fajnym człowiekiem:)
- Ulubiony Alkohol: Whisky,
- Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
- Lokalizacja: południowa Wielkopolska
- Podziękował: 2 razy
- Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino
Ja wykoncypowalem w tak zwanym miedyczasie cos innego, tylko musze to sprawdzi praktyce (nie mam ze soba Arduino.)
Licznik 1 jest skonfigurowany na generowanie przerwania co 1 sek . W przerwaniu :
odczytuje temperature
zleca kolejna konwersje
Cala reszta to juz zabawa w petli głownej. Jak zweryfikuje dzialanie to sie oczywiście podzielę.
Crobe, jedno pytanie. Widze ze odczytujesz adresy czujnikow bezposrednio w programie. Nie zdaza sie, ze Ci program zamieni czujniki miejscami?
Licznik 1 jest skonfigurowany na generowanie przerwania co 1 sek . W przerwaniu :
odczytuje temperature
zleca kolejna konwersje
Cala reszta to juz zabawa w petli głownej. Jak zweryfikuje dzialanie to sie oczywiście podzielę.
Crobe, jedno pytanie. Widze ze odczytujesz adresy czujnikow bezposrednio w programie. Nie zdaza sie, ze Ci program zamieni czujniki miejscami?
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
Nieee.... nie w przerwaniu absolutnie nic nie czytaj i nie zlecaj, przerwanie musi wykonać się szybko. Tam ew. flaga że to już i obsługa w głównej pętli, ale tak to arduino już sobie liczy te milisekundy przy pomocy timera0 i można z tego korzystać tak jak kolega Crobe.
Drugie pytanie w sumie nie do mnie, ale odpowiem. Czujniki nie powinny zamieniać się miejscami, zapewnia to algorytm wyszukiwania zaszyty w czujnikach.
Drugie pytanie w sumie nie do mnie, ale odpowiem. Czujniki nie powinny zamieniać się miejscami, zapewnia to algorytm wyszukiwania zaszyty w czujnikach.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
Oj tam DS18B20 nie powoduje lagów tylko jak jest programista jest to wstawia tam delay żeby poczekać na zakończenie konwersji. Regulator można spokojnie wyprodukować na przerwaniach od timera jakiegoś tylko trzeba się upewnić że nie zabijemy konwersji. Na jak dasz detektor zera sieci to można się obejść bez timera w przypadku regulatora grupowego nawet jak w pętli głównej wstawimy chamskie opóźnienie.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 2
- Rejestracja: czwartek, 29 lip 2010, 19:35
Re: Sterownik aabratek LM/VM- arduino
Witam, trafiłem na ten wątek gdyż szukałem rozwiązania zastosowania silnika krokowego do regulacji odbioru destylatu. Widzę, że kilka osób chciało by mieć choć elektroniczny pomiar temperatury . Mój projekt własnie na tym etapie spoczywa. W przyszłości mam zamiar (jeśli tylko znajdę trochę wolnego czasu) dołożenie owej regulacji odbioru przy pomocy silnika krokowego (mam już pomysł wraz z kalibracją) oraz sterowania pompką przepływu wody i chłodzenia (obieg zamknięty). Mogę udostępnić schemat wraz z wsadem do procka (.hex), który pozwala na pomiar temperatury w 4 punktach (u mnie to: Keg, 10-półka, OVM, góra) wraz z zobrazowniem tego na wyświetlaczu LCD 4x20.
Koszt kupując częsci w polsce tak na oko:
wyświetlacz - 30zł
procek-10zł
czujniki 4 szt -30zł
pcb, drobne elementy - 30zł
Jak nie patrzyć wyjdzie koło 100zł
Koszt kupując częsci w polsce tak na oko:
wyświetlacz - 30zł
procek-10zł
czujniki 4 szt -30zł
pcb, drobne elementy - 30zł
Jak nie patrzyć wyjdzie koło 100zł
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
Koniecznie jeszcze jakiś kondensator 100nF (ceramik będzie całkiem ok.) przy nogach AVCC i VCC. Inaczej jak odpalisz sterownik mocy mogą Cię czekać niespodzianki. Ja bym dał jeszcze jakiś elektrolit 1-4,7uF na całą grupę.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 2
- Rejestracja: czwartek, 29 lip 2010, 19:35
Re: Sterownik aabratek LM/VM- arduino
Cenna uwaga trzeba koniecznie dać elektrolit bo obydwóch stronach stabilizatora. Dzięki Rastro umkneło mi to. Odnośnie AVcc nie będe wykorzystywał raczej wcale (choć może będzie potrzebny przy silniczku krokowym) i nie trzeba go dodatkowo stabilizować.
Gdy uporam się z tym wyzwaniem będę chciał stworzyć drugi projekt tylko tym razem z użyciem czujników PT100. Rozdzielczość wzrosła by do dwóch miejsc po przecinku lecz trzeba by na pewno użyć zewnętrznego ADC oraz stabilnego źródła prądowego.
Gdy uporam się z tym wyzwaniem będę chciał stworzyć drugi projekt tylko tym razem z użyciem czujników PT100. Rozdzielczość wzrosła by do dwóch miejsc po przecinku lecz trzeba by na pewno użyć zewnętrznego ADC oraz stabilnego źródła prądowego.
-
- Posty: 2603
- Rejestracja: wtorek, 15 sty 2013, 15:29
- Podziękował: 83 razy
- Otrzymał podziękowanie: 301 razy
Re: Sterownik aabratek LM/VM- arduino
Lepiej jednak dać tam ten kondensatorek, koszt żaden a poczucie że jest dobrze bezcenne
Do czujnika PT100 polecam ADS1247/8 lub ADS124S06/08, są w zasadzie stworzone specjalnie do obsługi tych czujników, mają wbudowane po dwa przetworniki DAC jako źródło prądowe do zasilania czujnika... tylko że dostępne wyłącznie w obudowach smd z rastrem 0,65 i 0,5 mm.
Do czujnika PT100 polecam ADS1247/8 lub ADS124S06/08, są w zasadzie stworzone specjalnie do obsługi tych czujników, mają wbudowane po dwa przetworniki DAC jako źródło prądowe do zasilania czujnika... tylko że dostępne wyłącznie w obudowach smd z rastrem 0,65 i 0,5 mm.
″Iloraz inteligencji tłumu jest równy IQ najgłupszego jego przedstawiciela podzielonemu przez liczbę uczestników.„
- Terry Pratchett
- Terry Pratchett
-
- Posty: 35
- Rejestracja: czwartek, 3 gru 2009, 18:16
- Krótko o sobie: Jestem fajnym człowiekiem:)
- Ulubiony Alkohol: Whisky,
- Status Alkoholowy: Specjalista ds. Wyrobu Alkoholu Domowego
- Lokalizacja: południowa Wielkopolska
- Podziękował: 2 razy
- Otrzymał podziękowanie: 3 razy
Re: Sterownik aabratek LM/VM- arduino
Kolejna wersja oprogramowania.(tym razem bez obsługi zaworu - TBD)
Obsługa za pomocą dwóch klawiszy.
Program startuje w trybie NO_CONTROL - tylko pomiar temperatury. Po ustabilizowaniu kolumny, odbiorze przedgonów etc. wciskam SET, program zapamiętuje średnia z ostatnich 3 pomiarów jako wartość referencyjną i przechodzi do trybu NORMAL.
W trybie normal program monitoruje wartość temperatury - jeśli średnia za 3 ostatnie pomiary jest wyższa o 0,1 od wartości referencyjnej włączamy buzzer.
Dźwięk buzzera można wyłączyć klawiszem RESET. Kiedy uznam ze temperatura wróciła na miejsce wciskam SET, znów pobierana jest wartość referenyjna i znów wchodzimy w tryb NORMAL
W trybie NORMAL:
SET - pobranie i zapamiętanie nowej temp. referencyjnej
RESET - wyjscie do trybu NO_CONTROL
Bedę wdzięczny za uwagi, sugestie czy wskazanie błędów.
Obsługa za pomocą dwóch klawiszy.
Program startuje w trybie NO_CONTROL - tylko pomiar temperatury. Po ustabilizowaniu kolumny, odbiorze przedgonów etc. wciskam SET, program zapamiętuje średnia z ostatnich 3 pomiarów jako wartość referencyjną i przechodzi do trybu NORMAL.
W trybie normal program monitoruje wartość temperatury - jeśli średnia za 3 ostatnie pomiary jest wyższa o 0,1 od wartości referencyjnej włączamy buzzer.
Dźwięk buzzera można wyłączyć klawiszem RESET. Kiedy uznam ze temperatura wróciła na miejsce wciskam SET, znów pobierana jest wartość referenyjna i znów wchodzimy w tryb NORMAL
W trybie NORMAL:
SET - pobranie i zapamiętanie nowej temp. referencyjnej
RESET - wyjscie do trybu NO_CONTROL
Bedę wdzięczny za uwagi, sugestie czy wskazanie błędów.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.