20. Alkohol tester – detekcia alkoholu pomocou Arduino

20. Alkohol tester – detekcia alkoholu pomocou Arduino

Cieľom cvičenia je zostrojiť a naprogramovať jednoduchý alkohol tester, ktorý dokáže detegovať prítomnosť alkoholových pár vo vzduchu a reagovať zmenou jasu LED (alebo rozsvietením výstražnej LED).

Žiak sa naučí:

  • pracovať s plynovým senzorom (MQ-3),
  • čítať analógové hodnoty zo senzora,
  • pochopiť rozdiel medzi detekciou prítomnosti a odhadom koncentrácie,
  • uvedomiť si limity lacných senzorov.

🧠 Princíp činnosti

Senzor MQ-3 reaguje na alkoholové pary (etanol).
Jeho výstupom je analógový signál, ktorého hodnota rastie so zvyšujúcou sa koncentráciou alkoholu v okolí senzora.

⚠️ Dôležité:

  • nejde o presný certifikovaný alkohol tester,
  • ide o indikátor prítomnosti alkoholu, nie o právne záväzné meranie.

🧰 Použité súčiastky

  • Arduino UNO
  • Modul Alcohol Sensor (MQ-3) zo sady Keyestudio KS0068
  • LED dióda
  • Rezistor 220–330 Ω
  • Breadboard
  • Prepojovacie vodiče

🔌 Zapojenie obvodu

Zapojenie MQ-3 senzora

MQ-3 modulArduino UNO
VCC5V
GNDGND
AOA0

(Digitálny výstup DO v tomto cvičení nepoužívame)

Zapojenie LED

LEDArduino UNO
Anóda (dlhá noha)D9 (PWM) cez rezistor
Katóda (krátka noha)GND

🧩 Schéma zapojenia (textová)

Arduino UNO        Breadboard
-----------        -----------
5V  ------------> + lišta
GND ------------> - lišta

MQ-3 modul:
VCC ------------> + lišta
GND ------------> - lišta
AO  ------------> A0

LED:
D9  --> [220Ω] --> |>| --> GND

🔥 DÔLEŽITÉ UPOZORNENIE PRE HODINU

Senzor MQ-3 potrebuje zahriatie:

  • po zapnutí počkaj 1–2 minúty,
  • hodnoty sa postupne stabilizujú.

👉 Toto je výborný moment na vysvetlenie, že reálne senzory nie sú okamžité.


💻 Program – indikácia alkoholu jasom LED

const int MQ3 = A0;
const int LED = 9;   // PWM pin

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int alcoholValue = analogRead(MQ3);   // 0–1023
  int brightness = map(alcoholValue, 0, 1023, 0, 255);

  analogWrite(LED, brightness);

  Serial.print("Alkohol: ");
  Serial.print(alcoholValue);
  Serial.print(" | Jas LED: ");
  Serial.println(brightness);

  delay(200);
}

🧪 Testovanie

Bezpečný postup:

  • fúknuť vzduch z úst (bez alkoholu),
  • použiť dezinfekčný sprej na ruky (krátko, z diaľky),
  • porovnať hodnoty pred a po.

➡️ LED sa rozjasní pri zvýšenej koncentrácii alkoholových pár.


🧠 Dôležitá myšlienka

Senzor nemeria promile – meria zmenu prostredia, ktorú musíme správne interpretovať.


⭐ Rozšírenie (pre rýchlejších žiakov)

  • Nastaviť prahovú hodnotu a zapnúť alarm (LED / bzučiak).
  • Porovnať hodnoty pri rôznych vzdialenostiach od senzora.
  • Zobraziť hodnoty v Serial Plotteri.
  • Diskusia: prečo je kalibrácia v praxi nutná?

❓ Kontrolné otázky

  1. Prečo senzor potrebuje čas na zahriatie?
  2. Prečo tento tester nemôže byť právne záväzný?
  3. Aký je rozdiel medzi indikáciou a presným meraním?

🔗 Prepojenie na prax

Podobné senzory sa používajú:

  • v priemysle na detekciu únikov plynov,
  • v bezpečnostných systémoch,
  • v senzorických sieťach, kde sa nesleduje absolútna hodnota, ale trend a zmena.

Kód (plynulý jas podľa prahu 600–750)

const int MQ3 = A0;
const int LED = 9;          // PWM pin
const int BASELINE = 600;   // cca bez alkoholu
const int ALCOHOL = 750;    // cca s alkoholom (silnejšia reakcia)

const int AVG_N = 10;       // filter: počet vzoriek pre priemer
int buf[AVG_N];
long sum = 0;
int idx = 0;

int readAvg() {
  int v = analogRead(MQ3);
  sum -= buf[idx];
  buf[idx] = v;
  sum += v;
  idx = (idx + 1) % AVG_N;
  return (int)(sum / AVG_N);
}

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);

  // inicializácia filtra
  for (int i = 0; i < AVG_N; i++) {
    buf[i] = analogRead(MQ3);
    sum += buf[i];
    delay(20);
  }

  Serial.println("MQ-3 ready (wait 1-2 min for warm-up).");
}

void loop() {
  int v = readAvg();  // vyhladená hodnota 0–1023

  int brightness = 0;

  if (v <= BASELINE) {
    brightness = 0;  // LED vypnutá
  } else if (v >= ALCOHOL) {
    brightness = 255; // max jas
  } else {
    // plynulý prechod medzi 600 a 750
    brightness = map(v, BASELINE, ALCOHOL, 0, 255);
  }

  analogWrite(LED, brightness);

  Serial.print("MQ3=");
  Serial.print(v);
  Serial.print("  LED=");
  Serial.println(brightness);

  delay(100);
}

Poznámky pre hodinu (dôležité)

  • MQ-3 sa po zapnutí zahrieva → prvé 1–2 min budú hodnoty „plávať“.
  • Hodnoty 600 a 750 sú lokálne (záleží od senzora, napájania, vzdialenosti, prúdenia).
  • Ak to bude reagovať príliš skoro / neskoro, uprav:
    • BASELINE (napr. 580–650)
    • ALCOHOL (napr. 700–820)

Pridaj komentár