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-3Arduino Nano
VCC5V
GNDGND
AOUTA0

Display TFT GC9A01

DisplayArduino Nano
VCC5V
GNDGND
SCLD13
SDAD11
CSD10
DCD9
RSTD8

Funzionamento

All’accensione il sistema:

  1. Visualizza la schermata iniziale.
  2. Esegue una calibrazione automatica di circa 5 secondi.
  3. Memorizza il valore ambientale di riferimento.
  4. Mostra la schermata “Pronto”.
  5. 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

  1. Collegare Arduino al computer tramite USB.
  2. Caricare il programma.
  3. Attendere il completamento della calibrazione iniziale.
  4. Quando compare la scritta Pronto, soffiare verso il sensore MQ-3 per alcuni secondi.
  5. Osservare il valore indicato dalla lancetta e dal display.

Interpretazione dei risultati

Valore visualizzatoIndicazione
0.0 – 0.5 g/LZona verde
0.5 – 1.0 g/LZona gialla
1.0 – 2.0 g/LZona 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.