Etilometro con Arduino Nano, Sensore MQ-3 e Display TFT GC9A01
Introduzione
In questo progetto realizziamo un etilometro didattico utilizzando un Arduino Nano, un sensore MQ-3 per il rilevamento dei vapori di alcol e un display TFT circolare GC9A01 da 1,28″.
Il dispositivo esegue una calibrazione automatica all’accensione e visualizza il risultato su un tachimetro grafico con lancetta e zone colorate.
Importante: questo progetto è destinato esclusivamente a scopi educativi e sperimentali. Non sostituisce strumenti professionali certificati per la misurazione del tasso alcolemico.
Materiale necessario
- Arduino Nano (ATmega328P)
- Sensore MQ-3
- Display TFT GC9A01 da 1,28″
- Breadboard
- Cavetti Dupont
- Cavo USB
Collegamenti
Sensore MQ-3
| MQ-3 | Arduino Nano |
|---|---|
| VCC | 5V |
| GND | GND |
| AOUT | A0 |
Display TFT GC9A01
| Display | Arduino Nano |
|---|---|
| VCC | 5V |
| GND | GND |
| SCL | D13 |
| SDA | D11 |
| CS | D10 |
| DC | D9 |
| RST | D8 |
Funzionamento
All’accensione il sistema:
- Visualizza la schermata iniziale.
- Esegue una calibrazione automatica di circa 5 secondi.
- Memorizza il valore ambientale di riferimento.
- Mostra la schermata “Pronto”.
- Avvia la lettura continua del sensore MQ-3.
Soffiando verso il sensore viene rilevata la presenza di vapori di alcol e il valore viene visualizzato sul tachimetro.
Codice sorgente completo
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GC9A01A.h>
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
#define MQ3_PIN A0
#define BLACK 0x0000
#define WHITE 0xFFFF
#define RED 0xF800
#define GREEN 0x07E0
#define YELLOW 0xFFE0
Adafruit_GC9A01A tft(TFT_CS, TFT_DC, TFT_RST);
int baseline = 0;
void drawGauge() {
tft.fillScreen(BLACK);
int cx = 120;
int cy = 120;
int r = 100;
for (int i = 0; i <= 20; i++) {
float value = i * 0.1;
float angle = radians(
-90 + (value / 2.0) * 270
);
uint16_t color = GREEN;
if (value >= 1.0)
color = RED;
else if (value >= 0.5)
color = YELLOW;
int x1 = cx + cos(angle) * (r - 10);
int y1 = cy + sin(angle) * (r - 10);
int x2 = cx + cos(angle) * r;
int y2 = cy + sin(angle) * r;
tft.drawLine(x1, y1, x2, y2, color);
if (i % 5 == 0) {
char buf[5];
dtostrf(value, 3, 1, buf);
int tx = cx + cos(angle) * (r - 25);
int ty = cy + sin(angle) * (r - 25);
tft.setTextColor(WHITE);
tft.setTextSize(1);
tft.setCursor(tx - 8, ty - 4);
tft.print(buf);
}
}
}
void drawNeedle(float bac) {
int cx = 120;
int cy = 120;
int r = 75;
int angle = map(
bac * 100,
0,
200,
-90,
180
);
angle = constrain(
angle,
-90,
180
);
float rad = radians(angle);
int x = cx + cos(rad) * r;
int y = cy + sin(rad) * r;
tft.drawLine(
cx,
cy,
x,
y,
GREEN
);
tft.fillCircle(
cx,
cy,
4,
WHITE
);
}
void setup() {
Serial.begin(9600);
tft.begin();
tft.setRotation(0);
tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor(45, 90);
tft.print("Etilometro");
tft.setTextSize(1);
tft.setCursor(40, 120);
tft.print("Calibrazione in corso...");
long sum = 0;
for (int i = 0; i < 100; i++) {
sum += analogRead(MQ3_PIN);
delay(50);
}
baseline = sum / 100;
tft.fillScreen(BLACK);
tft.setTextSize(3);
tft.setCursor(65, 105);
tft.print("Pronto");
delay(1000);
drawGauge();
}
void loop() {
int raw = analogRead(MQ3_PIN);
int corrected = raw - baseline;
if (corrected < 0)
corrected = 0;
float bac = map(
corrected,
0,
600,
0,
200
) / 100.0;
if (bac > 2.0)
bac = 2.0;
float air = bac / 2.1;
drawGauge();
drawNeedle(bac);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.setCursor(70, 100);
tft.print(bac, 1);
tft.print(" g/L");
tft.setTextSize(2);
tft.setCursor(65, 140);
tft.print(air, 2);
tft.print(" mg/L");
delay(200);
}
Librerie necessarie
Installare tramite il Library Manager dell’IDE Arduino:
- Adafruit GFX Library
- Adafruit GC9A01A
Come utilizzare il dispositivo
- Collegare Arduino al computer tramite USB.
- Caricare il programma.
- Attendere il completamento della calibrazione iniziale.
- Quando compare la scritta Pronto, soffiare verso il sensore MQ-3 per alcuni secondi.
- Osservare il valore indicato dalla lancetta e dal display.
Interpretazione dei risultati
| Valore visualizzato | Indicazione |
|---|---|
| 0.0 – 0.5 g/L | Zona verde |
| 0.5 – 1.0 g/L | Zona gialla |
| 1.0 – 2.0 g/L | Zona rossa |
I valori rappresentano una stima basata sulla risposta del sensore MQ-3 e non devono essere considerati misure ufficiali.
Conclusioni
Questo progetto dimostra come utilizzare un sensore MQ-3 insieme a un display TFT GC9A01 per realizzare un etilometro grafico compatto e di facile utilizzo. Grazie alla calibrazione automatica e all’interfaccia a tachimetro, il sistema fornisce una rappresentazione immediata della concentrazione di alcol rilevata nell’aria espirata.

