Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Windows 8
  • Automatizacija za pivovaru BeerDuino temeljena na arduino mega. Automatizirani sustavi bazirani na Arduino mikrokontroleru

Automatizacija za pivovaru BeerDuino temeljena na arduino mega. Automatizirani sustavi bazirani na Arduino mikrokontroleru

Automatizacija u moderno društvopotrebna mjera, jer u digitalno doba izuzetno je važno isključiti ljudski faktor u raznim industrijama za standardizaciju i poboljšanje kvalitete proizvoda. Postoje i područja u kojima ljudi jednostavno ne mogu raditi ono što su roboti sposobni, na primjer, proizvodnja nanomaterijala i mikrosklopova.

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

Glavne prednosti automatiziranih sustava baziranih na Arduino mikrokontroleru

Nitko vam ne brani da sami zalemite svoju ploču i programirate je koristeći jezike niske razine. 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 skupom 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 zasuna s detektorom pokreta. Glavne prednosti po kojima je Arduino automatizacija poznata su:

  1. Niska ulazna barijera. Nije potrebno stjecati inženjersko obrazovanje, dovoljno je pogledati par videa za obuku i imati osnove programiranja.
  2. Veliki broj već pripremljenih knjižnica. Arduino koriste diljem CIS-a mnogi entuzijasti robotike, do te mjere da im proizvodnja različite elektronike postaje hobi. Sukladno tome, korisnička zajednica na internetu je izuzetno aktivna, objavljuje velik broj praznina i spremna vam pomoći u rješavanju problema. Kvaliteta biblioteka pati zbog niskog ulaznog praga, ali nitko vam ne brani da napravite vlastitu, dovoljno je proučiti semantiku jezika C++ ili koristiti gotove prevoditelje.
  3. Veliki broj perifernih uređaja. Nije važno trebate li automatizaciju staklenika temeljenu na Arduinu ili senzor svjetla, naći ćete sve module, uključujući senzore zvuka i prepoznavanje glasa. Da, neke ploče koštaju puno novca, ali uvijek možete pronaći jeftine analoge, na primjer, wi-fi modul iz trećih proizvođača esp8269, koji košta 10 puta manje od službenog.
  4. Puno informacija. Svaki problem s kojim se vi suočavate već se suočio s nekim drugim i vjerojatno ćete pronaći rješenje na Googleu. Tu je i kompletna literatura koju možete konzultirati.

Međutim, nemojte misliti da Arduino nema nedostataka. Ploča je poznata po svojim niskim performansama. Posebno složeni zadaci i kod 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 stvaranje neuronskih mreža ili korištenje medijskih datoteka. Naravno da se možete spojiti pomoćna karta memorije, ali to također povećava vrijeme odziva, oduzima dodatna sredstva za njenu ishranu i radi se na poluzanatski način.

Međutim, jednostavno automatizirani sustavi, na primjer, za kuhanje piva ili staklenika, ne zahtijevaju ni djelić resursa koje ploča može pružiti. Sukladno tome, većini korisnika ovi će nedostaci biti besmisleni. Ako odlučite sastaviti vlastiti 3-D printer ili složeniji dizajn, trebali biste bolje pogledati analoge. Ali prepreka ulasku za Arduino konkurente bit će mnogo veća.

Primjer automatizacije procesa na bazi Arduino mikrokontrolera

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

  1. Stvaranje posebne klime.
  2. Pravovremeno uključivanje i isključivanje rasvjete.
  3. Pravovremeno zalijevanje biljaka i održavanje vlažnosti zraka na istoj razini.

Na temelju ovih zadataka možete odmah primijetiti što ćete morati kupiti za glavnu ploču:

  1. Senzor temperature. Osigurat će da se zrak ne zagrijava ili hladi, unutar granica propisanih programom. Ako se temperatura promijeni, ploča će uključiti klima uređaj ili elektroničke baterije.
  2. Svijetli senzor. Naravno, možete se ograničiti programsko rješenje i kupiti skupe svjetiljke s imitacijom dnevno svjetlo. Ali ako želite stvoriti punopravni staklenik, tada će biti mnogo prikladnije instalirati automatski strop, koji će kontrolirati Arduino.
  3. Senzor vlažnosti. Ovdje je sve isto kao i s temperaturom, prema propisanom scenariju, odbor će uključiti prskalice i ovlaživače, ako je potrebno.

Kada kupite sve potrebne module, preostaje samo programirati ih. Uostalom, bez koda, to su samo dijelovi hardvera koji nisu sposobni ni za što.

Programiranje Arduino mikrokontrolera za automatizaciju procesa. Primjer

Kao iu prethodnoj točki, za programiranje je važno razdvojiti zadatak u zasebne podtočke i izvršavati ih uzastopno. Arduino programiranje se događa zahvaljujući naredbama u AT i AT+ sučelju, koristeći pripremljene biblioteke. Sukladno tome, svi scenariji su upisani posebno okruženje u C++ i prije nego bilo što poduzmete, posvetite vrijeme učenju njegove semantike. Osim nastupa jednostavne funkcije, sustav također može spremati skripte u flash memoriju, što nam je potrebno u ovom primjeru.

Ne zaboravite da informacije sa svakog senzora dolaze u stvarnom vremenu i kao varijable, ali možete ograničiti vrijeme odziva, jer nema potrebe trošiti resurse i stalno mjeriti svaki parametar. Sukladno tome, postavite vrijeme uključivanja i isključivanja za svaki senzor ili postavite vrijeme odziva za određeno razdoblje.

Htio bih dati još jedan primjer koristeći Arduino V pravi problemi. Ovdje ću predstaviti najjednostavniji, ali stvarno radni projekt za podešavanje grijanja kuće pomoću električnog kotla Temeljen na Arduinu. Stvarno se nadam da će ovaj članak pomoći nekome da odbaci svoje strahove i pokuša koristiti svoje ruke za njihovu namjenu; on jako dobro trenira vaše ruke, mozak i daje rijedak osjećaj zadovoljstva u stvaranju nečeg zanimljivog. Nakon što sam počeo raditi s ovim kontrolerom, još uvijek sam pomalo zbunjen mogućnostima koje se otvaraju njegovim korištenjem.

Priča

Zašto, zapravo, Arduino? Jednostavnost, dostupnost, puno dokumentacije i knjižnica. Kao vjerojatno mnogi, dugo sam pomno promatrao Arduino; od djetinjstva sam volio sve vrste baterija i motora, a evo nova razina, punopravni programski jezik i mnoštvo I/O mogućnosti. Kad su ga naši “najvjerojatniji gospodarski partneri” počeli proizvoditi, cijene su pale na prihvatljivu razinu. Kao rezultat toga, kupio sam početni kit i, trepćući očima na LED diode i indikatore, imao sam želju koristiti ga negdje oko kuće.

Što grijemo?

Moja baka živi u seoskoj kući blizu Moskve, nema normalne vodoopskrbe, plina, grijanja, a rješavanje svih tih 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. Tako je i moj - tipična kuća seljačke obitelji sredine 20. stoljeća, je kuća od brvana s jednom velikom sobom i kuhinjom. Nema drugih grijanih prostorija, što je za nas plus, dovoljno je za održavanje i kontrolu temperature u jednoj prostoriji.

Grijanje

Oprema za grijanje. Tradicionalno, kuća je imala pećno grijanje. Jedna "njemačka" peć u sobi (grije se zbog duge namotane cijevi), druga "ruska" u kuhinji (grije se zbog velike veličine samo ložište). Ako je netko okružen filmskim idejama da je pečenje cool, štoviše, prirodno i romantično, onda si mogu reći da ti ljudi nikada nisu živjeli u kući s peći. Zapravo, nije baš udobno, nezgodno i opasno od požara. Stoga je prije otprilike 5 godina naručen i implementiran projekt za ugradnju jednostavnog dvocijevnog sustava grijanja s plinskim kotlom. Kotao se trebao napajati iz plinskih boca.

Naknadno je odlučeno modernizirati sustav, dodati pumpu za prisilnu recirkulaciju rashladne tekućine i mali električni bojler od 2 kilovata, kako ne bi morali brinuti o paljenju plina kada još nije jako hladno. Sva se automatizacija svodila na postojanje velikog prekidača na zidu; kada je postalo prehladno, uključivao se, a kada je postalo prevruće, isključivao se. Dva kilovata bila su dovoljna dok temperatura nije dosegla 0°C, a onda je trebalo upaliti plin ili štednjak, što je bilo krajnje nezgodno.

Ekonomska svrsishodnost

Prije nego što se bilo što promijeni, naravno, odlučeno je razmisliti 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 dizelskog goriva, došao sam do zaključka da takve vrste grijanja nemaju smisla ako postoji dovoljna količina električne energije. Cijena cilindara je bila negdje oko 6-7 tisuća mjesečno,dizelsko gorivo ako se kupi nešto spaljeno ili ljetno zimi se uštedi i do 5 tisuća mjesečno dok na čistoj struji dođe 7 tisuća.Dodajmo ovdje trošak bojlera, stalno povlačenje cilindara i miris iz spreja, i bit će jasno da je struja puno jednostavnija i nimalo skuplja. Naravno, ima i modernih U zadnje vrijeme plamenici na pelete, ali mi nisu odgovarali, jer se ne mogu sami zapaliti i zato imaju minimalnu snagu, a nimalo malu (cca 5 kW), koju u 90% slučajeva jednostavno nema gdje staviti, a zahtijeva gorivo treba dodavati barem 2 puta tjedno, što ponekad nema tko učiniti. A trošak samih kotlova je red veličine veći 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 temelju potrošnje plina i drugih procjena, pokazalo se da je potrebno 4-5 kW, s marginom od 6. Pregled tržišta je pokazao da postoji model električnog kotla sličan onom koji je već instaliran, ali sa 3 grijača po 2 kW. Štoviše, prodavao se bez kontrola, što mi je bilo još zgodnije i jeftinije. Općenito, sam kotao je izuzetno jednostavan dizajn, metalni cilindar s ulaznim i izlaznim cijevima, poklopac pričvršćen vijcima na vrhu, u koji su učvršćeni grijaći elementi. Dodatno, 2 senzora su ugrađena u tijelo, otpornički senzor temperature i senzor koji se zatvara kada se pregrije, oba iz rashladnog sustava automobila. Sada se postavilo pitanje električne energije. Moja situacija je bila pojednostavljena činjenicom da se pored kuće nalazi radionica, na koju su spojene 3 faze (popularno - 380). Naravno, bilo je iskušenja da se svaki grijaći element napaja iz svoje faze, pa je nabavljen specijalizirani 4-žilni kabel u metalnoj pletenici za podzemnu instalaciju i ugrađen u kotlovnicu. Kabel je umetnut u ploču sa serijski spojenim RCD-om i blokom od 3 prekidača od 10A. Zatim je kabel išao izravno do ploče s arduinom, a odatle do električnog kotla.

Lagani hardver

Jasno je da ćemo grijaće elemente kontrolirati arduinom, pitanje je kako? Pridržavajući se načela - što jednostavnije, to pouzdanije, jednostavno ćemo ih uključiti ili isključiti pomoću releja bez ikakvih mogućnosti prijelaza. Nakon što sam surfao Aliexpressom, pronašao sam relejni blok za Arduino koji može kontrolirati 5 vodova odjednom. Jedan problem, najveća struja koju ovi releji mogu izdržati je 10 A, ali ja dobivam 2 kW / 220 V ~ 9 A. Odnosno, praktički maksimum, a preporučljivo je imati rezervu od najmanje 25%. Ipak, odlučio sam riskirati. Releji su iskreno trajali skoro tjedan dana, onda su se samo počeli topiti. Trebalo je nešto odlučiti i to brzo, jer bila je zima i nije bilo moguće zaustaviti grijanje. Stoga su kupljeni releji od 30 A, iako s namotima od 12 V. Stoga sam brzo zalemio tranzistor na svaki relej kako bih ih uključio s 5V Arduina.

Shema je dobro funkcionirala gotovo mjesec dana, a onda sam primijetio da je u kući nekako pretoplo. Provjera je pokazala da je jedan relej zapeo u uključenom položaju. Kucnuo sam ga i ponovno je počelo djelovati, ali trajalo je samo nekoliko dana. Promijenio sam ga u nadi da je kvar, ali tjedan dana kasnije isto se dogodilo s 2. relejem. Nakon što sam ugradio zadnji rezervni, vratio sam se Aliju. Tamo su pronađeni specijalizirani releji za 40A Arduino! Ovo bi svakako trebalo biti dovoljno, pomislio sam. Nekoliko tjedana čekanja, a onda opet izbacujem tranzistore i postavljam nove releje s gotovim ožičenjem i indikacijom. Radost je bila kratkog vijeka, nakon 2-3 tjedna relej je opet zapeo. Počeo sam proučavati problem, pokazalo se da kako bi se smanjilo opterećenje releja i uklonilo iskrenje kontakata, relej se mora uključiti ne nasumično, već u trenutku kada sinusoid napona prolazi kroz 0. Pa , u teoriji, to se može učiniti pomoću našeg Arduina, samo spajanjem kroz dijeljenje sve tri faze i promatranjem napona. Problem je u tome što relej ima određeno vrijeme odziva i, zapravo, još ga moramo eksperimentalno instalirati. Općenito, zadatak nije tako jednostavan.

I onda nailazim na tzv Kruto stanje Relej je, jednostavno rečeno, 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 jake EM smetnje, što je važno za ethernet, 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 šute i oni, iako za naš slučaj to i nije toliko bitno. Nakon proučavanja uputa i karakteristika, naručili smo SSR-40DA, što na ruskom znači poluprovodnički relej s konstantnom upravljačkom strujom od 3-5V i strujom opterećenja do 40A. U isto vrijeme, odlučio sam malo odstupiti od načela "jednostavnije je bolje" i također kontrolirati struju u grijaćim elementima. Tako bi se moglo otkriti pregorjeli grijač/relej ili nestanak struje na jednoj od faza. Dodao sam modul za kontrolu struje od 20A svojoj narudžbi, iako su izgledali slabašno za takvu struju (kabel od 2,5 kvadrata nije čak ni stao u njihovu stezaljku). Kada su stigli releji i moduli za mjerenje struje, pokazalo se da su releji dosta glomazni, pa je odlučeno da se sve što se tiče visokonaponskog dijela preseli u nova kutija, a Arduino ostaviti u starom.

Nakon prvih eksperimenata pokazalo se da sam potpuno zaboravio da se ovi releji, budući da su sastavljeni na tiristorima, prilično zagrijavaju. Nakon dana rada releji su se toliko zagrijali da nisam mogao izdržati prst na njima, dakle 60C stupnjeva, a to je već blizu kritičnih 80C. Opet sam otišao do Alija, smišljajući koje radijatore prilagoditi, a onda sam saznao da za ove SSR-ove postoje standardni radijatori! U trenutku postavljanja radijatora, također sam otkrio da jedan strujni upravljački modul sam više ne propušta struju, a na bočnoj strani ploče bila je vidljiva spaljena staza. Još jedan modul također nije ulijevao povjerenje, pa sam ih odlučio sve ukloniti. U ovom obliku, oni su još uvijek prilično slabi i opasni, ali nisu od velike koristi. Problem odspajanja faza ili grijaćih tijela dosad je stavljen po strani kao ne baš hitan, u 3 godine niti jednom se nije dogodilo ni prvo ni drugo.

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. Smisao je jednostavan, uzmemo određeni vremenski prozor, recimo 1 minutu, i u ciklusu uključimo ili isključimo opterećenje ovisno o proteklom vremenu. Odnosno, ako nam treba 50% snage, tada uključimo opterećenje u prvih 30 sekundi i isključimo ga u zadnjih 30, a zatim se ciklus ponavlja. Brzo sam ga pretvorio u 3 nezavisna releja, ako je snaga veća od 33%, onda uključim drugi relej, ako je više od 66%, onda treći, a prvi uključim i isključim prema glavnom algoritam. Sada ustaje glavno pitanje, i koji algoritam treba koristiti za odabir snage? Budući da sam programer po struci, prvo sam zaključio da je problem prilično jednostavan, dodao više hladnoće, više topline, i pokušao sve to shvatiti u svom umu.

Pokazalo se da to nije tako jednostavno. Bilo je korisno pogledati kako se to radi u prodanim sustavima, pokazalo se da je tamo sve jednostavno kao u glačalu - +1C = isključeno, -1 = uključeno. Ali tada dobivamo oscilacije od gotovo 4C zbog inercije sustava! Ovo je pregrubo, jer podatke možemo dobiti s točnošću od desetinke stupnja. Također sam pogledao algoritme za rad pomoću vanjske temperature zraka, pokazalo se da su prilično jednostavni i radili su na gotove tablice, koji su prethodno ožičeni i jednostavno su se mijenjali ovisno o gubitku topline kuće. Kopajući sve dublje i dublje, došao sam do dna industrijskih postrojenja, gdje su se algoritmi PID regulatora naširoko koristili. I, oh slavo popularnosti, pokazalo se da Arduino ima besplatnu PID knjižnicu!

Nekoliko riječi o tome što je PID u odnosu na naš slučaj. Poanta algoritma je da mu kažemo potrebnu vrijednost određenog parametra (temperatura u kući) iu ciklusu proslijeđujemo trenutnu vrijednost, a on nam daje potreban učinak (snaga koju treba dovesti kotao). Ne ulazeći u detalje matematički model, kako to funkcionira s programerskog gledišta. Dakle, imamo temperaturu u sobi, neka bude 20C, željena temperatura je 22C, i dajemo ih našem PID algoritmu.

Sam algoritam ima 3 neovisna dijela, nazvana P, I i D. Prvi dio radi krajnje jednostavno, gleda na 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 konstantne 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 ugasiti kotao, već morate nekako tražiti snagu jednaku 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 visoku inerciju. A ako uključite kotao na 100%, tada morate smanjiti snagu puno prije nego što temperatura dosegne željenu temperaturu, inače čak i s potpuno gašenje još ćemo imati vremena pregrijati prostoriju za 2 stupnja.Ista stvar se događa kada temperatura padne, morate dodati snagu čak i prije nego što temperatura dosegne željenu temperaturu. To je ono što čini treći dio algoritma D. Pa, sada, naravno, to je sve, sve što preostaje je shvatiti kojem dijelu dati koju težinu, ali to je ono što rade množitelji svakog dijela, koje treba odabrati . Usput, izbor ovih multiplikatora je zaseban i prilično složen matematički problem, odabrao sam ih "po oku", sjećajući se onoga što je gore rečeno. Prvo 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 čarobnoj web stranici digitalni senzori temperature temeljene na DS18B20. Senzor je sam po sebi jednostavno prekrasan, ne treba ga kalibrirati ili konfigurirati na bilo koji način, ali može mjeriti temperaturu sa zadanom točnošću, a s Arduinom komunicira preko OneWier protokola. Odnosno, na 3 žice duljine do 50 metara možete objesiti gotovo neograničen broj senzora. Po želji se ne mogu ni napajati, već rade samo preko 2 žice (zapravo se napajaju, 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 kabelom s upletenom paricom. Ugradio sam 3 senzora, jedan u kotlovnici, jedan u kući, u sobi, i jedan na tavanu ispod stropa, tavan se nikako ne grije i tamo dobivam temperaturu vani.

Popis kupljenog hardvera

- Arduino ploča. Koristio sam UNO r3. Cijena oko 350 rubalja.
- Ethernet Shield, oko 500 rub.
- upletena parica(ovisi koliko vam treba), uvala od 305m košta oko 4 tisuće kuna.
- 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.

To jest, ne računajući upleteni par i sam kotao, cijeli projekt košta 4 tisuće rubalja.

Stavljamo podatke u bazu i prikazujemo ih.

Ali sve je to, naravno, dobro, ali ne morate stalno stajati s računalom pored kotla, ipak biste željeli znati što se događa kod kuće, na daljinu putem interneta. Dugo sam imao onaj najjednostavniji VPS poslužitelj od majordoma za god. Na njemu sam stvorio MySQL bazu podataka za pohranu 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 s internetom, nije lako, ali vrlo jednostavno. Za ovo nam je potreban Ethernet Shield i njegova biblioteka. Jednostavan usmjerivač sa "zviždaljkom" odavno je instaliran u kući, prvo od megafona, a zatim od yote. Povucite standardnu upletena parica na usmjerivač i dodajte prijenos podataka u program. Prijenos se odvija pozivom stranice u PHP-u s parametrima - podacima. Na našem internet poslužitelju stvaramo stranicu pod nazivom temp.php

Pogreš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 ulaziti u bazu, ali pogledajte najnovije podatke, napisao sam “privremenu” skriptu u php-u, ali, kao znaš, nema ništa trajnije od privremenih stvari, pa ih koristim.
gettemp.php

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

Što biste željeli dodati u budućnosti?

Naravno, ovo je, u načelu, minimum, koji nam, međutim, omogućuje da budemo potpuni i dovoljni prikladna kontrola grijanje u maloj kući. Iako se uz neke izmjene može koristiti u višesobnim i općenito zgradama bilo koje složenosti, arduino tu može puno, ako ne i sve. Ovom projektu bih u budućnosti želio dodati:
  • Regulator temperature. Iako je praksa pokazala da je 22,5 sasvim optimalna vrijednost i u principu ne zahtijeva podešavanje. Opet, želio bih učiniti upravljač udaljenim od glavnog arduina, ali za ovo morate ili složeni sklop, ili neki drugi arduino. Općenito, postoji nešto o čemu treba razmišljati.
  • Želio bih moći ne samo očitavati temperaturu, već i mijenjati PID parametre u hodu. Moguće je stvoriti zaseban način "početnog zagrijavanja", u protivnom parametru I treba dugo da se normalizira nakon svakog ponovnog pokretanja programa.
  • Želio bih jednostavnu aplikaciju za Android da ne moram čačkati po malom pregledniku na telefonu. Ovo je najjednostavnija stvar i već je u tijeku.
  • Ipak, spojite osjetnik temperature rashladne tekućine i prenesite njegove podatke, kao i druge podatke o temperaturi.
  • Signalizacija u nuždi. To jest, automatski detektirati gubitak napona na vodovima, kvar releja ili grijaćih elemenata.
  • Napravite "vrtuljak", promijenite odredišta grijaćih elemenata. Inače, ispada da jedan grijaći element uvijek radi više od ostalih, iu teoriji bi trebao prvi pokvariti. Samo trebate povremeno promijeniti PIN-ove u programu. Čini se jednostavno, ali jednostavno ne mogu to dodati.
Tekst programa za Arduino:

#uključi #uključi #uključi #uključi #uključi #uključi // 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 pinu 10 (potreban je otpornik od 4,7 K) 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); DeviceAddress KatThermometer = (0x28, 0x61, 0x43, 0x28, 0x05, 0x00, 0x00, 0x14); adresa bajta; nepredpisano dugo vrijeme početka = 0; unsigned long WorkWindow = 60000; // 10min unsigned long WorkTime, TenTime; float maxData = 100; float celsius, temp; dvostruka zadana vrijednost, ulaz, izlaz; int ThermometerCount; DeviceAddress termometar; PID myPID(&ulaz, &izlaz, &postavka, 10, 0,1, 5, IZRAVNO); //0,000006 0,03 40 dvostruka ciljnaTemp = 22,5; bajt mac = (0xE0, 0x69, 0x95, 0x72, 0x65, 0xE8); bajt ip = (192, 168, 1, 100); bajt poslužitelj = (?, ?, ?, ?); EthernetClient klijent; bajt webskipcount = 10; bajt 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(); ) long filter(long x, long Nb, long k ) ( statički dugi y = 0, z = 0; z += (x - y); povratak y = (Nb * z) >> k; ); void petlja(void) ( byte i; byte type_s; byte data; long Out; if (milis()< StartTime) { StartTime = millis(); } WorkTime = millis() - StartTime; if (WorkTime >WorkWindow) ( WorkWindow = WorkWindow - WorkWindow; StartTime = millis() + WorkTime; ) //Serial.println("ciklus"); senzori.zahtjevTemperature(); Celzija = senzori.getTempC(IntTermometar); Ulaz = celzijus; if (webcount >= webskipcount) ( char buffer; String temperatureS1 = dtostrf(celsius, 2, 2, buffer); String temperatureS2 = dtostrf(sensors.getTempC(OutThermometer), 2, 2, buffer); String temperatureS3 = dtostrf(sensors .getTempC(KatThermometer), 2, 2, međuspremnik); String OutputPowerS = dtostrf(Izlaz, 2, 2, međuspremnik); String msg = "GET /temp.php?t1="+ temperatureS1 + "&t2=" + temperatureS2 + "&t3=" + temperatureS3 + "&p="+OutputPowerS; Serial.println(msg); client.connect(server, 80); client.println(msg); client.stop(); webcount = 0; ) else ( 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 (Output > 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, radni prozor); Serial.print(celzija); 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(Radno vrijeme); ako (Radno vrijeme< TenTime) { digitalWrite(lamp3, HIGH); } if (WorkTime >TenTime) ( digitalWrite(lamp3, LOW); ) )

Ja sam student na tehničkom sveučilištu. Jednog dana, sjedeći u kafiću s prijateljem koji je tada studirao na medicinskom sveučilištu, odlučili su otvoriti bar. Bilo je mnogo ideja koje su, u načelu, zasluživale pozornost. Na primjer, plesni podij koji mijenja kut nagiba ovisno o stilu glazbe... No, uz svu raznolikost ideja, pojavila se i još jedna -

...ne bismo li trebali kuhati vlastito pivo?

Nekoliko tjedana kasnije skuhao sam pivo koristeći sastojke iz pivovare u kojoj je radio očev prijatelj. Ali mnogi tehnološki procesi bile prekršene, pa je umjesto piva izašlo nešto ne baš ugodnog mirisa.

Nekoliko godina kasnije odlučio sam ponoviti proces, malo ga automatizirajući koristeći Arduino UNO. I evo što se dogodilo.

Počet ću s onim što bi cijeli setup trebao raditi.

  • Provjerite sami - radi li sve, je li sve povezano;
  • Očistite se;
  • Pripremite se za proces kuhanja;
  • Skuhajte pivo na podu automatski način rada;
  • Kuhajte pivo ručno;
  • Kuhajte pivo automatski (kao perilica za rublje pere odjeću).

Prva točka u ovaj trenutak nije implementirano. Zasad uopće nemam razmišljanja kako to implementirati.
Druga također nije implementirana, ali ću je završiti u skoroj budućnosti, samo ću čekati da pumpe s ebaya budu isporučene.
Treća točka je vrlo jednostavna.

Priprema za proces kuhanja piva

Poruka sustava da je potrebno uliti vodu u bačvu -> program čeka da se pritisne tipka OK -> program šalje arduino naredba za uključivanje poluprovodničkog releja -> poluprovodnički relej uključuje grijač od jednog kilovata u bačvi, dovodi ga na temperaturu od 37 stupnjeva, šalje naredbu programu da je sve spremno za kuhanje. Održava temperaturu od 37 stupnjeva.

Volio bih da postoji provjera prisutnosti vode, ali senzor još uvijek čeka da ga pošalju "braća Kinezi".

Kuhanje piva u poluautomatskom načinu rada

U principu, jednostavan postupak:

Kliknite na kontrolni program Gumb "Zagrijavanje", ostali kontrolni gumbi su neaktivni;
- Nakon zagrijavanja, program prikazuje poruku “Sve je spremno, možete kuhati”;
- Dodajte sastojke, odaberite program kuhanja - tipka “Kuhanje piva” postaje aktivna;
- Pritisnite gumb "Kuhanje piva", proces je započeo;
- Zatim će sustav povremeno obavijestiti informativne porukešto učiniti i kada.

Morate slijediti upute.

Kuhanje piva ručno

Ovaj postupak vam omogućuje postavljanje parametara kuhanja i njihovu promjenu tijekom ciklusa kuhanja. Još nisam došao do toga.

Automatsko kuhanje

To je san. Trenutno nema komponenti za implementaciju. Nema dovoljno pumpi i senzora razine vode. Ne znam kako mjeriti gustoću sladovine, koliko ima alkohola u mladom pivu i još mnogo toga. Ali ne očajavam i postupno ću automatizirati dok kuhanje piva ne bude izgledalo ovako:

Ubacio sam sastojke u odgovarajuće ladice, pritisnuo tipku i... nakon mjesec i pol dobio sam gotovo pivo.

Ovo je kratak pregled procesa, a sada prijeđ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 s glavnim programom preko com porta. Jer Nemam pločicu s nazivom u stvarnom vremenu za arduino, morao sam uzeti mjerače vremena iz Visual C#. Nemam iskustva s pisanjem programa, pa ako netko ima bilo kakvu ideju ili kritiku, bila bih počašćena. Kritizirajte, parajte, takoreći, ako vam se odjednom ne sviđa.

Ovdje je tekst programa na arduinu

#uključi OneWire ds(8); // senzori temperature nalaze se na pinu 8 int reley1 = 13; int relej2 = 12; int relej3 = 11; int relej4 = 10; int relej5 = 7; //omogući desetke int reley6 = 6; // grijanje na mash tun float temp1; temp2 plovka; 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); else digitalWrite(reley6,HIGH); ) digitalWrite(reley6,LOW); dok(Serial.read()!="c") kašnjenje(1000); dok(Serial.read()!="x") ( digitalWrite(reley5,HIGH); temperatura(); ) digitalWrite(reley5,LOW); ) void infuz() ( //temperature(); //Serial.available(); while (Serial.read()!="s")( //isključite ciklus kuhanja infuzije ako (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) //kašnjenje (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 ; bajt prisutan = 0; bajt podataka; bajt adresa; bajt zator = (40, 23, 218, 43, 6, 0, 0, 22); // adresa senzora temperature u kaši bajt varilka = (40, 255 , 240, 115 , 59, 4, 0, 234); //adresa temperaturnog senzora u posudi za kuhanje float celsius; // float temp; boolean gdje; 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 važeći!"); // return; ) ds.reset(); ds.select(addr); ds.write(0x44, 1); // početak konverzije, s uključenim parazitom at the end delay(840) ; // možda je 750 ms dovoljno, možda ne // mogli bismo 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; ja< 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 stupnjeva. Još ne mogu reći zašto. A potreban je za daljnju automatizaciju – održavanje temperature u hladnjaku.

Ukratko ću opisati što program radi.

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

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

Sada, što se tiče glavnog upravljačkog programa.

Glavni kontrolni program

Napisan je u Visual Studio C#.

Izvorni kod programa:

Izvorni kod programa

korištenje sustava; koristeći System.Collections.Generic; using 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; namespace WindowsFormsApplication1 ( public partial class 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(object sender, EventArgs e) ( label2.Text = Port1. PortName; Port1.Open(); ) //Provjera opreme private void button1_Click(object sender, EventArgs e) ( if (Port1.IsOpen == false) ( try ( //program se može modificirati informacijama s 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čitanja priključka 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. Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close(); MessageBox.Show("Kraj ciklusa provjere hardvera" +" "+ DateTime.Now.ToString("HH:mm")) ; richTextBox1.SaveFile("CheckLOG.rtf"); ) ) catch ( richTextBox1.Text = richTextBox1.Text + "\n" + "Pogreška procesa provjere hardvera" +" "+ DateTime.Now.ToString("HH:mm" ); MessageBox.Show("Odabran je nevažeći priključak uređaja. Proces provjere nije moguće pokrenuti", "Upozorenje"); richTextBox1.SaveFile("log/Check_"+DateTime.Now.ToString("ddMMyyyy")+".rtf" ) ; ) ) ) // Čišćenje opreme private void button3_Click(object sender, EventArgs e) ( if (Port1.IsOpen == false) ( try ( //programu se mogu mijenjati informacije iz podrugomu.com/node/987 MessageBox. Show(" Definitivno ste sipali sredstvo za dezinfekciju", "UPOZORENJE", MessageBoxButtons.OK, MessageBoxIcon.Warning); Port1. PortName = label2.Text; Port1.Open(); Port1.Write("Očisti"); MessageBox.Show("Počeo je proces čišćenja opreme", "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 priključak uređaja. Proces čišćenja se ne može pokrenuti", "Warninig"); ) ) ) private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) ( ) private void cOM1ToolStripMenuItem_Click(object sender, EventArgs e ) ( SerialPort Port1 = new SerialPort("COM1", 9600); // MessageBox.Show("COM1 port selected"); label1.Visible = true; label2.Text = "COM1"; ) private void label2_Click(objekt pošiljatelj, 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 = true; 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 odabran"); 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 selected"); 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) //( // pokušajte //( //programu se mogu modificirati informacije s podrugomu.com/node/987 //Port1.PortName = label2. Tekst; //Port1.Open(); switch (label3.Text) ( case "Odabrano miješanje infuzije": MessageBox.Show("Proces miješanja infuzije je započeo", "Informacijska poruka"); Port1.WriteLine("i"); timer1.Start(); break; case "Cooper brew odabran": MessageBox.Show("Počeo je postupak Cooper gnječenja", "Informacijska 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"); // ) // ) // uhvati //( // MessageBox.Show("Odabran je nevažeći priključak 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 zagrijavati vodu u posudi za kašu na 37 stupnjeva" + " " + DateTime.Now.ToString("HH:mm"); /* Port1. Otvori (); //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, EventArgs e) ( label3.Text = "InfusionMash selected"; ) privatni void timer1_Tick(pošiljatelj 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("infuzijska kaša je gotova, sladovina se mora filtrirati"); 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 ima 37 stupnjeva. Možete dodati slad i uključiti način gnječenja"); richTextBox1.Text = richTextBox1.Text + "\n" + "Kraj procesa pripreme kaše. T=37 stupnjeva" + " " + DateTime.Now.ToString("HH:mm"); button2.Enabled = true; ) ) private void hitnoDisableToolStripMenuItem_Click(object sender, EventArgs e) ( Port1.WriteLine("a"); MessageBox.Show("Korisnik je isključio cijeli sustav u hitnom slučaju"); ) private void mash kettleToolStripMenuItem_Click(object sender, EventArgs e) ( Port1.WriteLine("k"); MessageBox.Show("Mash tun mod kuhanja je uključeno. Pričekajte 60 minuta") ; richTextBox1.Text = richTextBox1.Text + "\n" + "Način kuhanja kaše je uključen. Pričekajte 60 minuta" + " " + DateTime.Now.ToString("HH:mm "); ) privatni void timer3_Tick(pošiljatelj objekta, EventArgs e) ( niz 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("Prepiši stadij na 62 stupnja"); richTextBox1.Text = richTextBox1.Text + "\n" + "Stadij gnječenja na 62 stupnja" + " " + DateTime.Now.ToString("HH: mm"); ) if(s== 2250) ( Port1.WriteLine("n"); MessageBox.Show("Trljajte stupanj na 78 stupnjeva"); richTextBox1.Text = richTextBox1.Text + "\n" + "Trljajte stupanj na 78 stupnjeva " + " " + DateTime.Now.ToString("HH:mm"); ) if (s ==2700) ( Port1.WriteLine("b"); MessageBox.Show("Mash faza je završena, možete isprazniti sladovina") ; richTextBox1.Text = richTextBox1.Text + "\n" + "Faza gnječenja je gotova. Možete ocijediti sladovinu" + " " + DateTime.Now.ToString("HH:mm"); ) ) privatno void normalToolStripMenuItem_Click(object sender, EventArgs e) ( label3.Text = "Cooper brew selected"; ) ) )

Program komunicira s arduinom preko com porta. Jedina stvar koju ne mogu nadvladati jest da se prilikom propitivanja com porta program ne zamrzne dok se potprogram izvršava. Nakon završetka potprograma, program visi, ali za sada to nije kritično i čak je neka vrsta plusa. Otporan na pogreške - da vas spriječi da bilo što pritisnete tijekom određenog postupka.

Sve u svemu, program može

- pripremiti opremu za kuhanje;
- kuhati;
- napisati jednostavan radni dnevnik (vrlo korisno za daljnju analizu pivarstva);
- odaberite port za spajanje na upravljački kontroler (arduino UNO);
skuhati pivovar i zgnječiti tun.

Kad stignu pumpe i solenoidni ventili, dalje ću ih automatizirati. U međuvremenu ću svake nedjelje dodati jedan program kuhanja. Ukupno će biti 5 programa. Implementacija ručnog načina rada također čeka na svoj red.
kako se kaže,

nastavit će se...

UPD:

Evo nekoliko fotografija pivovare

Ovo je digestor. Imam dvije takve. Sa strane je ugrađen senzor temperature DS18B20 u zatvorenom okviru.
Dugo nisam mogao shvatiti zašto se arduino povremeno smrzava, dok mi nije sinulo da sve treba uzemljiti, inače bi se probio do kućišta, zatim do kućišta senzora i do arduina.

Bakrena cijev unutar je za filtriranje sladovine. Može se učiniti ljepšim, ali bolje je koristiti lažno dno. Nažalost, Kinezi se ne žure da ga pošalju.

Još je rano govoriti o rezultatu, evo što se dogodilo

Opći pogled na bačvu izgleda ovako.

Korišteni obični konektori
za spajanje senzora temperature, spojen na dvostruku utičnicu. Pogodnije je oprati opremu. Ugasio sam ga i odnio u kupaonicu. Oprao sam ga, spojio i sve radi.

Sve se zapjenilo po rasporedu, nikakav višak nije iscurio. A moji neposredni planovi su ispustiti jednu seriju piva za daljnju fermentaciju i skuhati drugu. Recept se, u principu, može vidjeti u kodu u potprogramu varka() arduina.

Napokon su stigli magnetni ventili. Proces automatizacije se nastavlja.

Najbolji članci na temu