Le guet à pintes : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
 
Ligne 49 : Ligne 49 :
  
 
<pre>
 
<pre>
#include <Wire.h>
+
#define LCD_I2C false //Compilation conditionelle en fonction de l'afficheur utilisé
#include <rgb_lcd.h>
+
 
 +
#if LCD_I2C // Si afficheur LCD 16x2 (I2C)
 +
  #include <Wire.h>
 +
  #include <rgb_lcd.h>
 +
  rgb_lcd lcd; // on crée l'objet écran
 +
  int colorR = 255;
 +
  int colorG = 255;
 +
  int colorB = 255;
 +
#else // Sinon afficheur LCD 16x2 (RS, Enable, D4, D5, D6, D7)
 +
  #include <LiquidCrystal.h>
 +
  const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
 +
  LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // on crée l'objet écran
 +
#endif
 +
 
 
#include <Servo.h>
 
#include <Servo.h>
boolean saoul = false;
+
boolean Saoul = false;
byte const alarm =12;
 
 
byte const BP_gauche = 0, BP_droite = 0, BP_haut = 0, BP_bas = 0; //Adresse des pins Bouton Pousoir
 
byte const BP_gauche = 0, BP_droite = 0, BP_haut = 0, BP_bas = 0; //Adresse des pins Bouton Pousoir
rgb_lcd LCD; // on crée l'objet écran
 
int colorR = 255;
 
int colorG = 255;
 
int colorB = 255;
 
  
Servo verou;
+
byte const AnalogCapteurEthanol = A0;
const int bp1 = 2;  
+
int sensorValue = 0;
int closed = 45;
+
int RS = 0; // Valeur de saturation RS de l'air "Alcoolisé" soufflé
int openn = 0;
+
int R0 = 0; // Valeur R0 de saturation dans l'air "Sain"
 +
float RatioRS_R0 = 0;
 +
int const nombrePointMesure =3000; //Nombre de points de mesure éthylomètre (1 point par 1 ms)
 +
 
 +
void setup() {
 +
  lcd.begin(16, 2); // Initialisation de l'afficheur LCD
 +
  lcd.noDisplay();
  
int buttonState1 ;
+
  Serial.begin(9600);
float s;
 
float sensor_volt;
 
float RS; // Get the value of RS via in Alcohol
 
float R0; // Get the value of R0 via in air
 
float sensorValue;
 
float ratio;
 
float ratioc ;  
 
  
void setup() {
 
  Serial.begin(9600); //Démarrage de la liaison série USB
 
  LCD.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
 
 
   pinMode (BP_haut, INPUT);
 
   pinMode (BP_haut, INPUT);
 
   pinMode (BP_gauche, INPUT);
 
   pinMode (BP_gauche, INPUT);
 
   pinMode (BP_bas, INPUT);
 
   pinMode (BP_bas, INPUT);
   pinMode (BP_droite, INPUT);  
+
   pinMode (BP_droite, INPUT);
  
  pinMode(bp1, INPUT);
 
  verou.attach(5);
 
  buttonState1 = HIGH; // bouton relaché
 
 
   R0 = analogRead (A0); // calcul du niveau d'alcool dans l'air -> calibrage
 
   R0 = analogRead (A0); // calcul du niveau d'alcool dans l'air -> calibrage
 +
}
  
   pinMode (alarm, INPUT);
+
void loop() {
 +
  #if LCD_I2C
 +
  colorR=255; colorG=255; colorB=255; // couleur "Blanc"
 +
  lcd.setRGB(colorR, colorG, colorB); // Changement de la couleur
 +
  #endif
 +
  lcd.setCursor(0,0); // On se place en (x:0,y:0)
 +
  lcd.print("Bonjour, appuyer");
 +
   lcd.setCursor(0,1); // On se place en (x:0,y:1)
 +
  lcd.print("sur une touche  ");
  
}
+
  if(digitalRead(BP_droite)){
 
+
    lcd.clear();
void loop() {  
+
    lcd.setCursor(0,0); // On se place en (x:0,y:0)
  delay (200); 
+
     lcd.print("Soufflez et vous");
  LCD.clear();            
+
     lcd.setCursor(0,1); // On se place en (x:0,y:1)
  colorR = 255;
+
     lcd.print("saurez !");
  colorG = 255;
 
  colorB = 255;
 
  LCD.setRGB(colorR, colorG, colorB);
 
  saoul = false;
 
  LCD.setCursor(0,0);
 
  LCD.print("Bonjour, appuyer"); // on écrit Bonjour
 
  LCD.setCursor(0,1); //on passe à la ligne suivante
 
  LCD.print("sur une touche "); // on finit d'écrire
 
 
 
  if (!digitalRead(bp1) ){
 
    LCD.clear();
 
    LCD.setCursor(0,0);
 
     LCD.print("Soufflez et vous");
 
     LCD.setCursor(0,1);
 
     LCD.print("saurez !");
 
 
     delay (3000);
 
     delay (3000);
     LCD.clear();
+
      
     LCD.setCursor(0,0);
+
    lcd.clear();
     LCD.print("3");
+
     lcd.setCursor(0,0); // On se place en (x:0,y:0)
 +
     lcd.print("3");
 
     delay (1000);
 
     delay (1000);
     LCD.setCursor(2,0);
+
     lcd.setCursor(2,0); // On se place en (x:2,y:0)
     LCD.print("2");
+
     lcd.print("2");
 
     delay (1000);
 
     delay (1000);
     LCD.setCursor(4,0);
+
     lcd.setCursor(4,0); // On se place en (x:4,y:0)
     LCD.print("1...");
+
     lcd.print("1...");
 
     delay (1000);
 
     delay (1000);
     LCD.setCursor(0,1);
+
     lcd.setCursor(0,1); // On se place en (x:0,y:1)
     LCD.print("Soufflez !");
+
     lcd.print("Soufflez !");
    delay (20);
+
 
   
+
      int index = 0;
    int i = 0;
+
      RS = 0;
     while(i<1000){
+
     while (index<nombrePointMesure){
        
+
       RS += analogRead(AnalogCapteurEthanol);
      for(int x = 0 ; x < 100 ; x++)
+
       delay(1);
      {
+
       index++;
        sensorValue = sensorValue + analogRead(A0);
+
    }
       }
+
    RS /= nombrePointMesure;
       sensorValue = sensorValue/100.0;
+
    RatioRS_R0 = RS/R0;
      RS = analogRead(A0);  
+
    RatioRS_R0 *=100;
      ratio = RS/R0;  
 
      ratioc = ratio*100;
 
      if (ratioc>125)
 
      {
 
        saoul=true;
 
      }
 
      i++;
 
  
 +
    if (RatioRS_R0 > 125){
 +
      Saoul=true;
 
     }
 
     }
     if (saoul == true){
+
     if (Saoul == true){
         LCD.clear();
+
         lcd.clear();
         LCD.setCursor(0,0);
+
         lcd.setCursor(0,0);
         colorR = 255;
+
        #if LCD_I2C
        colorG = 0;
+
         colorR = 255; colorG = 0; colorB = 0;
        colorB = 0;
+
         lcd.setRGB(colorR, colorG, colorB);
         LCD.setRGB(colorR, colorG, colorB);
+
         #endif
         LCD.print("Vous etes ivre");
+
        lcd.print("Vous etes ivre");
 
         delay (3000);
 
         delay (3000);
        verou.write(closed);
 
 
     }
 
     }
     if (saoul == false){
+
     else{
         LCD.clear();
+
         lcd.clear();
         LCD.setCursor(0,0);
+
         lcd.setCursor(0,0);
         colorR = 0;
+
        #if LCD_I2C
        colorG = 255;
+
         colorR = 0; colorG = 255; colorB = 0;
        colorB = 0;
+
         lcd.setRGB(colorR, colorG, colorB);
         LCD.setRGB(colorR, colorG, colorB);
+
         #endif
         LCD.print("Vous etes sobre");
+
        lcd.print("Vous etes sobre");
        verou.write(openn);  
 
 
         delay (3000);
 
         delay (3000);
 
     }
 
     }
  }
+
  }
 
}
 
}
 
 
</pre>
 
</pre>
  

Version actuelle datée du 27 février 2018 à 16:40

L'idée de base

Vous êtes au bar, vous ne savez pas si vous êtes aptes à conduire. Grâce à notre guet à pintes, il n'y a pas de problème. En arrivant, vous laissez vos clés de voiture dans une boîte, sécurisé par un code de votre choix. Ensuite, vous entrez votre poids, votre taille, âge... Cela vous indiquera alors le nombre de verres que vous pouvez boire. Enfin, en sortant du bar, vous entrez votre code et vous soufflez sur un capteur à gaz (éthanol), si c'est positif, la boîte ne s'ouvre pas même avec le code.

Cadre pédagogique

Public

Notre projet s'adresse à tous les habitués des bars. Nous espérons que notre projet permettra de réguler la prise d'alcool dans les bars.

Notions abordées

  • Programmer une carte Arduino
  • Bricolage
  • Utiliser un servomoteur

Réalisation technique

Matériels

  • Carte Arduino
  • LED
  • Résistances
  • Capteur de gaz (éthanol)
  • boite en carton
  • servomoteur pas à pas
  • 4 boutons poussoirs
  • afficheur LCD 2 lignes 16 colonnes

La boite en carton est fabriqué à la main et est constitué de deux compartiments et d'une porte s'ouvrant électroniquement. L'un des deux compartiments contiendra les clés de voiture, et l'autre, la carte Arduino qui sera relié à la porte, à l'afficheur LCD, et aux boutons poussoirs. L'afficheur LCD permettra d'afficher le menu et les boutons poussoirs de naviguer sur celui-ci.

Fabrication de la boite

Photocreation.jpg

Erreur lors de la création de la miniature : Fichier avec des dimensions supérieures à 12,5 MP
Erreur lors de la création de la miniature : Fichier avec des dimensions supérieures à 12,5 MP
Erreur lors de la création de la miniature : Fichier avec des dimensions supérieures à 12,5 MP

Code arduino

Photo2.jpg câblage de la carte Arduino

#define LCD_I2C false //Compilation conditionelle en fonction de l'afficheur utilisé

#if LCD_I2C // Si afficheur LCD 16x2 (I2C)
  #include <Wire.h>
  #include <rgb_lcd.h>
  rgb_lcd lcd; // on crée l'objet écran 
  int colorR = 255;
  int colorG = 255;
  int colorB = 255;
#else // Sinon afficheur LCD 16x2 (RS, Enable, D4, D5, D6, D7)
  #include <LiquidCrystal.h>
  const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
  LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // on crée l'objet écran 
#endif

#include <Servo.h>
boolean Saoul = false;
byte const BP_gauche = 0, BP_droite = 0, BP_haut = 0, BP_bas = 0; //Adresse des pins Bouton Pousoir

byte const AnalogCapteurEthanol = A0;
int sensorValue = 0;
int RS = 0; // Valeur de saturation RS de l'air "Alcoolisé" soufflé
int R0 = 0; // Valeur R0 de saturation dans l'air "Sain"
float RatioRS_R0 = 0;
int const nombrePointMesure =3000; //Nombre de points de mesure éthylomètre (1 point par 1 ms)

void setup() {
  lcd.begin(16, 2); // Initialisation de l'afficheur LCD
  lcd.noDisplay();

  Serial.begin(9600);

  pinMode (BP_haut, INPUT);
  pinMode (BP_gauche, INPUT);
  pinMode (BP_bas, INPUT);
  pinMode (BP_droite, INPUT);

  R0 = analogRead (A0); // calcul du niveau d'alcool dans l'air -> calibrage
}

void loop() {
  #if LCD_I2C
  colorR=255; colorG=255; colorB=255; // couleur "Blanc"
  lcd.setRGB(colorR, colorG, colorB); // Changement de la couleur
  #endif
  lcd.setCursor(0,0); // On se place en (x:0,y:0)
  lcd.print("Bonjour, appuyer");
  lcd.setCursor(0,1); // On se place en (x:0,y:1)
  lcd.print("sur une touche  ");

  if(digitalRead(BP_droite)){
    lcd.clear();
    lcd.setCursor(0,0); // On se place en (x:0,y:0)
    lcd.print("Soufflez et vous");
    lcd.setCursor(0,1); // On se place en (x:0,y:1)
    lcd.print("saurez !");
    delay (3000);
    
    lcd.clear();
    lcd.setCursor(0,0); // On se place en (x:0,y:0)
    lcd.print("3");
    delay (1000);
    lcd.setCursor(2,0); // On se place en (x:2,y:0)
    lcd.print("2");
    delay (1000);
    lcd.setCursor(4,0); // On se place en (x:4,y:0)
    lcd.print("1...");
    delay (1000);
    lcd.setCursor(0,1); // On se place en (x:0,y:1)
    lcd.print("Soufflez !");

      int index = 0;
      RS = 0;
    while (index<nombrePointMesure){
      RS += analogRead(AnalogCapteurEthanol);
      delay(1);
      index++;
    }
    RS /= nombrePointMesure;
    RatioRS_R0 = RS/R0;
    RatioRS_R0 *=100;

    if (RatioRS_R0 > 125){
      Saoul=true;
    }
    if (Saoul == true){
        lcd.clear();
        lcd.setCursor(0,0);
        #if LCD_I2C
        colorR = 255; colorG = 0; colorB = 0;
        lcd.setRGB(colorR, colorG, colorB);
        #endif
        lcd.print("Vous etes ivre");
        delay (3000);
    }
    else{
        lcd.clear();
        lcd.setCursor(0,0);
        #if LCD_I2C
        colorR = 0; colorG = 255; colorB = 0;
        lcd.setRGB(colorR, colorG, colorB);
        #endif
        lcd.print("Vous etes sobre");
        delay (3000);
    }
   }
}

Problème rencontré

  • capteur de gaz qui ne détecte que les fortes concentrations d'alcool.
  • mise en place d'une bibliothèque personnelle sur le programme Arduino

Sources

  • ajout sur le programme Arduino de la bibliothèque "rgb_lcd"

Equipe

  • Edwin Kerbaul
  • Emeline Gilles
  • Florian Lenoir
  • Edwin Fontenelle
  • Tristan Pirou