Avtor: Boštjan Tovšak
Kot hobi pivovar sem potreboval kontrolo in regulacijo temperature pri fermentaciji pivine. Vsak tip kvasovk ima svoje temperaturno področje delovanja.
Ta področja so v razponu od 18°C pa tja do 25°C. Na tržišču se seveda najdejo rešitve a sem se raje odločil za lastno izdelavo.
Namen članka je osvetliti osnovne gradnike (programske in strojne), ki so potrebni, da lahko sestavimo celoto. Dodatno gradivo z detajli programske kode najdete v sklopu knjižnic programa v razvojnem okolju Arduino IDE.
Kaj potrebujemo
Uporabimo ESP8266, SSR rele, napajalnik za ESP modul, BME280 senzor temperature (meri tudi tlak), razvojno okolje Arduino IDE, grelni trak moči cca. 100W (230V) in aplikacijo IoT Blynk (svoj uporabniški račun) v oblaku ali za Android. ESP8266, grelni silikonski trak (slika 2) in SSR (3V, slika 1) lahko najdete in naročite na spletni strani Aliexpress-a. Za silikonski grelni trak in SSR boste odšteli skupaj cca. 12€. Za ESP8266 še dodatnih cca. 6€. Torej nas strošek materiala stane cca. 18€.
Povezava do programov: https://scanned.page/p/679f3c5c5eafe
Ta vsebina je samo za naročnike
Blynk
Blynk je nadzorna aplikacija, ki je na voljo brezplačno z določenimi omejitvami. Omejeni smo na deset IoT naprav, kar bi za povprečnega hobi uporabnika moralo zadostovati. Omejitev je tudi število gradnikov, ki jih uporabljamo pri kreiranju svoje nadzorne plošče v aplikaciji. Če želimo povezati več kot deset IoT naprav, je Blynk plačljiv, seveda pa ponuja širši nabor gradnikov, količine poslanih podatkov, zgodovine podatkov itd. Cena se prične pri 6,99 USD/mesec za MAKER naročnino za deset registriranih naprav. Za PRO naročnino pa se cene gibljejo glede na število registriranih IoT naprav od 99 USD/mesec pa vse do 499 USD/mesec.
Kako začeti
V razvojnem okolju Arduino IDE moramo najprej poiskati in namestiti naslednje knjižnice:
Blynk, komunikacija za IoT v oblaku
BME280, temperaturni senzor
PID_v1_bc, programski PID regulator
Program v Arduino IDE bomo sestavili iz treh delov:
del za identifikacijo in povezavo ESP8266 s strežnikom Blynk v oblaku
del za komunikacijo med ESP8266 in BME280 senzorjem
del za PID regulacijo
Del za identifikacijo in povezavo z Blynk-om
Program poveže krmilnik z Blynk IoT v oblaku. Programski del Blynk skrbi za sinhronizacijo podatkov med ESP8266 in IoT. Definirati je potrebno virtualne priključke V1, V2…Vn, ki služijo prenosu podatkov med ESP8266 in oblakom Blynk. Za vsak virtualni priključek določimo veličino (merjeno temperaturo, vrednost izhoda PID-a, konstante regulatorja Kp, Ki in Kd itd.)
Virtualne priključke definiramo tako v Blynk IoT v oblaku, kot tudi v samem Arduino IDE razvojnem okolju. Tako poteka branje in pisanje podatkov med ESP8266 in Blynk-om. Definiramo tudi grafični vmesnik, nadzorno ploščo in ju opremimo z gradniki (grafi, indikatorji itd.)
Primer programa Blynk najdemo v v okolju Arduino IDE v meniju File->Examples->Blynk->Boards_WiFi->ESP8266_Standalone.
Del za komunikacijo med ESP8266 in BME280
Ta del skrbi za I2C komunikacijo med senzorjem in krmilnikom. Senzor BME280 poleg temperature meri tudi zračni tlak in relativno vlago. Priključimo ga preko štirih priključkov. Dva služita za napajanje, preostala dva pa sta priključka SDA in SCL. Na kovinski fermentor pritrdimo senzor z lepilnim trakom, kajti za potrebe čiščenja fermentorja mora biti senzor snemljiv.
Primer programa v okolju Arduino IDE najdemo v meniju File->Examples->BME280->BME_280_I2C_Test.
Del za PID regulacijo
Na podlagi posredovane izmerjene in želene temperature preračunava in nastavlja izhod. Preverja vrednost PID izhoda glede na vrednost periode (prednastavljen časovni okvir). Čas vklopa releja v času ene periode je proporcionalen vrednosti PID izhoda, Output.
Funkciji, ki se uporabljata sta myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT) in myPID.Compute().
V programu definiramo spremenljivke tipa double: &Input (merjena temperatura, vhodna spremenljivka), &Output (izhodna spremenljivka), želeno vrednost temperature &SetPoint in konstante PID regulatorja Kp, Ki in Kd. Funkcija v parametrih uporablja kazalce (pomnilniške naslove spremenljivk, zato v funkciji znak »&«). Parameter DIRECT povečuje vrednost izhoda (sistem gretja), REVERSE pa ga znižuje (sistem hlajenja).
Funkcija myPID.Compute() na podlagi vhodne in želene vrednosti izračuna vrednost izhoda in jo shrani v predhodno definirano spremenljivko &Output.
Primer programa v okolju Arduino IDE najdemo v meniju File->Examples->PID_v1_bc->PID_RelayOutput.
S funkcijo myPID.SetOutputLimits(0, PID_limits) omejimo področje izhoda PID-a na 100, kar ustreza PWM 100%. Periodo lahko nastavljamo od nekaj sekund do več minut. V našem primeru 25l tekočine je nastavljena na 15min.
Da je izhod PID proporcionalen s PWM skaliramo funkcijo (slika 4) v razmerju Output/PID_limits. Tako je pri vrednosti PID izhoda Output npr. 50, čas vklopa releja enak 50% časa ene periodo. Za merjenje časovnega intervala uporabljamo ukaz milis(). To je čas delovanja krmilnika od trenutka vklopa v milisekundah oz. njegova interna ura.
Zavihajmo rokave in na delo
Kot je bilo predhodno omenjeno, potrebujemo uporabniški račun na spletni strani https://blynk.io.
Po uspešni registraciji in prijavi v Blynk IoT, se najprej lotimo izdelave predloge. Odpremo zavihek »Developer zone« na levi strani okna in kreiramo novo predlogo z gumbom »New Template« (slika 9).
Vpišemo potrebne podatke kot so Naziv projekta, strojna oprema in pomemben podatek, vrsta povezave. Tu izberemo WiFi ali Ethernet.
Ko zaključimo s predlogo, nam sistem podeli unikaten ID in ime predloge. Nato kliknemo na zavihek »Devices«. Kliknemo gumb »New device« in izberemo opcijo »From Template«. Izberemo predhodno kreirano predlogo. Po zaključku nam sistem avtomatsko kreira ID in naziv predloge ter identifikacijski žeton (slika 10). Te podatke shranimo v odložišče, ker jih bomo potrebovali pri programiranju v Arduino IDE okolju.
Programiranje v Arduino IDE okolju
Kot je bilo na začetku omenjeno, gradimo program iz treh delov. Iz dela za Blynk IoT povezavo, dela za komunikacijo z BME280 in dela za regulacijo PID. Primere vseh treh delov kode najdete na koncu članka v QR kodi. Prav tako celoten program.
Kot se za program spodobi so na začetku deklaracije, definirane knjižnice za Blynk, BME280 in nastavitve krmilnika za povezavo v naše lokalno brezžično omrežje. Definiramo tudi virtualne priključke, nosilce podatkov, od V1 do Vn, ki jih bomo definirali kasneje tudi v oblaku Blynk IoT.
Seveda želimo tudi, da imamo možnost ročne nastavitve PID konstant in želene temperature. V inicializacijskem delu programa omogočimo tudi branje shranjenih vrednosti PID konstant iz EEPROM-a.
Definiramo časovno funkcijo, ki izvaja PID ukaz in jo bomo uporabili v glavni zanki programa (funkcija MyTimer). Funkcija s pomočjo časovnika ciklično proži ukaze branja temperature in PID regulacije. Izvaja se v glavni zanki programa.
Ukaz Blynk.run() ohranja vzpostavljeno povezavo med oblakom IoT in krmilnikom EPS8266, ukaz timer.run() pa proži časovnik za izvajanje funkcije myTimer (slika 11).
Izven glavne zanke na koncu programa definiramo nabor ukazov, ki skrbijo za prenos podatkov med IoT Blynk in krmilnikom ESP8266.
Za komunikacijo krmilnika z Blynk-om sta pomembni funkciji »BLYNK_READ» in « BLYNK_WRITE«. Poimenovanje funkcij je sicer malo dvoumno. Podrobno definicijo najdete na spletni strani https://docs.blynk.io/en/blynk-library-firmware-api/virtual-pins
Funkcija »BLYNK_READ» služi pisanju vrednosti v virtualni priključek oz. pošiljanju podatkov od krmilnika k strežniku.
Funkcija »BLYNK_WRITE» služi branju vrednosti virtualnega priključka oz. pošiljanju podatkov od strežnika do krmilnika.
Vsi zgornji ukazi za prenos podatkov se avtomatsko izvajajo ob vsakokratnem klicu funkcije Blynk.run().
Ko smo definirali tudi vse virtualne priključke, je na vrsti konfiguracija virtualnih priključkov v IoT Blynk-u na spletu. Prijavimo se v svoj predhodno odprt uporabniški račun in se lotimo definiranja.
Definiranje virtualnih priključkov v IoT Blynk
Po prijavi v Blynk kliknemo na tipko »Developer zone« in izberemo predhodno definirano predlogo. Izberemo »Datastreams« in pričnemo z definiranjem. Definirati moramo virtualne priključke enakih oznak kot v razvojnem okolju Arduino IDE.
Za vsak virtualni priključek imamo na razpolago več opcij. Poleg oznake priključka je pomemben tudi podatkovni tip, razpon vrednosti, enota in decimalna mesta. Podatkovni tipi v programu krmilnika in v IoT Blynk se morajo ujemati. Ko smo z definiranjem vseh priključkov končali, lahko pričnemo z gradnjo lastnega grafičnega vmesnika.
Grafični vmesnik Blynk
V oknu Developer zone, izberemo želeno predlogo, nato kliknemo na tipko Webdashboard. Tu imamo na voljo množico gradnikov s katerimi lahko ustvarimo nadzorno ploščo po svojih željah. Skupno vsem gradnikom je definiranje podatkovnih tokov, ki jih izbiramo iz spustnega seznama. Na voljo imamo gradnike grafov, analognih merilnikov, drsnikov, tipk, LED indikatorjev in še in še.
Tako smo uspešno nastavili grafični vmesnik v IoT Blynk oblaku. Podobno lahko ustvarimo na pametnem telefonu. V trgovini Google play poiščemo Blynk in ga namestimo. Sledi prijava z našim uporabniškim računom in lahko začnemo z definicijo nadzorne plošče po svojih potrebah na enak način kot v oblaku. Osnova so seveda predefinirani virtualni priključki oz. podatkovni tokovi.
Poleg gradnje lastne nadzorne plošče ima Blynk še vrsto drugih možnosti: posodobitev kode na krmilniku z OTA, beleženje stanja naprave, avtomatsko obveščanje o dogodkih, »webhooks«, integracijo z drugimi platformami, definiranje uporabniških računov, lokacijo…
Zaključek
Najzahtevnejši je programski del, kajti moramo biti pozorni, da se oznake in tipi podatkov naših podatkovnih tokov, tj. virtualnih priključkov na krmilniku in oblaku IoT, ujemajo.
PID konstante lahko nastavljamo ročno v aplikaciji, dokler ne dobimo želenega rezultata. Izhajamo iz vrednosti Kp = 1, Ki = 1 in Kd = 0. Postopoma spreminjamo posamezno konstanto. Ko je delovanje PI zadovoljivo, se lotimo nastavljanja konstante Kd. Empirično sem določil Kp=0.4, Ki=7.9 in Kd =2.9. S temi konstantami sem ostal znotraj področja +0,4°C in -0,6°C, kar je povsem zadovoljivo za hobi potrebe.
Upoštevati moramo tudi, da senzor ni nameščen v merjeni tekočini in so temu primerna odstopanja. Vrtanja in predelave fermentorja se nisem lotil, ker je bila nakupna cena le-tega previsoka za tak poseg. Potrebno bi bilo dobro tesnjenje senzorja, v procesu pretakanja pivine v fermentor so temperature visoke (65°C in več), prisotne bi bile komplikacije z demontažo pri pranju in premiku fermentorja.
V osnovi sama pivina že zaradi procesa fermentacije vzdržuje lastno temperaturo okoli 18°C (odvisno seveda tudi od temperature okolice). Delovanje PID-a v tolerančnem področju je povsem zadovoljivo. Že kar nekaj sodčkov (po 5 Galon) pivine je do danes šlo skozi fermentor in tudi pošlo.