Introduction: Birra_Monitor

About: - Bello, Magro, Ricco ma soprattutto BUGIARDO!

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

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;

}