Prosty sterownik na płytce rozwojowej ESP

Przyrządy pomiarowe, ich montaż i zastosowanie odczytów w procesach destylacji. Regulacja procesów.

Autor tematu
Baryla
20
Posty: 23
Rejestracja: niedziela, 17 mar 2019, 18:57
Podziękował: 6 razy
Otrzymał podziękowanie: 5 razy

Post autor: Baryla »

Chciałem wam zaprezentować mój sterownik do kolumny i opisać pokrótce jak takie coś lub podobnego samodzielnie zbudować.
Na wstępie chciałem zaznaczyć, że nie jestem ani elektronikiem ani programistą, więc moje rozwiązanie zapewne zawiera sporo naiwności i niedociągnięć wynikających z tego faktu. Projekt jest w ciągłej fazie rozwoju, więc w kodzie jest trochę śmieci (nawet więcej niż trochę) część z przycisków i trybów nie jest funkcjonalna, bo albo była bez sensu albo czeka na lepsze pomysły. Natomiast urządzenie działa i nie jest kosztowne i każdy kto nie boi się młotka i śrubokręta powinien sobie z nim poradzić.

Obrazek
Obrazek
Obrazek

https://vimeo.com/user123522353/review/ ... 8573573f83
Obrazek
Obrazek


Mój sterownik wyświetla temperaturę z 3 (a w zasadzie 4) czujników temperatury ds18b20, włącza i wyłącza 3 grzałki na 220V, jak również kręci za pomocą serwa zaworem precyzyjnym do odbioru urobku. Obsługa odbywa się za pomocą strony www którą generuje sterownik lub/i blink, dane są również wysyłane do systemu domoticz, który wyrysuje nam piękne wykresy z przeprowadzonego procesu.

Czego będziemy potrzebować do zbudowania sterownika:

Płytki nodemcuv3 lub innej zgodnej opartej na ESP8226
3 lub 4 czujników DS18b20 i rezystor 4,7 kΩ
3 moduły SSR i radiatory.
wyświetlacz lcd zgodny ze standardem I2C z rozdzielczością 20x4 znaków
Serwo MG995 z orczykami lub inne kompatybilne
Jakieś kondensatory zdolne pracować przy 5V
Jakieś głośne piezo piszczadło na 3.3v
Jakieś wtyczki i gniazda kabelki, i pudełka w które całość zapakujecie, cyna i lutownica jakieś śrubki i nakrętki M3 też się przydadzą.

Należy zaznaczyć, że sterownik działać będzie również w okrojonym wydaniu, nie zamontujemy serwa, nie będzie kręcić zaworem, nie damy wyświetlacza, nie będzie wyświetlać stanów, nie damy piezopiszczadła nie będzie piszczeć itp. Przyporządkowanie poszczególnych pinów na płytce oczywiście można zmienić i oczywiście będzie to wymagało modyfikacji w kodzie.
Na internetach pełno jest filmików i artykułów jak podłączyć poszczególne elementy więc nie chcąc się powielać opis będzie dość lakoniczny.

Bierzemy się do pracy:

Instalujemy program arduino IDE a następnie biblioteki obsługujące płytkę nodemcu, dokładniejszy opis znajduje się np tu:https://abc-rc.pl/Node-MCU-ESP8266-w-sr ... 75167.html

Do pinu D7 podpinamy przewód transmisji danych z czujników DS18b20 plusa do 3v i minusa do GND na płytce:
Obrazek



Display łączymy w następujący sposób:
Obrazek
Przy czym nie ma przeszkód żeby podpiąć go bezpośrednio pod 5V z zasilacza zamiast 3 z płytki, będzie jaśniej świecić i chyba sama płytka będzie miała troszkę lżej.

Do D1 podpinamy komunikację serwa, zasilanie bezpośrednio pod zasilacz 5V.

Do D2 piezopiszczalkę minus do pinu oznaczonego GND.

SSR kolejno do pinów D5 D6 D8 minus do GND.

Zasilanie całości możemy realizować przez podpięcie mikro USB pod płytkę jak również przez wpięcie się z napięciem +5V w pin oznaczony VIN i minusem w G. Pod zasilanie zalecam podpiąć mocniejszy bufor na pracę serwa, gdyż ma ono dość duże chwilowe pobory i tego prądu może czasem w układzie brakować.

Wszystko oczywiście pakujemy w mniej lub bardziej estetyczne pudełka, na rynku jest wiele różnych i niestety nie należą one do najtańszych (w porównaniu do części elektronicznych wydają się drogie :) )

Skoro uporaliśmy się już z częścią twardą projektu (hardware) teraz czas na miękką (software). Niestety kod trzeba indywidualnie personalizować w zależności od urządzenia nie da się tych wstępnych konfiguracji zrobić online. Sprawa nie jest skomplikowana i raczej każdy sobie poradzi. Pamiętajcie, brak kropki, przecinka czy inny drobny błąd może spowodować że program się nie skompiluje lub urządzenie nie będzie działać poprawnie

Po pierwsze instalujemy program arduino ide:
https://www.arduino.cc/en/main/software

Po drugie instalujemy odpowiednie sterowniki pod płytkę nodemcu jak tutaj:
https://pcudnik.pl/jak-zaczac-zabawe-z- ... odemcu-v3/
i ustawiamy sobie w programie naszą płytkę Narzędzia-->Płytka-->NodeMCU1.0

Teraz dokładamy następne potrzebne biblioteki które wywołujemy na początku programu. Narzędzia --> Zarządzaj bibliotekami. Potrzebne biblioteki znajdują się na początku kodu.

Teraz jak już mamy wszystkie zasoby przystępujemy do modyfikacji kodu:

Zaczynamy od czujników.
Żeby odczytać numery seryjne poszczególnych czujek, wpisujemy następujący program, kompilujemy i wczytujemy w płytkę:

Kod: Zaznacz cały

#include <OneWire.h>

OneWire  magistrala(D7); 

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte addr[8];
  int i;

  if ( !magistrala.search(addr)) {
    magistrala.reset_search();
    delay(1000);
    return;
  }
  
  Serial.print("Adres =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC jest niepoprawny!");
      return;
  }
  Serial.println();
 
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20"); 
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      break;
    default:
      Serial.println("Inne urządzenie.");
      return;
  } 

}
i za pomocą monitora portu szeregowego (narzędzia-->monitor portu szeregowego) odczytujemy numery seryjne naszych czujek które wpisujemy w te miejsca w programie głównym:

Kod: Zaznacz cały

DeviceAddress pomiar = { 0x88, 0x98, 0xEF, 0x73, 0x27, 0x19, 0x1, 0x75 };   // nadanie nazwy czujnikowi temp od sn czujnika kazda sztuka ma swój 
DeviceAddress pomiar1 = { 0x28, 0x35, 0x20, 0x80, 0x27, 0x19, 0x1, 0x5A };  // nadanie nazwy czujnikowi temp od sn czujnika kazda sztuka ma swój 
DeviceAddress pomiar2 = { 0x28, 0xFD, 0x13, 0x26, 0x5F, 0x14, 0x1, 0xDF };  // nadanie nazwy czujnikowi temp od sn czujnika kazda sztuka ma swój 
DeviceAddress pomiar3 = { 0x28, 0x16, 0xB0, 0x4A, 0x1A, 0x19, 0x1, 0xE2 };  // nadanie nazwy czujnikowi temp od sn czujnika kazda sztuka ma swój 
Następnie konfigurujemy połączenie wifi z nasza domową siecią:

Kod: Zaznacz cały

//Nazwa urządzenia i dane WIFI zamiast ***** wpisać swoje dane
const char* deviceName = "*****";
const char* ssid = "*****";
const char* password = "******";
Gdzie nazwa urządzenia to nazwa naszego sterownika, pod jaką będzie widoczny w sieci. SSID to nazwa sieci wfi a passsword to po prostu hasło do tej sieci.
Dalej wpisujemy dane Blynk, jeśli korzystamy, pamiętając, że jeśli nie korzystamy należy odkomentować tą linię i zapewne wszystkie inne pozostałe zawierające ciąg znaków "blynk" w przeciwnym wypadku program może nie działać jak potrzeba. Ja ze swojej strony gorąco zachęcam do korzystania, chyba że warunki lokalowe nam na to nie pozwalają (brak dostępu do internetu), z drugiej strony nasz telefon może posłużyć zawsze za punkt dostępowy, więc w 99% przypadków problem nie wystąpi.

Kod: Zaznacz cały

// BLYNK
char auth[] = "*************************";  // Jeśli nie korzystasz z BLYNK wykomentuj tą linie płytka nie będzie kontynuować programu bez podania klucza klucz autoryzacyjny blynk zamiast ***** wpisać swoje dane
Następnie dane do domoticza jeśli korzystamy:

Kod: Zaznacz cały

// Domoticz
const char* host = "192.168.1.3";     //adres domoticza
const int   port = 8080;              //port domoticza
Dalej zgodnie z opisem ustawiamy sobie domyślne parametry procesu=

Kod: Zaznacz cały

volatile int czas = 900000; // to 15 min
volatile int stan = 0;
volatile float T = 0; //nie ustawiać, wartość temperatury kolumny
volatile float Td = 0; // nie ustawiać, wartość temperatury czujnika na dole kolumny
volatile float Tk = 0; //nie ustawiać, wartość temperatury kotła 
volatile float Tp = 0; //nie ustawiać, wartość temperatury radiatora przekaźników SSR
volatile int Z = 180; //Serwo wartość początkowa 180-zamknięte 0-otwarte
volatile float To = 78; //Temperatura optymalna
volatile float Ta = 86; //Temperatura alarmowa
volatile float Tos = 82; //Temperatura ostrzegawcza
volatile float Tt = 0.3; //Tolerancja temperatury
volatile int Zk = 5; //Co ile ma się zmieniać pozycja serwa
volatile int pozycja = Z; //Aktualna pozycja serwa 0-180
volatile int cykl = 0; // Deklaracja licznika cykli
volatile int maxCykl = 10; //Max. wartość licznika cykli do ustawienia
Na samym końcu musimy sobie ustawić sterowanie w komórce w blynk-u, niżej definicje przełączników wirtualnych:

Kod: Zaznacz cały

BLYNK_WRITE(V3)   // BLYNK sterowanie serwem
BLYNK_WRITE(V4)   // BLYNK sterowanie stanem
BLYNK_WRITE(V5)   // BLYNK sterowanie temp ostrzegawcza
BLYNK_WRITE(V6)   // BLYNK sterowanie temp optymalna
Blynk.virtualWrite(7, outputTEMP);
Blynk.virtualWrite(8, koldolTEMP);
Blynk.virtualWrite(9, kociolTEMP);
Blynk.virtualWrite(10, przekaznikiTEMP);  
Blynk.virtualWrite(4, stan);
Rozmieszczenie u mnie wygląda tak:
Obrazek

DZIAŁANIE:

Proces podzieliłem na 4 fazy.

STAN 1
Rozgrzewanie kotła

Wszystkie 3 grzałki pracują zawór odbioru zamknięty. Faza kończy się w momencie osiągnięcia na górnym termometrze temperatury optymalnej (To). Warto w tym miejscu wspomnieć, że urządzenie nie włącza wody na chłodnice. U mnie robi to Domoticz (włącza pompę kiedy Td osiągnie zadaną temperaturę). Po zakończeniu program z automatu przechodzi w STAN 2.

STAN 2
Stabilizacja kolumny

W moim dziwnym przypadku kolumna fi 76 stabilizuje się przy 6KW więc nadal 3 grzałki są włączone, natomiast w każdym innym przypadku możemy to zmienić modyfikując fragment kodu:

Kod: Zaznacz cały

 case 2:
          digitalWrite(output5, HIGH);
          digitalWrite(output6, HIGH);
          digitalWrite(output8, HIGH);
          
          output5State = "ON";
          output6State = "ON";
          output8State = "ON";

          lcd.setCursor(10, 0); // komunikacja z LCD
          lcd.print("STAN 2"); // komunikacja z LCD
          
          Serial.print("Czas: ");
          Serial.println(TimeStart);
          
          if (TimeStart >= czas)
          {
            Z = 180;
            pozycja = Z;
            ruch_serwem();                     
            alarmON();
          }
                      
Odpowiednie przełączniki zmieniając z HIGH na LOW i ON na OFF. Kolumna będzie się stabilizować przez czas określony zmienną:

Kod: Zaznacz cały

volatile int czas = 900000; // to 15 min
czas podajemy w milisekundach. Po upływie czasu urządzenie przypomni nam o sobie za pomocą brzęczka. Przejście do następnego stanu następuje przez ręczne przełączenie.

STAN 3
Odbiór.

To już właściwa praca urządzenia, na tym etapie na początku odbieramy sobie przedgony i wreszcie serce.
Zasady logiki:
Logika urządzenia pracuje raczej w pół-automacie z priorytetem pilnowania temperatury a nie tempa odbioru. Temperatura optymalna (To), to temperatura po przekroczeniu której + tolerancja temperatury (Tt) zawór zacznie się przymykać o Zk stopni co określoną ilość cykli (maxCykl) przy czym cykl trwa od około 1 do 2 sekund w zależności od ilości pracy dla procesora. Generalnie im wyższa wartość maxCykl tym dłużej będziemy czekać na następną reakcję zaworu, parametr ten został wprowadzony by uwzględnić bezwładność temperaturową kolumny. Oczywiście możemy ustawić go na 1 w tedy zawór będzie obracał się (jeśli inne warunki zostaną spełnione) co pętlę programu.
W momencie gdy temperatura zostanie przekroczona o dwukrotność Tt zawór obróci się o dwukrotność Zk a jeśli o trzykrotność to wykona 3 razy większy obrót.
W momencie gdy temperatura na dole spadnie poniżej To zawór zacznie się otwierać co maxCykl o Zk.

STAN 4

Miały być pogony, ale odbieram je (jeśli w ogóle) na stanie 3 zwiększając po prostu To.

Dodatkowo program czuwa troszkę nad bezpieczeństwem.

Gdy przekroczona zostanie zadana temperatura Tos urządzenie wysyła powiadomienie na komórkę wykorzystując blynk. Po przekroczeniu temperatury alarmowej Ta, urządzenie wyśle powiadomienie, włączy brzęczyk i wyłączy grzałki.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony sobota, 19 wrz 2020, 21:13 przez manowar, łącznie zmieniany 3 razy.
alembiki

Ardusense.io
50
Posty: 66
Rejestracja: środa, 26 sie 2020, 14:22
Krótko o sobie: Jestem fajnym człowiekiem:)
Ulubiony Alkohol: Glengoyne
Lokalizacja: Scotland / Poland
Podziękował: 5 razy
Otrzymał podziękowanie: 6 razy
Re: Prosty sterownik na płytce rozwojowej ESP

Post autor: Ardusense.io »

Ciekawy projekt, fajnie że jest dostępny dla każdego zainteresowanego. Sprzętowo miałbym obiekcje co do tych foteków bo ewidentnie mam na nie alergię, no ale każdy może sobie zamontować taki jaki chce. Kod faktycznie wymaga uporządkowania ale to sam dopracujesz zdobywając wiedzę i doświadczenie w miarę dalszej pracy z tymi urządzeniami. Życzę dalszego rozwoju projektu!

Autor tematu
Baryla
20
Posty: 23
Rejestracja: niedziela, 17 mar 2019, 18:57
Podziękował: 6 razy
Otrzymał podziękowanie: 5 razy
Re: Prosty sterownik na płytce rozwojowej ESP

Post autor: Baryla »

Zacząłem migracje projektu na ESP32 i mam problem z BLYNK, konkretnie z połączeniem. Płytka nie chce się łączyć z serwerem blynk. Przerobiony kod jaki pakuje na płytkę w załączniku. Monitor portu szeregowego pokazuje następujące komunikaty:
Obrazek

Po zakomentowaniu linijki odpowiedzialnej za połączenie wszystko zdaje się działać, poza blynkiem oczywiście.

Kod: Zaznacz cały

// Blynk.begin(auth, ssid, password);  
Dane autoryzacyjne (klucz blynk nazwa sieci i pass do wifi) wydają się być prawidłowe, jak przekopiuje dane do przykładu z blynk ESP32 płytka ładnie się łączy.

Podobna konfiguracja grzecznie działała na esp8266 pozamieniałem w zasadzie tylko biblioteki i nazwę jednego pinu.

Pomoże ktoś??
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

MastaMari
150
Posty: 168
Rejestracja: poniedziałek, 10 lut 2020, 21:47
Podziękował: 3 razy
Otrzymał podziękowanie: 15 razy
Re: Prosty sterownik na płytce rozwojowej ESP

Post autor: MastaMari »

Spróbuj usunąć nadanie statycznego IP, poniżej i tak masz mozliwosc wpisana danych do WIFI

Kod: Zaznacz cały

IPAddress staticIP(192, 168, 1, 15); //ESP static ip
IPAddress gateway(192, 168, 1, 1);   //IP Address of your WiFi Router (Gateway)
IPAddress subnet(255, 255, 255, 0);  //Subnet mask
IPAddress dns(8, 8, 8, 8);

Autor tematu
Baryla
20
Posty: 23
Rejestracja: niedziela, 17 mar 2019, 18:57
Podziękował: 6 razy
Otrzymał podziękowanie: 5 razy
Re: Prosty sterownik na płytce rozwojowej ESP

Post autor: Baryla »

Dzięki poszło.
ODPOWIEDZ

Wróć do „Kontrola procesu destylacji”