Strani simboli su display lcd

ciao aquilacieca,

permettimi un paio di osservazioni...non è buona cosa, se non realmente necessario, riscrivere il display ad ogni ciclo loop...aggiornalo solo quando serve e nelle posizioni specifiche.
i decimali si distinguono dalle unità tramite il "." e non tramite "," quindi questo if non va bene:

if (t < 20,1)

detto questo...lunghezza dei cavi per l'I2C?
cosa ti arriva come cavi di potenza in quella scatola?...se si tratta del "proibito" sei sicuro che non diano fastidio ai cavi I2C?

i cavi sono da 20 cm.
in quella scatola ci sono i cavi del dht22, della scheda relè, del rtc. Di esterno c'è il jack dell'alimentatore di arduino, ci sono solo 2 cavi del "proibito" e passano lontano da loro.tutti gli altri cavi sono da 5v o al massimo 12 v delle ventole.

>aquilacieca: SOLO per questa volta NON ho cancellato tutti i messaggi, ma ho diviso il post ...
... cosa c'è di poco chiaro nel punto 16.9 del REGOLAMENTO ? ? ? Il thread a cui ti eri collegato era del 2017 !

Per i futuro presta più attenzione, grazie,

Guglielmo

aquilacieca:
i cavi sono da 20 cm.
in quella scatola ci sono i cavi del dht22, della scheda relè, del rtc. Di esterno c'è il jack dell'alimentatore di arduino, ci sono solo 2 cavi del "proibito" e passano lontano da loro.tutti gli altri cavi sono da 5v o al massimo 12 v delle ventole.

Ecco, già che sono da 20 cm. sono già fin troppo lunghi! Io ho problemi con un pettine che si inserische nell'I2C del display e che va ad un altro circuito stampato sotto il display...
Già che sei su breadboard diciamo che i contatti non sono propriamente "dorati" e perfetti...
Già che ci sono delle ventole, la cosa mi piace poco.
Già che sei vicino ai cavi di rete mprendi anche i disturbi della lavatrice nell'appartamento del vicino.
Se poi hai una lampada al neon prova pure ad accenderla e spegnerla così sul display hai l'albero di natale tutto disegnato...
...E...WOW!!! c'è anche una scheda relé con chissà che diavolo c'è attaccato !!!

al relè le ventole e i led cob.
ho capito, mi tengo i disturbi :frowning:

aquilacieca:
al relè le ventole e i led cob.
ho capito, mi tengo i disturbi :frowning:

Non è una risposta...
Puoi provare a diminuire la lunghezza dei 4 fili I2C?
Poi, sul mio circuito i disturbi che non entrano "via cavo" entrano direttamente sui chip del circuito stampato del display attraverso i relé. Io ho ovviato con dei relè statici triac, tu puoi allontanare il display dal relè e mettere un filtro RC (condensatore 0,1uF in serie a una 47 ohm) in parallelo al contatto.
Poi su un altro post avevamo trovato una soluzione anche per il display, mettendo un condensatore 0,1uF tra pin VSS e pin E e una resistenza da 3.300 ohm tra pin VDD e pin E (sempre lui...)

Come vedi c'è da divertirsi...

aquilacieca:
al relè le ventole e i led cob.
ho capito, mi tengo i disturbi :frowning:

Comincia a non scrivere sul display ad ogni ciclo di loop ma solo quando ti cambia una o più informazioni come ti hanno suggerito nel post #2 ci sono ottime possibilità che se non scompaiono del tutto saranno sicuramente più limitati i problemi, io stesso ho riscontrato in passato display lcd impazziti con caratteri strani, senza toccare i collegamenti ma aggiornando solo quando strettamente necessario ho risolto.
Poi se i caratteri strani dipendono dalle tue cose (software+interferenze) allora devi risolvere sia l'uno che l'altro, ma intanto intervenire sul sofwtare è già un inizio e non comporta modifiche hardware

Edit = Sovrapposto a Steve-cr che ha dato anche ottimi consigli lato hardware

Che valori di resistenze Pullup hai / hai messo su SDA e SCL?
Ciao Uwe

Non ho messo resistenze :o
Domani farò le modifiche suggerite
Grazie mille

allora metti prima 4,7kOhm e se continua il problema 2,2kOhm Pullup su SDA e SCL.
Ciao Uwe

inserite le 4,7kOhm pullup come suggerito, le 2,2kOhm non le ho al momento.
allego le foto della situazione. quando carico il codice con usb il monitor impazzisce completamente (foto 1).
stacco l'alimentazione e riattacco, la situazione è come in foto 2 e 3. allego il codice nuovo con le modifiche apportate come suggerito ( il codice è diverso da prima, è la versione con isteresi).
ho provato anche a caricare il codice senza alimentare i relè e senza l'alimentazione "proibita" dei led cob, ma non cambia nulla.
non capisco come mai fino a lunedi era tutto funzionante e ora fa cosi, l'impianto e il codice sono cosi da più di un mese.

grazie

#include <DS3231.h>
  #include <LiquidCrystal_I2C.h>
  #include <Wire.h>
  #include <Time.h>
  #include <TimeLib.h>
  #include <DHT.h>
  #include "DHT.h"
  #define DHTPIN 6 // 6 è il pin di Arduino a cui collego il sensore di temperatura
  #define DHTTYPE DHT22 // dht22 è il tipo di sensore che uso
  DHT dht(DHTPIN, DHTTYPE);
  
  #define Isteresi 3
  #define TempImpostata 22
  LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
  DS3231  rtc(SDA, SCL);

  // Init a Time-data structure
  Time  ti;
  
  #define PAUSA 600000
  #define DURATA 60000
  unsigned long t1=0;
  byte on=0;
  int relay_luci = 3; // PIN DEL RELè LUCE
  int relayVentolaEntrata = 10;
  int relayVentolaUscita= 9;
  int relay_calore = 8; //calore
  //Setup light cycle for both bars
  const int OraAccensione = 6;     //Accensione luci alle 6:00:00
  const int OraSpegnimento = 21;    // Spegnimento luci alle 20:59:59

  


void setup() 
{

  lcd.begin(16,2);
  lcd.backlight();
  rtc.begin();
  //rtc.setDOW(THURSDAY);     
  //rtc.setTime(19,15,00);     
  //rtc.setDate(24, 1, 2019); 
  
   
  lcd.setCursor(0, 1);
  lcd.print("T:");
  lcd.setCursor(7, 1);
  lcd.print("C");
  lcd.setCursor(8, 1);
  lcd.print("Hu:");
  lcd.setCursor(15, 1);
  lcd.print("%");
  pinMode(relay_luci, OUTPUT);
  digitalWrite(relay_luci,LOW);

  pinMode(relayVentolaEntrata, OUTPUT);
  digitalWrite(relayVentolaEntrata, LOW);

  pinMode(relayVentolaUscita, OUTPUT);
  digitalWrite(relayVentolaUscita, LOW);

  pinMode(relay_calore, OUTPUT);
  digitalWrite(relay_calore, LOW);

}


void loop() 
{
  ti = rtc.getTime();

  if (ti.hour >= OraAccensione && ti.hour < OraSpegnimento)
{
if(millis()-t1>PAUSA && on==0)
  {on=1; digitalWrite(relayVentolaUscita, HIGH);digitalWrite(relayVentolaEntrata, HIGH);} // Se è trascorsa la pausa, accende
if(millis()-t1>PAUSA+DURATA)
  {on=0; t1 =millis(); digitalWrite(relayVentolaUscita, LOW);digitalWrite(relayVentolaEntrata, LOW);} // Se è trascorsa anche la durata, spegne e azzera.

  digitalWrite(relay_luci, HIGH);
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  lcd.setCursor(1, 0);
  lcd.print(rtc.getTimeStr()); 
  lcd.print(" ");
  lcd.setCursor(2, 1);    
  lcd.print(t);
  lcd.setCursor(10, 1);
  lcd.print(h);
  

 if (t > TempImpostata)
{
  if (t > TempImpostata + Isteresi)
{
  digitalWrite(relay_calore, LOW);
  //digitalWrite(relayVentolaEntrata, HIGH);
  //digitalWrite(relayVentolaUscita, HIGH);
}
  else
{
  digitalWrite(relay_calore, LOW);
  //digitalWrite(relayVentolaEntrata, LOW);
  //digitalWrite(relayVentolaUscita, LOW);
}  
}
  else 
{
  if (t < TempImpostata - Isteresi)
{
  digitalWrite(relay_calore, HIGH);
  //digitalWrite(relayVentolaEntrata, LOW);
  //digitalWrite(relayVentolaUscita, LOW);
}
}}
  else if (ti.hour >= OraSpegnimento || ti.hour < OraAccensione)
{
  digitalWrite(relay_luci, LOW);
  digitalWrite(relay_calore, LOW);
  digitalWrite(relayVentolaEntrata, LOW);
  digitalWrite(relayVentolaUscita, LOW);
 // lcd.clear();
  lcd.noBacklight();
  
}}

le foto :slight_smile:

Ahh ma la I2C non è APPICCICATA al display!!!
Non se ne parla nemmeno, i collegamenti tra la I2C e il display devono essere il più corti possibili tanto è vero che i display I2C nativi ce l'hanno saldata dietro.
E occhio al collegamento sul piedino E che è quello più "delicato"... probabilmente quel filo non è collegato bene o si è "spostato" quindi riceve più disturbi.

Dalla foto allegata, se fai questo montaggio (la schedina è stata progettata apposta) non dovresti pèiù avere i problemi dei collegamenti lunghi. Ti serve solo un "pettinino" da mettere in mezzo.

lcd.jpg

Ho il display con i piedini dello starter kit di Arduino, come ci attacco la I2C? Devo dissaldare? Forse mi conviene prendere un Display con i2c? :frowning:

Con meno di cinque euro te la cavi. Poi quando avrai voglia "convertirai" anche quello, perché usarlo così ha poco senso.
QUESTO

Grazie mille, procedo all'acquisto.
:slight_smile:

Montato nuovo display con i2c incluso, purtroppo continuano i simboli strani :frowning:

ciao,

pui postare il tuo ultimo programma?
te lo chiedo in quanto finora ho sempre visto, nei tuoi programmi, che impostavi l'LCD come 16x2 e quello che stai usando è un 20x4.

Scusa la domanda stupida, ma quando parte il tutto, per un po', hai i dati sul display corretti?
Ho guardato un po' immagini e codice postato e non mi tornano alcune cose, ad es. sul primo post hai postato la situazione di 3 giorni, in alcuni i dati erano allineati a sinistra in altri a destra, se guardo il codice non ritrovo i caratteri costanti del codice, come se tu mostrassi un codice diverso da quello eseguito.
Sul codice metti "Temp" e sul display esce solo T.
Sul setup formatti in un modo nel loop in un altro.
Ho l'impressione che tu possa avere più problemi accavallati.

Io ripartirei dall'inizio facendo un'analisi ordinata del problema, se ti va.
Quindi partirei da un codice stabile e da immagini del risultato coerenti con il codice, indicando dopo quanto si sballa tutto.

Sospetto due problemi, il primo sono disturbi sui cavi, l'altro sono errori di visualizzazione dei dati sul display derivanti dal codice, vedo che aggiorni solo alcuni pezzi e in modo differente tra setup e loop, ma non avendo trovato coerenza tra codice e immagini non posso esserne sicuro.

il codice che gira attualmente è questo:

#include <DS3231.h>
  #include <LiquidCrystal_I2C.h>
  #include <Wire.h>
  #include <Time.h>
  #include <TimeLib.h>
  #include <DHT.h>
  #include "DHT.h"
  #define DHTPIN 6 // 6 è il pin di Arduino a cui collego il sensore di temperatura
  #define DHTTYPE DHT22 // dht22 è il tipo di sensore che uso
  DHT dht(DHTPIN, DHTTYPE);
  #define Isteresi 3
  #define TempImpostata 22
  LiquidCrystal_I2C lcd(0x27,20,4); 
  DS3231  rtc(SDA, SCL);
  
  Time  ti;
  
  #define PAUSA 600000
  #define DURATA 60000
  unsigned long t1=0;
  byte on=0;
  int relay_luci = 3; // PIN DEL RELè LUCE
  int relayVentolaEntrata = 10;
  int relayVentolaUscita= 9;
  int relay_calore = 8; //calore
  //Setup light cycle for both bars
  const int OraAccensione = 6;     //Accensione luci alle 6:00:00
  const int OraSpegnimento = 21;    // Spegnimento luci alle 20:59:59


void setup() 
{

  lcd.begin(20,4);
  rtc.begin();
  //rtc.setDOW(THURSDAY);     
  //rtc.setTime(19,15,00);     
  //rtc.setDate(24, 1, 2019);   
  lcd.setCursor(0, 1);
  lcd.print("T:");
  lcd.setCursor(8, 1);
  lcd.print("Hu:");
  lcd.setCursor(15, 1);
  lcd.print("%");
  
  pinMode(relay_luci, OUTPUT);
  digitalWrite(relay_luci,LOW);

  pinMode(relayVentolaEntrata, OUTPUT);
  digitalWrite(relayVentolaEntrata, LOW);

  pinMode(relayVentolaUscita, OUTPUT);
  digitalWrite(relayVentolaUscita, LOW);

  pinMode(relay_calore, OUTPUT);
  digitalWrite(relay_calore, LOW);

}


void loop() 
{
  
    //Bar 1
  if (ti.hour >= OraAccensione && ti.hour < OraSpegnimento)
  
{
if(millis()-t1>PAUSA && on==0)
  {on=1; digitalWrite(relayVentolaUscita, HIGH);digitalWrite(relayVentolaEntrata, HIGH);} // Se è trascorsa la pausa, accende
if(millis()-t1>PAUSA+DURATA)
  {on=0; t1 =millis(); digitalWrite(relayVentolaUscita, LOW);digitalWrite(relayVentolaEntrata, LOW);} // Se è trascorsa anche la durata, spegne e azzera.

  digitalWrite(relay_luci, HIGH);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 //lcd.print(rtc.getDateStr());  
  // posiziono il cursore alla colonna 5 e riga 0 
  lcd.backlight();
  lcd.setCursor(1, 0);
  lcd.print(rtc.getTimeStr()); 
  lcd.print("");
  lcd.setCursor(2, 1);    
  lcd.print(t);
  //lcd.setCursor(7, 1);
  //lcd.print("C");
  lcd.setCursor(10, 1);
  lcd.print(h);

 if (t > TempImpostata)
{
  if (t > TempImpostata + Isteresi)
{
  digitalWrite(relay_calore, LOW);
  //digitalWrite(relayVentolaEntrata, HIGH);
  //digitalWrite(relayVentolaUscita, HIGH);
}
  else
{
  digitalWrite(relay_calore, LOW);
  //digitalWrite(relayVentolaEntrata, LOW);
  //digitalWrite(relayVentolaUscita, LOW);
}  
}
  else 
{
  if (t < TempImpostata - Isteresi)
{
  digitalWrite(relay_calore, HIGH);
  //digitalWrite(relayVentolaEntrata, LOW);
  //digitalWrite(relayVentolaUscita, LOW);
}
}}
  else if (ti.hour >= OraSpegnimento || ti.hour < OraAccensione)
{
  digitalWrite(relay_luci, LOW);
  digitalWrite(relay_calore, LOW);
  digitalWrite(relayVentolaEntrata, LOW);
  digitalWrite(relayVentolaUscita, LOW);
 // lcd.clear();
  lcd.noBacklight();
  
}}

il display non mostra mai i dati correttamente, già dall'avvio inizia a dare simboli strani.
Domani ricomincio con un codice stabile, magari qualche esempio, per cercare di capire da dove nasce il problema.

grazie a tutti