bug écran LCD avec arduino + données capteurs

Bonjour,
J'ai un pb avec mon ecran LCD 1602 et mon code arduino. L'écran a ses cases blanche en haut et ces case noire ( bleue pour etre plus précis ) en bas.
j'ai besoin qu'il m'affiche les valeur de mon capteur de CO2 .
voici mon code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);// initialisation, on définit les ports pour RS, E et D4 à D7

#include "MQ135.h"
const int mq135Pin = 2 ; // Pin sur lequel est branché de MQ135

MQ135 gasSensor = MQ135(mq135Pin); // Initialise l'objet MQ135 sur le Pin spécifié
const int LED=3; //declaration constante de broche

void setup()
{
Serial.begin(9600); // Initialise le port série à 9600 bps
float rzero = gasSensor.getRZero();
Serial.print("R0: ");
Serial.println(rzero); // Valeur à reporter ligne 27 du fichier mq135.h après 48h de préchauffage
pinMode(LED, OUTPUT); //met la broche en sortie
digitalWrite(LED,LOW); // met la broche au niveau bas (0V) – éteint la LED
lcd.begin(16, 2);
//lcd.print("hello world");
lcd.print("C02: ");
}

void loop()
{
float ppm = gasSensor.getPPM();
Serial.print("port 2: ");
Serial.print(analogRead(mq135Pin));
Serial.print(" ppm CO2: ");
Serial.println(ppm);
if ( ppm >= 15)
{
digitalWrite(LED,HIGH); // met la broche au niveau haut (5V) – allume la LED
delay(500); // pause de 500 millisecondes (ms)
digitalWrite(LED,LOW); // met la broche au niveau bas (0V) – éteint la LED
}
lcd.setCursor(0, 1); // la ligne 1 correspond à la seconde ligne
lcd.print("CO2 value is :");
lcd.print(ppm);
delay(1000); // Actualise la mesure chaque seconde
}

tous est bien branché...
please help me... :slight_smile:

Sans schéma cela va être compliqué.

Tu as mis R/W à GND ?
Tu as mis un potentiomètre de réglage du contraste ?
Si oui l'as-tu réglé ?

Votre LCD a 16 chars:
"CO2 value is :" vous en mange 13 ou 14
Il vous en reste ... 2 ou 3 Est ce assez pour afficher un float?

Je vous conseillerais d'être plus concis :
au lieu de ""CO2 value is :"", imprimer "CO2:" vous laisserait 12 chars (et serait sans connotation de langage).

Il serait possible, puisque vous avez activé une liaison serie, d'imprimer sur cette liaison , par Serial.print, ce que vous voulez envoyer au LCD....

hbachetti:
Sans schéma cela va être compliqué.

Tu as mis R/W à GND ?
Tu as mis un potentiomètre de réglage du contraste ?
Si oui l'as-tu réglé ?

Est ce que l'auteur aa testé (il y a un exemple dans l'IDE, appelé "helloworld" si ma mémoire est bonne son LCD en affichant "Salut, monde" (ou "Lasho gies" ou .. "Rojbash" ou "0123456" ou "0123456789012345")

hbachetti:
Sans schéma cela va être compliqué.

Tu as mis R/W à GND ?
Tu as mis un potentiomètre de réglage du contraste ?
Si oui l'as-tu réglé ?

yes cela a été fait ^^

Tout à été soudé niveau broches etc ? pcq on a eu le cas ya quelques semaines avec un écran juste "posé" sur les barettes :smiley: ...

dbrion06:
Votre LCD a 16 chars:
"CO2 value is :" vous en mange 13 ou 14
Il vous en reste ... 2 ou 3 Est ce assez pour afficher un float?

Je vous conseillerais d'être plus concis :
au lieu de ""CO2 value is :"", imprimer "CO2:" vous laisserait 12 chars (et serait sans connotation de langage).

Il serait possible, puisque vous avez activé une liaison serie, d'imprimer sur cette liaison , par Serial.print, ce que vous voulez envoyer au LCD....

je teste cela ce soir a mon retour chez moi ^^ je crois que je suis au alentour de 4-5

BrUnO14200:
Tout à été soudé niveau broches etc ? pcq on a eu le cas ya quelques semaines avec un écran juste "posé" sur les barettes :smiley: ...

Alors oui tt est soudé :slight_smile: il s'allume:)

dbrion06:
Votre LCD a 16 chars:
"CO2 value is :" vous en mange 13 ou 14
Il vous en reste ... 2 ou 3 Est ce assez pour afficher un float?

Je vous conseillerais d'être plus concis :
au lieu de ""CO2 value is :"", imprimer "CO2:" vous laisserait 12 chars (et serait sans connotation de langage).

Il serait possible, puisque vous avez activé une liaison serie, d'imprimer sur cette liaison , par Serial.print, ce que vous voulez envoyer au LCD....

je teste cela ce soir a mon retour chez moi ^^ je crois que je suis au alentour de 4-5

Je vois un dernier petit problème (mais qui n'empêche pas l'affichage, même s'il affecte la lecture): si vous passez d'une grande valeur de concentration (disons 9000) à une petite valeur (disons 90) et si vous vous contentez de positionner le curseur et si les chiffres à afficher sont cadrés à gauche, les deux derniers chiffres (disons) précedemment affichés ne seront pas gommés; Au vu de vos cadences d'affichage (1 seconde de rafraîchissement), vous auriez peut être interet à carrément effacer tout l'ecran (clrscr, de mémoire), puis à positionner le curseur et à afficher votre libellé et sa valeur. Ca rajoute une ligne, mais ça évite de risquer d'afficher des valeurs fausses, difficiles à détecter.

voila ce que j'ai ci joint.
avec les câblages et l’écran, sont bon j 'ai revérifié...

code:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);// initialisation, on définit les ports pour RS, E et D4 à D7

#include "MQ135.h"
const int mq135Pin = 2 ; // Pin sur lequel est branché de MQ135

MQ135 gasSensor = MQ135(mq135Pin); // Initialise l'objet MQ135 sur le Pin spécifié
const int LED=3; //declaration constante de broche

void setup()
{
Serial.begin(9600); // Initialise le port série à 9600 bps
float rzero = gasSensor.getRZero();
Serial.print("R0: ");
Serial.println(rzero); // Valeur à reporter ligne 27 du fichier mq135.h après 48h de préchauffage
pinMode(LED, OUTPUT); //met la broche en sortie
digitalWrite(LED,LOW); // met la broche au niveau bas (0V) – éteint la LED
lcd.begin(16, 2);
//lcd.print("hello world");
lcd.print("C02: ");
}

void loop()
{
float ppm = gasSensor.getPPM();
Serial.print("port 2: ");
Serial.print(analogRead(mq135Pin));
Serial.print(" ppm CO2: ");
Serial.println(ppm);
if ( ppm >= 15)
{
digitalWrite(LED,HIGH); // met la broche au niveau haut (5V) – allume la LED
delay(500); // pause de 500 millisecondes (ms)
digitalWrite(LED,LOW); // met la broche au niveau bas (0V) – éteint la LED
}
lcd.clear();
lcd.setCursor(0, 1); // la ligne 1 correspond à la seconde ligne
lcd.print("CO2:");
lcd.print(ppm);
delay(1000); // Actualise la mesure chaque seconde
}

Bon:
a) est ce que votre setup marche? (faites dormir 10 000 millisecondes, pour pouvoir voir "CO2" sur votre LCD ... ou pas)
b) est ce que votre affichage sur lisaison série marche et affiche des concentrations en CO2? ou pas?
c) est ce que votre LCD daigne afficher des concentrations en CO2? ou pas?

Est ce que, après avoir passé ces tests, vous avez ouvert une bouteille de champagne et rapproché son goulot du capteur de CO2? Est ce qu'il a réagi? (sinon, ça doit marcher avec du coca cola, une autre source de CO2). Parce que, sans plaisanter, je vois mal comment tester le réalisme de ces capteurs....

En soufflant dessus peut-être ? Notre souffle est chargé en CO2 aussi

lesept:
En soufflent dessus peut-être ? Notre souffle est chargé en CO2 aussi

et, pour avoir beaucoup de CO2, j'ai conseillé de retenir son souffle(via le setup) pendant 10 000 millisecondes.
cette période d'apnée est cependant négligeable devant le temps de stabilisation du capteur -48 heures: là, il en aura beaucoup- selon
https://projetsdiy.fr/mq135-mesure-qualite-air-polluant-arduino/
(dont ce projet est inspiré me semble-t-il, tout en faisant clignoter pour des valeurs très basses de CO2: je pensais que le clignotement était une alarme)

dbrion06:
et, pour avoir beaucoup de CO2, j'ai conseillé de retenir son souffle(via le setup) pendant 10 000 millisecondes.
cette période d'apnée est cependant négligeable devant le temps de stabilisation du capteur -48 heures: là, il en aura beaucoup- selon
https://projetsdiy.fr/mq135-mesure-qualite-air-polluant-arduino/
(dont ce projet est inspiré me semble-t-il, tout en faisant clignoter pour des valeurs très basses de CO2: je pensais que le clignotement était une alarme)

alors oui effectivement :slight_smile:
et la led est bien une alarme si le seuil de C02 est dépassé:) et j'ai bien tt testé ... c'est pour cela que je suis venu ici , mm avec la fonction lcd.println(ppm) cela ne fonctionne pas ^^ j'ai tt essayé XD je suis perdu, je pense a prendre l'écran et le jeté par la fenêtre sérieux... ^^'

Pour l'amour de Zeus (un Jupiter grec) , dites si
a) votre lcd fonctionne avec le setup (affichage d'une chaîne simple, "CO2" si je me souviens bien).
Pour ce test simple, vous pouvez mettre, en première ligne de loop, un return; (qu'il faudra retirer ensuite)

b) si il peut afficher le libelle dans le loop

c) s'il peut afficher , tant sur la jonction série que sur le LCD, la chaîne suivante "CO2 :"+ String(ppm) (je vous le dis sans le tester; je n'ai pas d'arduino sous la main: et, s'il peut l'afficher sur la jonction serie, quelle est sa longueur? ça serait parfait de montrer le résultat)

Et, au nom de ce que vous avez de plus sacré, et tenant compte que personne n'a d'yeux téléscopiques, faites part de ces résultats (à ce stade, on ne sait même pas si votre LCD marche, ce qui est l'objet de ma question a)
on ne sait même pas si la conversion de real en string met plein de chiffres après la virgule, ce qui est l'objet de la question c -et la répartio,nn est triviale :vu les ordres de grandeur, vous n'aurez plus, si le nombre de chiffres après la virgule/le point décimal est faramineux, qu'à convertir en int.....)

Sachez que le temps passé à vous implorer , j'aurais fait ces tests 10 fois...

Acikifu:
je suis perdu, je pense a prendre l'écran et le jeté par la fenêtre sérieux... ^^'

Normalement, les écrans LCD sont la dernière chose à jeter par la fenêtre
si vous avez

  1. vérifié le câblage ,
  2. vérifié qu'il affiche des chaînes fixées (on ne sait rien de ces deux points)
    et
  3. converti ppm en String (String sPPM = String(ppm, 1) ; doit faire l'affaire -et pas comme je l'indiquais avec un seul argument; pour les floats, il faut indiquer le nombre de chiffres après la "virgule" -le point décimal)
    ça devrait marcher; sinon, il faudra des tests de plus en plus minutieux...

dbrion06:
Normalement, les écrans LCD sont la dernière chose à jeter par la fenêtre
si vous avez

  1. vérifié le câblage ,
  2. vérifié qu'il affiche des chaînes fixées (on ne sait rien de ces deux points)
    et
  3. converti ppm en String (String sPPM = String(ppm, 1) ; doit faire l'affaire -et pas comme je l'indiquais avec un seul argument; pour les floats, il faut indiquer le nombre de chiffres après la "virgule" -le point décimal)
    ça devrait marcher; sinon, il faudra des tests de plus en plus minutieux...
  1. le câblage est bien verifié ^^'
  2. j'ai essayé avec hello world il y a 3 jour cela m'a affiché des caractère bizarre je l'ai re téléversé et plus rien impossible de le retrouvé ...
    3)il faut que je test cela se soir ^^

ci joint une photo de mon projet ^^ avec les branchement lié a l'écran ^^

cela m'a affiché des caractère bizarre

Tant que tu ne parviens pas à afficher des choses simples, pas la peine d'aller plus loin.

Je crains de me répéter : quel schéma as-tu utilisé ?

hbachetti:
Tant que tu ne parviens pas à afficher des choses simples, pas la peine d'aller plus loin.

Je crains de me répéter : quel schéma as-tu utilisé ?

celui ci ( en piece jointe) trouvé sur openclassrooms

Si vous avez un voltmètre, vous pouvez tester:
la valeur au curseur du potentiomètre de contraste
les 5v (3 fils; le retroeclairage marche)
les masses

Par ailleurs, j'ai encore vu un loup dans votre logiciel: analogRead accepte en entrée A0 à A5, et en aucun cas 2 (un bout de la jonction serie, IIRC....).Si, en desespoir de cause (on n'en est pas encore là), vous renouvelez votre LCD, je vous conseillerais d'acheter un afficheur shield précablé, préréglé, prêt à enficher (je hais les soudures, surtout celles qui me font tourner en bourrique) ;
celui que j'ai a un miniclavier en rab, branché sur la voie analogique zero -A0- IIRC... ce qui laisse 5 positions prêtes à accueillir votre capteur, si vous desespèrez -mais, je le repète, on n'en est pas encore à ce stade-)

dbrion06:
Si vous avez un voltmètre, vous pouvez tester:
la valeur au curseur du potentiomètre de contraste
les 5v (3 fils; le retroeclairage marche)
les masses

Par ailleurs, j'ai encore vu un loup dans votre logiciel: analogRead accepte en entrée A0 à A5, et en aucun cas 2 (un bout de la jonction serie, IIRC....).Si, en desespoir de cause (on n'en est pas encore là), vous renouvelez votre LCD, je vous conseillerais d'acheter un afficheur shield précablé, préréglé, prêt à enficher (je hais les soudures, surtout celles qui me font tourner en bourrique) ;
celui que j'ai a un miniclavier en rab, branché sur la voie analogique zero -A0- IIRC... ce qui laisse 5 positions prêtes à accueillir votre capteur, si vous desespèrez -mais, je le repète, on n'en est pas encore à ce stade-)

Malheureusement pas de voltmetre...
vous me conseillé donc de changé le 2 par un A(0-5)??
j'ai aussi pensé a une chose, si je mettais la fonction: lcd.print((int)ppm) au lieux de lcd.print(ppm) ... :slight_smile: