In questa guida vi illustreremo come creare il vostro etilometro tascabile!
Cosa ci serve?
1 x DFRduino Nano (cod. DF-DFR0010) – Arduino in miniatura con uscite a 5V e 3.3V
1 x Analog Gas Sensor(MQ3) (cod. DF-SEN0128) – Sensore di gas alimentato a 5V
1 x Display OLED 128 X 64 (cod. IM-130625003) – Display con risoluzione 128 x 64, alimentato a 3,3V
1 x Robot Jumper Wire Kit (cod. RD-JumperMix) – Set di jumper
COLLEGAMENTI
Cominciamo collegando l’ Analog Gas Sensor(MQ3) al DFRduino Nano.
I tre pin del sensore (SEN, VCC e GND)
vanno collegati nel seguente modo
PIN SENSORE | PIN SCHEDA |
SEN | A0 |
VCC | 5V |
GND | GND |
Conclusa questa operazione procediamo con il collegamento del Display OLED 128 X 64
PIN OLED | PIN SCHEDA |
VCC | 3.3V |
GND | GND |
RES | D4 |
SDA | A4 |
SCL | A5 |
Come risultato dovremmo ottenere questo:
CODICE
Il seguente codice è solo una delle tante cose che si possono fare con questi componenti… Ovviamente il mio consiglio è quello di spaziare da questo, e di creare il vostro proprio codice!
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 int WARMUP = 2000; //Tempo di riscaldamento del sensore unsigned long time; int analogPin = 0; int val = 0; float x; Adafruit_SSD1306 display(OLED_RESET); void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //per default viene impostata una tensione interna di 3.3V display.clearDisplay(); //puliamo in display } void loop() { delay(100); val = readAlcohol(); x = getGL(); printTitle(); printWarming(); time = millis()/10; if(time <= WARMUP) { time = map(time, 0, WARMUP, 0, 100); display.drawRect(10, 23, 110, 9, WHITE); //Barra vuota display.fillRect(10, 23, time,9,WHITE); //Riempimento } else { printTitle(); printAlcohol(x); printAlcoholLevel(val); } display.display(); // abilitiamo il display alla visualizzazione } void printTitle() //Stampa del nome del nostro dispositivo { display.clearDisplay(); display.setTextSize(1); //Impostiamo la grandezza del testo display.setTextColor(WHITE); //Impostiamo il colore del testo (con questo display possiamo impostare solo BLACK e WHITE) display.setCursor(35,0); //Posizioniamo il cursore (in questo caso "x: 35" e "y: 0") display.println("Etilometro"); } void printWarming() //Stampa della scritta di caricamento { display.setTextSize(2); //Impostiamo la grandezza del testo display.setTextColor(WHITE); //Impostiamo il colore del testo (con questo display possiamo impostare solo BLACK e WHITE) display.setCursor(30,8); //Posizioniamo il cursore (in questo caso "x: 30" e "y: 8") display.println("Carica"); } void printAlcohol(float value) //Stampare sul display il valore decimale raccolto dal sensore { display.setTextSize(2); //Impostiamo la grandezza del testo display.setTextColor(WHITE); //Impostiamo il colore del testo (con questo display possiamo impostare solo BLACK e WHITE) display.setCursor(45,9); //Posizioniamo il cursore (in questo caso "x: 45" e "y: 9") display.println(x); } void printAlcoholLevel(int value) //Cambiare informazione display al variare del valore raccolto dal sensore { display.setTextSize(1); //Impostiamo la grandezza del testo display.setTextColor(WHITE); //Impostiamo il colore del testo (con questo display possiamo impostare solo BLACK e WHITE) display.setCursor(20,24); //Posizioniamo il cursore (in questo caso "x: 20" e "y: 24") if(value<180) { display.println("Sei OK."); } if (value>=180 && value<=200) { display.println("Entro i limiti."); } if (value>200 && value<=400) { display.println("Non guidare."); } if (value>400 && value <=750) { display.println("Oltre il limite!"); } if(value>750) { display.println("Sei ubriaco!"); } } int readAlcohol() //Funzione per determinare la media tra tre valori raccolti dal sensore { int val = 0; int val1; int val2; int val3; display.clearDisplay(); val1 = analogRead(analogPin); delay(10); val2 = analogRead(analogPin); delay(10); val3 = analogRead(analogPin); val = (val1+val2+val3)/3; return val; } float getGL() //Funzione per ricavare il decimale dal valore letto dal sensore { float x; float x1; x1 = (val * 0.4); x = x1/200; return x; }
Per calibrare il sensore mi sono basato sui dati del produttore, che indica come punto di riferimento il valore 200ppm (rilevato dal sensore) corrispondente a 0,4 g/l circa.
Ci tengo a specificare che il prodotto finito non garantisce una precisione tale da essere certi che il valore raccolto rappresenti effettivamente la quantità di alcool studiata e/o ingerita. Vi chiedo quindi di non fare affidamento al 100% a questo dispositivo.
… E ricorda di bere responsabilmente!
Ultimi post di andreac (vedi tutti)
- Etilometro - 10 giugno 2016
- PULSANTE RADIO - 23 marzo 2016
- Supporto Tab - 18 marzo 2016