Introduction: Birra_Monitor
Il progetto serve a monitorare la fermentazione della birra fatta in casa tramite un semplice sensore di vibrazione (SW-420 NC). l'aggiunta del sensore di temperatura (DHT22) serve a monitorare temperatura e umidità della stanza atta alla fermentazione. Questi dati vengono gestiti da una scheda nodemcu e visualizzati tramite Blynk app deputata allo sviluppo di soluzioni IoT.
The project is used to monitor the fermentation of homemade beer using a simple vibration sensor (SW-420 NC). the addition of the temperature sensor (DHT22) serves to monitor the temperature and humidity of the room suitable for fermentation. This data is managed by a nodemcu card and visualized through Blynk app appointed to develop IoT solutions.
Step 1: Packaging
Scheda e sensori sono alloggiate in una semplice scatola di derivazione.
Board and sensors are housed in a simple junction box.
Step 2: Sensor at Work
quello che succede quando il sensore è "montato" sul gorgogliatore che ad ogni espulsione di CO2 il sensore registrerà delle vibrazioni che verranno visualizzate sull'app Blynk
what happens when the sensor is "mounted" on the bubbler that every time the CO2 is expelled the sensor will record vibrations that will be displayed on the Blynk app
Attachments
Step 3: Code
il codice per permettere il funzionamento del tutto è il seguente che basterà caricare sulla scheda tramide il software Arduino IDE
the code to allow the functioning of the whole is the following that will be enough to load on the card the Arduino IDE software
#include Adafruit_Sensor.h
#include DHT.h
#define BLYNK_PRINT Serial
#include ESP8266WiFi.h ;
#include BlynkSimpleEsp8266.h ;
#include SimpleTimer.h ;
#include WidgetRTC.h ;
float lettura[50]; //dimensione Arrayper media
int nume_Letture=0; //progressivo letture
float tot_Letture=0; //somma letture
float media_Letture=0; //media letture
int conteggio=0; //variabile di conteggio primario
//inizio dichiarazioni variabili per media continua
int i=0;
int cc=0;
int togli=0;
//fine dichiarazioni variabili per media continua
int val; //variabile registrazione vibrazione
int vibr_pin=5 ; //Piedino x Sensore di Vibrazione D1
int vb=0; //Inizializzo vb a 0
int vbr=0; //Inizializzo vb a 0
int vbinit=0; //Inizializzo vbinit a 0
unsigned long prima=0; //utile per swap min/max
long Tempmax=660000; //utile per swap min/max
float tmax=-100; //impostazione impossibile per la temperatura massima
float tmin=100; //impostazione impossibile per il temperatura minima
float umax=0; //impostazione impossibile per umidità massima
float umin=100; //impostazione impossibile per umidità minima
String maxt; //stringa visualizzata su Blynk
String mint; //stringa visualizzata su Blynk
String maxu; //stringa visualizzata su Blynk
String minu; //stringa visualizzata su Blynk
char auth[] = "a°°°°°°°°°°°°°d";//token Blynk
char ssid[] = "T°°°°°°°°°°°°°9"; //wifi
char pass[] = "O°°°°°°°°°°°°R"; //psw
#define DHTPIN 2 //pin sensore DHT
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
SimpleTimer timer; //timer
WidgetRTC rtc; //orologio di sistema Blynk
WidgetLED led1(V15); //Led Blynk sul pin V15
BLYNK_CONNECTED () {
rtc.begin(); //avvio RTC
}
BLYNK_WRITE(V0) //routine per tasto reset da Blynk
{
int attiva = param.asInt();
if (attiva==1){
tmax=-100;
tmin=100;
umax=0;
umin=100;
maxt= "------------";
mint= "------------";
maxu= "------------";
minu= "------------";
media_Letture=0;
tot_Letture=0;
nume_Letture = 0;
conteggio = 0;
cc=0;
Serial.println(conteggio);
Blynk.virtualWrite(V8, media_Letture);
Blynk.virtualWrite(V10, maxt);
Blynk.virtualWrite(V11, mint);
Blynk.virtualWrite(V12, maxu);
Blynk.virtualWrite(V13, minu);
Blynk.virtualWrite(V1, conteggio);
Serial.println("Resetta");
delay(200);
Blynk.virtualWrite(V0, LOW);
}
}
void sendSensor() //normale procedura di lettura
{
String currentTime = String(hour()) + ":" + minute();
String currentDate = String(day()) + "/" + month();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
led1.on();
return;
}
else {
led1.off();
}
if (t > tmax) {
tmax=t;
maxt= String(t) + "°C (" + currentTime + "-" +currentDate+ ")";
}
if (t < tmin) {
tmin=t;
mint= String(t) + "°C (" + currentTime + "-" +currentDate+ ")";
}
if (h > umax) {
umax=h;
maxu= String(h) + "% (" + currentTime + "-" +currentDate+ ")";
}
if (h < umin) {
umin=h;
minu= String(h) + "% (" + currentTime + "-" +currentDate+ ")";
}
Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V6, t);
Blynk.virtualWrite(V7, vb);
Blynk.virtualWrite(V10, maxt);
Blynk.virtualWrite(V11, mint);
Blynk.virtualWrite(V12, maxu);
Blynk.virtualWrite(V13, minu);
}
void calcolo_media() //procedura per registrazioni dati media
{
lettura[nume_Letture] = dht.readTemperature();
if (isnan(lettura[nume_Letture])) {
led1.on();
return;
}
//procedura media circolare
if (nume_Letture>=48){
togli=nume_Letture-48;
tot_Letture -=(lettura[togli]);
tot_Letture +=(lettura[nume_Letture]);
nume_Letture=0; //setta a zero e riparte tutto
cc=1; //identifica primo passaggio dopo 48 letture (24ore)
}
if (cc==1) {
conteggio=48; //DOPO le prime 24ore divide sempre per 24ore (48mezzore)
}
else{
//media prima dello scadere delle 24ore
tot_Letture +=(lettura[nume_Letture]);
conteggio=conteggio+1;
}
media_Letture=tot_Letture/conteggio;
nume_Letture=nume_Letture+1;
Blynk.virtualWrite(V8, media_Letture);
Blynk.virtualWrite(V1, conteggio);
}
void setup()
{
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
dht.begin();
timer.setInterval(10000, sendSensor); //lettura temperatura umidità ogni 5 min
timer.setInterval(1800000, calcolo_media); //lettura e media ogni 30min
}
void loop()
{
Blynk.run();
timer.run();
long adesso=millis();
val = digitalRead (vibr_pin);
vb=vb+val;
if (adesso - prima >= Tempmax)
{
vb=0;
vbinit=vb;
prima=adesso;
}