Go Down

Topic: Strani simboli su display lcd (Read 1 time) previous topic - next topic

aquilacieca

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.

Code: [Select]

#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);
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);
  }
  }


aquilacieca

mancava lunedi

ORSO2001

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:
Code: [Select]
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?

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.

gpb01

#4
Feb 22, 2019, 04:05 pm Last Edit: Feb 22, 2019, 04:05 pm by gpb01
>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
Search is Your friend ... or I am Your enemy !

steve-cr

#5
Feb 22, 2019, 04:46 pm Last Edit: Feb 22, 2019, 04:47 pm by steve-cr
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 !!!
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

aquilacieca

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

steve-cr

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...
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

fabpolli

#8
Feb 22, 2019, 05:01 pm Last Edit: Feb 22, 2019, 05:02 pm by fabpolli
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

uwefed

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

aquilacieca

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

uwefed

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

aquilacieca

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

Code: [Select]

#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();
 
}}

aquilacieca

#13
Feb 23, 2019, 08:00 pm Last Edit: Feb 23, 2019, 08:01 pm by aquilacieca
le foto  :)

steve-cr

#14
Feb 23, 2019, 11:32 pm Last Edit: Feb 23, 2019, 11:39 pm by steve-cr
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.
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Go Up