Objectifs

Dans cette activité, il s'agit de déterminer comment les capteurs vont être utilisés :

- sur la carte Arduino elle-même

- dans le programme Arduino qui sera téléversé

- dans le programme python

ArduinoPrincipeUtiliseCapteur

Comme précédemment, l'IDE Arduino est utilisé pour téléverser le programme Arduino dans la carte Arduino.

L'éditeur python est utilisé pour envoyer les ordres à la carte Arduino via la liaison série. Un programme analysera les réponses et réagira en conséquence.

 

Programme Arduino

Tester le rogramme arduino dans le moniteur série 

Tester dans l'IDE Arduino le bon fonctionnement de chaque commande du programme suivant :

//=======appel des bibliothèques requises
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//=======Configuration utilisation bibliothèques pour capteur température
//branchement de la sortie du capteur DS18B20 sur broche digitale n°4
#define ONE_WIRE_BUS 4
//configuration liason série
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

//========Configuration de l'adressage de l'afficheur numérique
// En cas de non fonctionnement, mettez la ligne 8 en 
// commentaire et retirez le commentaire à la ligne 9.
LiquidCrystal_I2C lcd(0x27, 20, 4);
//LiquidCrystal_I2C lcd(0x3F,20,4);

//=======Déclaration des variables
//la led est branchée sur la broche digitale n°10
const int led = 10;
//le capteur eau est branché sur la broche analogique n°A1         
const int eau= A1;
//le capteur de lumière est branché sur la broche analogique n°A0
const int lum= A0;
//les variables reception et potarLevel sont de type integer    
int reception, eauLevel, lumLevel;
//déclaration variable nombre décimal (type float)
float tempC;
//déclaration des variables de type string
String message, commande = "";

//=======Fonction d'initialisation - exécutée 1 seule fois
void setup() {
  // initialisation de l'afficheur
  lcd.init();
  lcd.backlight();
  //définit le type d'entrée/sortie des broches utilisées
  pinMode(led, OUTPUT);
  pinMode(eau, INPUT);
  pinMode(lum, INPUT);
  //définit les paramètres de la liaison série (cable USB)
  Serial.begin(115200);
  Serial.flush();
  //Active la librairie du capteur de température
  sensors.begin();
}
void affiche() {
  lcd.clear();
  //Lumière 1ère ligne à gauche
  lcd.setCursor(0, 0);
  lcd.print("Lum:");
  lcd.print(lumLevel);
  //Lumière 1ère ligne au milieu
  lcd.setCursor(8, 0);
  lcd.print("Eau:");
  lcd.print(eauLevel);
  //Temp 2ème ligne à gauche
  lcd.setCursor(0, 1);
  lcd.print("Temp:");
  lcd.print(tempC); 
}
//=======Boucle principale
void loop() {
  //++++++++++++++Lecture des valeurs des capteurs
  eauLevel = analogRead(eau);
  lumLevel = analogRead(lum);
  sensors.requestTemperatures();
  tempC = sensors.getTempCByIndex(0);
  //++++++++++++++Traitement des ordres
  //-------Boucle de réception de données en provenance de la console
  while (Serial.available() > 0) {
    //lecture du code ASCII d'un caractère
    reception = Serial.read();
    //vérifie si c'est le dernier caractère Line Feed "\ln"
    if (reception !=10) {
      commande += char(reception);
    }
    //delais de 5/1000s
    delay(5);
  }
  //------Traitement de la commande on
  if (commande == "on") {
    //Met à l'état haut la sortie led
    digitalWrite(led, HIGH);
  }
  //------Traitement de la commande off
  if (commande == "off") {
    //Met à l'état bas la sortie led
    digitalWrite(led, LOW);
  }
  //------Traitement de la commande potar
  if (commande == "eau") {
    Serial.println(eauLevel);
  }
  //------Traitement de la commande potar
  if (commande == "lum") {
    Serial.println(lumLevel);
  }
  //------Traitement de la commande temp
  if (commande == "temp") {
    Serial.println(tempC);
  }
  //efface la variable commande
  commande = "";  
  affiche();
}

On cherche à savoir ce que le programme python va récupérer comme informations de la carte Arduino.

Comment est transmis dans la liaison série les valeurs des capteurs ?

Associer la valeur lue par l'arduino avec la grandeur réelle

Les valeurs lues pour l'eau et la luminosité sont codées sur 10 bits, donc compris entre 0 et 1023.

Comment savoir quel est le seuil qui indiquera qu'il y a suffisamment de lumière par exemple ?

Imaginons que la quantité de lumière en dessous de 600lux soit insuffisante : il faudrait alors allumer l'éclairage de la serre.

Quelle est la valeur lue par l'Arduino (variable lumLevel) qui correspond à ces 600lux ?

En utilisant un luxmètre, déterminer la valeur de lumLevel qui correspond à un éclairage de 600lux.

 

Programme python : faire une boucle pour lire et afficher la valeur de chaque capteur

a- Adapter le programme ci-dessous afin que, dans la boucle while, se déroulent les étapes suivantes :

- envoyer la commande pour le capteur eau,

- récupérer la valeur renvoyée et faire un affichage avec l'instruction print() pour obtenir par exemple eau = 450

- puis, envoyer la commande pour le capteur lumière,

- récupérer la valeur renvoyée et faire un affichage avec l'instruction print() pour obtenir par exemple lumière = 120

- puis, envoyer la commande pour le capteur température,

- récupérer la valeur renvoyée et faire un affichage avec l'instruction print() pour obtenir par exemple température = 24,4

# coding: utf-8
#!/usr/bin/python
#=======appel des bibliothèques======================
import serial
import time

#=======fonction lecture potentiomètre====================
def lumiere():
    #envoi de la commande de lecture du niveau de luminosité
    commande='lum'
    portCom.write(commande.encode())
    time.sleep(1)
    #réception des données sur la liaison série
    nbCar = portCom.in_waiting
    retour = portCom.read(nbCar)
    val = retour.decode()
    #val est une suite de caractères et non un nombre
    #si val n'est pas vide
    if (retour.decode()!=''):
        val=int(retour.decode())
    else:
        val=0.1
    return val

#=======paramétrage de la liaison série==============
portCom = serial.Serial()
portCom.port = "COM4"
portCom.baudrate = 115200
portCom.open()

#=======boucle de lecture/affichage des capteurs
#++++ATTENTION : il faut trouver une condition de sortie de la boucle
ordre='yes'
while (ordre!='stop'):
    #appel de la fonction pour envoie et réception de la valeur
    lumLevel = lumiere()
    #affichage de la valeur du capteur dans la console python
    print("Niveau de lumière :",lumLevel)
    #envoi de la commande pour allumer/éteindre en fonction du niveau de lumière



    #délai de 1s avnt de recommencer la boucle
    time.sleep(1)

#---déconnecter python du port série
portCom.close()

 

Conseils :

- Pensez à remplacer le nom du port de la liaison série.

- Il est judicieux de s'inspirer de la fonction lumière 

b- Tester le bon fonctionnement du programme en envoyant chaque commande et en vérifiant la valeur retournée.

 

Amélioration du programme python : tester la valeur du capteur par rapport à un seuil

a- Modifier le code précédent pour que :

- si la valeur du capteur eau est inférieure à 700 : afficher le message "Arrosage nécessaire"

- si la valeur du capteur lumière est inférieure à 150: afficher le message "Eclairage nécessaire"

- si la valeur du capteur température est supérieure à 22° : afficher le message "Ventilation nécessaire".

b- Tester le bon fonctionnement du programme