L’écran LCD Arduino affiche un caractère étrange après un certain temps

piertoni

L’écran LCD Arduino affiche un caractère étrange après un certain temps


J’ai des problèmes avec un écran LCD.

J’ai créé un système de contrôle climatique qui contrôle certains relais (sortie) et reçoit une entrée du capteur de conduite d’eau et de la température / humidité ambiante. Cela a été fait en utilisant 2 PT100 (étalonner manuellement) et 1 DHT11.

Toutes les données sont affichées sur un écran LCD 16×2 qui fonctionne bien, mais après un certain temps (je ne peux pas dire après un événement spécifique) commence à imprimer des chaînes étranges. Lorsque j’éteins et que l’écran LCD fonctionne correctement, cette chose me suggère que ce n’est probablement pas une mauvaise soudure des broches LCD.

Le système fonctionne et je peux le voir à partir d’une communication série, il ne semble donc y avoir qu’un problème d’écran LCD.

ALIMENTATION: L’alimentation LCD provient de l’arduino 5V et est alimentée par une source d’alimentation 12v. La source d’alimentation 5v est également connectée à un DHT11 et à deux PT100 en série avec des résistances 1k, donc l’absorption de courant ne devrait pas être beaucoup (0,01A pour les deux pt100, plus Dht11). Je n’ai connecté aucun condensateur en parallèle à une source d’alimentation Arduino 5V, je devrais peut-être en mettre un.

J’apprécierai toute suggestion.

Explication du code:

  • fonction du point de rosée: calcul du point de rosée

  • temp_acqua_mand: calcul de l’eau du diviseur de tension PT100 aux bornes

  • temp_acqua_rito: calcul de l’eau du diviseur de tension PT100 en retour des bornes

  • trevie: objet qui contrôle la sortie 1-5V pour une vanne à trois voies

  • AvviamentoImpianto: fonction qui démarre la congélation ou le réchauffement des machines et des pompes

  • ArrestoImpianto: éteindre les machines de congélation / réchauffement et les pompes

Merci

 double  dewPoint ( double  celsius ,   double  humidity ) 
 { 
     double  A0 =   373.15 /( 273.15   +  celsius ); 
     double  SUM =   - 7.90298   *   ( A0 - 1 ); SUM +=   5.02808   *  log10 ( A0 ); SUM +=   - 1.3816e-7   *   ( pow ( 10 ,   ( 11.344 *( 1 - 1 / A0 )))- 1 )   ; SUM +=   8.1328e-3   *   ( pow ( 10 ,(- 3.49149 *( A0 - 1 )))- 1 )   ; SUM +=  log10 ( 1013.246 ); 
     double  VP =  pow ( 10 ,  SUM - 3 )   *  humidity ; 
     double  T =  log ( VP / 0.61078 );     // temp var 
     return   ( 241.88   *  T )   /   ( 17.558 - T ); 
 } 

 double  temp_acqua_mand ( int  pinInput ) 
 { 
   Serial . print ( "Temp Mandata PIN " ); 
   float  letturaPin = analogRead ( pinInput ); 
   Serial . println ( letturaPin ); 
   return   ( float )(- 0.2083 *( 19.06 - letturaPin )); 
 } 
 double  temp_acqua_rito ( int  pinInput ) 
 { 
   Serial . print ( "Temp Ritorno PIN " ); 
   float  letturaPin = analogRead ( pinInput ); 
   Serial . println ( letturaPin ); 
   return   ( float )(- 1.258 *( 92.7 - letturaPin )); 
 } 


 class  val_Trevie { 
   private : 
     int  pinOut ; 
     int  apertura ;   //0 = Chiuso(completo ricircolo) 
                   //100= Aperto (Nessun ricircolo) 
   public : val_Trevie ( int  pin )   //COSTRUTTORE 
     { pinOut = pin ; 
       } 
     //~val_Trevie(); //DISTRUTTORE 
     int  read () 
     { 
       return  apertura ; 
       } 
     void   set ( int  percentuale )   //SET 
     { apertura = percentuale ; analogWrite ( pinOut ,    map ( apertura , 0 , 100 , 50 , 255 ));   //OUT 1-5V 
       Serial . print ( "Settaggio Trevie al " ); Serial . println ( apertura ); 
     } 
     void  aumenta () 
     { 
       if   ( apertura >= 90 ) 
           this -> set ( 100 ); 
       else 
           { apertura += 10 ; 
             this -> set ( apertura ); 
           } 
      } 
     void  diminuisci () 
     { 
       if   ( apertura <= 30 ) 
           this -> set ( 30 ); 
       else 
           { apertura -= 10 ; 
             this -> set ( apertura ); 
           }     
      }  

 }; 


 #include   <dht11.h> 
 #include   <LiquidCrystal.h> 


 #define  DHTLIB_OK 0 
 #define  DHTLIB_ERROR_CHECKSUM - 1 
 #define  DHTLIB_ERROR_TIMEOUT - 2 

 //Assegnazione PIN 0-13 

 #define  RELE_PdC 7 
 #define  RELE_Pompe 8 
 #define  RELE_Pompa_Inverno 9 
 #define  TREVIE 10 
 #define  DHT11PIN A5 #define  LCD_RS 12 
 #define  LCD_E 11 
 #define  LCD_D4 6 
 #define  LCD_D5 5 
 #define  LCD_D6 4 
 #define  LCD_D7 2 


 //Assegnazione PIN A0-A5 
 #define   Temp_Mandata  A1 #define   Temp_Ritorno  A0 #define   Chiamata_acqua  A2 #define   Estate_Inverno  A4 //SENSORE DHT11 dht11 DHT11 ; 
 //LCD 
 LiquidCrystal  lcd ( LCD_RS , LCD_E , LCD_D4 , LCD_D5 , LCD_D6 , LCD_D7 ); 
 //TREVIE val_Trevie trevie ( TREVIE ); 
 //DEFINIZIONI COSTANTI 
 #define  ESTATE 1              //SUMMER 
 #define  INVERNO 0             //WINTER 
 #define  SET_POINT 35 

 //DEFINIZIONE VARIABILI 
 double  inFunzione = 0 ; boolean stagione ;              //SEASON 

 void   AvviamentoImpianto () 
 { trevie . set ( 50 );   //Apertura Valvola 3 vie lcd . clear (); lcd . setCursor ( 0 , 0 ); lcd . print ( "Start Circuiti" ); lcd . setCursor ( 0 , 1 ); delay ( 10000 ); boolean stagione = analogRead ( Estate_Inverno )> 500 ; 

   if   ( stagione )     //ESTATE 
         { digitalWrite ( RELE_PdC , HIGH );   Serial . println ( "Avviamento Pompa Circuito Estivo" ); lcd . print ( "Prim EST" );} 
   else              //INVERNO 
         { digitalWrite ( RELE_Pompa_Inverno , HIGH ); Serial . println ( "Avviamento Pompa Circuito Invernale" ); lcd . print ( "Prim INV" );} delay ( 4000 ); digitalWrite ( RELE_Pompe , HIGH ); Serial . println ( "Avviamento Pompa Circuito Secondario" ); lcd . print ( " Second" ); delay ( 10000 ); inFunzione ++; 
   } 

 void   ArrestoImpianto () 
 { digitalWrite ( RELE_PdC , LOW ); digitalWrite ( RELE_Pompa_Inverno , LOW ); digitalWrite ( RELE_Pompe , LOW ); 
   Serial . println ( "Spegnimento Impianto" ); inFunzione = 0 ; lcd . clear (); lcd . setCursor ( 0 , 0 ); lcd . print ( "Spegnimento" ); delay ( 10000 ); 
   } 

 void  setup () 
 { delay ( 5000 ); 
   Serial . begin ( 9600 ); 
   Serial . println ( "CLIMADUINO START " ); 
   Serial . println (); 
   //INIZIALIZZAZIONE USCITE pinMode ( RELE_PdC , OUTPUT ); pinMode ( RELE_Pompe , OUTPUT ); pinMode ( RELE_Pompa_Inverno , OUTPUT ); 
   //INIZIALIZZAZIONE ENTRATE 
   //INIZIALIZZAZIONE LCD lcd . begin ( 16 , 2 ); lcd . print ( "CLIMADUINO" ); 
   //ANALISI STAGIONE ESTATE/INVERNO boolean stagione = analogRead ( Estate_Inverno )> 500 ; lcd . setCursor ( 0 , 1 ); 
   if   ( stagione ) lcd . print ( "ESTATE" ); 
   else lcd . print ( "INVERNO" ); delay ( 5000 ); 
 } 



 void  loop () 
 { 
 //LETTURA VALORI SENSORI 

   float  t_mandata =  temp_acqua_mand ( Temp_Mandata );   //TEMPERATURA DI MANDATA 

   float  t_ritorno =  temp_acqua_rito ( Temp_Ritorno );   //TEMPERATURA DI RITORNO 
 // String str_out= String("Temp Mand ")+String(t_mandata,2); lcd . clear (); lcd . setCursor ( 0 , 0 ); lcd . print ( "Tm " );  lcd . print ( String ( t_mandata , 1 )); lcd . print ( " Tr " );  lcd . print ( String ( t_ritorno , 1 )); lcd . setCursor ( 0 , 1 ); lcd . print ( "Trevie " ); lcd . print ( trevie . read ()); delay ( 6000 ); 

 float  t_ambiente , h_ambiente , t_rugiada ; 

 if   ( DHT11 . read ( DHT11PIN )== DHTLIB_OK ) 
     { t_ambiente =( float )  DHT11 . temperature + 3 ; h_ambiente =( float )  DHT11 . humidity ; 
     Serial . println ( "Umidita' %" );   Serial . println ( h_ambiente , DEC ); t_rugiada = dewPoint ( t_ambiente ,  DHT11 . humidity ); 
     Serial . println ( "Acquisizione Temperatura e Umidità Ambiente" ); 
     Serial . println ( t_ambiente ); lcd . clear (); lcd . setCursor ( 0 , 0 ); lcd . print ( "T Amb " );  lcd . print ( String ( t_ambiente , 1 )); lcd . setCursor ( 0 , 1 ); lcd . print ( "H% " );  lcd . print ( String ( h_ambiente , 0 )); lcd . print ( " Trug " ); lcd . print ( String ( t_rugiada , 0 )); 
     } 
   else 
   { t_rugiada = 15.0 ; lcd . clear (); lcd . setCursor ( 0 , 0 ); lcd . print ( "T amb ERRORE" ); 
     } 



   //CONTROLLO CHIAMATA ACQUA boolean chiamata_Acqua =  analogRead ( Chiamata_acqua )< 500 ; 
   Serial . println ( analogRead ( Chiamata_acqua )); 
   if   ( chiamata_Acqua ) 
       { 
         Serial . println ( "Richiesta acqua" ); 
         if   ( inFunzione == 0 )   AvviamentoImpianto ();   //SE L'IMPIANTO E' SPENTO LO AVVIA 
       } 
   else   { 
         if   ( inFunzione == 1 )   ArrestoImpianto ();   //SE L'IMPIANTO E' ACCESO LO SPEGNE 
         } 

 //ALGORITMO DI DECISIONE 
       if   ( inFunzione == 1 ) 
       { 
       //delta = DIFFERENZA DI TEMPERATURA AL SET POINT 
       float  delta = 0 ; 


             if   ( stagione == INVERNO )  
               { delta = SET_POINT - 5 - t_mandata ; 
               }   
             else  
               { delta = t_mandata -( t_rugiada + 2 ); 
               } 

             if   ( delta <   - 5 ) 
                 { trevie . diminuisci (); trevie . diminuisci (); 
                 }   
             else   if   ( delta <   0 ) 
                 { trevie . diminuisci (); 
                 } 
             else   if   ( delta >   5 ) 
                 { trevie . aumenta (); 
                 }  
       } delay ( 6000 ); 
 } 

Réponses


 Rodrigo Lopez

Essayez avec un condensateur aussi près que possible de la source d’alimentation de l’écran LCD (broches 0 et 1 si vous utilisez un parent HD44780, pointé par votre code)

Andrew

C’est toujours un bon conseil pour le découplage des condensateurs – et il est rarement économique de les omettre

piertoni

Le condensateur a-t-il pour but de stabiliser la source d’alimentation 5 V pour éviter les pics? Ou le but est d’éviter le bruit? Juste pour être sûr, le condensateur doit être connecté d’un côté à la broche et de l’autre à la terre? Quelle capacité pourrait être un bon choix? Merci

Rodrigo Lopez

@piertoni, l’idée principale est de stabiliser la source d’alimentation, mais cela aidera aussi avec le bruit. Lorsqu’un appareil numérique commute des bits, il nécessite des courants de courant très faibles mais très rapides . Un condensateur local (généralement appelé condensateur de découplage) permet de fournir ces accélérations très rapidement. Placez-le entre le positif et le sol. Les valeurs typiques commencent autour de 0,1 uF, mais des valeurs plus grandes ne feront pas de mal 🙂

 

affiche, après, arduino, caractère, certain, étrange, l’écran, LCD, temps, un

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *