Avis/conseil sur un codage simple (DHT LED LCD)

Bonjour à tous,

J'ai fais un petit programme tout simple et fonctionnel, pour m'améliorer j'aimerai votre avis sur la structure
J'ai utilisé :
LCD 1602 + LEDs + Potentiomètre + DHT11
J'ai repris quelques codes et réécris à ma manière (plus lisibles) en y ajoutant quelques conditions.

Pouvez vous me donner votre avis, par exemple si l'écriture est trop complexe, des ligne inutiles ou une façon de mieux les écrire , des composants manquant ect ....

Le code fonctionne.

Le but étant de :

  • Lecture de température et hygrométrie
  • Allumer certaines Leds en fonction de la température et du taux d'humidité.
  • Ecriture des valeurs sur le LCD
  • Ecriture sur LCD si température trop chaude, froide, OK
  • Ecriture sur LCD si hygrométrie trop sec, humide, OK

(les valeurs de température/hygrometrie sont celles de test.)

C'est un début pour une futur automatisation de ma serre à bonsaï.

Votre avis serai très apprécié :slight_smile:

Voici le schéma :

Voici le code :


#include <LiquidCrystal.h> //library
#include <SimpleDHT.h> //library
int DHT11pin = A5; //DHT PIN

SimpleDHT11 dht11;
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //LCD pins


void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2); //set lcd to 16 positions and 2 rows


 //Réglage LEDs
pinMode(2,OUTPUT); // Bleu température froide : en dessous de 20°C
pinMode(3,OUTPUT); // Vert température : tout est OK entre 20°C et 30°C
pinMode(4,OUTPUT); // Rouge température chaude : au dessus de 30°C

pinMode(5,OUTPUT); // Blanc hygrométrie basse : en dessous de 20%
pinMode(6,OUTPUT); // Vert hygrometrie : tout est OK entre 20% et 30%
pinMode(7,OUTPUT); // Jaune hygrométrie haute : au dessus de 30%
}


void loop() {
  // Ecriture des datas
  byte temperature = 0;
  byte humidity = 0;
  byte data[40] = {0};

  
 // lecture LCD
  if (dht11.read(DHT11pin, &temperature, &humidity, data)) 


 // Température écriture
  lcd.setCursor(0, 0);
 // print text
  lcd.print("Temp:    C  ");
  lcd.setCursor(6,0);
 // print temperature data
  lcd.print(temperature);

  
 // Hygrométrie écriture 
  lcd.setCursor(0,1);
 // print text
  lcd.print("Hygr:    %  ");
  lcd.setCursor(6,1);
 // print humidity data 
  lcd.print(humidity);


 // LEDs écriture TEMPERATURE
 if (temperature <= 20 ) {
  lcd.setCursor(11, 0);
 // print text
  lcd.print("COLD " ); }
  if ( temperature > 20 & temperature < 30 ) {
  lcd.setCursor(11, 0);
 // print text
  lcd.print("OK   "); }
 if (temperature >= 30 ) {
  lcd.setCursor(11, 0);
 // print text
  lcd.print("HOT  "); }


 // LEDs écriture HYGGROMETRIE
 if (humidity <= 20 ) {
  lcd.setCursor(11, 1);
 // print text
  lcd.print(" SEC " ); }
  if (humidity > 20 & humidity < 30 ) {
  lcd.setCursor(11, 1);
 // print text
  lcd.print("OK   "); }
 if (humidity >= 30 ) {
  lcd.setCursor(11, 1);
 // print text
  lcd.print("HUMID"); }


  // Allumage des LEDs
if (temperature <= 20 ) {    // Bleu = Trop froid
  digitalWrite (2, HIGH); }
else {
  digitalWrite (2, LOW); }
if ( temperature > 20 & temperature < 30 ) {    // Vert = Tout est OK
  digitalWrite (3, HIGH); }
else {
  digitalWrite (3, LOW); }
if (temperature >= 30 ) {    // Rouge = Trop chaud
  digitalWrite (4, HIGH); }
else {
  digitalWrite (4, LOW); }
  
if (humidity < 20 ) {    // Blanc = Trop humide
  digitalWrite (5, HIGH); }
else {
  digitalWrite (5, LOW); }
if ( humidity >= 20 & humidity <= 30 ) {    // Vert = Tout est OK
  digitalWrite (6, HIGH); }
else {
  digitalWrite (6, LOW); }
if (humidity > 30 ) {    // Jaune = Trop sec
  digitalWrite (7, HIGH); }
else {
  digitalWrite (7, LOW); }

  
 // Attendre 2s pour nouvelle lecture des data
    delay(2000);
  }

Merci à vous.

Mes remarque à froid (rien de bien important) :

Ce test n'est pas suivi par un bloc entre accolades { } donc il ne sert à rien : tu dois avoir oublié quelque chose ici.

Tu peux mettre des else devant les deux derniers if, ça ne change pas grand chose mais c'est plus propre. Pareil pour l'hygrométrie.
Es-tu sûr des valeurs d'hygrométrie à tester (20 & 30) ? Ca me parait faible.

Tu pourrais mettre les instructions d'allumage / extinction des LEDs dans les tests (température et humidité) d'affichage du LCD, ça raccourcirait un peu le code.

Bonjour vinz187

Quand on a un nombre de pin plus ou moins important, comme les pin des LED, il est bon de les mettre en tableau, ça facilite leur traitement.
En exemple, j'ai adapté ton programme pour que tu te fasses une idée.

#include <LiquidCrystal.h> //library
#include <SimpleDHT.h> //library
int DHT11pin = A5; //DHT PIN

SimpleDHT11 dht11;
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //LCD pins

// Pour "nommer" les LED   ledBleuTf = 0, ledVertTok = 1....., dans l'ordre du tableau ledPin[]
enum ledCouleursIndex {ledBleuTf, ledVertTok, ledRougeTc, ledBlancHb, ledVertHok, ledJauneHh};
	
//                   ledBleuT   ledVertTok   ledRougeTc   ledBlancHb   ledVertHok   ledJauneHh
const int ledPin[] = {   2,         3,           4,           5,           6,           7};
const int ledNombre = sizeof(ledPin) / sizeof(int);

void setup() {
	Serial.begin(9600);
	lcd.begin(16, 2); //set lcd to 16 positions and 2 rows


	//Réglage LEDs
	for (int l = 0; l < ledNombre; l ++)
	{
		pinMode(ledPin[l], OUTPUT);     // Ports des LED en sortie.
		digitalWrite(ledPin[l], LOW);     // Toutes les LED éteintes
	}
}


void loop() {
	// Ecriture des datas
	byte temperature = 0;
	byte humidity = 0;
	byte data[40] = {0};

	
	// lecture LCD
	if (dht11.read(DHT11pin, &temperature, &humidity, data))


	// Température écriture
	lcd.setCursor(0, 0);
	// print text
	lcd.print("Temp:    C  ");
	lcd.setCursor(6,0);
	// print temperature data
	lcd.print(temperature);

	
	// Hygrométrie écriture
	lcd.setCursor(0,1);
	// print text
	lcd.print("Hygr:    %  ");
	lcd.setCursor(6,1);
	// print humidity data
	lcd.print(humidity);


	// LEDs écriture TEMPERATURE
	if (temperature <= 20 ) {
		lcd.setCursor(11, 0);
		// print text
	lcd.print("COLD " ); }
	if ( temperature > 20 & temperature < 30 ) {
		lcd.setCursor(11, 0);
		// print text
	lcd.print("OK   "); }
	if (temperature >= 30 ) {
		lcd.setCursor(11, 0);
		// print text
	lcd.print("HOT  "); }


	// LEDs écriture HYGGROMETRIE
	if (humidity <= 20 ) {
		lcd.setCursor(11, 1);
		// print text
	lcd.print(" SEC " ); }
	if (humidity > 20 & humidity < 30 ) {
		lcd.setCursor(11, 1);
		// print text
	lcd.print("OK   "); }
	if (humidity >= 30 ) {
		lcd.setCursor(11, 1);
		// print text
	lcd.print("HUMID"); }


	// Allumage des LEDs
	if (temperature <= 20 ) {    // Bleu = Trop froid
	digitalWrite (ledPin[ledBleuTf], HIGH); }
	else {
	digitalWrite (ledPin[ledBleuTf], LOW); }
	if ( temperature > 20 & temperature < 30 ) {    // Vert = Tout est OK
	digitalWrite (ledPin[ledVertTok], HIGH); }
	else {
	digitalWrite (ledPin[ledVertTok], LOW); }
	if (temperature >= 30 ) {    // Rouge = Trop chaud
	digitalWrite (ledPin[ledRougeTc], HIGH); }
	else {
	digitalWrite (ledPin[ledRougeTc], LOW); }
	
	if (humidity < 20 ) {    // Blanc = Trop humide
	digitalWrite (ledPin[ledBlancHb], HIGH); }
	else {
	digitalWrite (ledPin[ledBlancHb], LOW); }
	if ( humidity >= 20 & humidity <= 30 ) {    // Vert = Tout est OK
	digitalWrite (ledPin[ledVertHok], HIGH); }
	else {
	digitalWrite (ledPin[ledVertHok], LOW); }
	if (humidity > 30 ) {    // Jaune = Trop sec
	digitalWrite (ledPin[ledJauneHh], HIGH); }
	else {
	digitalWrite (ledPin[ledJauneHh], LOW); }

	
	// Attendre 2s pour nouvelle lecture des data
	delay(2000);
}

Cette adaptation ne tiens pas compte des remarques pertinentes de @lesept et n'est pas testé!

Cordialement
jpbbricole

Merci à vous deux pour votre avis.
J'e n'ai pas écris n'importe quoi visiblement, ce code est simple, mais pour une 1ère je suis content.

Encore beaucoup de chose a apprendre, je ne connais pas les tableaux, j'ai survolé le lien, c'est interessant, je vais approfondir ça demain et refaire ce codage en groupant les LEDs

Non visiblement il est bien utile, j'ai essayé de retirer cette ligne, et les datas ne sont pas retranscrits sur le LCD.

OK en plus du tableau je vais modifier ces lignes, j'aurai 2 mêmes programmes à écriture différente.

Oui c'était simplement pour faire les test. Où je bosse l'air est très sec, au final ça sera plus du 60 & 80.

C'est a dire ?
Je suis pas sur de comprendre, je ne souhaite pas qu'elles s'éteignent. J'ai juste 2 LEDs qui sont allumées en continu (en fonction des valeurs de température et hygro)
Je pense que je ne comprend ce que tu veux dire.

Encore merci à vous deux

Je me suis mal exprimé : c'est le test (if) qui ne sert à rien, mais la condition du test est cruciale :
dht11.read(DHT11pin, &temperature, &humidity, data)

A priori, si tu changes ta ligne comme suit, ça devrait faire exactement pareil :
dht11.read(DHT11pin, &temperature, &humidity, data);
N'oublies pas le ; à la fin...

Pour le reste, tu peux mettre dans le bloc entre accolades suivant :

if (temperature <= 20 ) {
		lcd.setCursor(11, 0);
		// print text
	lcd.print("COLD " ); }

les instructions qui sont un peu plus loin dans le même test :
digitalWrite (2, HIGH);

C'est en fait un peu plus complexe : tu "dois" mettre dans chaque bloc les instructions d'allumage de la led concernée et d'extinction des autres. HIGH allume, LOW éteint

D’accord je comprends.
On peut dire que c’est une façon différente d’organiser son code, certes plus complexe mais très intéressantes pour des longs codes, pour une meilleure lecture.
Je vais essayer ça.

Merci aussi :pray:t2:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.