Skocz do zawartości

MietekF

Użytkownicy
  • Zawartość

    6
  • Rejestracja

  • Ostatnio

Reputacja

3 Neutralna

O MietekF

  • Ranga
    2/10
  1. Lodówki te mają dość taką klapkę do nalewania/wylewania wody. I taki okrągły otwór, w który można wsadzić sondę. Ogólnie one są zbudowane z 2 części. Dolna ma na górze pojemnik z wodą i wężownicę w nim dookoła ścian. Górna to nakładana na dolną pokrywa z 2 wężownicą mi, którymi płynie piwo i pompką, która pompuje zimną wodę do chłodzenia kolumny. Za instrukcję dziękuję.
  2. Tak. Chodzi o naukę. A jednocześnie będzie sterowanie bez rozkręcania lodówek.
  3. Zachęcony przez @Gieneq zakładam temat tutaj. Choć projekt jest na razie jeszcze na etapie diod zamiast ostatecznych urządzeń. Ale być może puszczenie tego w świat zmobilizuje mnie do szybszego dokończenia. Jest to w sumie mój pierwszy projekt, nie licząc zabaw z kursu Arduino z tej strony. Tytułem wstępu: Pracuję w browarze rzemieślniczym (na razie jeszcze kontraktowym). Na festiwalach rozlewamy piwo z rollbarów, które mają standardowe chłodnice, które działają na zasadzie, że w zbiorniku jest woda chłodzona wężownicą, a przez dwie pozostałe wężownice płynie piwo i się chłodzi (dodatkowo jeszcze woda jest pompowana przewodem, by ochładzać kolumnę. Część chłodząca jest podłączona do sterownika przez IEC. Domyślny sterownik w praktyce albo mrozi tak, że woda chłodząca zamarza, albo jest za ciepła. Trudno tym pokrętłem wyregulować. Pomysł jest taki, aby z pomocą Arduino sterować dokładnie temperaturami w lodówkach, by można było lać lagery bardzo zimne, a na przykład portery w temperaturze tylko ciut mniejszej, niż pokojowa. Na razie układ zawiera: Arduino Uno Ekran LED 2x16-podłączony jak w kursie 1, za wyjątkiem pinu 2, zamiast tego użyłem 1 2 sond z czujnikiem temp. DS18B20 podłączonych do pinu A5 Diod zielonych podłączonych do pinów 11 i 13. Po sprawdzeniu stabilności zostaną zastąpione modułem przekaźnikowym. 3 przycisków tact-switch Górny i dolny są podłączone do pinów 8 i 10. Środkowy do pinu 2, aby można było wywoływać nim przerwanie O potencjiometrze do ekranu i rezystorach do diod i termometrów nie wspomnę. Całość działa tak, że po ekranie startowym program domyślnie wskakuje na ekran podstawowy '0', na którym są pokazane temperatury w poszczególnych lodówkach. Trwa też odczyt temperatur i porównywanie z zadaną. Jeśli temperatura w lodówce przekroczy zadaną, do podawane jest napięcie na pin przypisany danej lodówce. Gdy spada poniżej temperatury zadanej pomniejszonej o histeryzę to napięcie zanika. Na razie te piny są podłączone do diod, ale zamienię to na przekaźniki. Czyli podwyższenie temperatury włączy chłodzenie. Te sprawdzanie temperatur trwa cały czas, niezależnie od ekranu. Po naciśnięciu przycisku środkowego można przechodzić do ekranów zmiany poszczególnych wartości zadanych (Temp1, Temp2, Hist1, Hist2) i je zmieniać. Gdy przez 10 sekund nie będzie żadnego naciśnięcia przycisku włączy się ekran podstawowy, a wartość nie zostanie zapisana. Program wygląda następująco: #include <EEPROM.h> #include <LiquidCrystal.h> #include <OneWire.h> #include <DallasTemperature.h> // bibioteki LiquidCrystal lcd(1, 3, 4, 5, 6, 7); //Informacja, gdzie podłączono ekran volatile int ileS = -1; //definicja zmiennej do przerwania volatile unsigned long teraz2; //zmienna potrzebna do określenia czasu od klikniec unsigned long wczesniej2 = 0; // zmienna potrzebna do określenia czasu od klikniec OneWire oneWire(A5); //Podłączenie termometru do A5 DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki DeviceAddress termometr1 = { 0x28, 0xE1, 0x7D, 0xF9, 0x39, 0x19, 0x1, 0x33 }; //Unikalny adres termometru 1 DeviceAddress termometr2 = { 0x28, 0xB3, 0x5A, 0x0, 0x3A, 0x19, 0x1, 0xDC }; //Unikalny adres termometru 2 float T1; //temperatura zadana w lodówce 1 float T2; //temperatura zadana w lodówce 2 float Hist1; //histeryza1 float Hist2; //histeryza2 float Temp1; //Zmienna temperatury w pierwszej lodówce float Temp2; //Zmienna temperatury w pierwszej lodówce float Dodatkowa; //Zmienna do ekranu 5 #define lodowka1 11 //zdefiniowanie sterowania lodówką1 na pinie 11 #define lodowka2 13 //zdefiniowanie sterowania lodówką1 na pinie 13 #define przyciskG 8 //piny przycisków (Górny) #define przyciskS 2 //Srodkowy #define przyciskD 10 //Dolny #define ekran 9 //zdefiniowanie pinu sterującego jasnością ekranu void setup() { pinMode (lodowka1, OUTPUT); //zdefiniowanie wyjść pinMode (lodowka2, OUTPUT); pinMode (ekran, OUTPUT); pinMode (przyciskG, INPUT_PULLUP); //Zdefiniowanie przycisków, jako wejść pinMode (przyciskS, INPUT_PULLUP); pinMode (przyciskD, INPUT_PULLUP); lcd.begin(16, 2); //Deklaracja typu analogWrite(ekran, 200); //ustawienie jasności ekranu lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("DZIEN"); //wstawia napis lcd.setCursor(0, 1); //Ustawienie Kursora lcd.print("DOBRY"); //Napis T1=EEPROM.read(0); //zczytanie z pamięci Hist1=EEPROM.read(10); //zczytanie z pamięci T2=EEPROM.read(20); //zczytanie z pamięci Hist2=EEPROM.read(30); //zczytanie z pamięci attachInterrupt(digitalPinToInterrupt(przyciskS), przeskok, FALLING); //przerwanie na przycisku środkowym. Pin 2 delay(1000); //Odczekanie sekundy, by powitanie było widoczne } void loop() { switch(ileS){ //przeskaktleiwanie w odpowiednie pętlę case 0: // stan podstawowy. Pokazuje temperatury i urochamia chłodzenie { sprTemp(); //podstawowa funkcja programu. porównuje temperaturę do zadanej i w zależności od różnicy włącza stan wysoki na pinach 11 i 13 teraz2 = millis(); if (teraz2 - wczesniej2 > 5000) //po 5 sekundach ekran przygasa { analogWrite(ekran, 80); //ustawienie jasności ekranu } lcd.clear(); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("T1:"); //wstawia napis lcd.print(Temp1, 1); //wstawia napis lcd.print(" st. C"); //wstawia napis lcd.setCursor(0, 1); //Ustawienie kursora lcd.print("T2:"); //wstawia napis lcd.print(Temp2, 1); //wstawia napis lcd.print(" st. C"); //wstawia napis } break; case 1: //Zmiana temperatury zadanej na pierwszej lodówce { analogWrite(ekran, 200); //ustawienie jasności ekranu sprTemp(); //W każdym ekranie działa sprawdzenie T1 = zmiana(T1, 0); //funkcja zmiany zadanej temperatury na pierwszej lodówce lcd.clear(); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("TEMP1:"); //wstawia napis lcd.setCursor(0, 1); //Ustawienie kursora lcd.print(T1, 1); //wstawia napis } break; case 2: //Zmiana temp na 2 { EEPROM.update(0, T1); //Po kliknięciu na przycisk srodkowy zapisywana jest ustawiona wartosc w EEPROM sprTemp(); T2 = zmiana(T2, 20);//funkcja zmiany zadanej temperatury na drugiej lodówce lcd.clear(); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("TEMP2:"); //wstawia napis lcd.setCursor(0, 1); //Ustawienie kursora lcd.print(T2, 1); //wstawia napis } break; case 3: //Zmiana histeryzy na 2 lodówce { EEPROM.update(20, T2); //Po kliknięciu na przycisk srodkowy zapisywana jest ustawiona wartosc w EEPROM sprTemp(); //W każdym ekranie działa sprawdzenie Hist1 = zmiana(Hist1, 10); //Zmiana histeryzy dla pierwszej lodówki lcd.clear(); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("Hist1:"); //wstawia napis lcd.setCursor(0, 1); //Ustawienie kursora lcd.print(Hist1, 1); //wstawia napis } break; case 4: //Zmiana histeryzy na 2 lodówce { EEPROM.update(10, Hist1); //Po kliknięciu na przycisk srodkowy zapisywana jest ustawiona wartosc w EEPROM sprTemp(); //W każdym ekranie działa sprawdzenie Hist2 = zmiana(Hist2, 30); //Zmiana histeryzy dla drugiej lodówki lcd.clear(); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("Hist2:"); //wstawia napis lcd.setCursor(0, 1); //Ustawienie kursora lcd.print(Hist2, 1); //wstawia napis } break; case 5: //Ekran z dodatkowymi informacjami { EEPROM.update(30, Hist2); //Po kliknięciu na przycisk srodkowy zapisywana jest ustawiona wartosc w EEPROM sprTemp(); //W każdym ekranie działa sprawdzenie Dodatkowa = zmiana(Dodatkowa, 100); //Zmienna dodatkowa. Może służyć do przesuwania napisu. Na razie chodzi o to, by ekran się sam przełączyć lcd.clear(); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("Autor: M. Franc"); //wstawia napis lcd.setCursor(0, 1); lcd.print("Informacje dodatkowe"); } break; default: //Gdy zmienna ileS jest większa od 5, to następuje jej zerowanie ileS = 0; break; } } void sprTemp() { sensors.requestTemperatures(); //Pobranie temperatury Temp1 = sensors.getTempC(termometr1); //Zapisanie aktualnej temperatury z termometru1 w zmiennej Temp1 Temp2 = sensors.getTempC(termometr2); //Zapisanie aktualnej temperatury z termometru2 w zmiennej Temp2 if (Temp1 > T1) { //Jeżeli Odczyt jest wyższy od zadanej maksymalnej digitalWrite(lodowka1, HIGH); //włączenie "chłodzenia" }else{ if (Temp1 < (T1-Hist1)) { //Jeżeli Odczyt jest niższy od zadanej minus histeryza digitalWrite(lodowka1, LOW); //wyłączenie "chłodzenia" }else{ } } if (Temp2 > T2) { //Jeżeli Odczyt jest wyższy od zadanej maksymalnej digitalWrite(lodowka2, HIGH); //włączenie "chłodzenia" }else{ if (Temp2 < (T2-Hist2)) { //Jeżeli Odczyt jest niższy od zadanej minus histeryza digitalWrite(lodowka2, LOW); //wyłączenie "chłodzenia" }else{ } } } float zmiana(float wartosc, int adres){ if (digitalRead(przyciskG)== LOW) { //Jeśli górny przycisk jest wciśnięty) wartosc = wartosc + 0.5; wczesniej2 = teraz2; //Zerowanie czasu } if (digitalRead(przyciskD)== LOW) { //Jeśli dolny przycisk jest wciśnięty) wartosc = wartosc - 0.5; wczesniej2 = teraz2; //Zerowanie czasu } teraz2 = millis(); //aktualny czas if (teraz2 - wczesniej2 > 10000) { //po 10 sekundach braku ruchu zmiana ekranu na stan podstawowy wartosc = EEPROM.read(adres); ileS = 0; //aby wskoczyć do case 0 } return wartosc; //zwraca wartosc } void przeskok() { static unsigned long wczesniej; //zmienna potrzebna do filtrowania migotania styków unsigned long teraz = millis(); wczesniej2 = teraz; if (teraz - wczesniej < 500) { //warunek pozwalający zaniedbać migotanie styków return; } ileS++; //zmiana o 1 wartosci zmiennej, która okresla, jaki ekran jest wyswietlany aktualnie wczesniej = teraz; //zerowanie czasu pozwalajacego filtrować migotanie styków } Po zmontowaniu i pierwszym użyciu chcę sprawdzić, czy wprowadzić jeszcze dodatkowy warunek, taką atrapę czynnika różniczkującego. Czyli, jeśli temperatura jest poniżej zadanej, ale za szybko rośnie, to włącza się lodówka. Wszelkie uwagi, co do programu mule widziane, bo, jak już zaznaczyłem, jest to mój pierwszy samodzielny program. Filmik z działania postaram się umieścić później.
  4. @Gieneq Opanowałem zmianę ekranów przez przerwania, więc już można się pochwalić. Na razie mam podłączony jeden termometr i jedna dioda udaje sprężarkę z lodówki. "Aktywne" są: ekran główny, w którym jest wyświetlana temperatura, ekran zmiany Temp.1, i ekran zmiany histeryzy. Po przekroczeniu zadanej temperatury na diodę podawane jest napięcie, póki temperatura nie spadnie poniżej Temp1-Hist1. Reszta powinna iść z górki (choć pewnie jakie pułapki po drodze mnie czekają ) Za jakość filmu przepraszam, ale nie potrafię ani kręcić, ani robić zdjęć.
  5. @Gieneq Na razie podłączyłem jeden termometr i diodę.Najpierw chcę, by program płynnie przechodził z ekranu pracy, na ekrany wybory temperatur. Potem dodam drugi termometr i diodę, Jak wszystko będzie chodziło, to dopiero podłączę przekaźniki. Ale to już powinno być łatwo. Na razie panuje chaos
  6. Cześć wszystkim. Dopiero zaczynam zabawę z Arduino, więc nie jest to na razie nic zaawansowanego. Tytułem wstępu: Pracuję w browarze rzemieślniczym (na razie jeszcze kontraktowym). Na festiwalach rozlewamy piwo z rollbarów, które mają standardowe chłodnice, które działają na zasadzie, że w zbiorniku jest woda chłodzona wężownicą, a przez dwie pozostałe wężownice płynie piwo i się chłodzi (dodatkowo jeszcze woda jest pompowana przewodem, by ochładzać kolumnę. Część chłodząca jest podłączona do sterownika przez IEC. Domyślny sterownik w praktyce albo mrozi tak, że woda chłodząca zamarza, albo jest za ciepła. Trudno tym pokrętłem wyregulować. Chcę zrobić układ z 2 sond z czujnikiem temp. DS18B20, modułem przekaźników i ekranem, który włącza chłodzenie, gdy temperatura jest wyższa od zadanej i wyłącza, gdy jest niższa niż zadana -histeryza. Na razie udało mi się doprowadzić do etapu, że dioda zapala się w momencie przekroczenia temperatury i gaśnie, gdy spada o 2 stopnie od zadanej. Mogę też za pomocą 3 przycisków zmieniać zadaną temperaturę i histeryzę. Udało mi się też ogarnąć zapis parametrów zadanych w EEPROM (wiem, że to pewnie nic nadzwyczajnego, ale dla mnie to sukces ). Teraz pozostaje jeszcze dodać drugi termometr i diodę i... zamienić diody na przekaźniki. Zastanawiam się, czy nie dodać jeszcze atrapy czynnika różniczkującego, czyli temperatura wprawdzie jest w widełkach, ale rośnie szybko, więc włącza się chłodzenie. Ale to zrobię, gdy poobserwuję działanie w praktyce,
×
×
  • Utwórz nowe...