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