Come configurare smartphone e PC. Portale informativo
  • casa
  • Ferro
  • Riscaldamento di una casa di campagna su arduino con trasmissione dati a internet. Realizziamo l'automazione per un birrificio su un'unica scheda

Riscaldamento di una casa di campagna su arduino con trasmissione dati a internet. Realizziamo l'automazione per un birrificio su un'unica scheda

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.

Perché avevo bisogno di automazione?

L'automazione è necessaria per facilitare il processo, perché questo controller stesso controllerà la temperatura, la manterrà e la aumenterà alla pausa di temperatura richiesta. Segnalare anche con un segnale acustico l'intervento necessario, ad esempio, è necessario riempire il malto o eseguire un test dello iodio.

Ho deciso di realizzare la mia automazione da un progetto già pronto. Funziona su arduino, ad esso sono collegati un sensore di temperatura, due relè, un display e pulsanti. Il primo relè controlla l'elemento riscaldante, il secondo relè controlla la pompa. La pompa di poltiglia è molto comoda perché non c'è bisogno di mescolare il mosto per l'intero processo di schiacciamento (per maggiori dettagli su come preparare la birra, consiglio di leggere nei miei precedenti)

Ho assemblato la prima automazione utilizzando i moduli:

- Arduino mini
- Blocco di due relè 15A
- Visualizza 2004
- Termometro
- 4 pulsanti
- alimentatore da 5 volt
La comodità dell'assemblaggio modulare, sta solo nel fatto che non è difficile ottenere tutte le parti e non è necessario quasi nulla per saldare. Ma il più grande svantaggio è l'enorme numero di cavi e un relè cinese economico ha interferito con il display, quindi il relè meccanico ha dovuto essere sostituito con uno a stato solido.

Nel corso del tempo, sono giunto alla conclusione che devo assemblare la mia automazione su un chip con 64 kb di memoria (arduino mini ha solo 32 kb) su una scheda. Non ho trovato una soluzione già pronta, quindi ho iniziato a creare da solo un circuito e successivamente una tavola per il mio mestiere.

Schema:

Ho sviluppato lo schema e disegnato, per così dire, sul mio ginocchio e per me stesso, quindi potrebbero esserci alcune carenze, ma lo schema funziona completamente:

Paga:

Ho disegnato lo schema, poi resta da disegnare la lavagna, prima ho disegnato usando il programma Sprint-Layout 6, molto comodo, ma non abbastanza funzionalità, quindi ho deciso di lasciarlo nella direzione del programma DipTrace e questo è quello che ho ottenuto:

Puoi scaricare i sorgenti.
Come puoi vedere, ho chiamato il mio birrificio QRBeer e questa è già la versione 0.5 ...

Il tabellone è pronto, resta da fare in qualche modo. Per questo ho deciso di usare. Perché esattamente loro e non LUT? Ho appena deciso di provare una tecnologia così nuova per me stesso, ho già provato LUT, l'ho sentito, per così dire, non dirò che mi è piaciuto ...

fotoresist:

Per produrre circuiti stampati utilizzando un fotoresist, avrai bisogno di:
- Pellicola per la stampante
-
- Lampada ultravioletta
- carbonato di sodio

lampada a raggi ultravioletti

Per cominciare, condividerò le informazioni su come ho fatto il mio Lampada UV... Inizialmente volevo utilizzare una lampada già pronta, poi ho deciso di montarla su sei LED da 3W:
e ho comprato lo stesso su Tao:


Ho incollato i led al radiatore, nonostante fosse possibile montarli su un PCB, dubito che si sarebbero surriscaldati.
Questo è quello che ho fatto:


Produzione della scheda

1. Quindi, ho preparato il modello, non resta che stamparlo su pellicola. Come ho scritto sopra, hai bisogno di una pellicola per stampante, ho provato la pellicola sia per una stampante laser che per una stampante a getto d'inchiostro, l'opzione migliore si ottiene solo su pellicola a getto d'inchiostro. Devi stampare in negativo e in immagine speculare:

Ho subito laminato il modello in modo che le impronte digitali e i detriti potessero essere facilmente lavati via.
2. Successivamente, è necessario carteggiare la nostra futura tavola (fibra di vetro falsificata). Una spugna normale leggermente inumidita o una spugna melamminica è adatta per questo:


3. Dopo questa procedura, il rame deve ancora essere sgrassato con acetone:


Come puoi vedere nella mia foto, ho sgrassato con un normale tovagliolo e ho versato acetone in una bottiglia di perossido, quindi è più comodo prendere ...
4. Il prossimo passo è tagliare leggermente il fotoresist per la tua futura scheda con un margine e rimuovere con attenzione la pellicola protettiva superiore in modo da non danneggiarla. Se il fotoresist è domestico, devi staccare il lato opaco, se è cinese, non c'è differenza ...
5. Successivamente, incolliamo il fotoresist sulla textolite in modo che non appaiano bolle d'aria sotto il fotoresist, altrimenti le tracce non appariranno in tali punti, tagliamo l'eccesso ...
Il processo di incollaggio di un fotoresist è simile all'incollaggio di una protezione per lo schermo su un telefono.


6. Quando il fotoresist è incollato, la textolite con esso deve essere passata attraverso il laminatore 2-3 volte o utilizzare un ferro caldo e stirarlo attraverso un foglio di carta piegato due volte:


La cosa principale è non surriscaldare il fotoresist, altrimenti risulterà così:


Se si ottiene uno stipite quando si incolla il fotoresist, allora è meglio rimuoverlo (lavarlo o raschiarlo via) e riattaccarlo, altrimenti dopo aver inciso la tavola sarà triste ... Non rimuoverò questo fotoresist , mostrerò il risultato finale.
7. Mettiamo un modello sulla textolite con un fotoresist e lo premiamo con il vetro (l'ho preso da una vecchia cornice per foto) e mettiamo un carico sul vetro:


8. Illuminiamo il fotoresist utilizzando una lampada UV. La mia lampada dura circa 2 minuti:


Come puoi vedere, il fotoresist che è stato acceso ha cambiato colore da azzurro a blu scuro e il fotoresist esposto è molto fragile.
9. Rimuovere il vetro e la dima. Il fotoresist in eccesso può (facoltativamente) essere tagliato e separato con cura con una pinzetta:


10. Il prossimo passo è lavare via il fotoresist non sviluppato con alcali, per questo prendiamo 2 bicchieri d'acqua e un cucchiaio di carbonato di sodio, mescoliamo bene. Stacchiamo la pellicola protettiva superiore dal fotoresist e abbassiamo la nostra textolite in una soluzione alcalina.


11. Prendiamo un pennello e tre del fotoresist in alcali, gradualmente il fotoresist non sviluppato viene lavato via:


L'alcali non può essere versato, ma lasciato sulla tavola successiva o per lavare via il fotoresist dopo l'incisione, ma ne parleremo più avanti ...
12. Tavola per incisione:
Esistono due metodi più accessibili: incisione con cloruro ferrico o perossido + acido citrico e sale. Non scriverò del cloruro ferrico, ma probabilmente lo descriverò con il perossido:
- 100 ml. perossido di idrogeno 3% - è venduto in farmacia per 7-12 rubli
- 30gr. acido citrico (disponibile in qualsiasi negozio di alimentari)
- 1 cucchiaio. un cucchiaio di sale (adatto sia fino che nocciola)


Tutto questo viene mescolato in un contenitore e una tavola con un fotoresist già pronto viene immersa lì, dopo un po 'appare delle bolle sulla tavola:


E dopo un po', il "rame nudo" è completamente inciso:


A proposito, se si incide a una temperatura più alta, ad esempio vicino a una lampada a incandescenza o a bagnomaria, l'incisione diminuirà di tre, l'importante è non esagerare, altrimenti l'eccesso verrà inciso ...
13. È più conveniente rimuovere il fotoresist nello stesso alcali, in cui il fotoresist non inciso è stato lavato via, dopo circa 20 minuti scomparirà da solo e non è necessario strofinare nulla ...

Ed ecco i miei "stipiti":


Sebbene non significativo, ma tuttavia, la disattenzione è la causa di tutto, non ha notato bolle d'aria sotto il fotoresist o si è surriscaldato ...

La seguente scheda si è rivelata "pulita":


14. Successivamente, eseguiamo dei fori e armeggiare la tavola:


15. Saldiamo tutti i dettagli e laviamo il flusso in eccesso:


Ho saldato componenti SMD con una stazione di saldatura a infrarossi cinese, molto conveniente:

Questo è tutto, la cosa più difficile è finita, resta da suonare i binari per un cortocircuito e iniziare a programmare il chip.

Programmazione Atmega644

1. Per iniziare a programmare, è necessario caricare il bootloader al suo interno. Questo non è difficile da fare con Arduino UNO, ma prima devi scaricare e installare il programma.
2. Il passaggio successivo consiste nell'aggiungere o portare un assembly già pronto al programma installato:
3. Compila lo sketch UNO ArduinoISP:

4. E collega la nostra scheda a UNO:


Secondo le istruzioni dello schizzo:
// nome pin // reset slave: 10: // MOSI: 11: // MISO: 12: // SCK: 13:
Risulta secondo il mio schema in questo modo:

5. Successivamente, installa la nostra scheda nelle impostazioni e carica il bootloader:




Se tutto è andato bene, vedremo il messaggio: "Registrazione bootloader completata"
Questo completa il bootloader "un caricamento, puoi collegare il display, i pulsanti, il sensore di temperatura e riempirlo. Sono uno studente di un'università tecnica. Una volta, seduto in un caffè con un amico che allora studiava in un'università di medicina, abbiamo deciso di aprire un bar. C'erano molte idee che, in linea di principio, meritavano una certa attenzione. Ad esempio, la 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 ()); // controllo delle 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 verifica 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 oggetto, EventArgs e) (SerialPort Port1 = new SerialPort ("COM6", 9600); // MessageBox.Show ("La porta COM6 è selezionata"); 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 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 spento l'intero sistema in modo anomalo");) 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 è in attesa del 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 fino a quando non si è resa conto della necessità di mettere a terra tutto, prima pugni 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 si presenta così.

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.

Nel 2014, mi sono imbattuto in un video di un ragazzo che produce birra dal concentrato di mosto di birra. Mi sono appassionato all'idea di fare la birra e poi è iniziata...
La produzione di birra dal cibo in scatola non è diventata interessante per me dopo la seconda volta e ho deciso di passare a all-grain. Una volta ho preparato la birra a gas e ho capito che questo non era il mio metodo. Ho deciso di fare un'automazione. Le serate diventavano più interessanti. Ero così coinvolto nella programmazione che stavo programmando fino alle 2-3 del mattino. Erano necessari test del mondo reale. Nei bidoni ho dissotterrato una caldaia e un vetro sfaccettato.

E questo è quello che ho finito con

E ora ti dirò come realizzare una tale automazione.
Innanzitutto, abbiamo bisogno dei seguenti dettagli. Li ho acquistati in Cina.
ssd1289 o ili9341.
Relè a stato solido per il controllo dell'elemento riscaldante (o circuito acceso)
Relè a stato solido per comando pompa (per pompa AC) o (DC)
Sensore termico o o
Alimentazione 7,5-9V 1A. ad esempio
Connettori per il collegamento di un sensore di temperatura e una pompa e
(Di più )
(cicalino)
Resistore da 4,7k ohm

Circuito a bassa tensione

Circuito di potenza. Stai attento. Se non sei sicuro, affidati ai professionisti.

Prendiamo la sezione dei fili in base alla potenza totale della pompa e dell'elemento riscaldante. Per un elemento riscaldante a stato solido, è necessario un radiatore. non è riscaldato debolmente. Infiliamo tutto in scatole. Compila il firmware, configura e prepara la birra.

(istruzioni all'interno)

Ma le funzioni di base non mi bastavano. E ho deciso di rovinare il wifi. Ho acquistato il modulo ESP8266 su aliexpress. Allo stesso tempo ho ordinato il modulo. ragazzi del forum, beh, hanno chiesto molto di implementarlo nel progetto (è possibile senza di esso). E l'ho collegato secondo il seguente schema

Per alimentare il modulo wifi, abbiamo bisogno di un alimentatore da 5V. Non puoi usare arduino. È possibile utilizzare un alimentatore separato o convertire 9V in 5V. Per fare ciò, puoi assemblare un semplice circuito con uno stabilizzatore di tensione o acquistarne uno già pronto dai cinesi. Ad esempio (ci sono un sacco di altre opzioni).

Il prossimo passo è eseguire il flashing del nostro modulo con il firmware NodeMCU. Download. Lanciamo. Premi Start e attendi la fine del caricamento del firmware. L'hai chiesto? È grandioso. Ora carichiamo lo script. Per questo abbiamo bisogno. Ci sono ovviamente altri programmi come. Ma non sono riuscito a farli funzionare con il mio modulo. In ESPlorer, crea un nuovo file init.lua con il seguente contenuto:

Cambia il nome della rete wifi e la password con la nostra. Impostare la velocità su 9600. Premere il pulsante "Apri" (se non si connette, premere il pulsante di ripristino sul modulo può essere d'aiuto). E fai clic su "Salva in ESP". Dopo aver caricato lo script, il modulo dovrebbe connettersi al router. Questo può essere verificato entrando nel router e guardando i client DHCP. Se il tuo modulo non è visibile lì, qualcosa è andato storto.

L'interfaccia web contiene le seguenti funzioni.
1. Monitoraggio dei processi. È possibile monitorare la temperatura, lo stato della pompa, gli indicatori di ammostamento e cottura. L'interfaccia web è dotata di un dispositivo di segnalazione sonora.
2. Caricare le ricette nella memoria del controller e nella chiavetta USB.
3. Costruire un programma globale per l'intera cottura.






Accedi all'interfaccia web

Principali articoli correlati