display impazzito!

Salve a tutti
in un mio progetto, in cui visualizzo temperatura e umidità tramite il display dello starter kit,
ad un certo punto l' LCD restituisce dei valori illeggibili (vedi foto allegate).
Sembra che questo accada all' attivazione del servo. A qualcuno è mai capitato?
Trattasi di un prototipo di un essiccatore.

#include <Adafruit_Sensor.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(13,12,11,10,9,8);
#include <DHT.h>
#include <DHT_U.h>
unsigned long previousTime = 0;
long interval = 600000;
#define DHTPIN 4     // Pin di Arduino dove è collegato il sensore
#define rele1 6       //  Pin di Arduino dove è collegato il relè 1-riscaldatore
#define rele2 7       //  Pin di Arduino dove è collegato il relè 2-ventola
float temp_max = 70.0 ;  // valore temperatura a cui si spegne il riscaldatore
float temp_min = 35.0 ;  // valore temperatura a cui si attiva il riscaldatore
#define DHTTYPE DHT22   // DHT 22 
DHT dht(DHTPIN, DHTTYPE);
#include <Servo.h>
Servo myServo;
int velocita = 50; // Un valore da 0 a 100 (da lento a veloce)

void setup() {
  lcd.begin(16, 2);
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);
  dht.begin(); 
  digitalWrite(rele1, HIGH);
  digitalWrite(rele2, HIGH);
  myServo.attach(2);
  myServo.writeMicroseconds(1500); // Imposto il servo al centro
 }
void loop(){
delay(2000);
  float h = dht.readHumidity(); // Read Humidity 
  float t = dht.readTemperature(); // Read temperature as Celsius (the default)
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Umidita':");
  lcd.print(h);
  lcd.print("%\t");
  lcd.setCursor(0, 1);
  lcd.print("Temperat:");
  lcd.print(t);
  lcd.print(" *C ");

  if (t <= temp_min ) {
    digitalWrite(rele1, LOW);
  }
  else if (t >= temp_max ) {
    digitalWrite(rele1, HIGH);
    }
  unsigned long currentTime = millis();
  if (currentTime - previousTime > interval)  {
    previousTime = currentTime;
    digitalWrite(rele2, LOW) ;  // Accende la ventola
    
     for (int n=0; n<175; n++) // Rotazione 45 gradi, un grado per volta
 
  myServo.write(n); // Faccio muovere il servo di un grado 
    delay(calcolaVelocita()); // Imposto il ritardo prima del movimento
  
    delay(20000); // aspetto 20 secondi
  
    digitalWrite(rele2, HIGH) ;  // Spegne la ventola
  }
    for (int n=175; n>0; n--) // Rotazione 45 gradi, un grado per volta
  {
    myServo.write(n); // Faccio muovere il servo di un grado 
  }
    delay(calcolaVelocita()); // Imposto il ritardo prima del movimento
}      
  int calcolaVelocita()
{
  return (map(velocita,0,100,120,20));
  }

Hai un falso contatto sul collegamento Arduino - Display.
Ciao Uwe

Cioè? vuoi dire che devo controllare i collegamenti Uwe?
Perché all' inizio va bene e poi...no?

Il problem é ripetibile? Nel senso viene fuori dopo x tempo e sempre gli stessi caratteri sbagliati oppure i caratteri cambiano da volta in volta?

Dacci uno schema del circuito. Come alimenti il servo e i relé?

Ciao Uwe

Togli tutti i delay

if (currentTime - previousTime > interval)  {
    previousTime = currentTime;
    digitalWrite(rele2, LOW) ;  // Accende la ventola
   
     for (int n=0; n<175; n++) // Rotazione 45 gradi, un grado per volta
 
  myServo.write(n); // Faccio muovere il servo di un grado
    delay(calcolaVelocita()); // Imposto il ritardo prima del movimento
 
    delay(20000); // aspetto 20 secondi
 
    digitalWrite(rele2, HIGH) ;  // Spegne la ventola
  }

Qua ci sono 2 errori:
Il for non comprende delay(calcolaVelocita()); percui prima si muove e poi viene il ritardo. Il for é cosí veloce che é uguale come se mettesti il servo direttamente a 175 senza passi intermedi.
E il delay(20000) blocca tutto per 20 secondi.

Ciao Uwe

Uno schema del circuito non ce l' ho pronto, comunque lo preparo e appena pronto lo posto.
Per il movimento del servo avevo notato che non si muove lentamente, quindi il motivo sarebbe che il delay
calcolavelocità è fuori del ciclo for? comunque quello non è il problema principale perché è uno sportellino che si apre, e poco importa che si apra piano o forte.

Per l' altro delay (il delay 20000) avevo il sospetto che non fosse il metodo giusto, perché mette in pausa tutto il programma...ma come faccio a fare funzionare la ventola per 20 secondi e poi farla stare ferma finchè non sono passati altri 10 min.?

Flavi71:
Per l' altro delay (il delay 20000) avevo il sospetto che non fosse il metodo giusto, perché mette in pausa tutto il programma...ma come faccio a fare funzionare la ventola per 20 secondi e poi farla stare ferma finchè non sono passati altri 10 min.?

Con la funzione millis(). Vedi l' esempio blink without delay del IDE

Ciao Uwe

In questi casi, spesso, la colpa è dei relè.
Prova a toglierli e vedi cosa succede.

Problemi stra-noti con il display 20x2 oppure 20x4.
Se usi un display I2C diminuiscono drasticamente (però non spariscono) ma se usi un display con tutti i fili che vanno ad altrettante uscite allora la cosa è "normalissima"...

Succede che i disturbi del relè oppure i disturbi del carico collegato al relé vanno a disturbare la parte display.

Vai a vedere questa discussione dove con una resistenza ed un condensatore abbiamo risolto...

http://forum.arduino.cc/index.php?topic=294426.45

Volevo provare a sostituire il modulo 2 relè (che adesso è a 5V e alimento con arduino) con uno a 12V (che ho già in casa) e alimentarlo esternamente, per vedere se cambia qualcosa. Quello a 5V non ho possibilità di alimentarlo esternamente.

Per i collegamenti posso seguire lo schema allegato?

Hai messo il condensatore e la resistenza sul display? Non dovresti più avere problemi.
Comunque la prossima volta prendi lo stesso display però in costruzione I2C : risparmi un sacco di pin (ne usi solo 2), ha sicuramente meno problemi ai disturbi e ti costa solo un paio di euro in più.

steve-cr:
Hai messo il condensatore e la resistenza sul display? Non dovresti più avere problemi.
Comunque la prossima volta prendi lo stesso display però in costruzione I2C : risparmi un sacco di pin (ne usi solo 2), ha sicuramente meno problemi ai disturbi e ti costa solo un paio di euro in più.

La resistenza si ma il condensatore no, dove va il condensatore?
Ho usato quel tipo di LCD semplicemente perché avevo solo quello a disposizione (è quello dello starter kit)
lo so che l' I2C è più affidabile.

Sul post del link che ti ho aggiunto , Etemenanki aveva scritto così:

"Giusto per curiosita', collegando la R da 4K7 fra il pin E ed il +V dell'LCD (anziche' massa, perche' il PCF non e' simmetrico come uscita fra +V e massa) ed un condensatorino da 10nF fra E e massa, avevi lo stesso disturbo ?"

Per cui la 4k7 va tra E e V+
Il condensatore tra E e GND