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 <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();
}}
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.
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.
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.
Scusa la domanda stupida, ma quando parte il tutto, per un po', hai i dati sul display corretti?
Ho guardato un po' immagini e codice postato e non mi tornano alcune cose, ad es. sul primo post hai postato la situazione di 3 giorni, in alcuni i dati erano allineati a sinistra in altri a destra, se guardo il codice non ritrovo i caratteri costanti del codice, come se tu mostrassi un codice diverso da quello eseguito.
Sul codice metti "Temp" e sul display esce solo T.
Sul setup formatti in un modo nel loop in un altro.
Ho l'impressione che tu possa avere più problemi accavallati.
Io ripartirei dall'inizio facendo un'analisi ordinata del problema, se ti va.
Quindi partirei da un codice stabile e da immagini del risultato coerenti con il codice, indicando dopo quanto si sballa tutto.
Sospetto due problemi, il primo sono disturbi sui cavi, l'altro sono errori di visualizzazione dei dati sul display derivanti dal codice, vedo che aggiorni solo alcuni pezzi e in modo differente tra setup e loop, ma non avendo trovato coerenza tra codice e immagini non posso esserne sicuro.
il codice che gira attualmente è questo:
#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,20,4);
DS3231 rtc(SDA, SCL);
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(20,4);
rtc.begin();
//rtc.setDOW(THURSDAY);
//rtc.setTime(19,15,00);
//rtc.setDate(24, 1, 2019);
lcd.setCursor(0, 1);
lcd.print("T:");
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()
{
//Bar 1
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.print(rtc.getDateStr());
// posiziono il cursore alla colonna 5 e riga 0
lcd.backlight();
lcd.setCursor(1, 0);
lcd.print(rtc.getTimeStr());
lcd.print("");
lcd.setCursor(2, 1);
lcd.print(t);
//lcd.setCursor(7, 1);
//lcd.print("C");
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();
}}
il display non mostra mai i dati correttamente, già dall'avvio inizia a dare simboli strani.
Domani ricomincio con un codice stabile, magari qualche esempio, per cercare di capire da dove nasce il problema.
grazie a tutti
Posso suggerirti un piccolo test?
Nel setup, dopo
lcd.begin(20,4);
prova a metterci
delay(1000);
lcd.setCursor(0, 0);
lcd.print("01234567890123456789");
lcd.setCursor(0, 1);
lcd.print("ABCDEFGHIJKLMNOPQRST");
lcd.setCursor(0, 2);
lcd.print("abcdefghijklmnopqrst");
lcd.setCursor(0, 3);
lcd.print("01234567890123456789");
delay(2000);
prima di
rtc.begin();
Per vedere se almeno all'avvio stampa qualcosa di corretto.
maubarzi:
Posso suggerirti un piccolo test? ....
Grazie del consiglio, stasera proverò
--- Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce. Gli utenti da device "mobile" ringrazieranno per la cortesia -gpb01
La risposta l'avevamo già letta: non era necessario copiarla.
maubarzi:
Posso suggerirti un piccolo test?
ho provato il codice suggerito ma niente da fare, il display si è inchiodato.
ho tolto il codice suggerito e ripristinato il codice originale e ora il monitor da simboli strani e basta.vedi foto.
non vedo più nemmeno l'orario , la temperatura e l'umidità.
ho provato alcuni esempi tipo hello word ed altri e funzionano tranquillamente senza nessun simbolo strano.
ora quindi oltre ai simboli strani arduino non riconosce più rtc.