Camera Fermentazione controllata via WEB

Sezione specifica dedicata alla progettazione di sistemi di controllo sia hardware che software con il sistema Arduino

Camera Fermentazione controllata via WEB

Messaggioda ziobill » 18/11/2013, 12:01

Salve ragazzi,
ho terminato da qualche giorno il facile facile termostato con controllo via web per la mia camera di fermentazione (il frigorifero!)
Ho aggiunto anche la funzionalita' "salva frigo" che ha l'STC1000.

Il funzionamento e' facile:
Voi impostate il range di temperatura che il frigo deve mantenere (MIN e MAX).
Poi impostate la variabile "secure_time" a 120 (se volete 2 minuti di "salva frigo")

Una volta impostato questo e caricato il programma lui manterra' il range di temperatura accendendo il frigo o la striscia riscaldante che avrete posizionato nel frigo possibilmente in basso in modo che il calore salga verso l'alto.
In piu' lui avviera' un server web all'indirizzo 192.168.2.177 (che potete modificare). Quindi se aprirete il vostro browser all'indirizzo http://192.168.2.177 la pagina che ne uscira' sara' la seguente:

Immagine
come facilmente intuibile basta inserire il valore "MIN=<temp>" oppure "MAX=<temp>" e lui andra' a modificare le variabili impostate all'inizio in modo da cambiare il range di temperatura.

Spero sia tutto chiaro altrimenti contattatemi pure :)

Il risultato finale e' questo:

http://www.nostress.it/20131117_122642.jpg
http://www.nostress.it/20131117_122717.jpg

Ecco quello che serve:

- Un frigorifero
- un Cavo riscaldante per terrari tipo questo http://www.ebay.it/itm/EDEN-415-CAVO-CAVETTO-RISCALDANTE-50-W-TERRARI-ACQUARI-RETTILARI-/271159562839?pt=Acquari_Pesci_e_Tartarughe&hash=item3f225e9257
- Arduino (per chi non ha mai comprato arduino consiglio il KIT perche' quest'ultimo comprende la board e i connettori vari) http://www.ebay.it/itm/VARALLOSTORE-Arduino-Uno-Electronics-Development-Microcontroller-Board-EC-/331065843534?pt=Attrezzature_e_strumentazione&hash=item4d150fdf4e&_uhb=1
- Ethernet Shield http://www.ebay.it/itm/Ethernet-Shield-W5100-per-Arduino-Scheda-Principale-Uno-/350895961433?pt=Automazione_domestica&hash=item51b3077559&_uhb=1
- Sonda temperatura http://www.ebay.it/itm/141103829544?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
- Scheda con 2 rele' http://www.ebay.it/itm/160981814618?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
- Scatola di derivazione
- interruttore
- Alimentatore da 9V
- fili, prese, etc etc

Lo schema di collegamento che ho usato e' il seguente:

Immagine

il codice per Arduino eccolo qua'...

#include <OneWire.h>
#include <DallasTemperature.h>
#include <secTimer.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,2,177);
EthernetServer server(80);
String receivedText = String(255);

int cold = 7;
int hot = 6;
char floatbuf[32];

int MIN = 23;
int MAX = 30;

int time;
secTimer myTimer;
byte state=1;
unsigned long seconds=0;
const int chipSelect = 4;

#define CALDO 0
#define FREDDO 1

int ultimostato = NULL;
int ultimoff = 0;
int secure_time = 120;

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup(void)
{
// start serial port
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());

// if the file opened okay, write to it:


myTimer.startTimer();
seconds=myTimer.readTimer();
pinMode(cold, OUTPUT);
pinMode(hot, OUTPUT);

// Start up the library
sensors.begin();
}

void loop(void)
{
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (receivedText.length() < 55) {
receivedText += c;
}
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

client.print("<html><head><title>Arduino Webserver</title></head><body>");
client.print("La temperatura del sensore e':");
client.println(sensors.getTempCByIndex(0));
client.print("</br>");
client.print("La temperatura impostata e':");
client.print("Min: ");
client.print(MIN);
client.print(" Max: ");
client.print(MAX);


client.println("<h1>Controllo Temperatura!</h1>");
client.print("<form method=get>Inserisci la temperatura (MAX=? oppure MIN=?): <input type=text size=10 name=temp>&nbsp;<input type=submit></form>");
//client.print("<form method=get>Inserisci la temperatura Massima: <input type=text size=10 name=max>&nbsp;<input type=submit></form>");
client.println("</body></html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
delay(1);
Serial.println("questo e' il received text");
Serial.println(receivedText); // uncomment this line to debug ;-)

// do something with the text
int firstPos = receivedText.indexOf("?");
if (firstPos > -1) {
int lastPos = receivedText.indexOf(" ", firstPos);
String theText = receivedText.substring(firstPos+12, lastPos); // 10 is the length of "?the_text="
String theTextScelta = receivedText.substring(firstPos+6, firstPos+9); // 10 is the length of "?the_text="
// if your text contains spaces they will be replaced with "+"
Serial.println("***********************");
Serial.println(theTextScelta);
Serial.println(theText);
Serial.println("***********************");

theText.toCharArray(floatbuf, sizeof(floatbuf));
int TheTextINT = atoi(floatbuf);

if (theTextScelta == "MIN")
MIN = TheTextINT;
if (theTextScelta == "MAX")
MAX = TheTextINT;
}
receivedText = "";
client.stop();
Serial.println("client disonnected");
}
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");

Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempCByIndex(0));

time=myTimer.readTimer();

if (sensors.getTempCByIndex(0) < MIN)
{
digitalWrite(hot, LOW);
digitalWrite(cold, HIGH);
Serial.print("Riscaldamento...");
ultimostato = CALDO;
}
else if (sensors.getTempCByIndex(0) > MAX && (time-=secure_time) > ultimoff)
{
digitalWrite(hot, HIGH);
digitalWrite(cold, LOW);
Serial.print("Raffreddamento...");
ultimostato = FREDDO;
}
else if (sensors.getTempCByIndex(0) > MIN || sensors.getTempCByIndex(0) < MAX)
{
digitalWrite(hot, HIGH);
digitalWrite(cold, HIGH);
Serial.print("Temperatura OK!");

if (ultimostato == FREDDO)
{
ultimoff = myTimer.readTimer();
ultimostato = NULL;
}
}/*
Serial.println();
Serial.print("ULTIMOSTATO: ");
Serial.println(ultimostato);
Serial.print("ULTIMOFF: ");
Serial.println(ultimoff);
Serial.print("Timer: ");
Serial.println(myTimer.readTimer());
Serial.print("secure Timer: ");
Serial.println(secure_time);
Serial.print("MIN: ");
Serial.println(MIN);
Serial.print("MAX: ");
Serial.println(MAX); */
}



Ciao e mi raccomando...
BIRRIFICATEEEEEEE
ziobill
Principiante
Principiante
 
Messaggi: 10
Iscritto il: 04/11/2013, 13:47
Comune: Roma
Stile preferito: Imperial Stout
Tecnica: All Grain
Provincia: Roma (Lazio)

Re: Camera Fermentazione controllata via WEB

Messaggioda saviothecnic » 18/11/2013, 15:52

Interessante visto che sai scrivere soft per Arduino perchè non ci dai una mano al nostro progetto ?
Domanda perche non ci aggiungi un Modulo in I2C per interfaccia utente tipo questo Display 20x4
http://www.ebay.it/itm/2004-20x4-LCD-Ch ... 5d45cdebe3

Come sensori non hai caricato la Libreria dallass ?
Qui gli trovi a meno http://www.ebay.it/itm/140741163209?ssP ... 1423.l2649

Per impostare i dati potresti usare uno di questi
http://www.ebay.it/itm/310511616357?ssP ... 1497.l2649

Poi io un modulito RTC in I2C l' avrei messo cosi hai data e ora smerpe reali :D
saviothecnic
Novizio
Novizio
 
Messaggi: 60
Iscritto il: 31/07/2012, 15:52
Comune: Itri
Stile preferito: Waizzen
Tecnica: All Grain
Provincia: Latina (Lazio)

Re: R: Camera Fermentazione controllata via WEB

Messaggioda vriende » 18/11/2013, 18:06

Per ora la cosa non mi serve, ma ti faccio i più sinceri complimenti per il lavoro fatto e per la disponibilità nel condividere ;)

inviato via tapatalk
vriende
Birraio
Birraio
 
Messaggi: 335
Iscritto il: 03/09/2013, 15:40
Comune: cosenza
Stile preferito: weiss
Tecnica: All Grain
Provincia: Cosenza (Calabria)

Re: Camera Fermentazione controllata via WEB

Messaggioda saviothecnic » 19/11/2013, 8:07

ziobill ha scritto:Salve ragazzi,ho terminato da qualche giorno il facile facile termostato con controllo via web per la mia camera di fermentazione (il frigorifero!)

Dimenticavo se ci vuoi dare una mano sempre per gestione automazione camera di fermentazione con arduino avevo aperto un topic proprio sul forum arduino

http://forum.arduino.cc/index.php?topic=192189.0

Spero avrai tempo e voglia per darci una mano :D

Ha volendo che chi non vuole montare il tutto volante riadattando il PIN-OUT per questo progetot potrebbe anche usare la schield che abbiamo realizzato per BrauDuino
Infatti questa schield vuole avere anche lo spunto di diventare una cosa facile fai da te per progetti simili
https://plus.google.com/photos/11709602 ... 9927896725

http://www.saviot.com/images/MastroBirr ... -R2-lc.jpg

Immagine

Grazie
saviothecnic
Novizio
Novizio
 
Messaggi: 60
Iscritto il: 31/07/2012, 15:52
Comune: Itri
Stile preferito: Waizzen
Tecnica: All Grain
Provincia: Latina (Lazio)

Re: Camera Fermentazione controllata via WEB

Messaggioda ziobill » 19/11/2013, 11:06

certo che ho voglia di darvi una mano...
ditemi che cosa vogliamo modificare o aggiungere e mi metto all'opera :)

diciamo che la prossima cosa che volevo mettere e' un microfono e una mini telecamerina in modo da poter vedere e sentire online il gorgoglio! huahuahuahuhuauha la malattia che dilaga!
ziobill
Principiante
Principiante
 
Messaggi: 10
Iscritto il: 04/11/2013, 13:47
Comune: Roma
Stile preferito: Imperial Stout
Tecnica: All Grain
Provincia: Roma (Lazio)

Re: Camera Fermentazione controllata via WEB

Messaggioda saviothecnic » 19/11/2013, 11:32

ziobill ha scritto:certo che ho voglia di darvi una mano...
ditemi che cosa vogliamo modificare o aggiungere e mi metto all'opera :)


Ottima Notizia birra3

ziobill ha scritto:diciamo che la prossima cosa che volevo mettere e' un microfono e una mini telecamerina in modo da poter vedere e sentire online il gorgoglio!
huahuahuahuhuauha la malattia che dilaga!


Se leggi il mio topic su forum arduino vedi che quello che ho chiesto io è proprio quello che vuoi fare tu con in piu la parte log ed altre chicche
Ieri mi hanno spedito dalla Germania le serpentine Inox quindi in settimana dovrei avere quasi tutto HW necessario
Unica cosa si migra su Arduino Mega 2560 perche le cose da voler aggiungere sono molte e meglio partire subbito con un HW predisposto per il futuro
Intanto se vuoi se adatti il tuo FW al pcb Brauduino o Birraduino possiamo al volo aggiungere interfaccia utente con tastiera e LCD
In modo che interfaccia WEB sia un ADD ON e non unico metodo di interfaccia utente

Io ho tutto HW dentro e posso darti una mano dal lato elettronica come vedi per il lavoro PCB se amico DanielXan mi da una mano
per la nuova schield unica che ho proposto
Che sara una schield basata su UNO Mega che potra essere ustata per tutto Brauduino birraduino camera fermentazione ecc ecc

P.S nel progetto che hai postato è bene mettere i link alle librerie non incluse che servono come è stato fatto per Birraduino
Inizia ad aggiungere al soft un PIN Ingresso e un Uscita Allarme tipo porta frigo Aperta che si collega ad un buzzer tipo questo che ho usato in BirraDuino

http://www.youtube.com/watch?v=Ix4np_VLPcE
saviothecnic
Novizio
Novizio
 
Messaggi: 60
Iscritto il: 31/07/2012, 15:52
Comune: Itri
Stile preferito: Waizzen
Tecnica: All Grain
Provincia: Latina (Lazio)

Re: Camera Fermentazione controllata via WEB

Messaggioda saviothecnic » 26/11/2013, 23:28

ziobill ha scritto:certo che ho voglia di darvi una mano...

Ha vorrei a breve ho gia quasi tutto dentro fare una cosa tipo questa
http://thebobrowe.com/?p=840
Pero con LCD e RTC in I2c 20x4 e Tastiera 4x4 cosi da mettere a Display Data ora e Nome Birra servita
Immagine
Se mi dai una mano per la modifica firmware io parto con la parte pratica :D

Grazie
saviothecnic
Novizio
Novizio
 
Messaggi: 60
Iscritto il: 31/07/2012, 15:52
Comune: Itri
Stile preferito: Waizzen
Tecnica: All Grain
Provincia: Latina (Lazio)

Re: Camera Fermentazione controllata via WEB

Messaggioda saviothecnic » 05/12/2013, 8:13

La struttura inizia a prendere forma tra poco mi mancherà solo questa parte firmware modificato Arduino ed è finito birra3

Immagine

Grazie
saviothecnic
Novizio
Novizio
 
Messaggi: 60
Iscritto il: 31/07/2012, 15:52
Comune: Itri
Stile preferito: Waizzen
Tecnica: All Grain
Provincia: Latina (Lazio)

Re: Camera Fermentazione controllata via WEB

Messaggioda saviothecnic » 02/04/2014, 7:38

ziobill ha scritto:certo che ho voglia di darvi una mano...ditemi che cosa vogliamo modificare o aggiungere e mi metto all'opera :)


Intanto ho fatto preparare un PCB secondo mie indicazioni cosi come HW abbiamo tutto definito :D

Immagine

Quando sei pronto dimmi che definiamo cosa fare :D

Grazie
saviothecnic
Novizio
Novizio
 
Messaggi: 60
Iscritto il: 31/07/2012, 15:52
Comune: Itri
Stile preferito: Waizzen
Tecnica: All Grain
Provincia: Latina (Lazio)

Re: Camera Fermentazione controllata via WEB

Messaggioda saviothecnic » 20/05/2014, 0:26

ziobill ha scritto:certo che ho voglia di darvi una mano...ditemi che cosa vogliamo modificare o aggiungere e mi metto all'opera :)


Ottima ZioBill ci sei ancora ?

Allora l' Ultimo PCB modificato da DanielXan OpenArdBirOC che sotto mia Indicazione non USA piu i PIN SPI va bene anche per il tuo firmware [:D]

Ovviamente non andrebbe un eventuale LCD ma tanto in questo FW TU non lo gestisci dato che in questo PCB usa il Pin4 tra i vari Pin del LCD

che in questo caso è usato assieme hai PIN Liberi 10 11 13 dalla Schield W5100 LAN per SD select

Magari lato PCB se poi fa la modifica di spostare il connettore Pulsanti e Rimettere il connettore I2C per LCD e RTC su A4 e A5 e tu fai

una modifica al Firmware si potrebbe anche vedere la temperatura su LCD e impostare da pulsanti oltre che da WEB e è figo

ma fare il tutto solo via WEB non è immediato sarebbe bello andare davanti al frigo e leggere al volo la temp interna

senza andare in web ed aggiornare le pagine per leggere temp e modficare SP [:P]

Immagine

Allora sto Uppando un Video del mio test che dimostra che tutto funziona a meraviglia [:D]

Non ho fatto nulla solo adattato il tuo FW cosi modificato solo il Pin Out gira sul PCB OpenArdBir OC

Ti restano anche Liberi 4 ingressi per 4 Pulsanti e un uscita che potresti usare come Buzzer tipo per allarme porta Aperta

Ovviamente le uscite sono OC quindi ci va collegato un SSR o un Rele a valle per comandare resistenza e pompa frigo

pero cosi e piu sicuro che collegare direttamete la la 230V su un rele piazzato sul PCB

Il PCB è questo OpnArdBir-lc.jpg

Codice Modificato questo

Codice: Seleziona tutto

#include <OneWire.h>
#include <DallasTemperature.h>
#include <secTimer.h>
#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,81,100);
EthernetServer server(80);
String receivedText = String(255);
 
int cold = 6;
int hot = 9;
char floatbuf[32];
 
int MIN = 23;
int MAX = 30;
 
int time;
secTimer myTimer;
byte state=1;
unsigned long seconds=0;
const int chipSelect = 4;
 
#define CALDO 0
#define FREDDO 1
 
int ultimostato = NULL;
int ultimoff = 0;
int secure_time = 120;
 
// Data wire is plugged into port 7 on the Arduino
#define ONE_WIRE_BUS 7
 
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
 
  // if the file opened okay, write to it:
 
 
  myTimer.startTimer();
  seconds=myTimer.readTimer();
  pinMode(cold, OUTPUT);
  pinMode(hot, OUTPUT);
 
  // Start up the library
  sensors.begin();
}
 
void loop(void)
{
  EthernetClient client = server.available();
if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (receivedText.length() < 55) {
          receivedText += c;
        }
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
 
          client.print("<html><head><title>Arduino Webserver</title></head><body>");
          client.print("La temperatura del sensore e':");
          client.println(sensors.getTempCByIndex(0));
          client.print("</br>");
          client.print("La temperatura impostata e':");
          client.print("Min: ");
          client.print(MIN);
          client.print("  Max: ");
          client.print(MAX);
         
         
          client.println("<h1>Controllo Temperatura!</h1>");
          client.print("<form method=get>Inserisci la temperatura (MAX=? oppure MIN=?): <input type=text size=10 name=temp>&nbsp;<input type=submit></form>");
            //client.print("<form method=get>Inserisci la temperatura Massima: <input type=text size=10 name=max>&nbsp;<input type=submit></form>");
          client.println("</body></html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
     delay(1);
     Serial.println("questo e' il received text");
    Serial.println(receivedText); // uncomment this line to debug ;-)
 
    // do something with the text
    int firstPos = receivedText.indexOf("?");
    if (firstPos > -1) {
      int lastPos = receivedText.indexOf(" ", firstPos);
      String theText = receivedText.substring(firstPos+12, lastPos); // 10 is the length of "?the_text="
      String theTextScelta = receivedText.substring(firstPos+6, firstPos+9); // 10 is the length of "?the_text="
      // if your text contains spaces they will be replaced with "+"
      Serial.println("***********************");
      Serial.println(theTextScelta);
      Serial.println(theText);
      Serial.println("***********************");
     
      theText.toCharArray(floatbuf, sizeof(floatbuf));
      int TheTextINT = atoi(floatbuf);
     
      if (theTextScelta == "MIN")
        MIN = TheTextINT;
      if (theTextScelta == "MAX") 
        MAX = TheTextINT;
    }
    receivedText = "";
    client.stop();
    Serial.println("client disonnected");
}
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
 
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0)); 
 
  time=myTimer.readTimer();
 
  if (sensors.getTempCByIndex(0) < MIN)
  {
    digitalWrite(hot, LOW);
    digitalWrite(cold, HIGH);
    Serial.print("Riscaldamento...");
    ultimostato = CALDO;
  }
  else if (sensors.getTempCByIndex(0) > MAX && (time-=secure_time) > ultimoff)
  {
    digitalWrite(hot, HIGH);
    digitalWrite(cold, LOW);
    Serial.print("Raffreddamento...");
    ultimostato = FREDDO;
  }
  else if (sensors.getTempCByIndex(0) > MIN || sensors.getTempCByIndex(0) < MAX)
  {
    digitalWrite(hot, HIGH);
    digitalWrite(cold, HIGH);
    Serial.print("Temperatura OK!");
   
    if (ultimostato == FREDDO)
    {
       ultimoff = myTimer.readTimer();
       ultimostato = NULL;
    }
  }/*
  Serial.println();
  Serial.print("ULTIMOSTATO: ");
  Serial.println(ultimostato); 
  Serial.print("ULTIMOFF: ");
  Serial.println(ultimoff); 
  Serial.print("Timer: ");
  Serial.println(myTimer.readTimer());
  Serial.print("secure Timer: ");
  Serial.println(secure_time);
  Serial.print("MIN: ");
  Serial.println(MIN);
  Serial.print("MAX: ");
  Serial.println(MAX); */
}


Spero che ZioBill abbia voglia e tempo di continuare a migliroare questo splendito programma [:D]

Io sono disponibile per dare una mano lato test HW

Ecco il Video del mio test http://youtu.be/SQraPXFI1zs

Grazie
saviothecnic
Novizio
Novizio
 
Messaggi: 60
Iscritto il: 31/07/2012, 15:52
Comune: Itri
Stile preferito: Waizzen
Tecnica: All Grain
Provincia: Latina (Lazio)


Torna a Arduino

Chi c’è in linea

Visitano il forum: tonino e 1 ospite