Strani simboli su display lcd

buongiorno a tutti, non apro un altro thread dato che ce ne sono diversi. in allegato trovate il mio display, nelle versioni di lunedi ieri e oggi(nel modulo non era collegato un cavo, non fateci caso, lo stavo sostituendo). Ha iniziato a dare valori strani da ieri. Ho provato con 2 moduli diversi i2c; ho sostituito tutti i fili con fili nuovi. vi riporto il codice, uso IDE 1.8.8 per mac.

#include 
#include 
#include 
#include 
#include 
#include 
#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);
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
DS3231  rtc(A4, A5);

// Init a Time-data structure
Time  ti;

int relay_luci = 3; // PIN DEL RELè LUCE
int relayVentolaEntrata = 9;
int relayVentolaUscita= 10;
int relay_calore = 8; //calore
//Setup light cycle for both bars
const int OraAccensione = 8;     //all lights on 
const int OraSpegnimento = 20 ;    //all ights off




void setup() {
 //assign 
   
  Serial.begin(9600);
  
  rtc.begin();
  //The following lines can be uncommented to set the date and time
  //rtc.setDOW(TUESDAY);     
  //rtc.getTime();     
  //rtc.setDate(1, 15, 2019); 
  ti = rtc.getTime();

Serial.print("Time ");
Serial.print(ti.hour);
Serial.print(":");
Serial.print(ti.min);
Serial.print(" and ");
Serial.println(ti.sec);


lcd.begin(16,2);
lcd.backlight();

 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() 
{{
float h = dht.readHumidity();
float t = dht.readTemperature();
// posiziono il cursore alla colonna 5 e riga 0
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.setCursor(5, 0);    
lcd.print(t);
lcd.setCursor(10, 0);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hu:");
lcd.setCursor(3, 1);
lcd.print(h);
lcd.setCursor(8, 1);
lcd.print("%");


if (t < 20,1)
{
  digitalWrite(relay_calore, HIGH);
  
  delay(10);
}
else if 
(t > 26){
digitalWrite(relayVentolaEntrata, HIGH);
digitalWrite(relayVentolaUscita, HIGH);
digitalWrite(relay_calore, LOW);
}
  else {
  digitalWrite(relayVentolaEntrata, LOW);
  digitalWrite(relayVentolaUscita, LOW);
  digitalWrite(relay_calore, LOW);}


}

//Get time data from RTC and store in ti
//Luce
 if (ti.hour >= OraAccensione && ti.hour < OraSpegnimento){
    digitalWrite(relay_luci, HIGH);
  }  
   else if (ti.hour >= OraSpegnimento || ti.hour < OraAccensione){
    digitalWrite(relay_luci, LOW);
  }
  }

oggi.jpg|1200x1600

ieri1.jpg|2976x3968

ieri.jpg|2976x3968

mancava lunedi

lunedi.jpg|1200x1600

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 :(

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

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 :(

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 
  #include 
  #include 
  #include 
  #include 
  #include 
  #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 :)

2.jpg|1080x1440

3.jpg|1080x810

1.jpg|1080x1440

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|282x179

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? :(

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. :)

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

IMG-20190304-WA0009.jpg

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.