Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows 8
  • Automatizacija za BeerDuino pivaru baziranu na arduino mega. Automatski sistemi bazirani na Arduino mikrokontroleru

Automatizacija za BeerDuino pivaru baziranu na arduino mega. Automatski sistemi bazirani na Arduino mikrokontroleru

Automatizacija u modernog društvaneophodna mera, jer u digitalno doba izuzetno je važno isključiti ljudski faktor u raznim industrijama za standardizaciju i poboljšanje kvaliteta proizvoda. Postoje i područja u kojima ljudi jednostavno ne mogu raditi ono za što su roboti sposobni, na primjer, proizvodnju nanomaterijala i mikrokola.

Međutim, automatizacija ne pomaže samo u proizvodnji, već može biti korisna i za prosječnog čovjeka. Na primjer, automatizacija za pivaru koja koristi Arduino može značajno pojednostaviti proces proizvodnje proizvoda. Hajde da shvatimo kako automatizacija za ispravljanje na Arduinu i druge stvari može pomoći i pogledajmo primjere.

Glavne prednosti automatizovanih sistema baziranih na Arduino mikrokontroleru

Niko vam ne zabranjuje da lemite sopstvenu ploču i sami je programirate koristeći jezike niskog nivoa. Međutim, automatizacija pomoću Arduina i gotovih mikrokontrolera uvelike će olakšati cijeli proces i uštedjeti vrijeme. Uostalom, mnogo je lakše kupiti gotov proizvod sa setom biblioteka i prilagoditi ga svojim potrebama. A pristupačna automatizacija na Arduino mega 2560 može biti korisna u mnogim područjima života, od glasovnih prekidača do pametna kuća i do električnih brava sa detektorom pokreta. Glavne prednosti po kojima je Arduino automatizacija poznata su:

  1. Niska barijera za ulazak. Nema potrebe za stjecanjem inženjerskog obrazovanja, dovoljno je pogledati nekoliko videa za obuku i imati osnove u programiranju.
  2. Veliki broj već pripremljenih biblioteka. Arduino koriste širom CIS-a mnogi entuzijasti robotike, do te mjere da proizvodnja razne elektronike postaje njihov hobi. Shodno tome, korisnička zajednica na mreži je izuzetno aktivna, postavlja veliki broj praznina i spremna je da vam pomogne u rješavanju bilo kakvih problema. Kvalitet biblioteka trpi zbog niskog ulaznog praga, ali niko vam ne brani da kreirate svoje, dovoljno je proučiti semantiku jezika C++ ili koristiti gotove prevodioce.
  3. Veliki broj perifernih uređaja. Nije važno da li vam je potrebna automatizacija staklenika bazirana na Arduinu ili senzor svjetla, pronaći ćete sve module, uključujući senzore zvuka i glasovne prepoznavaoce. Da, neke ploče koštaju puno novca, ali uvijek možete pronaći jeftine analoge, na primjer, wi-fi modul od proizvođači trećih strana esp8269, koji košta 10 puta manje od zvaničnog.
  4. Puno informacija. Bilo koji problem sa kojim se suočavate već se suočio neko drugi, a rješenje ćete vjerovatno pronaći na Google-u. Postoji i kompletna literatura koju možete pogledati.

Međutim, nemojte misliti da Arduino nema mana. Ploča je poznata po svojim niskim performansama. Posebno složeni zadaci i na velike količine Vrijeme odziva koda može doseći 1 sekundu, što je neprihvatljivo za mikrokontrolere. Flash memorija većine modula ne prelazi 1 MB, što nije dovoljno za kreiranje neuronskih mreža ili korištenje medijskih datoteka. Naravno da se možete povezati pomoćna karta memoriju, ali to također povećava vrijeme odziva, oduzima dodatna sredstva za njenu ishranu i radi se na poluzanatski način.

Međutim, jednostavno automatizovani sistemi, na primjer, za kuvanje piva ili staklenika, ne zahtijevaju ni djelić resursa koje odbor može pružiti. Shodno tome, većina korisnika će ove nedostatke smatrati besmislenim. Ako odlučite sastaviti vlastiti 3-D pisač ili složeniji dizajn, trebali biste pobliže pogledati analoge. Ali barijera za ulazak za Arduino konkurente bit će mnogo veća.

Primjer automatizacije procesa baziran na Arduino mikrokontroleru

Najjednostavniji primjer automatizacije procesa može biti staklenik koji koristi Arduino. Da biste stvorili bilo koji sistem, vrijedno je jasno definirati zadatke koje mora izvršiti. Koristeći staklenik kao primjer, ovo bi bilo:

  1. Stvaranje posebne klime.
  2. Pravovremeno uključivanje i isključivanje rasvjete.
  3. Pravovremeno zalivanje biljaka i održavanje vlažnosti vazduha na istom nivou.

Na osnovu ovih zadataka, odmah možete primijetiti šta ćete morati kupiti za glavnu ploču:

  1. Senzor temperature. Obezbediće da se vazduh ne zagreva i ne ohladi u granicama propisanim programom. Ako se temperatura promijeni, ploča će uključiti klima uređaj ili elektronske baterije.
  2. Svetlosni senzor. Naravno, možete se ograničiti softversko rješenje i kupujte skupe lampe sa imitacijom dnevno svjetlo. Ali ako želite stvoriti punopravni staklenik, tada će biti mnogo praktičnije instalirati automatski strop, koji će kontrolirati Arduino.
  3. Senzor vlage. Ovdje je sve isto kao i sa temperaturom, prema propisanom scenariju, ploča će uključiti prskalice i ovlaživače zraka, ako je potrebno.

Kada kupite sve potrebne module, ostaje samo da ih programirate. Uostalom, bez koda, ovo su samo komadi hardvera koji nisu sposobni ni za šta.

Programiranje Arduino mikrokontrolera za automatizaciju procesa. Primjer

Kao iu prethodnoj tački, za programiranje je važno podijeliti zadatak na zasebne podtačke i izvršiti ih uzastopno. Arduino programiranje se odvija zahvaljujući komandama u AT i AT+ interfejsu, koristeći pripremljene biblioteke. U skladu s tim, svi scenariji su upisani posebno okruženje u C++ i pre nego što bilo šta uradite, provedite vreme učeći njegovu semantiku. Pored nastupa jednostavne funkcije, sistem je također sposoban pohraniti skripte u flash memoriju, što nam je potrebno u ovom primjeru.

Ne zaboravite da informacije sa svakog senzora dolaze u realnom vremenu i kao varijable, ali možete ograničiti vrijeme odziva, jer nema potrebe za trošenjem resursa i konstantnim mjerenjem svakog parametra. U skladu s tim, podesite vrijeme uključivanja i isključivanja za svaki senzor ili podesite vrijeme odziva za određeni period.

Želio bih dati još jedan primjer koristeći Arduino V stvarni problemi. Ovdje ću predstaviti najjednostavniji, ali stvarno radni projekt za podešavanje grijanja kuće pomoću električnog bojlera na Arduino baziran. Zaista se nadam da će ovaj članak pomoći nekome da odbaci svoje strahove i pokuša da koristi svoje ruke za ono što im je namijenjeno; jako dobro trenira ruke, mozak i daje rijedak osjećaj zadovoljstva u stvaranju nečeg zanimljivog. Počevši da radim s ovim kontrolerom, još uvijek sam pomalo zbunjen mogućnostima koje se otvaraju prilikom korištenja.

Priča

Zašto, zapravo, Arduino? Jednostavnost, pristupačnost, puno dokumentacije i biblioteka. Kao vjerovatno mnogi, dugo sam pažljivo promatrao Arduino; od djetinjstva volim sve vrste baterija i motora, a ovdje novi nivo, punopravni programski jezik i mnoštvo I/O mogućnosti. Kada su naši „najverovatnije ekonomski partneri“ počeli da ga proizvode, cene su pale na prihvatljiv nivo. Kao rezultat toga, kupio sam početni set i, trepćući očima na LED diode i indikatore, imao sam želju da ga koristim negdje u kući.

Šta grijemo?

Moja baka živi u seoskoj kući u blizini Moskve, nema normalnog vodovoda, nema plina, nema grijanja, a rješavanje svih ovih problema zahtijeva velika ulaganja ili praktičan rad. Ovdje sam vidio mjesto gdje možete u potpunosti koristiti arduino, gdje se možete proširiti. Najveća prednost seoske kuće je što tradicionalno nije velika i vrlo jednostavna. I moj je - tipična kuća seljačka porodica iz sredine 20. stoljeća, brvnara sa jednom velikom sobom i kuhinjom. Nema drugih grijanih prostorija, što je za nas plus, dovoljno je održavati i kontrolirati temperaturu u jednoj prostoriji.

Grijanje

Oprema za grijanje. Kuća je tradicionalno imala grijanje na peći. Jedna “njemačka” peć u prostoriji (grije se zbog dugačke cijevi za namotavanje), druga “ruska” u kuhinji (grije se zbog velike veličine samo ložište). Ako je neko okružen filmskim idejama da je pečenje cool i, osim toga, prirodno i romantično, onda si dozvoljavam da kažem da ti ljudi nikada nisu živjeli u kući sa grijanjem na peći. Zapravo, nije baš udobno, nezgodno i opasno je od požara. Stoga je prije otprilike 5 godina naručen i implementiran projekat ugradnje jednostavnog dvocijevnog sistema grijanja sa plinskim kotlom. Kotao je trebalo da se napaja iz plinskih boca.

Naknadno je odlučeno da se sistem modernizuje, doda pumpa za prinudnu recirkulaciju rashladne tečnosti i mali električni kotao od 2 kilovata, kako ne bi morali da brinete o paljenju gasa kada još nije mnogo hladno. Sva automatizacija se svodila na prisustvo velikog prekidača na zidu; kada je postalo previše hladno, uključivao se, a kada je postalo previše vruće, isključivao se. Dva kilovata su bila dovoljna dok temperatura ne dođe do 0°C, a onda je trebalo upaliti plin ili šporet, što je bilo krajnje nezgodno.

Ekonomska svrsishodnost

Prije nego što se bilo što promijeni, naravno, odlučeno je da se razmotri ima li cijela ova ideja uopće smisla. Nakon što sam iz iskustva izračunao potrošnju plina iz boca i procijenio očekivanu potrošnju dizel goriva, došao sam do zaključka da nema smisla od ovakvih vrsta grijanja ako postoji dovoljna količina električne energije. Cena cilindara je bila negde oko 6-7 hiljada mesecno dizel gorivo ako zimi kupis nesto izgorelo ili leti moze se ustedeti do 5 hiljada mesecno dok je na cistu struju bilo 7 hiljada. Dodajmo ovde trošak bojlera, konstantno vučenje cilindara i miris iz spreja, pa će postati jasno da je struja mnogo jednostavnija i nimalo skuplja. Naravno, postoje i moderne U poslednje vreme gorionici na pelete, ali meni nisu odgovarali, jer se ne mogu sami zapaliti pa imaju minimalnu snagu, a nimalo malu (oko 5 kW), koju 90% vremena jednostavno nema gdje staviti, a zahtijevaju gorivo treba dodati najmanje 2 puta sedmicno, sto ponekad nema ko da radi. A cijena samih kotlova je za red veličine veća prethodne verzije, tako da su pogodni za velike kuće gdje je potrebna veća snaga i veći troškovi, a ne u mom slučaju.

Teški hardver

Pokušao sam procijeniti potrebnu snagu na osnovu potrošnje plina i drugih procjena, pokazalo se da je potrebno 4-5 kW, uz marginu od 6. Pregled tržišta pokazao je da postoji model električnog bojlera sličan onom koji je već instaliran, ali sa 3 grijaća elementa od po 2 kW. Štaviše, prodavao se bez kontrola, što je meni bilo još zgodnije i jeftinije. Generalno, sam kotao je izuzetno jednostavan dizajn, metalni cilindar sa ulaznim i izlaznim cijevima, poklopac pričvršćen vijcima na vrhu, u koji su pričvršćeni grijaći elementi. Dodatno, 2 senzora su ugrađena u karoseriju, otporni temperaturni senzor i senzor koji se zatvara kada se pregrije, oba iz rashladnog sistema automobila. Sada se postavilo pitanje struje. Situaciju mi ​​je pojednostavila činjenica da se pored kuće nalazi radionica na koju su priključene 3 faze (popularno - 380). Naravno, postojalo je iskušenje da se svaki grijaći element napaja iz svoje faze, pa je kupljen specijalizirani 4-žilni kabel u metalnoj pletenici za podzemnu instalaciju i ugrađen u kotlovnicu. Kabl je umetnut u ploču sa serijski povezanim RCD i blokom od 3 prekidača 10A. Zatim je kabl išao direktno do ploče sa arduinom i odatle do električnog bojlera.

Lagani hardver

Jasno je da ćemo grijaće elemente kontrolirati arduinom, pitanje je kako? Pridržavajući se principa - što jednostavnije, to pouzdanije, jednostavno ćemo ih uključiti ili isključiti pomoću releja bez ikakvih mogućnosti prijelaza. Nakon surfanja Aliexpressom, pronašao sam blok releja za Arduino koji može kontrolirati 5 strujnih vodova odjednom. Jedan problem, maksimalna struja koju ovi releji mogu izdržati je 10A, ali ja dobijam 2kW / 220V ~ 9A. To je praktično maksimum, a preporučljivo je imati rezervu od najmanje 25%. Međutim, odlučio sam da rizikujem. Štafete su pošteno trajale skoro nedelju dana, a onda su samo počele da se tope. Moralo se nešto odlučiti i to brzo, jer je bila zima i nije bilo moguće zaustaviti grijanje. Stoga su kupljeni releji od 30A, iako sa 12V namotajima. Stoga sam brzo zalemio tranzistor na svaki relej kako bih ih uključio sa 5V Arduina.

Shema je dobro funkcionirala skoro mjesec dana, a onda sam primijetio da je kuća nekako prevruća. Provjera je pokazala da je jedan relej zaglavljen u uključenom položaju. Kucnuo sam ga i ponovo je proradio, ali je trajalo samo nekoliko dana. Promenio sam ga u nadi da je kvar, ali nedelju dana kasnije isto se desilo i sa 2. štafetom. Nakon što sam instalirao zadnji rezervni, vratio sam se Aliju. Tamo su pronađeni specijalizovani releji za 40A Arduino! Ovo bi svakako trebalo biti dovoljno, pomislio sam. Par sedmica čekanja, a onda opet izbacim tranzistore i ugradim nove releje sa gotovim ožičenjem i indikacijom. Radost je kratko trajala, posle 2-3 nedelje štafeta se ponovo zaglavila. Počeo sam proučavati problem, ispostavilo se da kako bi se smanjilo opterećenje na releju i eliminiralo iskrenje kontakata, relej se mora uključiti ne nasumično, već u trenutku kada sinusoida napona prođe kroz 0. Pa , u teoriji, to se može učiniti pomoću našeg Arduina, samo povezivanjem kroz podjelu sve tri faze i praćenjem napona. Problem je u tome što relej ima određeno vrijeme odziva i, zapravo, još uvijek ga moramo eksperimentalno instalirati. Općenito, zadatak nije tako jednostavan.

I onda naiđem na tzv Solid State Relej, jednostavno rečeno, je električni krug sastavljen na snažnom tiristoru, u kućištu sličnom običnom releju. Jedna od njegovih prednosti je što nema mehanike, ništa se neće zalijepiti. Ne stvara snažne EM smetnje, što je važno za eternet, o čemu se govori u nastavku. Oni već sadrže krug koji uključuje i isključuje relej kada prođe nulu. Relej ima indikator uključenosti. Pa i oni ćute, iako za naš slučaj to nije toliko bitno. Nakon što smo proučili uputstva i karakteristike, naručili smo SSR-40DA, što na ruskom znači poluprovodnički relej sa konstantnom upravljačkom strujom od 3-5V i strujom opterećenja do 40A. Istovremeno sam odlučio malo odstupiti od principa „jednostavnije je bolje“ i kontrolirati struju u grijaćim elementima. To bi omogućilo da se sazna za pregorio grijač/relej ili nestanak struje na jednoj od faza. U svoju narudžbu sam dodao 20A strujni modul za kontrolu, iako su izgledali slabašni za takvu struju (kabl od 2,5 kvadrata nije čak ni stao u njihovu stezaljku). Kada su stigli releji i moduli za mjerenje struje, ispostavilo se da su releji prilično glomazni, pa je odlučeno da se sve što se tiče visokonaponskog dijela preseli na nova kutija, i ostavite Arduino u starom.

Nakon prvih eksperimenata ispostavilo se da sam potpuno zaboravio da se ovi releji, budući da su sklopljeni na tiristorima, prilično zagrijavaju. Nakon jednog dana rada releji su se toliko zagrijali da nisam mogao izdržati da ih držim prstom, odnosno 60C stepeni, a to je već blizu kritičnih 80C. Opet sam otišao kod Alija, smišljajući koje radijatore da prilagodim, a onda sam saznao da postoje standardni radijatori za ove SSR! Prilikom ugradnje radijatora, također sam otkrio da jedan modul za kontrolu struje više ne propušta struju, a sa strane ploče je vidljiva izgorjela trag. Još jedan modul također nije ulivao povjerenje, pa sam odlučio da ih sve uklonim. U ovom obliku, oni su i dalje prilično slabi i opasni, ali nisu od velike koristi. Problem odvajanja faza ili grijaćih elemenata do sada je stavljen po strani kao ne baš hitan, za 3 godine ni prvi ni drugi se nije dogodio ni jednom.

Sada o softveru

Arduino

Odmah u primjerima pronađen je komad koji je omogućio kontrolu prosječne snage, imajući binarnu kontrolu - uključeno i isključeno. Značenje je jednostavno, uzimamo određeni vremenski okvir, recimo, 1 minut, i u ciklusu uključujemo ili isključujemo opterećenje ovisno o proteklom vremenu. Odnosno, ako nam treba 50% snage, onda uključimo opterećenje u prvih 30 sekundi i isključimo ga u posljednjih 30, a zatim se ciklus ponavlja. Brzo sam ga pretvorio u 3 nezavisna releja, ako je snaga veća od 33%, onda uključujem drugi relej, ako je više od 66%, pa treći, pa prvi palim i gasim prema glavnom algoritam. Sada ustaje glavno pitanje, i koji algoritam treba koristiti za odabir snage? Budući da sam po profesiji programer, prvo sam odlučio da je problem prilično jednostavan, dodati još hladnoće, više topline i pokušao sam sve to shvatiti u mislima.

Ispostavilo se da to nije tako jednostavno. Bilo je korisno pogledati kako se to radi u prodanim sistemima, pokazalo se da je sve tamo ili jednostavno kao u pegli - +1C = isključeno, -1 = uključeno. Ali tada dobijamo skoro 4C oscilacije zbog inercije sistema! Ovo je pregrubo, jer podatke možemo dobiti sa tačnošću od desetinke stepena. Pogledao sam i algoritme za rad pomoću vanjske temperature zraka, ispostavilo se da su prilično jednostavni i radili na gotove stolove, koji su prethodno ožičeni i jednostavno mijenjani ovisno o gubitku topline kuće. Kopajući sve dublje i dublje, došao sam do dna industrijskih instalacija, gdje su algoritmi PID regulatora bili široko korišteni. I, o slava popularnosti, ispostavilo se da Arduino ima besplatnu PID biblioteku!

Nekoliko riječi o tome šta je PID u odnosu na naš slučaj. Poenta algoritma je u tome da mu kažemo potrebnu vrijednost određenog parametra (temperatura u kući) i u ciklusu propuštamo trenutnu vrijednost, a ona nam daje potreban efekat (snagu koju treba isporučiti na kotao). Ne ulazeći u detalje matematički model, kako to funkcionira sa stanovišta programera. Dakle, imamo temperaturu u prostoriji, neka bude 20C, željena temperatura je 22C i dajemo ih našem PID algoritmu.

Sam algoritam ima 3 nezavisna dijela, nazvana P, I i D. Prvi dio radi izuzetno jednostavno, gleda razliku između željene temperature i trenutne temperature. Odnosno, što je hladnije više snage algoritam će nam dati. Čini se da je to dovoljno, ali kod kuće imamo stalne gubitke topline, odnosno da bismo održali željenu temperaturu, moramo stalno osigurati neku vrstu struje. Odnosno, čak i ako je temperatura u prostoriji jednaka zadanoj, ne možete isključiti kotao, ali morate nekako tražiti neku vrstu snage koja je jednaka gubitku topline. A gubitak topline varira ovisno o vanjskoj temperaturi. To radi drugi dio, nazvan I. Algoritam pokušava odabrati snagu pri kojoj će naša temperatura biti konstantna. I čini se da je to sve sigurno, ali ne.

Činjenica je da sam kotao, rashladna tekućina, a posebno kuća imaju vrlo veliku inerciju. A ako kotao uključite na 100%, tada morate smanjiti snagu mnogo prije nego što temperatura dostigne željenu temperaturu, inače čak i sa potpuno gašenje imaćemo još vremena da pregrejemo prostoriju za 2 stepena.Ista stvar se dešava kada temperatura padne, potrebno je dodati struju čak i pre nego što temperatura dostigne željenu temperaturu. To je ono što radi treći dio algoritma D. Pa, sad, naravno, to je sve, ostaje samo razumjeti kojem dijelu dati koju težinu, ali to rade množitelji svakog dijela koje treba odabrati . Inače, izbor ovih množitelja je zaseban i prilično složen matematički problem, odabrao sam ih "na oko", prisjećajući se gore rečenog. Isprva sam stavio sve nule osim P i odabrao ga tako da samo uzbuđenje nije počelo. Zatim je dodao I, a na kraju D.

Mjerenje temperature

Za mjerenje temperature sve je naručeno na istoj magičnoj web stranici digitalni senzori temperature na osnovu DS18B20. Sam senzor je jednostavno prekrasan, ne treba ga ni na koji način kalibrirati ili konfigurirati, a ipak može mjeriti temperaturu sa zadatom tačnošću i komunicira sa Arduinom preko OneWier protokola. Odnosno, na 3 žice dužine do 50 metara možete objesiti gotovo neograničen broj senzora. Po želji se ne mogu ni napajati, već rade samo preko 2 žice (u stvari, napajaju se, ali iz žice sa signalom), ali rade sporije. U mom slučaju, naručio sam senzore u zatvorenom kućištu i spojio ih običnim kablom upredenog para. Ugradio sam 3 senzora, jedan u kotlarnici, jedan u kuci, u prostoriji, a jedan na tavanu ispod plafona, tavan se nikako ne greje i tu dobijam temperaturu napolju.

Spisak kupljenog hardvera

- Arduino ploča. Koristio sam UNO r3. Cijena oko 350 rub.
- Ethernet štit, oko 500 rub.
- upredeni par(u zavisnosti od toga koliko vam treba), uvala od 305m košta oko 4 hiljade.
- Senzori temperature, oko 200 rub.
- Napajanje za 110-240 - 12V 2A, 420 rub.
- Stabilizator LM7805, oko 20 rubalja.
- Relej SSR-40DA 3 kom. 330 rub.
- Radijatori za releje za 200 rubalja.

Odnosno, ne računajući upleteni par i sam kotao, cijeli projekat košta 4 hiljade rubalja.

Stavljamo podatke u bazu podataka i prikazujemo ih.

Ali sve je to, naravno, dobro, ali ne morate stalno stajati s kompjuterom pored bojlera, ipak biste željeli znati šta se dešava kod kuće, na daljinu putem interneta. Dugo sam imao najjednostavniji VPS server od majordoma za sve. Na njoj sam kreirao MySQL bazu podataka za pohranjivanje podataka o temperaturi.

Sada moramo nekako staviti podatke iz arduina u ovu bazu podataka. Da biste to učinili, naravno, morat ćete barem povezati arduino na internet, nije lako, ali vrlo jednostavno. Za ovo nam je potreban Ethernet Shield i njegova biblioteka. Jednostavan ruter sa "zviždaljkom" odavno je instaliran u kući, prvo od megafona, a zatim od yote. Povucite standardnu upredeni par na ruter i dodajte prijenos podataka u program. Prijenos se odvija putem poziva na stranicu u PHP-u sa parametrima - podacima. Na našem Internet serveru kreiramo stranicu pod nazivom temp.php

Greška pri učitavanju podataka!

";) else (echo "";) mysql_close($connect); ?>
Nakon ovoga imamo podatke o temperaturama i snazi ​​kotla, tako da ne moramo svaki put da ulazimo u bazu podataka, već pogledajte najnovije podatke, napisao sam “privremenu” skriptu u php-u, ali kao znate, ne postoji ništa trajnije od privremenih stvari, pa ih ja koristim.
gettemp.php

\n"; while ($line = mysql_fetch_array($result, MYSQL_NUM)) ( echo " $line"; eho" TempIN = $lineTempOUT = $line\n"; eho " TempKotel = $line\n"; eho " Snaga = $line\n"; ) echo "\n"; mysql_free_result($result); mysql_close($connect); ?>

Šta biste željeli dodati u budućnosti?

Naravno, ovo je, u principu, minimum, koji nam, međutim, omogućava da napravimo kompletan i dovoljan zgodna kontrola grijanje u maloj kući. Iako se uz neke modifikacije može koristiti u višesobnim i općenito zgradama bilo koje složenosti, arduino ovdje može učiniti mnogo, ako ne i sve. Upravo u ovaj projekat želim da dodam u budućnosti:
  • Regulator temperature. Iako je praksa pokazala da je 22,5 sasvim optimalna vrijednost i u principu ne zahteva prilagođavanje. Opet, želio bih da učinim kontroler udaljenim od glavnog arduina, ali za to trebate ili složeno kolo, ili neki drugi arduino. Generalno, ima o čemu razmišljati.
  • Želio bih da mogu ne samo očitati temperaturu, već i mijenjati PID parametre u hodu. Moguće je kreirati poseban način „početnog zagrijavanja“, inače je potrebno dosta vremena da se parametar I normalizuje nakon svakog ponovnog pokretanja programa.
  • Želio bih jednostavnu aplikaciju za Android kako ne bih morao da guram u mali pretraživač na svom telefonu. Ovo je najjednostavnija stvar i već je u toku.
  • Ipak, spojite senzor temperature rashladne tekućine i prenesite njegove podatke, kao i druge podatke o temperaturi.
  • Hitna signalizacija. Odnosno, automatski otkriva gubitak napona na linijama, kvar releja ili grijaćih elemenata.
  • Napravite "vrtuljak", promijenite odredišta grijaćih elemenata. U suprotnom, ispada da jedan grijaći element uvijek radi više od ostalih, a u teoriji bi trebao prvi otkazati. Samo trebate s vremena na vrijeme promijeniti PIN-ove u programu. Čini se jednostavno, ali jednostavno ne mogu doći do toga da ga dodam.
Tekst programa za Arduino:

#include #include #include #include #include #include // Primjer temperature OneWire DS18S20, DS18B20, DS1822 // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // Biblioteka DallasTemperature može obaviti sav ovaj posao za tebe! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(6); // na pin 10 (potreban je otpornik od 4,7K) DallasTemperature sensors(&ds); boolean waithTemp = false; int TEMPERATURE_PRECISION = 10; int lamp1 = 7; int lamp2 = 8; int lamp3 = 9; DeviceAddress IntThermometer = (0x28, 0x8E, 0xF4, 0x28, 0x05, 0x00, 0x00, 0x07); DeviceAddress OutThermometer = (0x28, 0x65, 0x15, 0x32, 0x05, 0x00, 0x00, 0xE2); Adresa uređaja KatThermometer = ( 0x28, 0x61, 0x43, 0x28, 0x05, 0x00, 0x00, 0x14); byte addr; unsigned long StartTime = 0; unsigned long WorkWindow = 60000; // 10min nepotpisano dugo radno vrijeme, TenTime; float maxData = 100; plutajući Celzijus, temp; dvostruka zadana vrijednost, ulaz, izlaz; int ThermometerCount; DeviceAddress Thermometer; PID myPID(&Input, &Output, &Setpoint, 10, 0.1, 5, DIRECT); //0,000006 0,03 40 double targetTemp = 22,5; bajt mac = (0xE0, 0x69, 0x95, 0x72, 0x65, 0xE8); bajt ip = (192, 168, 1, 100); bajt server = ( ?, ?, ?, ? ); EthernetClient klijent; byte webskipcount = 10; byte webcount = 0; void setup(void) ( Serial.begin(9600); //Ethernet.begin(mac, ip); Ethernet.begin(mac); sensors.begin(); pinMode(lamp1, OUTPUT); pinMode(lamp2, OUTPUT) ; pinMode(lamp3, OUTPUT); Setpoint = targetTemp; myPID.SetOutputLimits(0, maxData); myPID.SetMode(AUTOMATIC); celsius = targetTemp; StartTime = millis(); ) dugi filter (dugi x, dugi Nb, dugi k ) ( static long y = 0, z = 0; z += (x - y); return y = (Nb * z) >> k; ); void petlja(void) (bajt i; bajt type_s; bajt podaci; long Out; if (millis()< StartTime) { StartTime = millis(); } WorkTime = millis() - StartTime; if (WorkTime >WorkWindow) ( WorkTime = WorkTime - WorkWindow; StartTime = millis() + WorkTime; ) //Serial.println("cycle"); senzori.requestTemperatures(); celzijus = senzori.getTempC(IntThermometer); Ulaz = Celzijus; if (webcount >= webskipcount) ( bafer znakova; temperatura stringaS1 = dtostrf(celzijus, 2, 2, bafer); temperatura stringaS2 = dtostrf(sensors.getTempC(OutThermometer), 2, 2, bafer); temperatura nizaS3 = dtostrf(senzori .getTempC(KatThermometer), 2, 2, bafer); String OutputPowerS = dtostrf(Izlaz, 2, 2, bafer); String msg = "GET /temp.php?t1="+ temperaturaS1 + "&t2=" + temperaturaS2 + "&t3=" + temperatureS3 + "&p="+OutputPowerS; Serial.println(msg); client.connect(server, 80); client.println(msg); client.stop(); webcount = 0; ) ostalo ( webcount += 1; ) myPID.Compute(); //Serial.print(Input);Serial.print(" ");Serial.print(Output);Serial.print(" ");Serial.println(Setpoint); if (Izlaz > maxData/3*2) ( digitalWrite(lamp1, HIGH); digitalWrite(lamp2, HIGH); Out = Output - maxData/3*2; ) else if (Izlaz > maxData/3) ( digitalWrite(lamp1, HIGH); digitalWrite(lamp2, LOW); Out = Output - maxData/3; ) else ( digitalWrite(lamp1, LOW); digitalWrite(lamp2, LOW); Out = Output; ) TenTime = map(Out, 0, maxData/ 3, 0, WorkWindow); Serial.print(celzijus); Serial.print(" "); Serial.print(sensors.getTempC(OutThermometer)); Serial.print(" "); Serial.print(sensors.getTempC(KatThermometer)); Serial.print(" "); Serial.print(Izlaz); Serial.print(" "); Serial.print(TenTime); Serial.print(" "); Serial.println(WorkTime); if (Radno vrijeme< TenTime) { digitalWrite(lamp3, HIGH); } if (WorkTime >TenTime) ( digitalWrite(lamp3, LOW); ) )

Ja sam student na tehničkom fakultetu. Jednog dana, sedeći u kafiću sa prijateljem koji je tada studirao na medicinskom fakultetu, odlučili su da otvore bar. Bilo je mnogo ideja koje su, u principu, zaslužile pažnju. Na primjer, plesni podij koji mijenja ugao nagiba u zavisnosti od stila muzike... Ali, uz svu raznolikost ideja, tu je bila i još jedna -

…zar ne bismo trebali sami skuhati svoje pivo?

Nekoliko sedmica kasnije, skuvao sam pivo koristeći sastojke iz pivare u kojoj je radio prijatelj mog oca. Ali mnogi tehnološkim procesima bili su narušeni, pa je umjesto piva izašlo nešto ne baš ugodnog mirisa.

Nekoliko godina kasnije odlučio sam da ponovim proces, malo ga automatizujući koristeći Arduino UNO. I evo šta se dogodilo.

Počeću sa onim što bi trebalo da radi čitavo podešavanje.

  • Provjerite sami - da li sve radi, da li je sve povezano;
  • Očistite se;
  • Pripremite se za proces pripreme piva;
  • Skuvaj pivo na podu automatski način rada;
  • Kuhajte pivo ručno;
  • Kuvajte pivo automatski (kao veš mašina pere odeću).

Prva tačka u ovog trenutka nije implementirano. Za sada nemam ni razmišljanja kako to implementirati.
Drugi također nije implementiran, ali ću ga završiti u bliskoj budućnosti, samo ću čekati da mi isporuče pumpe sa ebay-a.
Treća tačka je prilično jednostavna.

Priprema za proces kuvanja

Poruka iz sistema da je potrebno sipati vodu u bačvu -> program čeka da se pritisne tipka OK -> program šalje arduino komanda za uključivanje solid-state releja -> solid-state relej uključuje grejač od jednog kilovata u bačvi, dovodi ga na temperaturu od 37 stepeni, šalje komandu programu da je sve spremno za kuvanje. Održava temperaturu od 37 stepeni.

Voleo bih da postoji provera na prisustvo vode, ali senzor još uvek čeka na slanje od „kineske braće“.

Kuvanje piva u poluautomatskom načinu rada

U principu, jednostavna procedura:

Kliknite na kontrolni program Dugme “Zagrijavanje”, ostala kontrolna dugmad su neaktivna;
- Nakon zagrevanja, program prikazuje poruku „Sve je spremno, možete kuvati“;
- Dodajte sastojke, odaberite program kuvanja - dugme „Puvanje piva“ postaje aktivno;
- Pritisnite dugme „Puvanje piva“, proces je započeo;
- Zatim će sistem periodično obavještavati informativne porukešta raditi i kada.

Morate slijediti upute.

Kuvanje piva ručno

Ovaj proces vam omogućava da podesite parametre kuvanja i da ih promenite tokom ciklusa kuvanja. Još nisam stigao do toga.

Automatsko kuhanje

To je san. Trenutno nema komponenti za implementaciju. Nema dovoljno pumpi i senzora nivoa vode. Ne znam kako da izmjerim gustinu sladovine, koliko alkohola ima u mladom pivu i još mnogo toga. Ali ne očajavam i automatizirat ću se postepeno dok kuhanje piva ne bude izgledalo ovako:

Ubacio sam sastojke u odgovarajuće tacne, pritisnuo dugme i... posle mesec i po dana sam dobio gotovo pivo.

Ovo je kratak pregled procesa, a sada pređimo na tehničku stranu.

Tehnička strana procesa

Kao što je gore navedeno, upravljački mikrokontroler je arduino UNO. Na njega su spojena 2 releja, 2
digitalni termometar DS18B20.

Arduino komunicira sa glavnim programom preko com porta. Jer Nemam pločicu s imenom u realnom vremenu za arduino, morao sam uzeti tajmere iz vizualnog C#. Nemam iskustva u pisanju programa, pa ako neko ima neku ideju ili kritiku, bila bih počastvovana. Kritikujte, cijepajte, da tako kažem, ako vam se odjednom ne sviđa.

Evo teksta programa na arduinu

#include OneWire ds(8); // temperaturni senzori se nalaze na pinu 8 int reley1 = 13; int reley2 = 12; int reley3 = 11; int reley4 = 10; int reley5 = 7; //omogući desetice int reley6 = 6; // grijanje na kaši tun float temp1; float temp2; void setup(void) ( Serial.begin(9600); pinMode(reley1,OUTPUT); pinMode(reley2,OUTPUT); pinMode(reley3,OUTPUT); pinMode(reley4,OUTPUT); pinMode(reley5,OUTPUT); pinMode( reley6,OUTPUT); digitalWrite(reley1,LOW); digitalWrite(reley2,LOW); digitalWrite(reley3,LOW); digitalWrite(reley4,LOW); digitalWrite(reley5,LOW); digitalWrite(reley6,LOW); ) void petlja (void) ( if (Serial.available()) ( switch (Serial.read())( case "i": infuz(); break; case "p": progrev(); break; case "a": avariya (); break; case "v": varka(); break; case "t": temperature(); break; ) ) ) void varka() ( digitalWrite(reley6, HIGH); while(Serial.read()! ="m") (temperatura(); if (temp1 >= 52.00) digitalWrite(reley6,LOW); else digitalWrite(reley6,HIGH); ) while(Serial.read()!="n") ( //digitalWrite (reley6,HIGH); temperatura(); if(temp1>= 62.00) digitalWrite(reley6,LOW); else digitalWrite(reley6,HIGH); ) while(Serial.read()!="b") ( //digitalWrite (reley6,HIGH);temperatura();if(temp1 >= 75.00) digitalWrite(reley6,LOW); ostalo digitalWrite(reley6,HIGH); ) digitalWrite(reley6,LOW); while(Serial.read()!="c") delay(1000); while(Serial.read()!="x") ( digitalWrite(reley5,HIGH); temperatura(); ) digitalWrite(reley5,LOW); ) void infuz() ( //temperature(); //Serial.available(); while (Serial.read()!="s")( //isključi ciklus kuhanja infuzije if (temp<=69.50) digitalWrite(reley5,HIGH); else digitalWrite(reley5,LOW); } digitalWrite(reley5,LOW); } void progrev() { while (temp1 <=36.00) temperature(); digitalWrite(reley6,HIGH); digitalWrite(reley6,LOW); //while (temperature() >40.0) //delay(1000); Serial.println("s"); ) void nezgoda())( digitalWrite(reley1,LOW); digitalWrite(reley2,LOW); digitalWrite(reley3,LOW); digitalWrite(reley4,LOW); digitalWrite(reley5,LOW); ) void temperature() (bajt i ; prisutan bajt = 0; bajt podaci; bajt adresa; bajt zator = (40, 23, 218, 43, 6, 0, 0, 22); // adresa temperaturnog senzora u mash bajtu varilka = (40, 255 , 240, 115 , 59, 4, 0, 234); //adresa temperaturnog senzora u posudi za kuhanje pluta celzijus; // float temp; boolean where; if (!ds.search(addr)) ( //Serial .println("Nema više adresa ."); //Serial.println(); ds.reset_search(); delay(250); // return; ) if (OneWire::crc8(addr, 7) != addr) ( Serial.println("CRC nije valjan!"); // povratak; ) ds.reset(); ds.select(addr); ds.write(0x44, 1); // započni konverziju, sa uključenim parazitskim napajanjem na kraju delay(840) ; // možda je 750 ms dovoljno, možda ne // možemo napraviti ds.depower() ovdje, ali reset će se pobrinuti za to. present = ds.reset(); ds.select (addr); ds.write (0xBE); // Čitaj Scratchpad za (i = 0; i< 9; i++) { // we need 9 bytes data[i] = ds.read(); } int16_t raw = (data << 8) | data; byte cfg = (data & 0x60); if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms celsius = (float)raw / 16.0; for(i = 0; i<8; i++) { if (addr[i] == zator[i]) gde = true; else { gde = false; break; } } if (gde) { Serial.print("t2 "); //temperatura варочника temp2 = celsius; Serial.print(temp2); Serial.println(); } else { Serial.print("t1 "); //температура затора temp2 = celsius; Serial.print(temp1); } }

Sve bi bilo u redu, ali iz nekog razloga treći senzor stalno pokazuje 85 stepeni. Ne mogu još reći zašto. I potrebno je za dalju automatizaciju - održavanje temperature u frižideru.

Ukratko ću opisati šta program radi.

Program je podijeljen na potprograme, od kojih se svaka aktivira ako se na com portu pojavi određeni simbol. Na primjer, ako slovo “p” uđe u port, aktivira se način “Zagrijavanje”. Ili, ako je “a”, tada se poziva potprogram avariya() i sve se isključuje. Prilikom pozivanja temperature() potprograma, podaci se zapisuju u globalne varijable temp1, temp2. Odatle ulaze u potrebne potprograme.

U budućnosti će postojati potprogrami za pripremu raznih sorti, pa čak i mjesečine.

Sada, u vezi sa glavnim kontrolnim programom.

Glavni kontrolni program

Napisano je u Visual Studio C#.

Izvorni kod programa:

Programski izvorni kod

korištenje sistema; koristeći System.Collections.Generic; koristeći System.ComponentModel; koristeći System.Data; koristeći System.Drawing; koristeći System.Linq; koristeći System.Text; koristeći System.Threading.Tasks; koristeći System.Windows.Forms; koristeći System.IO.Ports; imenski prostor WindowsFormsApplication1 ( javna djelomična klasa Form1: Form ( // String portnumber; SerialPort Port1 = new SerialPort("COM5", 9600); int s=0; public Form1() ( InitializeComponent(); ) /*private const int CP_NOCLOSE_BUTTON = 0x200; zaštićeno nadjačavanje CreateParams CreateParams ( get ( CreateParams myCp = base.CreateParams; myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON; return myCp; ) )*/ private void = Form1_Load (tobject2 sendere.) (tobject2 sendere.) PortName; Port1.Open(); ) //Provjera opreme private void button1_Click(object sender, EventArgs e) ( if (Port1.IsOpen == false) (pokušajte ( //program se može mijenjati informacije sa podrugomu.com/node /987 Port1.PortName = label2.Text; Port1.Open(); Port1.Write("Check"); //SerialPort Port2 = new SerialPort("COM4", 9600); //Port2.Open(); // label3.Text = Convert.ToString(Port2.ReadByte()); //provjera očitavanja porta MessageBox.Show("Proces provjere hardvera je započeo", "Informacijska poruka"); richTextBox1.Text = richTextBox1.Text + "\n" + "Pokreni proces provjere hardvera"+" "+DateTime.Now.ToString("HH:mm"); button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; if (Port1.ReadByte() == 1000) ( richTextBox1.Text = richTextBox1.Text + "\n" + "Završi proces provjere hardvera"+" "+DateTime.Now.ToString("HH:mm"); button1. Omogućeno = istina; button2.Enabled = istina; button3.Enabled = istina; Port1.Close(); MessageBox.Show("Kraj ciklusa provjere hardvera" +" "+ DateTime.Now.ToString("HH:mm")) ; richTextBox1.SaveFile("CheckLOG.rtf"); ) ) catch ( richTextBox1.Text = richTextBox1.Text + "\n" + "Greška procesa provjere hardvera" +" "+ DateTime.Now.ToString("H:mm" ) ; MessageBox.Show("Odabran je nevažeći port uređaja. Proces provjere se ne može pokrenuti", "Upozorenje"); richTextBox1.SaveFile("log/Check_"+DateTime.Now.ToString("ddMMyyyy")+".rtf" ) ; ) ) ) // Čišćenje opreme private void button3_Klik(object sender, EventArgs e) ( if (Port1.IsOpen == false) (pokušajte ( //program se može izmijeniti informacija sa podrugomu.com/node/987 MessageBox. Show(" Definitivno ste sipali dezinfekciono sredstvo", "UPOZORENJE", MessageBoxButtons.OK, MessageBoxIcon.Warning); Port1. PortName = label2.Text; Port1.Open(); Port1.Write("Clean"); MessageBox.Show("Proces čišćenja opreme je započeo", "Informativna poruka"); button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; if (Port1.ReadByte() == 1000) ( button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close(); MessageBox.Show("Kraj ciklusa čišćenja opreme"); ) ) catch ( MessageBox.Show("Odabran je nevažeći port uređaja. Proces čišćenja se ne može pokrenuti", "Upozorenje"); ) ) ) private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) ( ) private void cOM1ToolStripMenuItem_Click(object sendere, EvenArgs sender ) ( SerialPort Port1 = novi SerialPort("COM1", 9600); // MessageBox.Show("COM1 port odabran"); label1.Visible = true; label2.Text = "COM1"; ) private void label2_Click(object sender, EventArgs e) ( ) private void cOM2ToolStripMenuItem_Click(object sender, EventArgs e) ( SerialPort Port1 = new SerialPort("COM2", 9600); // MessageBox.Show("COM2 port selected"); label1.Visible = true; label2. Text = "COM2"; ) private void cOM3ToolStripMenuItem_Click(object sender, EventArgs e) ( SerialPort Port1 = new SerialPort("COM3", 9600); // MessageBox.Show("COM3 port odabran"); label1.Visible = istina; label2.Text = "COM3"; ) private void cOM4ToolStripMenuItem_Click(object sender, EventArgs e) ( SerialPort Port1 = new SerialPort("COM4", 9600); // MessageBox.Show("COM4 port selected"); label1.Visible = true; label2.Text = "COM4 "; ) private void cOM5ToolStripMenuItem_Click(object sender, EventArgs e) ( SerialPort Port1 = new SerialPort("COM5", 9600); // MessageBox.Show("COM5 port selected"); label1.Visible = true; label2.Text = "COM5"; ) private void cOM6ToolStripMenuItem_Click(object sender, EventArgs e) ( SerialPort Port1 = new SerialPort("COM6", 9600); // MessageBox.Show("COM6 port selected"); label1.Visible = true; label2. Text = "COM6"; ) private void cOM7ToolStripMenuItem_Click(object sender, EventArgs e) ( SerialPort Port1 = new SerialPort("COM7", 9600); // MessageBox.Show("COM7 port odabran"); label1.Visible = true; label2.Text = "COM5"; ) privatni void program BrewToolStripMenuItem_Click(object sender, EventArgs e) ( ) // Brew private void button2_Click(object sender, EventArgs e) ( // if (Port1.IsOpen == false) //( // probaj //( //program se može mijenjati informacije sa podrugomu.com/node/987 //Port1.PortName = label2. Tekst; //Port1.Open(); switch (label3.Text) ( case "Infusion mashing selected": MessageBox.Show("Proces mešanja infuzije je započeo", "Informaciona poruka"); Port1.WriteLine("i"); timer1.Start(); break; case " Cooper brew odabran": MessageBox.Show("Cooper proces mešanja je započeo", "Informaciona poruka"); Port1.WriteLine("v"); timer3.Start(); break; ) button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; // button5.Enabled = false; // richTextBox1.Text = Port1.ReadLine()+"\n"; /* if (Port1.ReadLine() == "e\r") ( button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; button5.Enabled = true; */ //Port1.Close( ); // MessageBox.Show("Kraj ciklusa kuhanja"); // ) // ) // catch //( // MessageBox.Show("Odabran je nevažeći port uređaja. Proces kuhanja ne može se pokrenuti", "Upozorenje "); //) // ) ) private void button5_Click(object sender, EventArgs e) ( Port1.Write("p"); button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; timer2. Start(); richTextBox1.Text = richTextBox1.Text + "\n" + "Počni zagrijati vodu u mješalici na 37 stepeni" + " " + DateTime.Now.ToString("HH:mm"); /* Port1. Open (); //Port1.Open(); //richTextBox1.Text = richTextBox1.Text + "\n" + Port1.ReadLine(); Port1.WriteLine("o"); Port1.Close(); */ ) private void exitToolStripMenuItem_Click(object sender, EventArgs e) ( Close(); ) private void button4_Click(object sender, EventArgs e) ( ) private void infusionMashToolStripMenuItem_Click(object sender, Event label selected, Event label selected"; ) private void timer1_Tick(pošiljalac objekta, EventArgs e) (textBox1.Text = Convert.ToString(Convert.ToInt32(s / 60)); textBox2.Text = Convert.ToString(Convert.ToInt32((s))); s++; label5.Text = Port1.ReadLine(); if (s==4200)( //70 minuta je 4200 sekundi timer1.Stop(); //timer2.Start(); //Port1.Open(); Port1.WriteLine ("s"); // Port1.Close(); MessageBox.Show("Infuziona kaša je gotova, sladovina treba da se filtrira"); button1.Enabled = true; button2.Enabled = true; button3.Enabled = true ; button5.Enabled = true; textBox1.Text = ""; textBox2.Text = ""; ) //Port1.Close(); ) private void label4_Click(object sender, EventArgs e) ( ) private void timer2_Tick(object sender, EventArgs e) ( label5 .Text = Port1.ReadLine(); if (Port1.ReadLine() == "s\r") ( timer2.Stop(); MessageBox.Show("Voda je 37 stepeni. Možete dodati slad i uključiti način gnječenja"); richTextBox1.Text = richTextBox1.Text + "\n" + "Kraj procesa pripreme kaše. T=37 stepeni" + " " + DateTime.Now.ToString("HH:mm"); button2.Enabled = true; ) ) private void emergencyDisableToolStripMenuItem_Click(object sender, EventArgs e) ( Port1.WriteLine("a"); MessageBox.Show("Korisnik ima hitno isključenje čitavog sistema"); ) private void mash tunToolStripMenuItem_Click(object sender, EventArgs e) ( Port1.WriteLine("k"); MessageBox.Show("Mash tun kip mode je uključen uključeno. Sačekajte 60 minuta") ; richTextBox1.Text = richTextBox1.Text + "\n" + "Način kuhanja kaše je uključen. Sačekajte 60 minuta" + " " + DateTime.Now.ToString("HH:mm") ; ) private void timer3_Tick(pošiljalac objekta, EventArgs e) (string s1 = ""; Port1.ReadLine(); if (s1.Substring(0, 2) == "t1") label5.Text = s1.Substring(4 , 5); if (s1.Substring (0, 2) == "t2") label9.Text = s1.Substring(4, 5); s++; if (s == 900) ( Port1.WriteLine("m" ); MessageBox.Show("Faza prepisivanja na 62 stepena"); richTextBox1.Text = richTextBox1.Text + "\n" + "Faza mešanja na 62 stepena" + " " + DateTime.Now.ToString("HH:mm" ); ) if(s== 2250) ( Port1.WriteLine("n"); MessageBox.Show("Faza trljanja na 78 stepeni"); richTextBox1.Text = richTextBox1.Text + "\n" + "Faza trljanja na 78 stepeni " + " " + DateTime.Now.ToString("HH:mm"); ) if (s ==2700) ( Port1.WriteLine("b"); MessageBox.Show("Mash faza je završena, možete isprazniti wort") ; richTextBox1.Text = richTextBox1.Text + "\n" + "Faza gnječenja je gotova. Možete isprazniti sladovinu" + " " + DateTime.Now.ToString("HH:mm"); ) ) privatno void normalToolStripMenuItem_Click(object sender, EventArgs e) ( label3.Text = "Cooper brew odabran"; ) ) )

Program komunicira sa arduinom preko com porta. Jedina stvar koju ne mogu da prevaziđem je da se pri prozivanju com porta program ne zamrzava dok se podprogram izvršava. Nakon završetka potprograma, program visi, ali za sada to nije kritično, pa čak i neka vrsta plusa. Otporan - da vas spriječi da pritisnete bilo šta tokom određene procedure.

Ukupno, program može

- pripremiti opremu za kuvanje;
- kuvar;
- napisati jednostavan dnevnik rada (vrlo koristan za dalju analizu pivarstva);
- odaberite port za povezivanje na kontrolni kontroler (arduino UNO);
prokuhati pivar i zgnječiti tun.

Kad stignu pumpe i elektromagnetni ventili, dodatno ću ih automatizirati. U međuvremenu ću svake nedjelje dodati jedan program kuvanja. Biće ukupno 5 programa. Implementacija ručnog načina rada također čeka na svoj red.
kao sto se kaze,

nastavlja se...

UPD:

Evo nekoliko fotografija pivare

Ovo je digestor. Imam dva ovakva. Senzor temperature DS18B20 u zatvorenom okviru je ugrađen sa strane.
Dugo nisam mogao razumjeti zašto se arduino povremeno smrzava, dok mi nije sinulo da sve treba uzemljiti, inače bi probio do kućišta, pa do kućišta senzora i do arduina.

Bakarna cijev iznutra služi za filtriranje sladovine. Može se učiniti ljepšim, ali je bolje koristiti lažno dno. Nažalost, Kinezi ne žure sa slanjem.

Još je rano govoriti o rezultatu, evo šta se desilo

Opšti pogled na bačvu izgleda ovako.

Korišteni obični konektori
za spajanje temperaturnih senzora, spojenih na duplu utičnicu. Pogodnije je oprati opremu. Isključio sam ga i odnio u kupatilo. Oprao sam ga, spojio i sve radi.

Sve je zapjenilo po rasporedu, nije iscurio višak. A moji neposredni planovi su da ocijedim seriju piva za dalju fermentaciju i skuham još jedno. Recept se, u principu, može vidjeti u kodu u potprogramu varka() arduina.

Konačno su stigli elektromagnetni ventili. Proces automatizacije se nastavlja.

Najbolji članci na ovu temu