Skocz do zawartości
MietekF

Sterownik do lodówek rollbarów

Pomocna odpowiedź

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.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Powiem tak. Masz schemat oryginalnego urządzenia chłodniczego? Elektryczny oczywiście. Pewnie wystarczy podmienić sterownik na jakiś współczesny PID i po robocie. Masz sterowanie z dokładnością nawet do 1°C, zabezpieczenia i alarmy. Samemu sterownik, warto budować tylko edukacyjnie.

Udostępnij ten post


Link to post
Share on other sites

Tak. Chodzi o naukę. A jednocześnie będzie sterowanie bez rozkręcania lodówek.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
Cytat

A jednocześnie będzie sterowanie bez rozkręcania lodówek.

A jak będziesz mierzył temperatury obiektów sterowania? Pytam z czystej ciekawości, nie jest to żadna dygresja :).

Notabene gotowiec na Aliexpress kosztuje 80zł: Ale o co mi chodzi, można do niego znaleźć całkiem przyzwoitą instrukcję, która, może być pomocna w opracowywaniu swojego rozwiązania.

Zl630_manual.pdf

Edytowano przez BlackJack

Udostępnij ten post


Link to post
Share on other sites

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ę.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...