English Click this button for the international website

Arduino alcoholtester met MQ-3 gas sensor en OLED display

Eén van de voordelen van Arduino is dat er veel verschillende sensors voor beschikbaar zijn. Met deze sensors kun je bijna alles meten of detecteren. De meeste van deze sensors zijn meestal goedkoop en eenvoudig te gebruiken. Om ze in je project toe te passen is er meestal niet meer nodig dan een paar draden en een aantal regels programmacode. Eén van deze sensors is de MQ-3 gas sensor welke alcohol kan detecteren. Deze sensor is o.a. verkrijgbaar bij VNG Systems. Samen met een paar LEDs en een OLED scherm zoals besproken in het voorgaande artikel kun je zelf een Arduino alcoholtester bouwen.

Arduino alcoholtester: de MQ-3 gas sensor

De MQ-3 gas sensor gebruikt een klein verwarmingselement en een electro-chemische sensor. Je gebruikt hem binnenshuis bij kamertemperatuur. Je kunt hem eventueel calibreren door een vooraf bekende concentratie alcohol te meten. De uitvoer is een analoog signaal dan je met één van de analoge ingangen van de Arduino kunt meten. In deze tutorial gebruik ik de “MQ-3 Alcohol Ethanol Sensor Breath Gas Detection Module For Arduino” op een breadboard-compatible module.

MQ-3 gas sensor on breakout board for Arduino
MQ-3 gas sensor module voor Arduino

De sensor zal na verloop van tijd nauwkeuriger worden.  Een periode van 12 of 24 uur wordt meestal aanbevolen als tijd om ‘in te branden’. Inbranden wil zeggen: de sensor onder stroom (de voedingsspanning) houden. Daarna zal de sensor nog steeds even moeten opwarmen voor elke eerste meting. Sluit de sensor als volgt aan:

MQ-3 Arduino
AD A0
DD (niet aangesloten)
GND GND
VCC 5V

Arduino alcoholtester: het OLED display

In deze tutorial gebruiken we de 6-pins SPI versie van het 128×64 OLED scherm, samen met de Adafruit SSD1306 library. Zie het vorige artikel “Een 128×64 pixels wit OLED display aan je Arduino project toevoegen” voor meer informatie. Sluit het display volgens dit schema aan:

OLED Arduino
GND GND
VCC 5V
SCL D10
SDA D9
RES D13
DC D11

Arduino alcoholtester: de LEDs

Sluit de LEDs aan op de digitale pins D2 tot D6 van de Arduino. Vergeet niet om weerstanden vood de LEDs te gebruiken. In dit voorbeeld gebruik ik 470 Ohm weerstanden, maar je kunt ze ook van 220 Ohm gebruiken.

LED Arduino
1 Groen D6
2 Groen D5
3 Geel D4
4 Geel D3
5 Rood D2
Arduino breathalizer alcohol tester MQ-3 sensor with OLED and leds, breadboard view
Arduino alcoholtester met MQ-3 sensor, OLED scherm en leds op het breadboard

Arduino alcoholtester: de code

Dit is de voorbeeldsketch, aan te passen aan je eigen behoeften. TIME_UNTIL_WARMUP staat op 15 minuten. Je kunt deze tijd verkorten tot bijvoorbeeld 3 minuten nadat je de sensor een tijdje hebt gebruikt. De drempelwaarden voor ‘value’ zijn slechts een indicatie, je moet zelf een beetje experimenteren om de juiste waarden voor jouw sensor te vinden.

 

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// OLED pins, using software SPI:
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

int TIME_UNTIL_WARMUP = 900; // warm up for 15 minutes!
unsigned long time;

int analogPin = 0;
int val = 0;

// LED pins
int led1 = 2; // Red
int led2 = 3; // Yellow
int led3 = 4; // Yellow
int led4 = 5; // Green
int led5 = 6; // Green

int ledState = LOW;
unsigned long previousMillis = 0;
long blinkInterval = 250;

void setup()   {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);

  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
}

void loop() {

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= blinkInterval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
  }

  delay(100);

  val = readAlcohol();
  printTitle();
  printWarming();

  time = millis() / 1000;

  if (time <= TIME_UNTIL_WARMUP)
  {
    time = map(time, 0, TIME_UNTIL_WARMUP, 0, 100);
    display.drawRect(10, 50, 110, 10, WHITE); //Empty Bar
    display.fillRect(10, 50, time, 10, WHITE);
  } else
  {
    printTitle();
    printAlcohol(val);
    printAlcoholLevel(val);
  }
  display.display();

}

void printTitle()
{
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(22, 0);
  display.println("Breathalyzer");
}

void printWarming()
{
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 20);
  display.println("Warming up");
}

void printAlcohol(int value)
{
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(45, 25);
  display.println(val);
}

void printAlcoholLevel(int value)
{
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(10, 55);

  if (value < 250)
  {
    display.println("You are sober.");
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, HIGH);
  }
  if (value >= 250 && value < 300)
  {
    display.println("One beer.");
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
  }
  if (value >= 300 && value < 350)
  {
    blinkInterval = 750; // blinking slow
    display.println("2+ beers.");
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, ledState); // blinking yellow LED
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
  }
  if (value >= 350 && value < 450)
  {
    blinkInterval = 250; // blinking faster
    display.println("Many beers!");
    digitalWrite(led1, LOW);
    digitalWrite(led2, ledState); // blinking yellow LED
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
  }
  if (value > 450)
  {
    blinkInterval = 25; // blinking fast
    display.println("You are drunk!");
    digitalWrite(led1, ledState); // blinking red LED
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
  }
}

int readAlcohol()
{
  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;
}
Arduino alcoholtester met MQ-3 sensor, OLED display en LEDs, detail.
Arduino alcoholtester met MQ-3 sensor, OLED display en LEDs, detail.
0.96 Inch White SPI OLED Display Module 12864 LED For Arduino
Getest en Aanbevolen door OneGuyOneBlog.com:

0.96 Inch White SPI OLED Display Module 12864 LED For Arduino
Geekcreit® UNO R3 ATmega328P Development Board For Arduino
Getest en Aanbevolen door OneGuyOneBlog.com:

Geekcreit® UNO R3 ATmega328P Development Board For Arduino

Voeg een reactie toe

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *