pas d'affichage LCD

bonjour a tous,

je suis un passionné d’électronique mais débutant en arduino, je me suis entraîné sur plusieurs tuto et fait pas mal d’exercices, j'ai décidé de passer un cran au dessus et essayer une transmission sans fil (en m'aidant de plusieurs exemples sur le net :wink: )entre un DHT 33 (via arduino mini) et un afficheur LCD 16x2 (via un arduino MEGA), j'utilise un émetteur et récepteur 433Mhz .

la communication est bien établie entre mes deux arduino et mes valeurs envoyés par le DHT sont converties correcteument et s'affiche sur le Serial moniteur.

mon probléme est que rien ne s'affiche sur mon LCD :frowning:

j'ai fait un lcd print dans le void setup avec un message pour tester, et ca marche! mais pour afficher mes valeurs impossible !!

j'en appel donc a votre expérience pour m'aider a comprendre ce qui cloche.

voici le code pour le transmetteur:

#include <VirtualWire.h>
#include <VirtualWire_Config.h>
#include <dht.h>
#define DHT33_PIN 6

dht DHT;
int T;
int H;
char data[21];

void setup() {
  
  pinMode(13,OUTPUT);
  vw_setup(2000);
  vw_set_tx_pin(2);
  }
  
  void loop() {
    
    digitalWrite(13,HIGH);
    
    uint32_t start = micros();
    int chk = DHT.read33(DHT33_PIN);
    uint32_t stop = micros();
    
     H = DHT.humidity * 100;
     T = DHT.temperature * 100;
     
     sprintf(data, "%d,%d", T, H);
     
     vw_send((uint8_t *)data, strlen(data));
     vw_wait_tx();  
    
    digitalWrite(13,LOW);
    delay(1000);
  
 }

et celui du récépteur :

#include <LiquidCrystal.h>
#include <VirtualWire.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char data[21];
int t;
int h;
float T;
float H;


void setup() {
  
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(13,OUTPUT);
  
  vw_setup(2000);
  vw_set_rx_pin(6);  
  vw_rx_start();  
}

  void loop() {
    memset( data, 0, sizeof( data ));
    
    
    Serial.println(t);
    Serial.println(h);
    Serial.println(T);
    Serial.println(H);
    
    digitalWrite(13, HIGH);
    
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    
    if (vw_get_message(buf, &buflen)) 
    {
 int i;
        for (i = 0; i < buflen; i++)
 {            
         data[i] = char(buf[i]);
 }
  
      sscanf(data, "%d,%d",&t, &h);
      T = t;
      T = T/100;
      H = h;
      H = H/100;
          
      digitalWrite(13,LOW);   
         
    }
  affichage();

}


void affichage() {
    lcd.clear() ;
    lcd.setCursor(0, 0);
    lcd.print("DHT SANS FIL");
    lcd.setCursor(0, 1);
    lcd.print("T ");
    lcd.setCursor(2, 1);
    lcd.print(T);
    lcd.setCursor(8, 1);
    lcd.print("H ");
    lcd.setCursor(10, 1);
    lcd.print(H);
    lcd.setCursor(15, 1);
    lcd.print("%");
    }

Salut

A priori ton lcd est donc bien câblé et fonctionne correctement

Par contre, ta fonction affichage() est appelée à une frequence élevée ... Et ces écrans sont plutôt lents ... Essaie déjà de mettre un delay a la fin de la fonction pour avoir le temps de lire quelque chose ...

Ensuite, n'affiche que les valeurs qui changent ... Et évite le lcd.clear

merci pour la réponse rapide ! :slight_smile:

donc j'ai essayé de transférer les textes fixes dans le void setup et laissé dans la fonction que les valeurs, j'ai aussi rajouter un delay de 1s et supprimé le lcd clear.

du coup sur l'afficheur j'ai le texte que j'ai transféré dans le void setup, mais le T et H ne s'affichent toujours pas.

ce que je remarque c'est que le delay que j'ai rajouté est bien pris en compte dans le programme car dans le serial moniteur il se passe 1 seconde entre l'affichage des valeurs ce qui n’était pas le cas.
voici la nouvelle version:

#include <LiquidCrystal.h>
#include <VirtualWire.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char data[21];
int t;
int h;
float T;
float H;


void setup() {
  
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("DHT SANS FIL");
  lcd.setCursor(0, 1);
  lcd.print("T ");
  lcd.setCursor(8, 1);
  lcd.print("H ");
  lcd.setCursor(15, 1);
  lcd.print("%");
  
  vw_setup(2000);
  vw_set_rx_pin(6);  
  vw_rx_start();  
}

  void loop() {
    memset( data, 0, sizeof( data ));
    
    
    Serial.println(t);
    Serial.println(h);
    Serial.println(T);
    Serial.println(H);
    
    digitalWrite(13, HIGH);
    
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    
    if (vw_get_message(buf, &buflen)) 
    {
 int i;
        for (i = 0; i < buflen; i++)
 {            
         data[i] = char(buf[i]);
 }
  
      sscanf(data, "%d,%d",&t, &h);
      T = t;
      T = T/100;
      H = h;
      H = H/100;
          
      digitalWrite(13,LOW);   
         
    }
  affichage();

}


void affichage() {
        
    lcd.setCursor(2, 1);
    lcd.print(T);
    
    lcd.setCursor(10, 1);
    lcd.print(H);
    
    delay(1000);
    
    }

peux tu modifier

void affichage() {
    Serial.println(t);
    Serial.println(h);
    Serial.println(T);
    Serial.println(H);
    lcd.setCursor(2, 1);
    lcd.print(T);
    
    lcd.setCursor(10, 1);
    lcd.print(H);
    
    delay(1000);
    
    }

Quand tu dis que les valeurs de T et H ne s'affichent pas ... C'est que les cases restent vides ou qu'il y a un zero à la place ?

@ dfgh
ok je modifie :wink: en effet c'est plus logique

@ B83s

les cases restent vides,

tu as modifié, mais qu'y a t'il au moniteur pendant l'exécution ?

oui j'ai bien modifié et testé le code !
j'ai bien mes valeurs sur le moniteur mais toujours pas sur le lcd :frowning:

voici a quoi ressemble ma fonction affichage maintenant:

void affichage() {
    
    Serial.println(t);
    Serial.println(h);
    Serial.println(T);
    Serial.println(H);
        
    lcd.setCursor(2, 1);
    lcd.print(T);
    
    lcd.setCursor(10, 1);
    lcd.print(H);
    
    delay(1000);
    
    }

tu as bien supprimé les autres sérial print.
pour etre sur que c'est bien ceux de la fonction affichage qui sont envoyés au moniteur

à tout hasard, un essai aussi avec lcd.write (T) au lieu de lcd.print(T)

Et avec lcd.print(T,1)?

chez moi, après modif du code j'ai un affichage
attention nous n'avons pas les meme pinoches pour le lcd

sur le moniteur( nsauf le %) comme sur le lcd, j'ai "T 10.00 H10.00%"
teste ce code et si tu as la meme chose que moi...........

#include <LiquidCrystal.h>
//#include <VirtualWire.h>

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char data[21];
int t;
int h;
float T;
float H;


void setup() {
  
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("DHT SANS FIL");
  lcd.setCursor(0, 1);
  lcd.print("T ");
  lcd.setCursor(8, 1);
  lcd.print("H ");
  lcd.setCursor(15, 1);
  lcd.print("%");
 /* 
  vw_setup(2000);
  vw_set_rx_pin(6);  
  vw_rx_start();  
  */
}

  void loop() {
   /* memset( data, 0, sizeof( data ));
    
    
    Serial.println(t);
    Serial.println(h);
    Serial.println(T);
    Serial.println(H);
    
    digitalWrite(13, HIGH);
    
  //  uint8_t buf[VW_MAX_MESSAGE_LEN];
  //  uint8_t buflen = VW_MAX_MESSAGE_LEN;
    
    if (vw_get_message(buf, &buflen)) 
    {
 int i;
        for (i = 0; i < buflen; i++)
 {            
         data[i] = char(buf[i]);
 }
  */
      sscanf(data, "%d,%d",&t, &h);
      T = 1000;
      T = T/100;
      H = 1000;
      H = H/100;
          
      digitalWrite(13,LOW);   
         
   // }
  affichage();

}




void affichage() {
    Serial.println(t);
    Serial.println(h);
    Serial.println(T);
    Serial.println(H);
    lcd.setCursor(2, 1);
    lcd.print(T);
    
    lcd.setCursor(10, 1);
    lcd.print(H);
    
    delay(1000);
    
    }

@ B83s

je viens d'essayé avec lcd.print(T,1) mais aucune différence :frowning: les cases restent vides :angry:

@ dfgh

j'ai bien supprimer les serial.print dans le reste du programme !

en testant le dernier code j’obtiens 10 et 10 comme toi !

c'est vraiment bizarre le code semble correcte je vois pas ce qui cloche, j'ai même pensé a un problème de compatibilité des library mais je vois rien de particulier.
voici les liens des library que j'utilise :

virtualwire 1.27 : VirtualWire: VirtualWire library for Arduino and other boards

pour le lcd c'est celui pré-installé dans l'IDE !

j'ai eu le cas il y a peu avec un conflit entre un lcd, softserial et des serial.println
après mise en commentaire des serial print, plus de soucis.
surement un soucis niveau lib, mais où?

as tu vu que j'ai viré "virtualwire" avec des //

oui j'ai bien vu ! ce qui me conforte dans la piste que le problème viendrait de cette lib
mais je suis pas suffisamment balaise pour voir d'ou viendrait le problème ni comment le corriger!

je vais voir si je trouve une autre lib pour le virtualwire ?
tu croie que c'est une bonne idée?

en revalidant la librairie virtual et ses init, j'avais une perte du back light du lcd de mon shield.
c'est // vw_setup(2000); laquelle appelle vw_pinSetup(); puis vw_digitalWrite_ptt(vw_ptt_inverted);
	et vw_timerSetup(speed);
qui me provoque cette perte

en regardant dans virtualwire.cpp
[code//	Define digitalRead, digitalWrite and digital pins for Arduino like platforms
#if (VW_PLATFORM != VW_PLATFORM_GENERIC_AVR8 )
	#define vw_digitalRead_rx() digitalRead(vw_rx_pin)
	#define vw_digitalWrite_tx(value) digitalWrite(vw_tx_pin,(value))
	#define vw_digitalWrite_ptt(value) digitalWrite(vw_ptt_pin,(value))
	
	// The digital IO pin number of the press to talk, enables the transmitter hardware
	static uint8_t vw_ptt_pin = 10;	
	
	// The digital IO pin number of the receiver data
	static uint8_t vw_rx_pin = 11;
	
	// The digital IO pin number of the transmitter data
	static uint8_t vw_tx_pin = 12;

tu as changé rx mais pas tx et ptt

peut etre une piste

bonne nouvelle !!! :slight_smile:
j'ai supprimé la library virtualwire et je l'ai remplacé par radiohead (nouvelle version du virtualwire), et ca marche a merveille!
je met les codes modifiés et qui fonctionnent pour les curieux :wink:

le transmetteur:

#include <RH_ASK.h>
#include <SPI.h>
#include <dht.h>
#define DHT33_PIN 6

RH_ASK driver(2000,6,2);

dht DHT;
int T;
int H;
char data[21];

void setup() {
  
  pinMode(13,OUTPUT);
  if (!driver.init())
         Serial.println("init failed");
  }
  
  void loop() {
    
    digitalWrite(13,HIGH);
    
    uint32_t start = micros();
    int chk = DHT.read33(DHT33_PIN);
    uint32_t stop = micros();
    
     H = DHT.humidity * 100;
     T = DHT.temperature * 100;
     
     sprintf(data, "%d,%d", T, H);
     
     driver.send((uint8_t *)data, strlen(data));
    driver.waitPacketSent();
      
    
    digitalWrite(13,LOW);
    delay(500);
  
 }

et le recepteur :

#include <RH_ASK.h>
#include <SPI.h>

#include <LiquidCrystal.h>

RH_ASK driver(2000,6);


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char data[21];
int t;
int h;
float T;
float H;


void setup() {
  
  //Serial.begin(9600);
  pinMode(13,OUTPUT);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("DHT SANS FIL");
  lcd.setCursor(0, 1);
  lcd.print("T ");
  lcd.setCursor(8, 1);
  lcd.print("H ");
  lcd.setCursor(15, 1);
  lcd.print("%");
  
  if (!driver.init())
         Serial.println("init failed");
}

  void loop() {
    
    memset( data, 0, sizeof( data ));
    
    digitalWrite(13, HIGH);
    
    uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
    uint8_t buflen = sizeof(buf);

    
    if (driver.recv(buf, &buflen)) 
    {
 int i;
        for (i = 0; i < buflen; i++)
 {            
         data[i] = char(buf[i]);
 }
  
      sscanf(data, "%d,%d",&t, &h);
      T = t;
      T = T/100;
      H = h;
      H = H/100;
          
      digitalWrite(13,LOW);   
         
    }
  affichage();

}


void affichage() {
    
    Serial.println(t);
    Serial.println(h);
    Serial.println(T);
    Serial.println(H);
    
           
    lcd.setCursor(2, 1);
    lcd.print(T);
    
    lcd.setCursor(10, 1);
    lcd.print(H);
    
    delay(1000);
    
    }

je vous remercie tous pour votre aide :smiley:

cool