Outils pour utilisateurs

Outils du site


wiki:projets:rfid:ethylometre21.7:programmation
  • *Partie Programmation**

Responsables : BADRI Ayoub et NGUYEN Thibault

Nous nous sommes inspirés de programmes trouvés sur internet afin de créer le nôtre. Avant même la réception des commandes, nous nous sommes servis du matériel à disposition dans le fablab et nous avons essayé de tester le programme pour faire fonctionner l'écran LCD. Cependant, malgré les différentes tentatives, ce fut un échec. Mais, en recevant nos commandes, nous nous sommes aperçus que le code marchait (c'est donc l'écran LCD utilisé au préalable qui était inutilisable). Au moins, cela nous a permis de prendre la main!

Nos enseignants d'ARE ont soulevé l'hypothèse que le débit influerait sur la valeur indiquée sur le capteur MQ-3 (et donc le résultat affiché sur l'écran LCD) et nous ont demandé de faire un débitmètre. Nous avons programmé un capteur à effet Hall, afin de compter combien de fois l'aimant passe devant le capteur et ainsi en déduire un nombre de tours et obtenir un débit (peu précis malgré tout).

Voici quelques images de ce qui s'affiche, avant et après avoir fait passé un aimant devant le capteur de Hall. Avant :

Après :

Nous avons ajouté 2 LEDs rouge et verte, ainsi qu'un interrupteur et une batterie qui marche grâce à 6 piles de 1,5 V.

Concernant le capteur MQ-3, il s'agit bien là d'un composant à 5$. Ce capteur une fois branché correctement, nécessite ENORMEMENT de temps pour se calibrer à l'air libre. 24h de préchauffage selon la Datasheet, 48h sur des sites amateurs.

datasheet: https://www.sparkfun.com/datasheets/Sensors/MQ-3.pdf

PROGRAMME

#include <LiquidCrystal.h> on inclut la bibliothèque #define LED 8 #define LEDa 9 on déclare les 2 LED en D9 et D8 const int analogPin = A0; le capteur MQ-3 en A0 const int hallPin = 12; pin pour capteur hall const int ledPin = 13; int i=0; int hallState = 0; variable pour lire le hall int ref = 1; variable reférence pour hall binaire 1/0 int D=0; débit float S=0.0004; surface float P=3.1415;9265358979323846; Pi float R=0.01;

LiquidCrystal lcd(11, 10, 5, 4, 3, 2); définit un objet lcd avec les entrées sorties de l'Arduino en paramètre RS_pin EN_pin BUS1 BUS2 BUS3 BUS4

long time; pour pouvoir compter jusqua 60s void setup() { pinMode(LED, OUTPUT); pinMode(LEDa, OUTPUT); pinMode(ledPin, OUTPUT); LED pin output:

pinMode(hallPin, INPUT);                 //  hall effect  input:
lcd.begin(16, 2);                         // défini le nombre de caractère et de ligne de l'écran
Serial.begin(9600);                        // on configure les 2 leds et on prépare le moniteur série

}

void loop() {

while (time⇐10000) {

   
     lcd.clear();
     hallState = digitalRead(hallPin);         // read the state of the hall effect sensor:
     if (hallState == LOW && ref==HIGH) {        // truc de compte binaire pour les tours
     digitalWrite(ledPin, HIGH);                  // turn LED on:
     i=i+1; 

}

   //lcd.clear();                                   //afichage des tour
   // lcd.print(hallState);
   // lcd.setCursor(6, 0);
   // lcd.print(i);
    delay(5);                                    // pour perception visualiser
    ref = hallState;
   time = millis();
  // lcd.setCursor(0, 1);
  // lcd.print("Time: ");
  // lcd.setCursor(6, 1);
  //lcd.print(time/1000);                             //prints time since program started
   //delay(10);                              // wait a second so as not to send massive amounts of data
   break;
  

}

float sensor_volt;
float RS_gas;                                     // résistance mq-3 dans un Gaz
float ratio;                                      //ratio RS_GAS/R0
float R0 = 0.11;                                  // valeur initiale résistance mq-3
int sensorReading = analogRead(analogPin);       //sensorReading sera notre variable de lecture MQ-3
sensor_volt=(float)sensorReading/1024*5.0;
RS_gas = (5.0-sensor_volt)/sensor_volt;                             
ratio = RS_gas/R0;                                         // ratio = RS/R0 
float D=((S*R*2*P*i)/60*1000000);     // calcul de débit
                                             
float y ;                                  //concentration
float x = ratio;
y= - 0.8*x*x*x + 51*x*x - 524*x + 980 ;              // mg/L en fonction de Rs/R0. f(Rs/R0)=mg/L 

if (y>2) {

  digitalWrite(LED, LOW);
  digitalWrite(LEDa, HIGH);
}
else {
  digitalWrite(LEDa, LOW);
  digitalWrite(LED,HIGH);
}

if (time>=10000) {

  

  //lcd.clear();
  //lcd.print(i);
  //lcd.setCursor(6, 0);
  //lcd.print("tours");
  //unsigned int w=(2*PI*i)/60;
  //unsigned int v=w*R;
  //const int T=i;
  
  
  lcd.clear();//
  lcd.setCursor(0, 0);//
  lcd.print("Dv =");//
  lcd.setCursor(5, 0);//
  lcd.print(D);//
  lcd.setCursor(10, 0);//
  lcd.print("mL/s");//
  
  lcd.setCursor(0, 1);//
  lcd.print("C= ");//
  lcd.setCursor(3, 1);//
  lcd.print(y);//
  lcd.setCursor (10, 1);//
  lcd.print ("mg/L");//
  delay(1000);//
  lcd.clear();//
  lcd.print("Volt=");//
  lcd.setCursor(5, 0);//
  lcd.print(sensor_volt);//
  lcd.setCursor(10, 0);//
  lcd.print("RS=");//
  lcd.setCursor(13, 0);//
  lcd.print(RS_gas);//
  lcd.setCursor(0, 1);//
  lcd.print("Rs/R0 = ");//
  lcd.setCursor(8, 1);//
  lcd.print(ratio);//

delay(1000);

}

}

(note: les slashs en fin de ligne du code ne servent qu'à afficher celui-ci ligne par ligne dans le wiki; la présentation maladroite est due aux caractères spéciaux du code qui sont mal interprétés par le wiki)

wiki/projets/rfid/ethylometre21.7/programmation.txt · Dernière modification: 2020/10/05 16:39 (modification externe)