Come configurare smartphone e PC. Portale informativo
  • casa
  • Windows 8
  • Automazione del birrificio BeerDuino basata su arduino mega. Sistemi automatizzati basati sul microcontrollore Arduino

Automazione del birrificio BeerDuino basata su arduino mega. Sistemi automatizzati basati sul microcontrollore Arduino

L'automazione nella società moderna è una misura necessaria, perché nell'era digitale è estremamente importante escludere il fattore umano in vari settori al fine di standardizzare e migliorare la qualità del prodotto. Ci sono anche aree in cui una persona semplicemente non è in grado di fare ciò di cui sono capaci i robot, ad esempio la produzione di nanomateriali e microschede.

Tuttavia, l'automazione aiuta non solo nella produzione, ma può anche essere utile alla persona media. Ad esempio, l'automazione per un birrificio arduino può facilitare notevolmente il processo di produzione di un prodotto. Scopriamo come la rettifica automatica per arduino e altre cose può aiutare e consideriamo degli esempi.

I principali vantaggi dei sistemi automatizzati basati sul microcontrollore Arduino

Nessuno ti vieta di saldare la tua scheda e di programmarla da solo utilizzando linguaggi di basso livello. Tuttavia, l'automazione su arduino e microcontrollori già pronti faciliterà notevolmente l'intero processo e farà risparmiare tempo. Dopotutto, è molto più facile acquistare un prodotto già pronto con un set di librerie e adattarlo alle tue esigenze. E l'automazione disponibile sull'arduino mega 2560 può essere utile in molti ambiti della vita, dagli interruttori vocali per una casa intelligente alle serrature elettriche con rilevatore di movimento. I principali vantaggi per i quali l'automazione Arduino è famosa sono:

  1. Bassa soglia di ingresso. Non è necessario ottenere un'istruzione ingegneristica, basta guardare un paio di video di formazione e avere una base nella programmazione.
  2. Un gran numero di librerie già preparate. Arduino è utilizzato nella CSI da molti appassionati di robotica, al punto che la produzione di elettronica varia diventa il loro hobby. Di conseguenza, la comunità degli utenti è estremamente attiva sulla rete, pubblica un gran numero di modelli ed è pronta ad aiutarti a risolvere qualsiasi problema. La qualità delle librerie, a causa della bassa soglia di ingresso, ne soffre, ma nessuno vieta di crearne di proprie, basta studiare la semantica del linguaggio C++ o utilizzare traduttori già pronti.
  3. Un gran numero di periferiche. Non importa se hai bisogno di un'automazione per serra Arduino o di un sensore di luce, troverai tutti i moduli, fino ai sensori sonori e ai riconoscitori vocali. Sì, alcune schede costano un sacco di soldi, ma puoi sempre trovare analoghi economici, ad esempio il modulo Wi-Fi di produttori di terze parti esp8269, che è 10 volte più economico di quello ufficiale.
  4. Molte informazioni. Qualsiasi problema che incontri è già stato riscontrato da qualcuno e molto probabilmente troverai una soluzione su Google. C'è anche una letteratura a tutti gli effetti con cui puoi familiarizzare.

Tuttavia, non pensare che Arduino non abbia difetti. La tavola è famosa per le sue basse prestazioni. In compiti particolarmente complessi e con una grande quantità di codice, il tempo di risposta può raggiungere 1 secondo, il che è inaccettabile per i microcontrollori. La memoria flash della maggior parte dei moduli non supera 1 MB, il che non è sufficiente per creare reti neurali o utilizzare file multimediali. Certo, puoi collegare una scheda di memoria ausiliaria, ma anche questo aumenta il tempo di risposta, occupa risorse aggiuntive per la sua alimentazione ed è fatto in modo semi-artigianale.

Tuttavia, semplici sistemi automatizzati, ad esempio per la produzione di birra o serre, non richiedono nemmeno alcune delle risorse che il pagamento può emettere. Di conseguenza, alla maggior parte degli utenti, queste carenze sembreranno prive di significato. Se decidi di assemblare la tua stampante 3D o un design più complesso, dovresti dare un'occhiata più da vicino agli analoghi. Ma la soglia di ingresso per i concorrenti di Arduino sarà molto più alta.

Un esempio di automazione di processo basata su mk Arduino

L'esempio più semplice di automazione dei processi può essere una serra su un arduino. Per creare qualsiasi sistema, vale la pena delineare chiaramente i compiti che deve svolgere. Usando una serra come esempio, questo sarebbe:

  1. Creazione di un clima speciale.
  2. Accensione e spegnimento tempestivi dell'illuminazione.
  3. Irrigazione tempestiva delle piante e mantenimento dell'umidità dell'aria allo stesso livello.

Sulla base di queste attività, puoi immediatamente notare cosa devi acquistare per la scheda principale:

  1. Termometro. Farà in modo che l'aria non si riscaldi o si raffreddi, rientrando nei limiti prescritti dal programma. In caso di variazione di temperatura, la scheda accenderà il condizionatore o le batterie elettroniche.
  2. Sensore di luce. Certo, puoi limitarti a una soluzione software e acquistare lampade costose con imitazione della luce del giorno. Ma se vuoi creare una serra a tutti gli effetti, allora sarà molto più conveniente installare un soffitto automatico, che sarà controllato da Arduino.
  3. Sensore di umidità. Qui tutto è uguale alla temperatura, secondo lo scenario prescritto, la scheda includerà spruzzatori e umidificatori, se necessario.

Una volta acquistati tutti i moduli necessari, non resta che programmarli. Dopotutto, senza un codice, questi sono solo pezzi di ferro, non capaci di nulla.

Programmazione MK Arduino per l'automazione dei processi. Esempio

Come nel paragrafo precedente, è importante per la programmazione suddividere l'attività in sottovoci separate ed eseguirla in sequenza. La programmazione di Arduino avviene grazie ai comandi nell'interfaccia AT e AT+, utilizzando librerie predisposte. Di conseguenza, tutti gli script sono scritti in un ambiente speciale nel linguaggio C ++ e, prima di fare qualsiasi cosa, dedicano tempo allo studio della sua semantica. Oltre a svolgere semplici funzioni, il sistema è anche in grado di memorizzare script nella memoria flash, che è ciò di cui abbiamo bisogno in questo esempio.

Non dimenticare che le informazioni da ciascun sensore arrivano in tempo reale e come variabili, tuttavia, puoi limitare il tempo di risposta, poiché non è necessario spendere risorse e misurare ogni parametro in ogni momento. Di conseguenza, impostare i tempi di accensione e spegnimento per ciascun sensore o impostare il tempo di risposta per un determinato periodo.

Vorrei presentare un altro esempio di utilizzo di Arduino in attività reali. Qui presenterò il progetto più semplice, ma davvero funzionante per regolare il riscaldamento domestico utilizzando un boiler elettrico basato su Arduino. Spero davvero che questo articolo aiuti qualcuno a mettere da parte le proprie paure e provare a usare le mani per lo scopo previsto, allena molto bene le mani, il cervello e dà una rara sensazione di soddisfazione nel creare qualcosa di interessante. Avendo iniziato a lavorare con questo controller, sono ancora un po' confuso sulle possibilità che si aprono quando lo si utilizza.

Storia

Perché Arduino? Semplicità, accessibilità, molta documentazione e librerie. Come molti altri, ho osservato attentamente Arduino per molto tempo, fin dall'infanzia amo tutti i tipi di batterie e motori, ed ecco un nuovo livello, un linguaggio di programmazione completo e un sacco di capacità di input-output. Quando i nostri "più probabili partner economici" hanno iniziato a produrlo, i prezzi sono scesi a un livello accettabile. Di conseguenza, ho acquistato un kit di partenza e, dopo aver lampeggiato abbastanza con LED e indicatori, avevo il desiderio di usarlo da qualche parte in casa.

Cosa riscaldiamo

Mia nonna vive in una casa di campagna vicino a Mosca, non c'è un normale approvvigionamento idrico, né gas, né riscaldamento, e risolvere tutti questi problemi richiede grandi investimenti o l'uso delle mani. Qui ho visto un posto dove puoi usare completamente arduino, c'è dove girarti. Il più grande vantaggio della casa del villaggio è che è tradizionalmente piccola e molto semplice. Quindi la mia - una tipica casa di una famiglia contadina della metà del 20 ° secolo, è una capanna di tronchi con una grande stanza e una cucina. Non ci sono altri ambienti riscaldati, il che per noi è un plus, è sufficiente mantenere e controllare la temperatura in una singola stanza.

Il riscaldamento

Apparecchiature per il riscaldamento. Tradizionalmente, la casa aveva il riscaldamento a stufa. Una stufa "tedesca" nella stanza (si riscalda a causa di un lungo tubo di avvolgimento), la seconda "russa" in cucina (si riscalda a causa delle grandi dimensioni del focolare stesso). Se qualcuno aleggia nelle performance cinematografiche che la stufa è bella e, inoltre, naturale e romantica, allora mi permetto di presumere che queste persone non abbiano mai vissuto in una casa con riscaldamento a stufa. In effetti, non è molto comodo, scomodo e pericoloso per il fuoco. Pertanto, 5 anni fa, è stato ordinato e implementato un progetto per la distribuzione del riscaldamento a due tubi più semplice con una caldaia a gas. La caldaia doveva essere alimentata da bombole di gas.

Successivamente si è deciso di ammodernare l'impianto, aggiungere una pompa per il ricircolo forzato del liquido di raffreddamento e un piccolo boiler elettrico da 2 kilowatt, per non soffrire con la cottura a gas quando non fa ancora molto freddo. Tutta l'automazione era ridotta alla presenza di un grande interruttore a parete, quando faceva freddo lo accendevano e quando faceva caldo lo spegnevano. Due kilowatt erano sufficienti da qualche parte fino a una temperatura di 0 ° C, quindi era necessario accendere un gas o una stufa, il che era estremamente scomodo.

Opportunità economica

Prima di cambiare qualsiasi cosa, ovviamente, è stato deciso di calcolare se l'intera idea ha un senso. Dopo aver calcolato per esperienza il consumo di gas dalle bombole, dopo aver stimato il consumo previsto di gasolio, sono giunto alla conclusione che non ha senso tali tipi di riscaldamento se c'è una quantità sufficiente di elettricità. Al prezzo delle bombole uscivano da qualche parte 6-7 mila al mese, gasolio, se compri qualcosa di bruciato o d'estate in inverno, puoi risparmiare fino a un consumo di 5 mila al mese, mentre sull'elettricità pulita ne risultava 7 mille. Aggiungiamo qui il costo della caldaia, il trascinamento costante dei cilindri e l'odore dello stipendio, e diventerà chiaro che l'elettricità è molto più semplice e non più costosa. Certo, ci sono bruciatori a pellet che sono andati di moda negli ultimi tempi, ma non mi andavano bene, visto che non sanno accendersi da soli e quindi hanno una potenza minima, peraltro per nulla piccola (circa 5 kW), che 90 % delle volte non c'è semplicemente nessun posto dove andare e sono necessarie almeno 2 volte a settimana per fare il pieno di carburante, cosa che a volte non c'è nessuno da fare. E il costo delle caldaie stesse è di un ordine di grandezza superiore alle opzioni precedenti, quindi sono adatte per case di grandi dimensioni dove sono necessarie alte potenze e costi elevati, e non nel mio caso.

Hardware pesante

Ho provato a stimare la potenza richiesta in base al consumo di gas e ad altre stime, si è scoperto che avevamo bisogno di 4-5 kW, con un margine di 6. L'analisi di mercato ha mostrato che esiste un modello di caldaia elettrica, simile a quello già installato, ma con 3 resistenze da 2 kW cadauna. Inoltre, è stato venduto senza gestione, il che è stato ancora più conveniente ed economico per me. In generale, la caldaia stessa è un design estremamente semplice, un cilindro metallico con tubi di ingresso e uscita, un coperchio fissato sulla parte superiore con bulloni, in cui sono fissati gli elementi riscaldanti. Inoltre, nella scocca sono incorporati 2 sensori, un sensore di temperatura resistivo e un sensore che si chiude in caso di surriscaldamento, entrambi provenienti dal sistema di raffreddamento dell'auto. Ora è sorta la domanda sull'elettricità. La mia situazione è stata semplificata dal fatto che c'è un'officina vicino alla casa, a cui sono collegate 3 fasi (popolarmente - 380). Naturalmente, c'era la tentazione di alimentare ogni elemento riscaldante dalla propria fase, quindi è stato acquistato un cavo speciale a 4 conduttori in una treccia metallica per installazione interrata e posato nel locale caldaia. Il cavo è inserito in un quadro con differenziali collegati in serie e in un blocco di 3 macchine da 10A ciascuna. Inoltre, il cavo è andato direttamente allo scudo con l'arduino e da lì alla caldaia elettrica.

Hardware leggero

È chiaro che controlleremo gli elementi riscaldanti con arduino, la domanda è: come? Aderendo al principio: più semplice, più affidabile, li attiveremo o disattiveremo semplicemente utilizzando un relè senza alcuna opzione di transizione. Salendo su aliexpress, ho trovato un blocco relè per arduino, che può controllare 5 linee elettriche contemporaneamente. Un problema, la corrente massima che questi relè possono sopportare è 10A, ma ottengo 2kW / 220V ~ 9A. Questo è praticamente il massimo, ma è auspicabile avere un margine di almeno il 25%. Tuttavia, ho deciso di rischiare. Le staffette onestamente sono durate quasi una settimana, poi hanno appena iniziato a sciogliersi. Bisognava risolvere qualcosa e in fretta, perché era inverno ed era impossibile fermare il riscaldamento. Pertanto, sono stati acquistati relè da 30A, tuttavia, con avvolgimenti da 12V. Pertanto, ho rapidamente saldato un transistor a ciascun relè per accenderli da un arduino 5V.

Il circuito ha funzionato bene per quasi un mese, poi ho notato che in casa faceva troppo caldo. Il controllo ha mostrato che un relè "fusibile" in posizione on. Ci ho bussato: ha funzionato di nuovo, ma è durato per diversi giorni. L'ho cambiato nella speranza che fosse un matrimonio, ma una settimana dopo è successa la stessa cosa con la 2a staffetta. Mettendo l'ultima scorta, tornò da Ali. Sono stati trovati relè Arduino specializzati da 40A! Questi dovrebbero essere sufficienti di sicuro, ho pensato. Un paio di settimane di attesa, e poi di nuovo butto via i transistor e metto nuovi relè con reggette e indicazioni già pronte. La gioia è stata di breve durata, dopo 2-3 settimane la staffetta è stata nuovamente bloccata. Ho iniziato a studiare il problema, si scopre che per ridurre il carico sul relè e rimuovere l'arco dei contatti, il relè deve essere acceso non a caso, ma nel momento in cui la tensione sinusoidale passa per 0. Bene , in teoria questo può essere fatto usando il nostro arduino, solo per connetterti per dividere tutte e tre le fasi e guardare la tensione. Il problema è che il relè ha un certo tempo di risposta e, infatti, dobbiamo ancora installarlo empiricamente. In generale, il compito non è così semplice.

E poi mi imbatto nel cosiddetto relè a stato solido, in altre parole: un circuito elettrico, assemblato su un potente tiristore, in una custodia simile a un normale relè. Dei suoi vantaggi: non c'è meccanica, niente si attaccherà. Non crea potenti interferenze elettromagnetiche, cosa importante per Ethernet, descritta di seguito. Contengono già un circuito che accende e spegne il relè quando attraversa lo zero. Il relè ha un indicatore di accensione. Bene, sono anche silenziosi, anche se per il nostro caso non è così importante. Dopo aver studiato le istruzioni e le caratteristiche, è stato ordinato un SSR-40DA, che in russo significa: un relè a stato solido con una corrente di controllo costante di 3-5 V e una corrente di carico fino a 40 A. Allo stesso tempo, ho deciso di deviare leggermente dal principio "più semplice-migliore" e controllare maggiormente la corrente negli elementi riscaldanti. Ciò consentirebbe di scoprire un elemento riscaldante / relè bruciato o un'interruzione di corrente in una delle fasi. Ho aggiunto un modulo di controllo della corrente da 20 A all'ordine, anche se sembravano fragili per una tale corrente (il cavo quadrato da 2,5 non si adattava nemmeno al loro morsetto). Quando sono arrivati ​​i relè e i moduli di misurazione della corrente, si è scoperto che i relè erano piuttosto ingombranti, quindi è stato deciso di trasferire tutto ciò che è collegato alla parte ad alta tensione in una nuova scatola e lasciare l'arduino in quello vecchio.

Dopo i primi esperimenti, si è scoperto che ho completamente dimenticato che questi relè, poiché sono assemblati su tiristori, diventano piuttosto caldi. Dopo una giornata di funzionamento, i relè si sono surriscaldati così tanto che non potevo sopportare di tenerli con il dito sopra, cioè 60 °C, e questo è già vicino ai critici 80 °C. Di nuovo sono entrato in Ali, cercando di capire quali radiatori adattare, e poi ho scoperto che ci sono radiatori standard per questi SSR! Al momento dell'installazione dei radiatori, ho anche scoperto che un modulo di controllo della corrente stesso non passa più la corrente e una traccia bruciata è visibile dal lato della scheda. Anche un altro modulo non ha ispirato fiducia, ho deciso di rimuoverli tutti. In questa forma, sono ancora piuttosto deboli e pericolosi, ma non hanno molto senso da parte loro. Il problema dello scollegamento di fasi o resistenze è stato finora rimandato in quanto poco urgente, da 3 anni né il primo né il secondo si sono verificati nemmeno una volta.

Ora sul software

Arduino

Immediatamente negli esempi, è stato trovato un pezzo che ha permesso di controllare la potenza media, avendo un controllo binario - acceso e spento. Il significato è semplice, prendiamo una certa finestra di tempo, diciamo, 1 minuto, e nel ciclo accendiamo o spegniamo il carico, a seconda del tempo trascorso. Cioè, se abbiamo bisogno del 50% della potenza, accendiamo il carico nei primi 30 secondi e lo spegniamo negli ultimi 30, quindi il ciclo si ripete. L'ho rifatto rapidamente per 3 relè indipendenti, se la potenza è superiore al 33%, accendo il secondo relè, se superiore al 66%, quindi il terzo e accendo e spengo il primo secondo l'algoritmo principale. Ora sorge la domanda principale: quale algoritmo dovrebbe essere usato per selezionare la potenza? Essendo un programmatore di professione, all'inizio ho deciso che il problema era abbastanza semplice, freddo - aggiungi, caldo - più che sufficiente, e ho cercato di capirlo tutto nella mia testa.

Si è rivelato non così facile. È stato utile vedere come viene fatto nei sistemi venduti, si è scoperto che tutto è il più semplice possibile, come in un ferro da stiro - + 1C = spento, -1 = acceso. Ma poi otteniamo oscillazioni quasi 4C dovute all'inerzia del sistema! Questo è troppo approssimativo, perché possiamo ottenere dati con una precisione di un decimo di grado. Ho anche esaminato gli algoritmi per l'utilizzo della temperatura dell'aria esterna, si sono rivelati abbastanza semplici e hanno funzionato su tavoli già pronti che erano precablati e semplicemente cambiati a seconda della perdita di calore della casa. Scavando sempre più a fondo, sono arrivato in fondo alle installazioni industriali, usavano algoritmi di controllo PID ovunque. E, grazie alla popolarità, si scopre che Arduino ha una libreria PID gratuita!

Qualche parola su cosa sia il PID in relazione al nostro caso. Il significato dell'algoritmo è che gli diciamo il valore richiesto di un certo parametro (la temperatura all'interno della casa) e nel ciclo gli passiamo il valore corrente, e ci dà l'effetto necessario (la potenza che deve essere fornita al caldaia). Senza entrare nei dettagli del modello matematico, come funziona dal punto di vista di un programmatore. Quindi, abbiamo la temperatura nella stanza, diciamo 20C, la temperatura desiderata 22C, e la diamo al nostro algoritmo PID.

L'algoritmo stesso ha 3 parti indipendenti, denominate P, I e D. La prima parte funziona in modo estremamente semplice, esamina la differenza tra la temperatura desiderata e le temperature attuali. Cioè, più fa freddo, più potenza ci darà l'algoritmo. Sembra che questo sia sufficiente, ma abbiamo una perdita di calore costante a casa, cioè per mantenere la temperatura desiderata, dobbiamo fornire costantemente un qualche tipo di energia. Cioè, anche se la temperatura nella stanza è uguale a quella impostata, non puoi spegnere la caldaia, ma devi in ​​qualche modo cercare un qualche tipo di potenza uguale alla perdita di calore. E la perdita di calore varia a seconda della temperatura esterna. Questo è ciò che sta facendo la seconda parte sotto il nome I. L'algoritmo cerca di scegliere la potenza alla quale la nostra temperatura sarà costante. E sembra che sia già tutto lì, ma no.

Il fatto è che la caldaia stessa, il liquido di raffreddamento, e ancor più la casa, hanno un'inerzia molto elevata. E se accendi la caldaia del 100%, devi ridurre la potenza molto prima che la temperatura raggiunga quella desiderata, altrimenti, anche con uno spegnimento completo, avremo ancora tempo per surriscaldare la stanza di 2 gradi. la temperatura ha raggiunto quella desiderata. Questo è ciò che sta facendo la terza parte dell'algoritmo D. Bene, ora, ovviamente, questo è tutto, resta solo da capire a quale parte dare quale peso, ma questo viene fatto dai moltiplicatori di ciascuna parte, che devono essere selezionati. A proposito, la selezione di questi fattori è un problema matematico separato e piuttosto complicato, li ho selezionati "ad occhio", ricordando quanto detto sopra. Per prima cosa, ho messo tutti gli zeri, tranne P, e l'ho selezionato in modo che l'eccitazione stessa non iniziasse. Poi ha aggiunto I, e alla fine e D.

Misuriamo la temperatura

Per misurare la temperatura, nello stesso sito magico sono stati ordinati sensori di temperatura digitali basati su DS18B20. Il sensore in sé è semplicemente meraviglioso, non ha bisogno di essere calibrato o in qualche modo configurato, mentre può misurare la temperatura con una certa precisione e comunica con Arduino tramite il protocollo OneWier. Cioè, un numero quasi illimitato di sensori può essere appeso a 3 fili lunghi fino a 50 metri. Se lo desideri, non puoi nemmeno alimentarli, ma funzionano solo su 2 fili (infatti sono alimentati, ma da un filo con un segnale), ma funzionano più lentamente. Nel mio caso, ho ordinato i sensori in una custodia sigillata e li ho collegati con un normale doppino intrecciato. Ho messo 3 sensori, uno nel locale caldaia, uno in casa, in camera, e uno in soffitta sotto il soffitto, il solaio non si riscalda in alcun modo e lì prendo la temperatura esterna.

Elenco dell'hardware acquistato

- scheda arduino. Ho usato UNO r3. Il prezzo è di circa 350 rubli.
- Schermo Ethernet, circa 500 r.
- Twisted pair (a seconda di quanto è necessario), una baia di 305 m costerà circa 4 mila.
- Sensori di temperatura, circa 200 r.
- Alimentatore per 110-240 - 12V 2A, 420 rubli.
- Stabilizzatore LM7805, da qualche parte circa 20 rubli.
- Relè SSR-40DA 3 pz. per 330 rubli.
- Radiatori per relè 200 r.

Cioè, senza contare il cavo a doppino intrecciato e la caldaia stessa, l'intero progetto si adatta a 4 mila rubli.

Aggiungiamo i dati al database e lo mostriamo.

Ma tutto questo, ovviamente, va bene, ma per non stare costantemente con il computer accanto alla caldaia, vorrei comunque sapere cosa sta succedendo a casa, da remoto via Internet. Per molto tempo ho già avuto il server VPS più semplice di majordomo per qualsiasi cosa. Su di esso ho creato un database MySQL per l'archiviazione dei dati di temperatura.

Ora abbiamo bisogno di mettere in qualche modo i dati da arduino in questa base. Per fare ciò, ovviamente, dovrai almeno connettere l'arduino a Internet, non è facile, ma molto semplice. Per questo abbiamo bisogno di Ethernet Shield e della sua libreria. Un semplice router con un "fischio" è stato a lungo installato in casa, prima da megafon e poi da yota. Tiriamo il cavo twisted pair standard al router e aggiungiamo il trasferimento di dati al programma. Il trasferimento avviene tramite una chiamata a una pagina in PHP con parametri - dati. Creiamo una pagina chiamata temp.php sul nostro server internet

Errore caricamento dati!

";) else (echo" ";) mysql_close ($ connect);?>
Dopodiché, abbiamo i dati sulle temperature e sulla potenza della caldaia, in modo che ogni volta che non entriamo nel database, ma vediamo i dati più recenti, abbiamo scritto uno script "temporaneo" in php, ma, come sai, c'è niente di più permanente delle cose temporanee, quindi lo uso.
gettemp.php

\ n "; while ($ line = mysql_fetch_array ($ risultato, MYSQL_NUM)) (echo" $ linea"; eco" TempIN = $ rigaTempOUT = $ linea\ n "; eco" TempKotel = $ linea\ n "; eco" Potenza = $ linea\ n ";) eco"\ n "; mysql_free_result ($ risultato); mysql_close ($ connessione);?>

Cosa vorresti aggiungere in futuro

Naturalmente, questo, in linea di principio, è il minimo, che tuttavia consente di effettuare un controllo del riscaldamento completo e abbastanza conveniente in una piccola casa. Sebbene con alcune modifiche possa essere utilizzato in edifici multi-room e in generale di qualsiasi complessità, arduino può fare molto qui, se non tutto. È in questo progetto che vorrei aggiungere in futuro:
  • Regolatore di temperatura. Sebbene la pratica abbia dimostrato che 22,5 è abbastanza il valore ottimale e, in linea di principio, non richiede aggiustamenti. Ancora una volta, vorrei rendere il regolatore remoto dall'arduino principale, ma ciò richiede un circuito complesso o un altro arduino. In generale, c'è qualcosa a cui pensare.
  • Vorrei la possibilità non solo di leggere la temperatura, ma anche di modificare al volo i parametri PID. È possibile effettuare una modalità di "riscaldamento iniziale" separata, altrimenti il ​​parametro I verrà normalizzato a lungo dopo ogni riavvio del programma.
  • Vorrei un'applicazione semplice per Android in modo da non dover frugare in un piccolo browser del telefono. Questo è il più semplice ed è già in corso.
  • Tuttavia, collegare il sensore di temperatura del liquido di raffreddamento e trasmettere i suoi dati, come altri dati di temperatura.
  • Allarme emergenze. Cioè, determina automaticamente la perdita di tensione sulle linee, il guasto del relè o degli elementi riscaldanti.
  • Crea una "giostra", cambia la destinazione degli elementi riscaldanti. Altrimenti, si scopre che un elemento riscaldante funziona sempre più di altri e in teoria dovrebbe essere il primo a rifiutare. Hai solo bisogno di cambiare i PIN nel programma di volta in volta. Sembra semplice, ma le mani non raggiungeranno in alcun modo.
Codice Arduino:

#includere #includere #includere #includere #includere #includere // OneWire DS18S20, DS18B20, DS1822 Esempio di temperatura // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // La libreria DallasTemperature può fare tutto questo lavoro per te! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds (6); // sul pin 10 (è necessaria una resistenza da 4.7K) Sensori di temperatura Dallas (& ds); booleano waithTemp = false; int PRECISIONE_TEMPERATURA = 10; int lampada1 = 7; int lampada2 = 8; int lampada3 = 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); indirizzo di byte; StartTime lungo senza segno = 0; WorkWindow lungo senza segno = 60000; // 10min unsigned lungo WorkTime, TenTime; float maxData = 100; galleggiante Celsius, temperatura; doppio Setpoint, Ingresso, Uscita; int ThermometerCount; DeviceAddress Termometro; PID myPID (& Input, & Output, & Setpoint, 10, 0.1, 5, DIRETTO); //0.000006 0,03 40 double targetTemp = 22,5; byte mac = (0xE0, 0x69, 0x95, 0x72, 0x65, 0xE8); byte ip = (192, 168, 1, 100); byte server = (?,?,?,?); Client client Ethernet; byte webskipcount = 10; numero di byte = 0; void setup (void) (Serial.begin (9600); //Ethernet.begin(mac, ip); Ethernet.begin (mac); sensor.begin (); pinMode (lamp1, OUTPUT); pinMode (lamp2, OUTPUT) ; pinMode (lamp3, OUTPUT); Setpoint = targetTemp; myPID.SetOutputLimits (0, maxData); myPID.SetMode (AUTOMATIC); celsius = targetTemp; StartTime = millis ();) filtro lungo (x lungo, Nb lungo, k lungo ) (statico lungo 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("cycle "); sensori.requestTemperatures (); celsius = sensor.getTempC (IntThermometer); Ingresso = Celsius; if (webcount> = webskipcount) (char buffer; String temperatureS1 = dtostrf (celsius, 2, 2, buffer); String temperatureS2 = dtostrf (sensors.getTempC (OutThermometer), 2, 2, buffer); String temperatureS3 = dtostrf (sensori .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 (Input); Serial.print (""); Serial.print (Output); Serial.print (""); Serial.println (Setpoint); if (Output> 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, Finestra di lavoro); Serial.print (centigrado); Serial.print (""); Serial.print (sensors.getTempC (OutThermometer)); Serial.print (""); Serial.print (sensors.getTempC (KatThermometer)); Serial.print (""); Serial.print (uscita); Serial.print (""); Serial.print (TenTime); Serial.print (""); Serial.println (orario di lavoro); if (orario di lavoro< TenTime) { digitalWrite(lamp3, HIGH); } if (WorkTime >TenTime) (digitalWrite (lamp3, LOW);))

Sono uno studente di un istituto tecnico. Un giorno, mentre erano seduti in un caffè con un amico che studiava all'università di medicina, decisero di aprire un bar. C'erano molte idee che, in linea di principio, meritavano una certa attenzione. Ad esempio, una pista da ballo, che cambia l'angolo di inclinazione a seconda dello stile della musica ... Ma, insieme a tutta la varietà di idee, ce n'era anche un'altra -

... ma non dovremmo fare la nostra birra?

Dopo un paio di settimane, ho preparato la birra utilizzando gli ingredienti del birrificio dove lavorava l'amico di mio padre. Ma molti processi tecnologici sono stati interrotti, quindi invece della birra è uscito qualcosa con un odore non molto gradevole.

Dopo qualche anno ho deciso di ripetere il processo, automatizzandolo un po' utilizzando Arduino UNO. Ed è quello che è successo.

Per cominciare, cosa dovrebbe fare l'intera installazione.

  • Controlla te stesso: se tutto funziona, se tutto è connesso;
  • Purificati;
  • Prepararsi per il processo di fermentazione;
  • Preparare la birra in modalità semiautomatica;
  • Preparare la birra manualmente;
  • Prepara la birra in modalità automatica (come una lavatrice lava i vestiti).

Il primo punto non è stato attuato al momento. Finora, non ho nemmeno pensato a come implementarlo.
Anche il secondo non è implementato, ma lo finirò in un prossimo futuro, posso solo aspettare che le pompe vengano consegnate da ebay.
Il terzo punto è abbastanza semplice.

Preparazione per il processo di birrificazione

Un messaggio dal sistema che è necessario versare acqua nella vasca -> il programma attende che venga premuto il tasto OK -> il programma invia ad arduino un comando per accendere il relè a stato solido -> il relè a stato solido accende il tenn da un kilowatt in vasca, lo porta alla temperatura di 37 gradi, invia al programma un comando che tutto è pronto per la cottura. Mantiene una temperatura di 37 gradi.

Vorrei fare un controllo per la presenza di acqua, ma il sensore è ancora in attesa della sua partenza dai "fratelli cinesi".

Produzione di birra in modalità semiautomatica

In linea di principio, una procedura semplice:

Premere il pulsante "Riscaldamento" nel programma di controllo, gli altri pulsanti di controllo sono inattivi;
- Dopo il riscaldamento, il programma visualizza il messaggio "Tutto è pronto, puoi cucinare";
- Inserire gli ingredienti, selezionare il programma di erogazione - si attiva il pulsante "Preparazione";
- Premere il pulsante "Preparazione birra", il processo è iniziato;
- Inoltre, il sistema comunicherà periodicamente con messaggi informativi cosa fare e quando.

Devi seguire le istruzioni.

Preparazione manuale della birra

Questo processo consente di impostare i parametri di cottura, modificarli nel ciclo di cottura. Non l'ho ancora raggiunto.

Cottura automatica

Questo è un sogno. Al momento non ci sono componenti da implementare. Non ci sono abbastanza pompe, sensori di livello dell'acqua. Non so come misurare la gravità del mosto, quanto alcol c'è in una birra giovane e molto altro. Ma non mi dispero e automatizzerò gradualmente fino a quando la produzione della birra avrà questo aspetto:

Ho messo gli ingredienti nelle apposite vaschette, ho premuto il pulsante e... dopo un mese e mezzo ho avuto la birra finita.

Questo è brevemente il processo, ma ora passiamo al lato tecnico.

Il lato tecnico del processo

Come accennato in precedenza, Arduino UNO funge da microcontrollore di controllo. Ad esso sono collegati 2 relè, 2
termometro digitale DS18B20.

Arduino comunica con il programma principale tramite la porta com. Perché Non ho uno scudo in tempo reale per arduino, ho dovuto prendere i timer da visual c#. Non ho esperienza nella scrittura di programmi, quindi se improvvisamente qualcuno ha idee, critiche - mail per l'onore. Critica, derbante, per così dire, che improvvisamente non ti piace.

Ecco il testo del programma su arduino

#includere OneWire ds (8); // i sensori di temperatura sono sul pin 8 int reley1 = 13; int relè2 = 12; int relè3 = 11; int relè4 = 10; int rele5 = 7; // attiva dieci int reley6 = 6; // dieci sulla vasca mash float temp1; float temp2; void setup (void) (Serial.begin (9600); pinMode (reley1, OUTPUT); pinMode (reley2, OUTPUT); pinMode (reley3, OUTPUT); pinMode (reley4, OUTPUT); pinMode (reley5, OUTPUT); pinMode ( reley6, OUTPUT); digitalWrite (reley1, LOW); digitalWrite (reley2, LOW); digitalWrite (reley3, LOW); digitalWrite (reley4, LOW); digitalWrite (reley5, LOW); digitalWrite (reley6, LOW);) void loop (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": temperatura (); 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); temperature (); 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); altrimenti digitalWrite (reley6, HIGH); ) digitalWrite (reley6, LOW); while (Serial.read()! = "c") ritardo (1000); while (Serial.read()! = "x") (digitalWrite (reley5, HIGH); temperature ();) digitalWrite (reley5, LOW); ) void infuz() (// temperature (); //Serial.available (); while (Serial.read ()! = "s") (// disattiva il ciclo di infusione if (temp<=69.50) digitalWrite(reley5,HIGH); else digitalWrite(reley5,LOW); } digitalWrite(reley5,LOW); } void progrev() { while (temp1 <=36.00) temperature(); digitalWrite(reley6,HIGH); digitalWrite(reley6,LOW); //while (temperature() >40.0) // ritardo (1000); Serial.println ("s"); ) void avariya () (digitalWrite (reley1, LOW); digitalWrite (reley2, LOW); digitalWrite (reley3, LOW); digitalWrite (reley4, LOW); digitalWrite (reley5, LOW);) void temperature () (byte i; byte present = 0; byte data; byte addr; byte zator = (40, 23, 218, 43, 6, 0, 0, 22); // indirizzo del sensore di temperatura nel jam byte varilka = (40, 255, 240, 115 , 59, 4, 0, 234); // indirizzo del sensore di temperatura nella vasca di infusione float celsius; // float temp; boolean gde; if (! Ds.search (addr)) (//Serial. println("Non ci sono più indirizzi . "); //Serial.println (); ds.reset_search (); delay (250); // return;) if (OneWire :: crc8 (addr, 7)! = Addr) ( Serial.println (" CRC non è valido! "); // return;) ds.reset (); ds.select (addr); ds.write (0x44, 1); // avvia la conversione, con l'accensione del parassita alle il ritardo di fine (840) ; // forse 750ms sono sufficienti, forse no // potremmo fare un ds.depower () qui, ma il ripristino se ne occuperà.present = ds.reset (); ds.select ( addr); ds.write (0xBE); // Leggi Scratchpad per (i = 0; io< 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); } }

Andrebbe tutto bene, ma per qualche motivo il terzo sensore mostra sempre 85 gradi. Non posso ancora dire perché. Ed è necessario per un'ulteriore automazione: mantenere la temperatura nel frigorifero.

Descriverò brevemente cosa fa il programma.

Il programma è suddiviso in subroutine, ognuna delle quali si attiva se sulla porta com compare un determinato simbolo. Ad esempio, se la lettera "p" colpisce la porta, viene attivata la modalità "Riscaldamento". Oppure, se "a" - viene chiamata la subroutine avariya() e tutto viene disattivato. Quando viene chiamata la subroutine temperature(), i dati vengono scritti nelle variabili globali temp1, temp2. Da lì arrivano alle subroutine richieste.

In futuro, ci saranno subroutine per cucinare varie varietà e persino il chiaro di luna.

Ora per il programma di controllo principale.

Programma di controllo principale

È scritto in Visual Studio c#.

Codice sorgente del programma:

Codice sorgente del programma

utilizzando il sistema; utilizzando System.Collections.Generic; utilizzando System.ComponentModel; utilizzando System.Data; utilizzando System.Drawing; utilizzando System.Linq; utilizzando System.Text; utilizzando System.Threading.Tasks; utilizzando System.Windows.Forms; utilizzando System.IO.Ports; namespace WindowsFormsApplication1 (classe parziale pubblica Form1: Form (// String portnumber; SerialPort Port1 = new SerialPort ("COM5", 9600); int s = 0; public Form1 () (InitializeComponent ();) / * private const int CP_NOCLOSE_BUTTON = 0x200; protetto override CreateParams CreateParams (get (CreateParams myCp = base.CreateParams; myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON; return myCp;)) * / private void Form1_Load (mittente oggetto, Event.Args e) (etichetta PortName; Port1 .Open ();) // Verifica dell'attrezzatura private void button1_Click (mittente oggetto, EventArgs e) (if (Port1.IsOpen == false) (prova (// il programma può essere modificato informazioni da 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 ()); // verifica le letture della porta MessageBox.Show ("Il processo di controllo dell'attrezzatura è iniziato", "Info messaggio di risoluzione "); richTextBox1.Text = richTextBox1.Text + "\ n" + "Avvia il processo di controllo dell'hardware" + "" + DateTime.Now.ToString ("HH: mm"); button1.Enabled = falso; pulsante2.Abilitato = falso; pulsante3.Abilitato = falso; if (Port1.ReadByte () == 1000) (richTextBox1.Text = richTextBox1.Text + "\ n" + "Fine del processo di verifica dell'apparecchiatura" + "" + DateTime.Now.ToString ("HH: mm"); button1 . Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close (); MessageBox.Show ("Fine del ciclo di controllo dell'apparecchiatura" + "" + DateTime.Now.ToString ("HH: mm") ); richTextBox1.SaveFile ("CheckLOG.rtf");)) catch (richTextBox1.Text = richTextBox1.Text + "\ n" + "Errore nel processo di controllo hardware" + "" + DateTime.Now.ToString ("HH: mm "); MessageBox.Show ("La porta del dispositivo è selezionata in modo errato. Impossibile avviare il processo di verifica", "Warninig"); richTextBox1.SaveFile ("log / Check _" + DateTime.Now.ToString ("ggMMaaaa") + ". Rtf") ;))) // Pulizia dell'attrezzatura private void button3_Click (mittente oggetto, EventArgs e) (if (Port1.IsOpen == false) (prova (// il programma può essere modificato informazioni da podrugomu.com/ node/987 MessageBox.Show (" Hai sicuramente versato del disinfettante "," ATTENZIONE ", MessageBoxButtons.OK, MessageBoxIco n.Avviso); Porta1. NomePorta = label2.Text; Porta1.Apri (); Porta1.Scrivi ("Pulisci"); MessageBox.Show ("Processo di pulizia dell'attrezzatura avviato", "Messaggio informativo"); button1.Enabled = falso; pulsante2.Abilitato = falso; pulsante3.Abilitato = falso; if (Port1.ReadByte () == 1000) (button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; Port1.Close (); MessageBox.Show ("Fine del ciclo di pulizia dell'attrezzatura");) ) catch (MessageBox.Show ("Porta dispositivo non valida selezionata. Impossibile avviare il processo di pulizia", ​​"Warninig");))) private void contextMenuStrip1_Opening (mittente oggetto, CancelEventArgs e) () private void cOM1ToolStripMenuItem_Click (mittente oggetto, EventArgs e) (SerialPort Port1 = new SerialPort ("COM1", 9600); // MessageBox.Show ("La porta COM1 è selezionata"); label1.Visible = true; label2.Text = "COM1";) private void label2_Click (mittente oggetto, EventArgs e) () private void cOM2ToolStripMenuItem_Click (mittente oggetto, EventArgs e) (SerialPort Port1 = new SerialPort ("COM2", 9600); // MessageBox.Show ("porta COM2 selezionata"); label1.Visible = true; label2. Text = "COM2";) private void cOM3ToolStripMenuItem_Click (mittente oggetto, EventArgs e) (SerialPort Port1 = new SerialPort ("COM3", 9600); // MessageBox.Show ("Porta COM3 selezionata"); etichetta1.Visibile = vero; label2.Text = "COM3"; ) private void cOM4ToolStripMenuItem_Click (mittente oggetto, EventArgs e) (SerialPort Port1 = new SerialPort ("COM4", 9600); // MessageBox.Show ("COM4 è selezionato"); label1.Visible = true; label2.Text = "COM4 ";) private void cOM5ToolStripMenuItem_Click (mittente oggetto, EventArgs e) (SerialPort Port1 = new SerialPort (" COM5 ", 9600); // MessageBox.Show (" COM5 è selezionato "); label1.Visible = true; label2.Text = "COM5";) private void cOM6ToolStripMenuItem_Click (mittente dell'oggetto, EventArgs e) (SerialPort Port1 = new SerialPort ("COM6", 9600); // MessageBox.Show ("è selezionata la porta COM6"); label1.Visible = true; label2 . Text = "COM6";) private void cOM7ToolStripMenuItem_Click (mittente oggetto, EventArgs e) (SerialPort Port1 = nuova SerialPort ("COM7", 9600); // MessageBox.Show ("La porta COM7 è selezionata"); label1.Visible = true; label2.Text = "COM5";) private void programVarki ToolStripMenuItem_Click (mittente oggetto, EventArgs e) () // birra privata void button2_Click (mittente oggetto , EventArgs e) (// if (Port1.IsOpen == false) // (// try // (// il programma può essere modificato con le informazioni da podrugomu.com/node/987 //Port1.PortName = label2. Testo; //Porta1.Apri (); switch (label3.Text) (case "Infusion mash selezionato": MessageBox.Show ("Infusion mash process avviato", "Info message"); Port1.WriteLine ("i"); timer1.Start (); break; case " Cooper brew selezionato ": MessageBox.Show (" Processo di mashing Cooper avviato "," Messaggio informativo "); Port1.WriteLine (" v "); timer3.Start (); break;) button1.Enabled = false; pulsante2.Abilitato = falso; pulsante3.Abilitato = falso; // button5.Enabled = falso; // 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 ("End of the Brewing Cycle"); //) //) // catch // (// MessageBox.Show ("La porta del dispositivo è selezionata in modo errato. Il processo di preparazione non può essere avviato" , "Warninig "); //) //)) private void button5_Click (mittente oggetto, EventArgs e) (Port1.Write (" p "); button1.Enabled = false; button2.Enabled = false; button3.Enabled = false ; timer2. Start (); richTextBox1.Text = richTextBox1.Text + "\ n" + "Inizia a riscaldare l'acqua nel mash tun a 37 gradi" + "" + DateTime.Now.ToString ("HH: mm"); / * Port1.Open (); //Port1.Open (); //richTextBox1.Text = richTextBox1.Text + "\ n" + Port1.ReadLine (); Port1.WriteLine ("o"); Port1.Close () ; * /) private void exit ToolStripMenuItem_Click (mittente oggetto, EventArgs e) (Close ();) private void button4_Click (mittente oggetto, EventArgs e) () private void infusion mash Tool StripMenuItem_Click (mittente oggetto, EventArgs e) (label3.Text = "Infusion Mash selezionato"; ) private void timer1_Tick (mittente oggetto, 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 minuti sono 4200 secondi timer1.Stop (); //timer2.Start (); //Port1.Open (); Port1 .WriteLine ("s"); // Port1.Close (); MessageBox.Show ("l'infusione è finita, devi filtrare il mosto"); button1.Enabled = true; button2.Enabled = true; button3.Enabled = true; button5.Enabled = true; textBox1.Text = ""; textBox2.Text = "";) //Port1.Close ();) private void label4_Click (mittente oggetto, EventArgs e) () private void timer2_Tick (oggetto sender, EventArgs e) (label5 .Text = Port1.ReadLine (); if (Port1.ReadLine () == "s \ r") (timer2.Stop (); MessageBox.Show ("L'acqua è 37 gradi. Puoi aggiungere malto e attivare la modalità mash "); richTextBox1.Text = richTextBox1.Text +" \ n "+" Fine del processo di preparazione della vasca di mash. Т = 37 gradi "+" "+ DateTime.Now.ToString (" HH: mm "); button2.Enabled = true;)) private void EmergencyToolStripMenuItem_Click (mittente oggetto, EventArgs e) (Port1.WriteLine (" a "); MessageBox.Show ("L'utente ha arrestato in modo anomalo l'intero sistema");) vuoto privato di mashBoil ToolStripMenuItem_Click (mittente dell'oggetto, EventArgs e) (Port1.WriteLine ("k"); MessageBox.Show ("La vasca di mash è attiva . Attendi 60 minuti") ; richTextBox1.Text = richTextBox1.Text + "\ n" + "La modalità bollitura mash pot è abilitata. Attendi 60 minuti" + "" + DateTime.Now.ToString ("HH: mm"); ) private void timer3_Tick (mittente oggetto, EventArgs e) (string s1 = ""; Port1.ReadLine (); if (s1.Substring (0, 2) == "t1") label5.Text = s1.Substring (4, 5); if (s1.Substring (0, 2) == "t2") label9.Text = s1.Substring (4, 5); s ++; if (s == 900) (Port1.WriteLine ("m "); MessageBox.Show ("Fase di mashing a 62 gradi "); richTextBox1.Text = richTextBox1.Text +" \ n "+" Passo di mash a 62 gradi x "+" "+ DateTime.Now.ToString (" HH: mm "); ) if (s == 2250) (Port1.WriteLine ("n"); MessageBox.Show ("Mash stage a 78 gradi"); richTextBox1.Text = richTextBox1.Text + "\ n" + "Mash stage a 78 gradi "+" "+ DateTime.Now.ToString (" HH: mm ");) if (s == 2700) (Port1.WriteLine (" b "); MessageBox.Show (" La fase di mashing è finita, puoi svuotare il mosto "); richTextBox1.Text = richTextBox1.Text + "\ n" + "La fase di schiacciamento è finita. Puoi drenare il mosto" + "" + DateTime.Now.ToString ("HH: mm");)) private void normal ToolStripMenuItem_Click (mittente dell'oggetto, EventArgs e) (label3.Text = "Cooper brew selezionato";)))

Il programma comunica con arduino tramite la porta com. L'unica cosa, non posso vincere in alcun modo, in modo che durante il polling della porta com, il programma non si blocchi al momento dell'esecuzione della subroutine. Dopo la fine della subroutine, il programma si blocca, ma finora questo non è critico e anche un certo vantaggio. Infallibile - in modo da non premere nulla durante una determinata procedura.

Totale, il programma può

- preparare l'attrezzatura per cucinare;
- cucinare;
- scrivere un semplice log di lavoro (molto utile per ulteriori analisi di cottura);
- scegliere una porta per il collegamento al controllore (arduino UNO);
far bollire il bollitore e schiacciare i tini.

Quando arriveranno le pompe e le elettrovalvole, automatizzerò ulteriormente. Nel frattempo, ogni domenica aggiungerò un programma di cottura. Ci saranno 5 programmi in totale. Anche l'implementazione della modalità manuale attende il suo turno.
Come dicono,

continua ...

AGGIORNAMENTO:

Ecco alcune foto del birrificio

Questa è una pentola per cucinare. Ne ho due. Sul lato è installato un sensore di temperatura DS18B20 in un telaio sigillato.
Per molto tempo non sono riuscito a capire perché l'arduino si blocca periodicamente finché non si è reso conto di tutto da mettere a terra, prima punge sulla custodia, poi sulla custodia del sensore e sull'arduino.

Il tubo di rame all'interno serve per filtrare il mosto. Puoi renderlo più carino, ma è meglio usarne uno falso. Purtroppo i cinesi raccolgono senza fretta di spedirlo.

È presto per parlare del risultato, ecco cosa è successo

La vista generale della vasca è simile a questa.

Connettori normali usati
per il collegamento di sonde di temperatura, collegabile a doppia presa. È più conveniente lavare l'attrezzatura. Scollegato, portato in bagno. L'ho lavato, collegato e tutto funziona.

Tutto stava schiumando secondo il programma, troppo non scorreva. E i piani più vicini sono drenare una partita di birra per un'ulteriore fermentazione, per farne un'altra. La ricetta, in linea di principio, può essere visualizzata nel codice nella subroutine varka() dell'arduino.

Finalmente sono arrivate le elettrovalvole. Il processo di automazione continua.

Principali articoli correlati