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
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