/* Alcoholslot met 3 LED indicatie
  Met een alcoholslot kan het starten van de motorvoertuig worden geblokkeerd
  als het alcoholpercentage van de uitgeademde adem boven een wettelijke
  waarde zit, naast de rode LED (die bij de wettelijke grens van een ervaren bestuurder
  aangaat) kan de startblokkering van een motorvoertuig worden geactiveerd.
 
 Verbind de AOUT van MQ-3 alcoholsensor met de A0
 Gebruik een mondspray om te testen (gebruikt is Kruitvat eigenmerk UltraDent)
 Gebruik externe LED`s met voorschakelweerstand op D2, D3 en D4
*/
 
// Gebruikte constanten op de pinnen A0, D2, D3 en D4
const int analogInPin   = A0;   // Pinnummer analoge input MQ-3 Alcohol sensor A0
const int ledPinred     = 2;    // Pinnummer rode   LED (D2)
const int ledPinyellow  = 3;    // Pinnummer Gele   LED (D3)
const int ledPingreen   = 4;    // Pinnummer Groene LED (D4)
 
// Variabele vertegenwoordigt waarde van de sensor en uitgangwaarde:
int sensorValue = 0;            // waarde gelezen van de MQ-3 alcoholsensor
int outputValue = 0;            // waarde na mappen
 
 
void setup() {
 // initialiseren digitale poorten D2, D3 en D4 als uitgang (OUTPUT):
 pinMode(ledPingreen,  OUTPUT);
 pinMode(ledPinyellow, OUTPUT);
 pinMode(ledPinred,    OUTPUT);
 // initialiseren snelheid seriële communicatie op 9600 baud:
 Serial.begin(9600);
}
 
void loop() {
 // Lees de analoge waarde van de sensor:
 sensorValue = analogRead(analogInPin);
 // Map de sensorwaarde in de weer te geven range:
 // kalibreer met de 1e waarde(199)de digitale waarde uitgelezen op de ingang A0 zonder alcohol!!
 // laat de digitale sensorwaarde 199 tot 1023 mappen naar een uitgangswaarde van 50 tot 10000 µg/L
 outputValue = map(sensorValue, 199, 1023, 50, 10000);
 // Geef de waarde weer op de seriële monitor:
 Serial.print("Digitale sensorwaarde = ");
 Serial.print(sensorValue);
 Serial.print("\t Alcohol waarde = ");
 Serial.print(outputValue);
 Serial.println("\t  ug/L");       //  µg/L wordt als µg/L weergegeven, daarom ug/L
 
 // Controleer of de waarde onder de ondergrens voor een beginnende bestuurder is:
 if (outputValue <= 88) {
   // Als waar, zet de groene LED aan:
   digitalWrite(ledPingreen, HIGH);
 } else {
   // Als nietwaar, zet groene LED uit:
   digitalWrite(ledPingreen, LOW);
 }
 // Controleer of de waarde tussen de ondergrens voor een beginnende bestuurder en die van een ervaren bestuurder is:
 if  ((outputValue > 88) && (outputValue < 220)) {
   // Als waar, zet de gele LED aan:
   digitalWrite(ledPinyellow, HIGH);
 } else {
   // Als nietwaar, zet gele LED uit:
   digitalWrite(ledPinyellow, LOW);
 }
 // Controleer of de waarde onder ondergrens voor die van een ervaren bestuurder is:
 if (outputValue >= 220) {
   // Als waar, zet de rode LED aan:
   digitalWrite(ledPinred, HIGH);
 } else {
   // Als nietwaar, zet rode LED uit:
   digitalWrite(ledPinred, LOW);
 }
 //  Laat de meting iedere seconde uitvoeren:
 delay(1000);
}