Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Windows 8
  • Automatizare pentru fabrica de bere BeerDuino bazată pe arduino mega. Sisteme automate bazate pe microcontroler Arduino

Automatizare pentru fabrica de bere BeerDuino bazată pe arduino mega. Sisteme automate bazate pe microcontroler Arduino

Automatizare în societate modernămasura necesara, pentru că în era digitala este extrem de important să excludem factorul umanîn diverse industrii pentru standardizarea și îmbunătățirea calității produselor. Există, de asemenea, zone în care oamenii pur și simplu nu pot face ceea ce sunt capabili roboții, de exemplu, producția de nanomateriale și microcircuite.

Cu toate acestea, automatizarea nu ajută doar la producție, dar poate fi utilă și pentru omul obișnuit. De exemplu, automatizarea unei fabrici de bere care utilizează Arduino poate simplifica semnificativ procesul de producere a unui produs. Să ne dăm seama cum poate ajuta automatizarea pentru rectificare pe Arduino și alte lucruri și să ne uităm la exemple.

Principalele avantaje ale sistemelor automatizate bazate pe microcontrolerul Arduino

Nimeni nu vă interzice să vă lipiți propria placă și să o programați singur folosind limbaje de nivel scăzut. Cu toate acestea, automatizarea folosind Arduino și microcontrolere gata făcute va facilita foarte mult întregul proces și va economisi timp. La urma urmei, este mult mai ușor să cumperi un produs gata făcut cu un set de biblioteci și să-l adaptezi nevoilor tale. Iar automatizarea la prețuri accesibile pe Arduino mega 2560 poate fi utilă în multe domenii ale vieții, de la comutatoare vocale la casă inteligentăși până la zăvoare electrice cu detector de mișcare. Principalele avantaje pentru care automatizarea Arduino este renumită sunt:

  1. Barieră scăzută la intrare. Nu este nevoie să obțineți o educație de inginer; este suficient să vizionați câteva videoclipuri de instruire și să aveți o bază în programare.
  2. Un număr mare de biblioteci deja pregătite. Arduino este folosit în întreaga CSI de mulți pasionați de robotică, până în punctul în care producția de diverse electronice devine hobby-ul lor. În consecință, comunitatea de utilizatori online este extrem de activă, postează un număr mare de spații libere și este gata să vă ajute să rezolvați orice problemă. Calitatea bibliotecilor suferă din cauza pragului scăzut de intrare, dar nimeni nu vă interzice să vă creați propria, este suficient să studiați semantica limbajului C++ sau să folosiți traducători gata făcute.
  3. Un număr mare de periferice. Nu contează dacă aveți nevoie de automatizare pentru seră bazată pe Arduino sau de un senzor de lumină, veți găsi orice module, inclusiv senzori de sunet și recunoaștere de voce. Da, unele plăci costă mulți bani, dar puteți găsi întotdeauna analogi ieftini, de exemplu, modul wi-fi din producători terți esp8269, care costă de 10 ori mai puțin decât cel oficial.
  4. O mulțime de informații. Orice problemă cu care te confrunți a fost deja confruntă de altcineva și probabil vei găsi o soluție pe Google. Există și literatură completă pe care o puteți consulta.

Cu toate acestea, să nu credeți că Arduino nu are defecte. Placa este renumită pentru performanța sa scăzută. În special sarcini complexe iar la cantitati mari Timpul de răspuns al codului poate ajunge la 1 secundă, ceea ce este inacceptabil pentru microcontrolere. Memoria flash a majorității modulelor nu depășește 1 MB, ceea ce nu este suficient pentru a crea rețele neuronale sau a utiliza fișiere media. Desigur, vă puteți conecta hartă auxiliară memorie, dar acest lucru mărește și timpul de răspuns, ia resurse aditionale pentru alimentația ei și se face într-un mod semi-artisanal.

Cu toate acestea, simplu sisteme automatizate, de exemplu, pentru fabricarea berii sau sere, nu necesită nici măcar o fracțiune din resursele pe care consiliul le poate oferi. În consecință, majoritatea utilizatorilor vor găsi aceste deficiențe lipsite de sens. Dacă decideți să vă asamblați propria imprimantă 3-D sau un design mai complex, ar trebui să aruncați o privire mai atentă asupra analogilor. Dar bariera de intrare pentru concurenții lui Arduino va fi mult mai mare.

Un exemplu de automatizare a proceselor bazat pe microcontrolerul Arduino

Cel mai simplu exemplu de automatizare a proceselor poate fi o seră folosind Arduino. Pentru a crea orice sistem, merită să definiți clar sarcinile pe care trebuie să le îndeplinească. Folosind o seră ca exemplu, aceasta ar fi:

  1. Crearea unui climat deosebit.
  2. Pornirea și oprirea în timp util a luminii.
  3. Udarea în timp util a plantelor și menținerea umidității aerului la același nivel.

Pe baza acestor sarcini, puteți observa imediat ce va trebui să cumpărați pentru placa principală:

  1. Senzor de temperatura. Se va asigura ca aerul sa nu se incalzeasca sau sa se raceasca, fiind in limitele prescrise de program. Dacă temperatura se schimbă, placa va porni aparatul de aer condiționat sau bateriile electronice.
  2. Senzor de lumina. Desigur, te poți limita soluție softwareși cumpărați lămpi scumpe cu imitație lumina zilei. Dar dacă doriți să creați o seră cu drepturi depline, atunci va fi mult mai convenabil să instalați un tavan automat, care va fi controlat de Arduino.
  3. Senzor de umiditate. Aici totul este la fel ca și cu temperatura, conform scenariului prescris, placa va porni pulverizatoarele și umidificatoarele, dacă este necesar.

Când achiziționați toate modulele necesare, nu rămâne decât să le programați. La urma urmei, fără cod, acestea sunt doar bucăți de hardware care nu sunt capabile de nimic.

Programarea microcontrolerelor Arduino pentru automatizarea proceselor. Exemplu

Ca și în punctul anterior, pentru programare este important să împărțiți sarcina în subpuncte separate și să le executați secvenţial. Programarea Arduino are loc datorită comenzilor din interfața AT și AT+, folosind biblioteci pregătite. În consecință, toate scenariile sunt înscrise mediu deosebitîn C++ și înainte de a face ceva, petreceți timp învățându-i semantica. Pe lângă performanţă funcții simple, sistemul este, de asemenea, capabil să stocheze scripturi în memoria flash, care este ceea ce avem nevoie în acest exemplu.

Nu uitați că informațiile de la fiecare senzor vin în timp real și ca variabile, dar puteți limita timpul de răspuns, deoarece nu este nevoie să cheltuiți resurse și să măsurați fiecare parametru în mod constant. În consecință, setați timpul de pornire și oprire pentru fiecare senzor sau setați timpul de răspuns pentru o anumită perioadă.

Aș dori să ofer un alt exemplu folosind Arduino V probleme reale. Aici am sa va prezint cel mai simplu, dar cu adevarat functional proiect de reglare a incalzirii unei case folosind un boiler electric pornit Bazat pe Arduino. Sper cu adevărat că acest articol va ajuta pe cineva să-și lase deoparte temerile și să încerce să-și folosească mâinile în scopul propus; vă antrenează foarte bine mâinile, creierul și oferă un sentiment rar de satisfacție în a crea ceva interesant. După ce am început să lucrez cu acest controler, sunt încă oarecum confuz de posibilitățile care se deschid atunci când îl folosesc.

Poveste

De ce, de fapt, Arduino? Simplitate, accesibilitate, multă documentație și biblioteci. Ca probabil mulți, mă uit cu atenție la Arduino de mult timp; din copilărie am iubit tot felul de baterii și motoare, iar aici nou nivel, un limbaj de programare cu drepturi depline și o mulțime de capabilități I/O. Când „partenerii noștri economici cel mai probabil” au început să o producă, prețurile au scăzut la un nivel acceptabil. Drept urmare, am cumpărat un kit de pornire și, după ce am clipit din ochi la LED-uri și indicatoare, am avut dorința de a-l folosi undeva prin casă.

Ce încălzim?

Bunica mea locuiește într-o casă de sat lângă Moscova, nu există alimentare normală cu apă, gaz, încălzire, iar rezolvarea tuturor acestor probleme necesită investiții mari sau muncă practică. Aici am văzut un loc în care puteți folosi pe deplin arduino, unde vă puteți extinde. Cel mai mare avantaj al unei case de țară este că în mod tradițional nu este mare și foarte simplă. La fel și al meu - casă tipică familie de țărani de la mijlocul secolului al XX-lea, este o casă din bușteni cu o cameră mare și o bucătărie. Nu există alte încăperi încălzite, ceea ce este un plus pentru noi; este suficient să menținem și să controlăm temperatura într-o singură cameră.

Incalzi

Echipamente de incalzire. În mod tradițional, casa avea încălzire la sobă. O sobă „germană” în cameră (se încălzește datorită unei țevi lungi de înfășurare), a doua „rusă” în bucătărie (se încălzește datorită dimensiuni mari focarul propriu-zis). Dacă cineva este înconjurat de idei de film că coacerea este mișto și, în plus, naturală și romantică, atunci îmi iau libertatea de a sugera că acești oameni nu au locuit niciodată într-o casă cu încălzire în sobă. De fapt, nu este foarte confortabil, incomod și un pericol de incendiu. Prin urmare, în urmă cu aproximativ 5 ani, a fost comandat și implementat un proiect de instalare a unui sistem simplu de încălzire cu două conducte cu boiler pe gaz. Cazanul trebuia să fie alimentat de la butelii de gaz.

Ulterior, s-a decis modernizarea sistemului, adăugarea unei pompe de recirculare forțată a lichidului de răcire și a unui cazan electric mic de 2 kilowați, pentru a nu fi nevoit să vă faceți griji pentru aprinderea gazului când nu este încă foarte frig. Toate automatizările s-au rezumat la prezența unui întrerupător mare pe perete; când se răcea prea mult, era pornit, iar când era prea cald, era oprit. Doi kilowați erau suficienți până când temperatura ajungea la 0°C; apoi trebuia să aprinzi gaz sau o sobă, ceea ce era extrem de incomod.

Oportunitatea economică

Înainte de a schimba ceva, firește, s-a decis să se ia în considerare dacă toată această idee avea deloc sens. După ce am calculat consumul de gaz din butelii din experiență și am estimat consumul așteptat de motorină, am ajuns la concluzia că nu are rost la astfel de tipuri de încălzire dacă există o cantitate suficientă de energie electrică. Pretul cilindrilor era undeva in jur de 6-7 mii pe luna, motorina, daca iti cumperi ceva ars sau vara iarna, poti economisi pana la 5 mii pe luna, in timp ce la electricitate pura primesti 7 mii. Sa adaugam aici costul cazanului, cilindrii de tragere constantă și mirosul de la pulverizare și va deveni clar că electricitatea este mult mai simplă și deloc mai scumpă. Desigur, există și la modă În ultima vreme arzătoare pe peleți, dar nu erau potrivite pentru mine, deoarece nu se pot aprinde singure și, prin urmare, au o putere minimă și deloc mică (aproximativ 5 kW), care în 90% din timp pur și simplu nu există unde să o pun și necesită combustibil trebuie adăugat de cel puțin 2 ori pe săptămână, ceea ce uneori nu are cine să facă. Și costul cazanelor în sine este cu un ordin de mărime mai mare Versiuni anterioare, deci sunt potrivite pentru casele mari unde este nevoie de mai multa putere si costuri mai mari, si nu in cazul meu.

Hardware greu

Am încercat să estimez puterea necesară pe baza consumului de gaz și a altor estimări, s-a dovedit că era nevoie de 4-5 kW, cu o marjă de 6. O analiză a pieței a arătat că există un model de boiler electric asemănător cu cel deja instalat, dar cu 3 elemente de încălzire de 2 kW fiecare. Mai mult, a fost vândut fără controale, ceea ce a fost și mai comod și mai ieftin pentru mine. În general, centrala în sine este extrem de design simplu, un cilindru metalic cu țevi de admisie și de evacuare, un capac atașat cu șuruburi deasupra, în care sunt fixate elemente de încălzire. În plus, în caroserie sunt încorporați 2 senzori, un senzor de temperatură rezistiv și un senzor care se închide la supraîncălzire, ambii din sistemul de răcire al mașinii. Acum s-a pus problema energiei electrice. Situația mea a fost simplificată de faptul că lângă casă se află un atelier, la care sunt conectate 3 faze (popular - 380). Desigur, a existat tentația de a alimenta fiecare element de încălzire din faza proprie, așa că a fost achiziționat și instalat în camera cazanului un cablu specializat cu 4 fire într-o împletitură metalică pentru instalare subterană. Cablul este introdus într-un panou cu un RCD conectat în serie și un bloc de 3 întreruptoare automate de 10A. În continuare, cablul a mers direct la panou cu arduino și de acolo la boilerul electric.

Hardware ușor

Este clar că vom controla elementele de încălzire cu arduino, întrebarea este cum? Respectând principiul - cu cât este mai simplu, cu atât mai fiabil, pur și simplu le vom porni sau opri folosind un releu fără opțiuni de tranziție. După ce am navigat pe Aliexpress, am găsit un bloc de relee pentru Arduino care poate controla 5 linii de alimentare simultan. O problemă, curentul maxim pe care îl pot suporta aceste relee este de 10A, dar primesc 2kW / 220V ~ 9A. Adică practic maximul, și este indicat să aveți o rezervă de minim 25%. Totuși, am decis să-mi asum un risc. Staletele sincer au durat aproape o săptămână, apoi tocmai au început să se topească. Ceva trebuia hotărât și repede, pentru că era iarnă și era imposibil să oprești încălzirea. Prin urmare, au fost achiziționate relee de 30A, deși cu înfășurări de 12V. Prin urmare, am lipit rapid câte un tranzistor la fiecare releu pentru a le porni de la Arduino de 5V.

Schema a funcționat bine timp de aproape o lună, apoi am observat că casa era cumva prea caldă. Verificarea a arătat că un releu era blocat în poziția pornit. L-am lovit și a început să funcționeze din nou, dar a durat doar câteva zile. L-am schimbat in speranta ca a fost un defect, dar o saptamana mai tarziu s-a intamplat acelasi lucru si cu a 2-a stafeta. După ce l-am instalat pe ultimul de rezervă, m-am întors la Ali. Acolo au fost găsite relee specializate pentru 40A Arduino! Acestea ar trebui să fie cu siguranță suficiente, m-am gândit. Câteva săptămâni de așteptare și apoi din nou arunc tranzistoarele și instalez relee noi cu cablaje și indicații gata făcute. Bucuria a fost de scurtă durată, după 2-3 săptămâni ștafeta s-a blocat din nou. Am început să studiez problema, se dovedește că pentru a reduce sarcina pe releu și pentru a elimina scânteia contactelor, releul trebuie să fie pornit nu la întâmplare, ci în momentul în care sinusoidul de tensiune trece prin 0. Ei bine , în teorie, acest lucru se poate face folosind Arduino, doar prin conectarea prin împărțirea tuturor celor trei faze și urmărirea tensiunii. Problema este că releul are un anumit timp de răspuns și, de fapt, mai trebuie să-l instalăm experimental. În general, sarcina nu este atât de simplă.

Și apoi dau peste așa-zisa Stare solidă Releul, simplu spus, este un circuit electric asamblat pe un tiristor puternic, într-o carcasă asemănătoare unui releu obișnuit. Unul dintre avantajele sale este că nu există mecanică, nimic nu se va lipi. Nu creează interferențe EM puternice, ceea ce este important pentru ethernet, care este discutat mai jos. Acestea conțin deja un circuit care pornește și oprește releul atunci când trece de zero. Releul are un indicator pornit. Ei bine, și ei sunt tăcuți, deși pentru cazul nostru acest lucru nu este atât de important. După ce am studiat instrucțiunile și caracteristicile, am comandat SSR-40DA, care în limba rusă înseamnă un releu cu stare solidă cu un curent de control constant de 3-5V și un curent de sarcină de până la 40A. În același timp, am decis să mă abat puțin de la principiul „mai simplu este mai bine” și, de asemenea, să controlez curentul din elementele de încălzire. Acest lucru ar face posibilă aflarea unui element de încălzire/releu ars sau a unei întreruperi de curent pe una dintre faze. Am adăugat la comandă un modul de control al curentului de 20A, deși păreau slab pentru un astfel de curent (cablul pătrat de 2,5 nici nu se potrivea în clema lor). Când au sosit releele și modulele de măsurare a curentului, s-a dovedit că releele erau destul de voluminoase, așa că s-a decis să se mute tot ce ține de partea de înaltă tensiune în cutie nouași lăsați Arduino în cel vechi.

După primele experimente, s-a dovedit că am uitat complet că aceste relee, deoarece sunt asamblate pe tiristoare, se încing destul de mult. După o zi de funcționare, releele au devenit atât de fierbinți încât nu am putut suporta să țin degetul pe ele, adică 60C grade, iar acest lucru este deja aproape de 80C critici. Am fost din nou la Ali, dându-mi seama ce calorifere să adaptez, apoi am aflat că există radiatoare standard pentru aceste SSR-uri! La momentul instalării radiatoarelor, am mai descoperit că un singur modul de control al curentului în sine nu mai trecea curent, iar pe partea laterală a plăcii era vizibilă o pistă arsă. Nici un alt modul nu a inspirat încredere, așa că am decis să le elimin pe toate. În această formă, sunt încă destul de slabe și periculoase, dar nu sunt de mare folos. Problema deconectarii fazelor sau a elementelor de incalzire a fost pusa deoparte ca nu foarte urgenta; in 3 ani, nici primul, nici al doilea nu s-a intamplat nici macar o data.

Acum despre software

Arduino

Imediat în exemple s-a găsit o piesă care a făcut posibilă controlul puterii medii, având control binar - pornit și oprit. Sensul este simplu, luăm o anumită fereastră de timp, să zicem, 1 minut, iar într-un ciclu pornim sau oprim încărcătura în funcție de timpul trecut. Adică, dacă avem nevoie de 50% din putere, atunci pornim încărcătura în primele 30 de secunde și o oprim în ultimele 30, apoi ciclul se repetă. L-am transformat rapid în 3 relee independente, dacă puterea este mai mare de 33%, atunci pornesc al doilea releu, dacă este mai mare de 66%, apoi al treilea, și îl pornesc și îl opresc pe primul în funcție de principalul algoritm. Acum se ridică întrebarea principală, și ce algoritm ar trebui utilizat pentru a selecta puterea? Fiind programator de profesie, am decis mai întâi că problema era destul de simplă, adaug mai multă frig, mai multă căldură și am încercat să-mi dau seama în mintea mea.

S-a dovedit că nu este atât de simplu. A fost util să ne uităm la modul în care se face acest lucru în sistemele vândute, s-a dovedit că totul este fie la fel de simplu ca într-un fier de călcat - +1C = oprit, -1 = pornit. Dar apoi obținem oscilații de aproape 4C din cauza inerției sistemului! Acest lucru este prea dur, deoarece putem obține date cu o precizie de o zecime de grad. M-am uitat și la algoritmii de lucru folosind temperatura aerului exterior, s-au dovedit a fi destul de simpli și au funcționat mese gata făcute, care au fost precablate și pur și simplu schimbate în funcție de pierderea de căldură a casei. Sapat din ce in ce mai adanc, am ajuns la fundul instalatiilor industriale, unde algoritmii de controler PID erau utilizati pe scara larga. Și, o glorie a popularității, se dovedește că Arduino are o bibliotecă PID gratuită!

Câteva cuvinte despre ce este PID în raport cu cazul nostru. Ideea algoritmului este că îi spunem valoarea necesară a unui anumit parametru (temperatura din interiorul casei) și într-un ciclu trecem valoarea curentă și ne dă efectul necesar (puterea care trebuie furnizată la cazanul). Fara a intra in detalii model matematic, cum funcționează din punctul de vedere al unui programator. Deci, avem temperatura în cameră, să fie 20C, temperatura dorită este 22C și le dăm algoritmului nostru PID.

Algoritmul în sine are 3 părți independente, numite P, I și D. Prima parte funcționează extrem de simplu, se uită la diferența dintre temperatura dorită și temperatura curentă. Adică cu cât este mai rece mai multă putere algoritmul ne va da. Se pare că este suficient, dar avem pierderi constante de căldură acasă, adică pentru a menține temperatura dorită, trebuie să furnizăm constant un fel de putere. Adică, chiar dacă temperatura din cameră este egală cu cea setată, nu poți opri centrala, dar trebuie să cauți cumva o putere egală cu pierderea de căldură. Și pierderile de căldură variază în funcție de temperatura de afară. Aceasta este ceea ce face a doua parte, numită I. Algoritmul încearcă să selecteze puterea la care temperatura noastră va fi constantă. Și se pare că asta este totul sigur, dar nu.

Cert este că centrala în sine, lichidul de răcire și mai ales casa au o inerție foarte mare. Și dacă porniți cazanul la 100%, atunci trebuie să reduceți puterea mult mai devreme decât temperatura atinge temperatura dorită, altfel chiar și cu oprire completă inca vom avea timp sa supraincalzim camera cu 2 grade.Acelasi lucru se intampla cand temperatura scade, trebuie sa adaugati putere chiar inainte ca temperatura sa ajunga la temperatura dorita. Aceasta este ceea ce face a treia parte a algoritmului D. Ei bine, acum, desigur, asta e tot, tot ce rămâne este să înțelegem ce parte să acorde ce pondere, dar asta fac multiplicatorii fiecărei părți, care trebuie selectați. . Apropo, selecția acestor multiplicatori este una separată și destul de complexă problema de matematica, le-am selectat „cu ochi”, amintindu-mi ce s-a spus mai sus. La început am pus toate zerourile, cu excepția lui P, și am selectat-o ​​astfel încât excitația în sine să nu înceapă. Apoi a adăugat I, iar la sfârșit D.

Luarea temperaturii

Pentru a măsura temperatura, totul a fost comandat pe același site magic senzori digitali temperaturi bazate pe DS18B20. Senzorul în sine este pur și simplu minunat, nu trebuie să fie calibrat sau configurat în niciun fel, dar poate măsura temperatura cu o anumită precizie și comunică cu Arduino prin protocolul OneWier. Adică pe 3 fire de până la 50 de metri lungime poți agăța un număr aproape nelimitat de senzori. Dacă se dorește, nici nu pot fi alimentate, ci funcționează doar prin 2 fire (de fapt, sunt alimentate, dar de la firul cu semnal), dar funcționează mai lent. În cazul meu, am comandat senzorii într-o carcasă sigilată și i-am conectat cu un cablu obișnuit cu pereche răsucită. Am montat 3 senzori, unul in camera cazanului, unul in casa, in camera, si unul la mansarda sub tavan, mansarda nu se incalzeste in niciun fel si acolo iau temperatura afara.

Lista hardware-ului achiziționat

- Placa Arduino. Am folosit UNO r3. Preț aproximativ 350 de ruble.
- Ethernet Shield, aproximativ 500 de ruble.
- pereche răsucită(în funcție de cât aveți nevoie), un golf de 305 m va costa aproximativ 4 mii.
- Senzori de temperatura, aproximativ 200 de ruble.
- Alimentare pentru 110-240 - 12V 2A, 420 rub.
- Stabilizator LM7805, aproximativ 20 de ruble.
- Releu SSR-40DA 3 buc. 330 de ruble.
- Radiatoare pentru relee pentru 200 de ruble.

Adică, fără a număra perechea răsucită și cazanul în sine, întregul proiect costă 4 mii de ruble.

Punem datele în baza de date și le afișăm.

Dar toate acestea, desigur, sunt bune, dar nu trebuie să stai în mod constant cu un computer lângă boiler; încă ai dori să știi despre ce se întâmplă acasă, de la distanță, prin Internet. Pe cel mai simplu l-am avut de mult timp Server VPS din majordomo pentru orice. Am creat o bază de date MySQL pe ea pentru a stoca datele de temperatură.

Acum trebuie să punem cumva datele de la arduino în această bază de date. Pentru a face acest lucru, desigur, va trebui să conectați cel puțin arduino la Internet, nu este ușor, dar foarte simplu. Pentru aceasta avem nevoie de Ethernet Shield și biblioteca sa. Un router simplu cu un „fluier” a fost instalat de mult în casă, mai întâi de la megafon și apoi de la yota. Trageți cel standard pereche răsucită la router și adăugați transfer de date în program. Transferul are loc printr-un apel către o pagină în PHP cu parametri - date. Creăm o pagină numită temp.php pe serverul nostru de Internet

Eroare de încărcare a datelor!

";) else (echo "";) mysql_close($connect); ?>
După aceasta, avem date despre temperaturile și puterea cazanului, ca să nu trebuie să intrăm de fiecare dată în baza de date, dar uită-te la ultimele date, am scris un script „temporar” în php, dar, ca știi, nu există nimic mai permanent decât lucrurile temporare, așa că ei le folosesc.
gettemp.php

\n"; while ($line = mysql_fetch_array($rezultat, MYSQL_NUM)) ( echo " $line"; ecou" TempIN = $lineTempOUT = $line\n"; ecou " TempKotel = $line\n"; ecou " Putere = $line\n"; ) echo "\n"; mysql_free_result($rezultat); mysql_close($connect); ?>

Ce ați dori să adăugați în viitor?

Desigur, acesta este, în principiu, un minim, care, totuși, ne permite să facem un complet și suficient control convenabilîncălzire într-o casă mică. Deși cu unele modificări poate fi folosit în mai multe camere și în general în clădiri de orice complexitate, arduino poate face multe aici, dacă nu totul. În acest proiect aș dori să adaug pe viitor:
  • Regulator de temperatura. Deși practica a arătat că 22,5 este destul valoare optimăși în principiu nu necesită ajustare. Din nou, aș dori să fac controlerul la distanță de la arduino principal, dar pentru asta trebuie să faceți oricare circuit complex, sau alt arduino. În general, este ceva de gândit.
  • Aș dori să pot nu numai să citesc temperatura, ci și să pot modifica din mers parametrii PID. Este posibil să se creeze un mod separat de „încălzire inițială”, altfel parametrul I durează mult timp pentru a se normaliza după fiecare repornire a programului.
  • Aș dori o aplicație simplă pentru Android, astfel încât să nu fiu nevoit să intru într-un browser mic de pe telefon. Acesta este cel mai simplu lucru și este deja în curs.
  • Totuși, conectați senzorul de temperatură a lichidului de răcire și transmiteți datele acestuia, ca și alte date de temperatură.
  • Semnalizare de urgență. Adică, detectează automat pierderea de tensiune pe linii, defecțiunea releelor ​​sau a elementelor de încălzire.
  • Faceți un „carusel”, schimbați destinațiile elementelor de încălzire. În caz contrar, se dovedește că un element de încălzire funcționează întotdeauna mai mult decât celelalte și, teoretic, ar trebui să eșueze primul. Trebuie doar să schimbați codurile PIN din program din când în când. Pare simplu, dar pur și simplu nu pot să-l adaug.
Textul programului pentru Arduino:

#include #include #include #include #include #include // Exemplu de temperatură OneWire DS18S20, DS18B20, DS1822 // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // Biblioteca DallasTemperature poate face toată această muncă Pentru dumneavoastră! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(6); // pe pinul 10 (este necesar un rezistor de 4,7K) Senzori de temperatură Dallas(&ds); boolean waithTemp = fals; 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 ); adresă octet; StartTime lung nesemnat = 0; WorkWindow lung nesemnat = 60000; // Timp de lucru lung nesemnat de 10 minute, TenTime; float maxData = 100; plutire celsius, temp; Punct de referință dublu, intrare, ieșire; int ThermometerCount; DeviceAddress Termometru; PID myPID(&Input, &Output, &Setpoint, 10, 0,1, 5, DIRECT); //0,000006 0,03 40 dublu targetTemp = 22,5; octet mac = ( 0xE0, 0x69, 0x95, 0x72, 0x65, 0xE8 ); byte ip = (192, 168, 1, 100); server de octeți = (?, ?, ?, ?); Client EthernetClient; byte webskipcount = 10; webcount byte = 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(); ) filtru lung (lung x, lung Nb, lung k ) ( static lung y = 0, z = 0; z += (x - y); return y = (Nb * z) >> k; ); void loop(void) (byte i; byte type_s; byte data; long Out; if (millis())< StartTime) { StartTime = millis(); } WorkTime = millis() - StartTime; if (WorkTime >WorkWindow) ( WorkTime = WorkTime - WorkWindow; StartTime = millis() + WorkTime; ) //Serial.println("ciclu"); senzori.requestTemperatures(); celsius = senzori.getTempC(IntThermometer); Intrare = celsius; if (număr web >= webskipcount) ( buffer char; String temperatureS1 = dtostrf(celsius, 2, 2, buffer); String temperatureS2 = dtostrf(sensors.getTempC(OutThermometer), 2, 2, buffer); String temperatureS3 = dtostrf(senzori .getTempC(KatThermometer), 2, 2, buffer); String OutputPowerS = dtostrf(Output, 2, 2, buffer); 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(Intrare);Serial.print(" ");Serial.print(Ieșire);Serial.print(" ");Serial.println(Setpoint); if (Ieșire > maxData/3*2) ( digitalWrite(lamp1, HIGH); digitalWrite(lamp2, HIGH); Out = Output - maxData/3*2; ) else if (Ieșire > maxData/3) ( digitalWrite(lamp1, HIGH); digitalWrite(lamp2, LOW); Out = Ieșire - maxData/3; ) else ( digitalWrite(lamp1, LOW); digitalWrite(lampă2, LOW); Out = Output; ) TenTime = map(Out, 0, maxData/ 3, 0, WorkWindow); Serial.print(celsius); Serial.print(" "); Serial.print(senzori.getTempC(OutThermometer)); Serial.print(" "); Serial.print(senzori.getTempC(KatThermometer)); Serial.print(" "); Serial.print(Ieșire); Serial.print(" "); Serial.print(TenTime); Serial.print(" "); Serial.println(WorkTime); dacă (Timp de lucru< TenTime) { digitalWrite(lamp3, HIGH); } if (WorkTime >TenTime) ( digitalWrite (lamp3, LOW); ) )

Sunt student la o universitate tehnică. Într-o zi, stând într-o cafenea cu un prieten care atunci studia la o facultate de medicină, au decis să deschidă un bar. Au fost multe idei care, în principiu, meritau o oarecare atenție. De exemplu, un ring de dans care schimbă unghiul de înclinare în funcție de stilul de muzică... Dar, alături de toată varietatea de idei, a mai fost și una -

… nu ar trebui să ne producem propria bere?

Câteva săptămâni mai târziu, am fabricat bere folosind ingrediente de la fabrica de bere unde lucra prietenul tatălui meu. Dar multe procese tehnologice au fost încălcate, așa că în loc de bere a ieșit ceva cu un miros nu prea plăcut.

Câțiva ani mai târziu am decis să repet procesul, automatizându-l puțin cu folosind Arduino O.N.U. Și asta s-a întâmplat.

Voi începe cu ceea ce ar trebui să facă întreaga configurație.

  • Verificați-vă - totul funcționează, este totul conectat;
  • Curata-te;
  • Pregătiți-vă pentru procesul de preparare a berii;
  • Prepara bere pe podea mod automat;
  • Preparați berea manual;
  • Preparați berea automat (cum ar fi mașină de spălat spală rufe).

Primul punct în acest moment neimplementat. Până acum nu am nici măcar gânduri despre cum să o implementez.
Nici cel de-al doilea nu a fost implementat, dar îl voi termina în viitorul apropiat, doar aștept să fie livrate pompele de pe ebay.
Al treilea punct este destul de simplu.

Pregătirea pentru procesul de preparare a berii

Un mesaj de la sistem că este necesar să turnați apă în cuvă -> programul așteaptă apăsarea tastei OK -> programul trimite comanda arduino pentru a porni releul de stare solidă -> releul de stare solidă pornește elementul de încălzire de un kilowatt din cuvă, îl aduce la o temperatură de 37 de grade, trimite o comandă la program că totul este gata de gătit. Mentine o temperatura de 37 de grade.

Aș dori să se verifice prezența apei, dar senzorul încă așteaptă să fie trimis de la „frații chinezi”.

Prepararea berii în modul semi-automat

În principiu, o procedură simplă:

Click pe program de control Butonul „Încălzire”, celelalte butoane de control sunt inactive;
- După încălzire, programul afișează mesajul „Totul este gata, poți găti”;
- Adăugați ingredientele, selectați programul de preparare - devine activ butonul „Brewing Beer”;
- Apăsați butonul „Brewing Beer”, procesul a început;
- În continuare, sistemul va notifica periodic mesaje informative ce să faci și când.

Trebuie să urmați instrucțiunile.

Prepararea berii manual

Acest proces vă permite să setați parametrii de gătit și să îi modificați în timpul ciclului de gătit. Nu am ajuns încă la asta.

Gătit automat

E un vis. În prezent, nu există componente de implementat. Nu sunt suficiente pompe și senzori de nivel de apă. Nu știu cum să măsoare densitatea mustului, cât de mult alcool este în berea tânără și multe altele. Dar nu disper și mă voi automatiza treptat până când prepararea berii arată așa:

Am aruncat ingredientele în tăvile corespunzătoare, am apăsat butonul și... după o lună și jumătate am primit berea finită.

Aceasta este o scurtă prezentare generală a procesului, acum să trecem la partea tehnică.

Partea tehnică a procesului

După cum sa menționat mai sus, microcontrolerul de control este arduino UNO. La el sunt conectate 2 relee, 2
termometru digital DS18B20.

Arduino comunică cu programul principal prin portul com. Deoarece Nu am o plăcuță de identificare în timp real pentru arduino, a trebuit să iau cronometre din visual c#. Nu am experiență în scris programe, așa că dacă cineva are idei sau critici, aș fi onorat. Criticați, rupeți, ca să spunem așa, dacă dintr-o dată nu vă place.

Iată textul programului pe arduino

#include OneWire ds(8); // senzorii de temperatură sunt amplasați pe pinul 8 int reley1 = 13; int reley2 = 12; int reley3 = 11; int reley4 = 10; int reley5 = 7; //activează tens int reley6 = 6; // se încălzește pe mash 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); ) buclă goală (void) (dacă (Serial.available()) ( comutați (Serial.read()) (case "i": infuz(); break; case "p": progrev(); break; case "a": avariya (); break; case "v": varka(); break; case "t": temperatură(); break; ) ) ) void varka() ( digitalWrite(reley6, HIGH); while(Serial.read()! ="m") (temperatură(); dacă (temp1 >= 52.00) digitalWrite(reley6,LOW); else digitalWrite(reley6,HIGH); ) while(Serial.read()!="n") ( //digitalWrite (reley6,HIGH); temperatură(); if(temp1>= 62.00) digitalWrite(reley6,LOW); else digitalWrite(reley6,HIGH); ) while(Serial.read()!="b") ( //digitalWrite (reley6,HIGH);temperature(); if(temp1 >= 75.00) digitalWrite(reley6,LOW); else 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")( //opriți ciclul de preparare a infuziei dacă (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) //întârziere(1000); Serial.println("s"); ) accident accident())( digitalWrite(reley1,LOW); digitalWrite(reley2,LOW); digitalWrite(reley3,LOW); digitalWrite(reley4,LOW); digitalWrite(reley5,LOW); ) void temperature() (octetul i ; byte prezent = 0; byte data; byte addr; byte zator = (40, 23, 218, 43, 6, 0, 0, 22); // adresa senzorului de temperatură din mash byte varilka = (40, 255 , 240, 115 , 59, 4, 0, 234); //adresa senzorului de temperatură din cuva de preparare float celsius; // float temp; boolean unde; if (!ds.search(addr)) ( //Serial .println("Nu mai sunt adrese."); //Serial.println(); ds.reset_search(); delay(250); // return; ) if (OneWire::crc8(addr, 7) != addr) ( Serial.println("CRC nu este valid!"); // return; ) ds.reset(); ds.select(addr); ds.write(0x44, 1); // începe conversia, cu pornirea parazitului la final delay(840) ; // poate 750ms este suficient, poate nu // am putea face un ds.depower() aici, dar resetarea se va ocupa de asta. prezent = ds.reset(); ds.select (addr); ds.write (0xBE); // Citiți Scratchpad pentru (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); } }

Totul ar fi bine, dar din anumite motive al treilea senzor arată în mod constant 85 de grade. Nu pot spune încă de ce. Și este necesar pentru o automatizare suplimentară - menținerea temperaturii în frigider.

Voi descrie pe scurt ce face programul.

Programul este împărțit în subrutine, fiecare dintre acestea fiind activată dacă pe portul com apare un anumit simbol. De exemplu, dacă litera „p” intră în port, modul „Încălzire” este activat. Sau, dacă „a”, atunci subrutina avariya() este apelată și totul este oprit. La apelarea subrutinei temperature(), datele sunt scrise în variabilele globale temp1, temp2. De acolo intră în subrutinele necesare.

În viitor, vor exista subrutine pentru prepararea diferitelor soiuri și chiar luciu de lună.

Acum, referitor la programul principal de control.

Programul principal de control

Este scris în Visual Studio C#.

Cod sursa programului:

Codul sursă al programului

folosind System; folosind System.Collections.Generic; folosind System.ComponentModel; folosind System.Data; folosind System.Drawing; folosind System.Linq; folosind System.Text; folosind System.Threading.Tasks; folosind System.Windows.Forms; folosind System.IO.Ports; namespace WindowsFormsApplication1 ( clasă parțială publică Form1: Form ( // String portnumber; SerialPort Port1 = new SerialPort("COM5", 9600); int s=0; public Form1() ( InitializeComponent(); ) /*private const int CP_NOCLOSE_BUTTON = 0x200; suprascris protejat CreateParams CreateParams ( get ( CreateParams myCp = base.CreateParams; myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON; return myCp; ) )*/ private void Form1_Load = Event(arbel2 Port sender.1_Load) PortName; Port1.Open(); ) //Verificarea echipamentului private void button1_Click(obiect sender, EventArgs e) ( dacă (Port1.IsOpen == false) ( încercați ( //programul poate fi modificat informațiile de pe podrugomu.com/node) /987 Port1.PortName = label2.Text; Port1.Open(); Port1.Write(„Verificare”); //SerialPort Port2 = nou SerialPort(„COM4”, 9600); //Port2.Open(); // label3.Text = Convert.ToString(Port2.ReadByte()); //verificarea citirilor portului MessageBox.Show(„Procesul de verificare hardware a început”, „Mesaj de informare”); richTextBox1.Text = richTextBox1.Text + "\n" + "Începe procesul de verificare hardware"+" "+DateTime.Now.ToString("HH:mm"); button1.Enabled = fals; button2.Enabled = fals; button3.Enabled = fals; if (Port1.ReadByte() == 1000) ( richTextBox1.Text = richTextBox1.Text + "\n" + "Încheierea procesului de verificare hardware"+" "+DateTime.Now.ToString("HH:mm"); butonul1. Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close(); MessageBox.Show ("Sfârșitul ciclului de verificare hardware" +" "+ DateTime.Now.ToString ("HH:mm")) ; richTextBox1.SaveFile("CheckLOG.rtf"); ) ) catch ( richTextBox1.Text = richTextBox1.Text + "\n" + "Eroare proces de verificare hardware" +" "+ DateTime.Now.ToString("HH:mm" ); MessageBox.Show("Port dispozitiv nevalid selectat. Procesul de verificare nu poate fi pornit", "Warninig"); richTextBox1.SaveFile("log/Check_"+DateTime.Now.ToString("ddMMyyyy")+".rtf" ) ; ) ) ) // Curăţarea echipamentelor private void button3_Click(obiect sender, EventArgs e) ( dacă (Port1.IsOpen == false) ( încercați ( //programul poate fi modificat informații de la podrugomu.com/node/987 MessageBox). Show(" Cu siguranță ați turnat dezinfectant", "AVERTISMENT", MessageBoxButtons.OK, MessageBoxIcon.Warning); Port1. PortName = label2.Text; Port1.Open(); Port1.Write("Curățare"); MessageBox.Show(„Procesul de curățare a echipamentului a început”, „Mesaj de informare”); button1.Enabled = fals; button2.Enabled = fals; button3.Enabled = fals; if (Port1.ReadByte() == 1000) ( button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close(); MessageBox.Show("Sfârșitul ciclului de curățare a echipamentului"); ) ) catch ( MessageBox.Show("Portul dispozitivului invalid selectat. Procesul de curățare nu poate fi pornit", "Warninig"); ) ) ) private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) ( ) private void cOM1ToolStripMenuItem_Click(object sender, EventArgs) ) ( SerialPort Port1 = nou SerialPort("COM1", 9600); // MessageBox.Show("COM1 port selectat"); label1.Visible = true; label2.Text = "COM1"; ) private void label2_Click(obiect sender, EventArgs e) ( ) private void cOM2ToolStripMenuItem_Click(sender obiect, EventArgs e) ( SerialPort Port1 = new SerialPort("COM2", 9600); // MessageBox.Show("COM2 port selected"); label1.Visible = true; label2. Text = "COM2"; ) private void cOM3ToolStripMenuItem_Click(exmițător obiect, EventArgs e) ( SerialPort Port1 = new SerialPort("COM3", 9600); // MessageBox.Show("COM3 port select"); etichetă1.Vizibil = adevărat; label2.Text = "COM3"; ) private void cOM4ToolStripMenuItem_Click(exmițător obiect, EventArgs e) ( SerialPort Port1 = nou SerialPort("COM4", 9600); // MessageBox.Show("COM4 port selectat"); label1.Visible = true; label2.Text = "COM4 "; ) private void cOM5ToolStripMenuItem_Click(expeditor obiect, EventArgs e) ( SerialPort Port1 = nou SerialPort("COM5", 9600); // MessageBox.Show ("Port COM5 selectat"); label1.Visible = true; label2.Text = „COM5”; ) private void cOM6ToolStripMenuItem_Click(expeditor obiect, EventArgs e) ( SerialPort Port1 = new SerialPort("COM6", 9600); // MessageBox.Show("COM6 port selectat"); label1.Visible = true; label2. Text = "COM6"; ) private void cOM7ToolStripMenuItem_Click(expeditor obiect, EventArgs e) ( SerialPort Port1 = new SerialPort("COM7", 9600); // MessageBox.Show("COM7 port selectat"); label1.Visible = true; label2.Text = "COM5"; ) program privat de void BrewToolStripMenuItem_Click(exmițător obiect, EventArgs e) ( ) // Brew private void button2_Click (expedător obiect, EventArgs e) ( // dacă (Port1.IsOpen == false) //( // încercați //( //programul poate fi modificat informații de la podrugomu.com/node/987 //Port1.PortName = label2. Text; //Port1.Open(); comutator (eticheta 3.Text) (caz „Mashing perfuzie selectat”: MessageBox.Show(„Procesul de mashing perfuzie a început”, „Mesaj de informare”); Port1.WriteLine(„i”); timer1.Start(); break; case " Cooper brew selectat": MessageBox.Show("Procesul de mashing Cooper a început", "Mesaj de informații"); Port1.WriteLine("v"); timer3.Start(); break; ) button1.Enabled = false; button2.Enabled = fals; button3.Enabled = fals; // button5.Enabled = false; // richTextBox1.Text = Port1.ReadLine()+"\n"; /* dacă (Port1.ReadLine() == „e\r”) ( button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; button5.Enabled = true; */ //Port1.Close( ); // MessageBox.Show("Sfârșitul ciclului de preparare"); // ) // ) // captură //( // MessageBox.Show ("Portul dispozitivului este selectat nevalid. Procesul de preparare nu poate fi pornit", "Avertisment "); //) // ) ) private void button5_Click(emițător obiect, EventArgs e) ( Port1.Write("p"); button1.Enabled = false; button2.Enabled = false; button3.Enabled = false; timer2. Start(); richTextBox1.Text = richTextBox1.Text + „\n” + „Începeți încălzirea apei în rezervorul de piure la 37 de grade” + „ " + DateTime.Now.ToString("HH:mm"); /* Port1. Deschide (); //Port1.Open(); //richTextBox1.Text = richTextBox1.Text + „\n” + Port1.ReadLine(); Port1.WriteLine(„o”); Port1.Close(); */ ) private void exitToolStripMenuItem_Click(sender obiect, EventArgs e) ( Close(); ) private void button4_Click(sender obiect, EventArgs e) ( ) private void infusionMashToolStripMenuItem_Click(expeditor obiect, EventArgs e) ( eticheta selectată ";TMasht"; ) private void timer1_Tick(exmițător obiect, 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 de minute este de 4200 de secunde timer1.Stop(); //timer2.Start(); //Port1.Open(); Port1.WriteLine ("s"); // Port1.Close(); MessageBox.Show("mash de infuzie este terminat, mustul trebuie filtrat"); button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; ; button5.Enabled = true; textBox1.Text = ""; textBox2.Text = ""; ) //Port1.Close(); ) private void label4_Click(obiect sender, EventArgs e) ( ) private void timer2_Tick(obiect sender, EventArgs e) ( label5 .Text = Port1.ReadLine(); if (Port1.ReadLine() == "s\r") ( timer2.Stop(); MessageBox.Show ("Apa are 37 de grade. Puteți adăuga malț și porni modul de piure"); richTextBox1.Text = richTextBox1.Text + "\n" + "Sfârșitul procesului de preparare a piureului. Т=37 de grade" + " " + DateTime.Now.ToString("HH:mm"); button2.Enabled = true; ) ) private void emergencyDisableToolStripMenuItem_Click(sender object, EventArgs e) ( Port1.WriteLine("a"); MessageBox.Show("Utilizatorul are oprirea de urgență a întregului sistem"); ) private void mash tunToolStripMenuItem_Click(emițător obiect, EventArgs e) ( Port1.WriteLine("k"); MessageBox.Show("Modul de fierbere a mash tun este pornit activat. Așteptați 60 de minute") ; richTextBox1.Text = richTextBox1.Text + "\n" + "Modul de fierbere a mash tun este activat. Așteptați 60 de minute" + " " + DateTime.Now.ToString("HH:mm") ; ) private void timer3_Tick(emițător obiect, EventArgs e) ( șir 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("Suprascrie etapa la 62 de grade"); richTextBox1.Text = richTextBox1.Text + "\n" + "Etapa de mash la 62 de grade" + " " + DateTime.Now.ToString("HH:mm" ); ) if(s== 2250) ( Port1.WriteLine("n"); MessageBox.Show("Etapa de frecare la 78 de grade"); richTextBox1.Text = richTextBox1.Text + "\n" + "Etapa de frecare la 78 de grade " + " " + DateTime.Now.ToString("HH:mm"); ) if (s ==2700) ( Port1.WriteLine("b"); MessageBox.Show("Etapa Mash este finalizată, puteți scurge must") ; richTextBox1.Text = richTextBox1.Text + "\n" + "Etapa de zdrobire s-a încheiat. Puteți scurge mustul" + " " + DateTime.Now.ToString("HH:mm"); ) ) privat void normalToolStripMenuItem_Click(emițător obiect, EventArgs e) ( label3.Text = "Cooper Brew selectat"; ) ) )

Programul comunică cu arduino prin portul com. Singurul lucru pe care nu îl pot depăși este că atunci când interogând portul com, programul nu se îngheață în timp ce subrutina este executată. După sfârșitul subrutinei, programul se blochează, dar deocamdată acest lucru nu este critic și chiar un fel de plus. Foolproof - pentru a vă împiedica să apăsați ceva în timpul unei anumite proceduri.

În total, programul poate

- pregatirea echipamentelor pentru gatit;
- bucătar;
- scrieți un jurnal de lucru simplu (foarte util pentru analiza ulterioară a berii);
- selectați un port pentru conectarea la controlerul de control (arduino UNO);
fierbe bere și piure ton.

Când sosesc pompele și supapele solenoide, le voi automatiza în continuare. Între timp, voi adăuga un program de gătit în fiecare duminică. În total vor fi 5 programe. Implementarea modului manual își așteaptă și rândul.
Cum se spune,

va urma...

UPD:

Iată câteva fotografii ale fabricii de bere

Acesta este un digestor. Am două dintre acestea. Un senzor de temperatură DS18B20 într-un cadru etanș este instalat pe lateral.
Multă vreme nu am putut înțelege de ce arduino îngheață periodic, până când mi-am dat seama că totul trebuie să fie împământat, altfel s-ar sparge la carcasă, apoi la carcasa senzorului și la arduino.

Tubul de cupru din interior este pentru filtrarea mustului. Poate fi făcut mai frumos, dar este mai bine să folosiți un fund fals. Din păcate, chinezii nu se grăbesc să-l trimită.

Este prea devreme să vorbim despre rezultat, iată ce s-a întâmplat

Vederea generală a cuvei arată astfel.

Conectori obișnuiți folosiți
pentru conectarea senzorilor de temperatură, conectați la o priză dublă. Este mai convenabil să spălați echipamentul. L-am oprit și l-am dus la baie. L-am spalat, am conectat si totul merge.

Totul a spumat conform programului, nu s-a scurs niciun exces. Și planurile mele imediate sunt să scurg un lot de bere pentru o fermentație ulterioară și să prepar încă una. Rețeta, în principiu, poate fi vizualizată în codul din subrutina varka() a arduino.

Electrovalvele au sosit în sfârșit. Procesul de automatizare continuă.

Cele mai bune articole pe această temă