giovedì 5 maggio 2016

Temperatura di stoccaggio - Blynk & ESP8266

Per diversi materiali la temperatura di stoccaggio è un punto da tener ben presente.


Recentemente mi sono scontrato con l'ostico problema della temperatura di stoccaggio del filo per la stampa 3D.
Nel FabLab abbiamo una stanza dedicata allo stoccaggio del filo, PLA e ABS di diverse persone.
La stanza non è molto ben areata e necessita d'un controllo di temperatura per migliorare le cose.

Perchè non utilizzare un progetto IOT per controllare, momento per momento ed a distanza, la temperatura della stanza? 
Magari potendo intervenire accendendo alcune ventole per migliorare la ventilazione!

Nella speranza che questa guida vi sia d'aiuto e per darvi un'assaggio del progetto, vi lascio una piccola finestrella sul FabLab: 


Vi basterà aprire Blynk, nuovo progetto e scansionare il Qcode. 

Ora viene il bello, come posso farne una versione mia? Posso modificarlo?
Ovviamente si! 

Iniziamo.

Materiale richiesto:
  • DHT11, sensore d'umidità e temperatura
  • Esp8266, meglio se modello NodeLua per comodità
  • Protoboard, saldatore  e una resistenza da  circa 4.7 Kohm 
Il sensore DHT11 andrà saldato ad una protoboard con una resistenza di pull-up di 4.7 Kohm.



Studio del codice:

Intanto scarichiamo il programma su Git, di seguito lo commenteremo passo passo.


Il primo blocco del programma sono le dichiarazioni, variabili e librerie:
 #include <ESP8266WiFi.h>  
 #include <BlynkSimpleEsp8266.h>  
 #include <SimpleTimer.h> // Libreria Simple Timer  
 #include <dht11.h> // Libreria sensore DHT11  
 #define DHT11_PIN 12 // Pin fisico D6  
 dht11 DHT;  
   
 // Inserire sotto l'Auth Token Blynk App.  
 char auth[] = "xxx";   
   
 SimpleTimer timer; // Imposto l'uso del timer     
Ricordo d'inserire il vostro Auth Token generato dall'app Blynk.
Per finire abilito il time.

Il secondo blocco del programma riguarda l'impostazione della rete WiFi e la durata del timer:
void setup() {  
  Blynk.begin(auth, "Nome", "Password"); //Inserire SSID and password della rete  
   
  // Imposta il timer in modo da chiamare la funzione "sendUptime" ogni secondo  
  timer.setInterval(1000L, sendUptime);  
 }  
Il timer viene impostato per essere resettato ogni secondo.

Il terzo blocco è il corpo della la funzione sendUptime:
// ------ La funzione invia alla ESP8266 i dati acquisiti dal sensore  
 void sendUptime() {  
  Blynk.virtualWrite(10, DHT.temperature); // Temperatura su Pin Virtuale 10  
  Blynk.virtualWrite(11, DHT.humidity); // Umidità su Pin Virtuale 10  
 }  
Questa funzione invia i dati al server Blynk, ogni secondo, che verranno visionati sull'App.

Il quarto blocco è il ciclo infinito:
 void loop() {  
  Blynk.run(); // Initiates Blynk  
  timer.run(); // Initiates SimpleTimer  
  int controlla;  
  controlla = DHT.read(DHT11_PIN);  // Legge i dati da sensore  
 }  
Questo ciclo contiene sempre Blynk.run ed in più nel nostro caso l'uso del timer timer.run e la lettura del sensore DHT.read .


Pannello Blynk App:


Per caricare il pannello basterà creare un nuovo progetto e scansione il Qcode.


Note conclusive:

Penso proprio che la vostra prima domanda sia: perchè uso un timer?
La risposta è semplice, questa libreria SimpleTimer ci da a disposizione un timer molto veloce e facile da impostare. Posso farlo con la funzione Millis , ma perchè scomodarsi??
Ogni volta che il timer arriva al suo valore, qui un secondo, esegue una specifica funzione. Nel nostro caso sendUptime.

3 commenti:

  1. Ciao
    Io ho un sensore dht22 cosa devo modificare nella tua guida per farlo andare?
    Grazie suno un novellino.
    Michele

    RispondiElimina
  2. l DHT22 necessita di due librerie ( adafruit funziona molto bene ) https://goo.gl/fbJDx e https://goo.gl/IHTDL4 .
    Una volta installate nell'arduino IDE, cambia:
    Primo blocco:
    _ #include con #include "DHT.h"
    _ #define DHT11_PIN 12 con #define DHTPIN 12
    _ subito sotto aggiungi: #define DHTTYPE DHT22
    _ dht11 DHT con DHT dht(DHTPIN, DHTTYPE)
    Secondo blocco:
    _ in timer.setInterval(1000L, sendUptime) metti 2500L invece che 1000L
    _ aggiungi dht.begin() subito sotto a timer.setInterval(2500L, sendUptime)
    Terzo blocco:
    _ DHT.temperature con dht.readTemperature()
    _ DHT.humidity con dht.readHumidity()
    Quarto blocco:
    _ cancella le ultime due righe

    Il DHT22 è + lento del DHT11, richiede 2500ms (2.5 secondi) per una buona lettura.

    Fammi sapere se funziona!

    RispondiElimina