Strani simboli su display lcd

maubarzi:
Quando fai queste prove le fai tenendo tutto inscatolato oppure porti fuori tutto e colleghi passando ad es. per

le prove le ho fatte lasciando arduino nella scatola del progetto in cui si trova. stasera lo tiro fuori e tramite breadboard faccio i test uno ad uno. grazie ancora.

quello che non capisco è perché dai primi di gennaio (inizio del progetto) fino a 10 gg fa è filato tutto liscio e poi da un giorno all'altro sono iniziati i disturbi, non ho aggiunto nulla, solo implementato il codice.

Secondo me hai due problemi accavallati, lo dico a intuito, uno software e uno hardware.

maubarzi:
software e uno hardware.

Per il software cerco di risolvere come mi avete suggerito.
Per l'hardware i problemi credi siano le interferenze? Cavi inadatti? O cosa?

si, qualcosa del genere, però se affronti un problema alla volta poi si semplifica tutto.
Io inizierei con il sistemare il software in modo che funzioni correttamente sul banco e poi se non mantiene il comportamento atteso dopo averlo inscatolato si valuta anche la parte hardware ma con un po' più di certezze sulle spalle.

maubarzi:
si, qualcosa del genere

Grazie mille ancora.... Stasera smonto e inizio a pulire e testare il software....

Non puoi cominciare riportando il software a come era 10 giorni fa?

Datman:
Non puoi cominciare riportando il software a come era 10 giorni fa?

L'ho fatto ieri, le sere precedenti e anche 10 giorni fa quando ha iniziato a dare i valori strani. L'unico codice che ho visualizzato correttamente è stato HelloWord_i2c... Tutti gli altri codici mi davano valori strani

eccomi,
ho testato il codice di maubarzi e funziona, vedi foto. funziona anche l'esempio helloword, vedi foto.
ho poi testato l'rtc da solo e nel seriale ho dei simboli strani.
che sia tutta colpa sua? :slight_smile:
sotto il codice usato:

// DS3231_Temperature
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// A quick demo of how to use my DS3231-library to 
// quickly send the current temperature over a serial link
//
// To use the hardware I2C (TWI) interface of the Arduino you must connect
// the pins as follows:
//
// Arduino Uno/2009:
// ----------------------
// DS3231:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//          SCL pin   -> Arduino Analog 5 or the dedicated SCL pin
//
// Arduino Leonardo:
// ----------------------
// DS3231:  SDA pin   -> Arduino Digital 2 or the dedicated SDA pin
//          SCL pin   -> Arduino Digital 3 or the dedicated SCL pin
//
// Arduino Mega:
// ----------------------
// DS3231:  SDA pin   -> Arduino Digital 20 (SDA) or the dedicated SDA pin
//          SCL pin   -> Arduino Digital 21 (SCL) or the dedicated SCL pin
//
// Arduino Due:
// ----------------------
// DS3231:  SDA pin   -> Arduino Digital 20 (SDA) or the dedicated SDA1 (Digital 70) pin
//          SCL pin   -> Arduino Digital 21 (SCL) or the dedicated SCL1 (Digital 71) pin
//
// The internal pull-up resistors will be activated when using the 
// hardware I2C interfaces.
//
// You can connect the DS3231 to any available pin but if you use any
// other than what is described above the library will fall back to
// a software-based, TWI-like protocol which will require exclusive access 
// to the pins used, and you will also have to use appropriate, external
// pull-up resistors on the data and clock signals.
//

#include <DS3231.h>

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);

void setup()
{
  // Setup Serial connection
  Serial.begin(115200);
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}

  // Initialize the rtc object
  rtc.begin();
}

void loop()
{
  // Send current temperature
  Serial.print("Temperature: ");
  Serial.print(rtc.getTemp());
  Serial.println(" C");
  delay (1000);
}

aquilacieca:
eccomi,

come non detto, provando l'esempio di seguito l'rtc nel seriale riporta correttamente.

// Arduino DS3232RTC Library
// https://github.com/JChristensen/DS3232RTC
//
// Example sketch illustrating Time library with Real Time Clock.
// This example is identical to the example provided with the Time Library,
// only the #include statement has been changed to include the DS3232RTC library.

#include <DS3232RTC.h>      // https://github.com/JChristensen/DS3232RTC

void setup()
{
    Serial.begin(9600);
    setSyncProvider(RTC.get);   // the function to get the time from the RTC
    if(timeStatus() != timeSet)
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time");
}

void loop()
{
    digitalClockDisplay();
    delay(1000);
}

void digitalClockDisplay()
{
    // digital clock display of the time
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
    Serial.print(' ');
    Serial.print(day());
    Serial.print(' ');
    Serial.print(month());
    Serial.print(' ');
    Serial.print(year());
    Serial.println();
}

void printDigits(int digits)
{
    // utility function for digital clock display: prints preceding colon and leading 0
    Serial.print(':');
    if(digits < 10)
        Serial.print('0');
    Serial.print(digits);
}

forse il problema sul seriale deriva da una diversa velocità impostata.
Ho trovato questo
Serial.begin(115200);
Se le velocità impostate non sono corrette ottieni i caratteri strani che hai riportato.

Ora, il display funziona, l'rtc funziona
puoi provare ad inserire un pezzo alla volta tutto quello che ti serve in un singolo sketch testando il risultato prima di passare al pezzo successivo.

maubarzi:
Ora, il display funziona, l'rtc funziona

sto inserendo un pezzo alla volta, seguono aggiornamenti.
grazie ancora

sto modificando il codice originale sempre sul banco. eccolo:

  #include <DS3232RTC.h> 
  #include <LiquidCrystal_I2C.h>
  #include <Wire.h>
  #include <Time.h>
  #include <TimeLib.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); 
  DS3232RTC rtc;
   
  time_t myTime;
  
  
  #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 = 23;    // Spegnimento luci alle 20:59:59


void setup() 
{
  lcd.init();
  rtc.begin();
  lcd.clear();
  lcd.backlight();
  setTime(19, 54, 00, 06, 3, 2019);   //set the system time to 23h31m30s on 13Feb2009 
  lcd.setCursor(0, 1);
  lcd.print("Temp:");
  lcd.setCursor(11, 1);
  lcd.print("Hu:");
  lcd.setCursor(19, 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() 
{
 if (myTime >= OraAccensione && myTime < 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(0, 0);
  lcd.print (hour());
  lcd.print(":");
  lcd.print(minute());
  lcd.print(":");
  lcd.print(second());
  lcd.setCursor(10, 0);
  lcd.print(day());
  lcd.setCursor(11, 0);
  lcd.print("/");
  lcd.print(month());
  lcd.setCursor(13, 0);
  lcd.print("/");
  lcd.print(year());
  lcd.setCursor(5, 1);    
  lcd.print(t);
  //lcd.setCursor(7, 1);
  //lcd.print("C");
  lcd.setCursor(14, 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 (myTime >= OraSpegnimento || myTime < OraAccensione)
{
  digitalWrite(relay_luci, LOW);
  digitalWrite(relay_calore, LOW);
  digitalWrite(relayVentolaEntrata, LOW);
  digitalWrite(relayVentolaUscita, LOW);
 // lcd.clear();
  //lcd.noBacklight();
}}}

purtroppo se tolgo le // all'ultima riga del codice

//lcd.noBacklight();

il display si spegne dopo una frazione di secondo. come se non riconoscesse l'orario di accensione e spegnimento.
al momento comunque sembrerebbero risolti i problemi dei simboli strani.
domani provo a riportare tutto nello scatolato.

buonanotte :sleeping:

Noto ancora un paio di cose strane, ma siamo sulla strada giusta

  1. Continui ad avere commenti che dicono una cosa e azioni che ne fanno un'altra
 setTime(19, 54, 00, 06, 3, 2019);   //set the system time to 23h31m30s on 13Feb2009

che poi anche impostare il tempo tutte le volte non è che sia grande idea, lo RTC servirebbe per NON farlo...
interessante qui:

 if (myTime >= OraAccensione && myTime < 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.

a parte che se avessi un RTC non demanderei a millis() la gestione delle pause, ma ammetto che per semplicità ci starebbe, non è grande male
ma la prima if?
ti rendi conto che fai un test su un oggetto che NON aggiorni mai?
myTime è dichiarato, ma non è mai aggiornato, come pretenderesti che vada?
non parliamo poi della variabile byte 'on', che sarebbe parola riservata, infatti te la indica in arancione, chissa' cosa significa....
e poi di nuovo fai un test su mytime, che continua a non essere un orario valido
il fatto "strano" è che in sede di stampa ore minuti secondi, mese ed anno li usi correttamente, capirai che questo mi alimenta il dubbio su come stai scrivendo il tuo programma?
quindi, prova a pensare un attimo alla "logica" del programma, che a ma sembra molto zoppicante
qualche perplessità mi viene anche dal fatto che hai mezzo stravolto il programma per ripetere gli stessi errori della volta precedente...
io se devo riscrivere e so di aver sbagliato, per prima cosa elimino l'errore; capisci che mi viene il dubbio che tu non abbia ben capito cosa devi fare e stai "buttando dentro" righe di codice un po' alla carlona?
in sostanza:
piu' analisi, piu' pensiero e meno tastiera

Inoltre, se l'ora di spegnimento è dopo la mezzanotte, l'if non funziona più, perché è minore dell'ora di accensione. Per risolvere il problema, devi fare:

int OS;
if (OraAccensione<OraSpegnimento) {OS=OraSpegnimento;}
else {OS=OraSpegnimento+24;}

e poi usi OS per l'if.

Grazie a tutti per l'assistenza e il supporto.
Ho corretto il codice, provato su banco ed era ok. Rimontato tutto nello scatolato e tutto ok, nessun simbolo strano.
Risolto.

Ps: il dht22 ora scrive "nan" invece della temperatura e dell'umidità. Cercherò di risolvere :confused:

aquilacieca:
...
Ps: il dht22 ora scrive "nan" invece della temperatura e dell'umidità. Cercherò di risolvere :confused:

Succede che il DHT scrive "nan" quando la lettura non è corretta, magari dusturbi elettrici transitori (hai acceso un neon o hai attaccato/staccato il cavo USB o stai usando il Black & Decker...) e diciamo che ogni tanto è anche "normale", ma deve essere "ogni tanto tanto...".
Se dovesse farlo troppe volte devi pensare a modificare la connessione o la resistenza di pull-up o vedere da dove entrano questi problemi.

steve-cr:
Succede che il DHT scrive "nan"

i disturbi danno fastidio al cavo DATA oppure anche al VCC e GND?
al momento uso una resistenza Pullup da 10K. nel caso con cosa dovrei sostituirla?

Puoi arrivare fino a 4k7 nel caso succeda spesso.

steve-cr:
Puoi arrivare fino a 4k7

grazie mille, risolto.