| calcola
| Inviato il: 10/11/2018 21:49:20
|
ora la temperatura dovrebbe visualizzarla arrotondata all'unità più vicina, mentre le soglie te le visualizza con un decimale.
Non ho a portata di mano un lcd su cui provare, ma dovrebbe funzionare.
--------------- Impara l'arte e mettila da parte 14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.
| | | | Claudio
| Inviato il: 11/11/2018 00:52:23
|
Calcola è già cosi perché il DHT11 non ha i decimali, comunica il dato temperature e umidità puro già pronto senza decimali, i decimali che vorrei eliminare sono quelli che vengono settai con i tastini che ora vanno a un decimale alla volta, o tieni premuto e vanno avanti da soli o premi dieci volte per variare di un grado, ma siccome il DHT11 non lavora con i decimali è una funzione inutile, non determinante i settaggi, se imposto T 28,5° e isteresi 1° lui scatterà sempre quando la temperatura letta supera i 29° e non i 29,5°.
Non che sia importante la cosa ma poter variare la T impostata o l'isteresi di un grado alla volta è più comodo che attendere lo scorrere dei decimali che non vengono ne forniti ne considerati dal DHT11.
Ho provato in mille modi ma non ci arrivo, riesco a nascondere i decimali ma per variare di un grado devo sempre premere 10 volte, poi scatta il grado, ma ho tolto solo la visualizzazione e non il comando.
Immagine Allegata: Termostato.jpg
Modificato da Claudio - 11/11/2018, 01:08:53
--------------- Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.
| | | | calcola
| Inviato il: 11/11/2018 06:50:15
|
Non ho seguito la discussione e non avevo capito quali decimali volevi eliminare, ora mi é chiaro, appena posso modificheró il listato, non é un problema di visualizzazione e devo collegare un lcd 4 righe per poterlo fare, senza non riesco
--------------- Impara l'arte e mettila da parte 14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.
| | | | calcola
| Inviato il: 11/11/2018 08:23:19
|
Prova questa modifica
/*****************************************************************
Termostato differenziale digitale
/*****************************************************************
by
www.energialternativa.info
*/
#include <LiquidCrystal_I2C.h> // Per display I2C
#include <EEPROM.h> // Per memorizzare le soglie nella EPROM di Arduino
#include <math.h>
#include <DHT.h> // Libreria per sensore DHT11
#define DHTPIN 2 // E' il pin di Arduino a cui collego il sensore di temperatura digitale
#define DHTTYPE DHT11 // dht11 è il tipo di sensore che uso
#define CONFIG_EEPROM_ADDR ((byte*) 0x10)
#define on 6 // Led Verde o Relay NA
#define off 7 // Led Rosso o Relay NC
#define tempP 9 // Pulsante Temperatura "+"
#define tempM 8 // Pulsante Temperatura "-"
#define isterP 10 // Pulsante Isterisi "+"
#define isterM 11 // Pulsante Isterisi "-"
struct Config {
int isteresi;
int tempSoglia;
byte valid; //lasciare alla fine!
} config;
DHT dht(DHTPIN, DHTTYPE);
static void loadConfig() {
for (byte i = 0; i < sizeof config; ++i)
((byte*) &config)[i] = eeprom_read_byte(CONFIG_EEPROM_ADDR + i);
if (config.valid != 253) {
config.valid = 253;
config.isteresi = 3;
config.tempSoglia = 25;
}
}
static void saveConfig() {
for (byte i = 0; i < sizeof config; ++i)
eeprom_write_byte(CONFIG_EEPROM_ADDR + i, ((unsigned char*) &config)[i]);
}
int i; // variabile per cicli for
int Posizione = 12, Direzione = 0; // Variabili per lampeggio trattino di running del termostato
int rele = 0; // Variabile di stato dei relè: 0 = OFF, 1 = ON
//int byte0, byte1; // Variabili usate per scrivere/leggere nella Eprom
//int isteresi; // Isteresi del termostato: lavoro con int (moltiplicati per 10) per evitare errori di arrotondamenti sui float
//int tempSoglia; // Temperatura di Soglia: lavoro con int (moltiplicati per 10) per evitare errori di arrotondamenti sui float
int t = dht.readTemperature(); // Lettura temperatura
int h = dht.readHumidity(); // Lettura umudità
unsigned long T_Ultima_Lettura, T_Attuale; // Variabili per le pause senza blocco dei processi
byte PiuMeno[8] = { B00100, B00100, B11111, B00100, // Carattere personalizzato ±
B00100, B00000, B11111, B00000 };
LiquidCrystal_I2C lcd(0x27, 20, 4); // Per display I2C
void setup()
{
pinMode(on, OUTPUT); // Inizializzo i Pin
pinMode(off, OUTPUT);
pinMode(tempP, INPUT_PULLUP);
pinMode(tempM, INPUT_PULLUP);
pinMode(isterP, INPUT_PULLUP);
pinMode(isterM, INPUT_PULLUP);
loadConfig(); // Leggo i valori impostati nella Eprom
if (config.tempSoglia < 10 || config.tempSoglia > 900) {config.tempSoglia = 25; saveConfig();}
if (config.isteresi < 1 || config.isteresi > 250) {config.isteresi = 3; saveConfig();}
// Per display LCD 20 Colonne, 4 Righe, I2C
lcd.init();
lcd.begin(20, 4);
lcd.backlight();
lcd.clear();
lcd.createChar(0, PiuMeno);
// Schermata di avvio del termostato
lcd.setCursor(5, 1);
lcd.print("Termostato");
//lcd.setCursor(2, 1);
//lcd.print("Digitale");
lcd.setCursor(4, 2);
lcd.print("Differenziale");
lcd.setCursor(1, 0);
lcd.print("Energialternativa");
lcd.setCursor(0, 3);
lcd.print("Start");
delay(1000);
for (i = 0; i < 8; i++)
{
lcd.print(".");
delay(200);
}
// Setto le scritte statiche
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T.Letta");
readTemp();
LCD(0);
lcd.setCursor(10,0);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(14,0);
lcd.print("RH");
lcd.setCursor(0,1);
lcd.print("Relay -------");
lcd.setCursor(0,2);
lcd.print("T. Impost.:");
LCD(1);
lcd.setCursor(18,2);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,3);
lcd.print("Isteresi ");
lcd.write(byte(0));
lcd.print(":");
LCD(2);
lcd.setCursor(18,3);
lcd.print((char)223);
lcd.print("C");
}
void loop()
{
loadConfig();
int h = dht.readHumidity(); // Dato umudità
lcd.setCursor(17, 0);
lcd.print(h);
T_Attuale = millis();
if (T_Attuale - T_Ultima_Lettura > 500) // Attendo 0,5 secondi
{
readTemp(); // Leggo la temperatura
attivaRele(); // Setto i relè
LCD(0); // Aggiorno i valori sull'LCD
T_Ultima_Lettura = T_Attuale;
}
if(digitalRead(tempM) == LOW && config.tempSoglia > 100) // Modifica Temperatura Centro Soglia da 10 a 90 °C
{
config.tempSoglia--;
saveConfig();
LCD(1); // Scrivo sull'LCD
delay(150);
}
if(digitalRead(tempP) == LOW && config.tempSoglia < 900)
{
config.tempSoglia++;
saveConfig();
LCD(1); // Scrivo sull'LCD
delay(150);
}
// Modifica Isteresi
if(digitalRead(isterM) == LOW && config.isteresi > 1)
{
config.isteresi--;
saveConfig();
LCD(2); // Scrivo sull'LCD
delay(150);
}
if(digitalRead(isterP) == LOW && config.isteresi < 250)
{
config.isteresi++;
saveConfig();
LCD(2); // Scrivo sull'LCD
delay(150);
}
}
void readTemp() // Leggo la temperatura
{
float (dht.readTemperature());
t = dht.readTemperature();
}
void LCD(int valore) // Scrivo i valori sull'LCD: 0 = Temperatura Letta + Animazione, 1 = Temperatura Impostata, 2 = Isteresi Impostata, 3 = Stato Relè
{
switch (valore) {
case 1: // Temperatura Impostata
lcd.setCursor(13,2);
lcd.print(config.tempSoglia, 1);
break;
case 2: // Isteresi Impostata
lcd.setCursor(13,3);
if (config.isteresi < 100) lcd.print(" ");
lcd.print(config.isteresi, 1);
break;
case 3: // Stato Relè
lcd.setCursor(7,1);
if (rele == 0) lcd.print("OFF");
else lcd.print("ON ");
break;
default: // Temperatura Letta
lcd.setCursor(7,0);
if (t < 10.0) lcd.print(" ");
else if (t < 100.0) lcd.print(" ");
lcd.print(round(t));
if (Direzione == 0) // Animazione "Supercar"
{
lcd.setCursor(Posizione, 1);
lcd.print("- ");
Posizione++;
if (Posizione == 18) Direzione = 1;
}
if (Direzione == 1)
{
lcd.setCursor(Posizione, 1);
lcd.print(" -");
if (Posizione == 14) Direzione = 0;
else Posizione--;
}
break;
}
}
void attivaRele() // Imposto i relè
{
if(t < config.tempSoglia - config.isteresi) // Soglia Inferiore -
{
digitalWrite(on, HIGH);
digitalWrite(off, LOW);
rele = 0;
LCD(3);
}
if(t > config.tempSoglia + config.isteresi) // Soglia Superiore +
{
digitalWrite(on, LOW);
digitalWrite(off, HIGH);
rele = 1;
LCD(3);
}
}
Modificato da calcola - 11/11/2018, 08:33:12
--------------- Impara l'arte e mettila da parte 14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.
| | | | | | | calcola
| Inviato il: 11/11/2018 20:38:45
|
bene, ho solo cambiato la gestione dell'eeprom, io la uso così, mediante una struttura e due void, uno salva e l'altro legge i valori. Se quando legge trova il valore 256 vuol dire che l'eeprom è vuota e come valori di base usa quelli del void load.
Se vuoi cancellare tutti i valori memorizzati nell'eeprom devi caricare il codice clear eeprom presente tra gli esempi della libreria eeprom
--------------- Impara l'arte e mettila da parte 14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.
| | | | Sparkit
milliWatt  Gruppo:Utente Messaggi:4
Stato:
| Inviato il: 28/02/2019 00:06:34
|
Ciao sono nuovo e appena iscritto e da un paio di mesi che seguo la vostra discussione tentando di carpire😁 meglio sto provando anch'io a fare un termostato con isteresi ma mi sono perso nella fase iniziale dei componenti e non ci capisco più nulla esiste un progetto ove posso iniziare e copiare😀😀😎😎😎 grazie e sicuramente faro in modo di stressarvi con i miei quesiti visto che ormai di neuroni non ne ho più.
--------------- 👌😦😎😨😬😴📩📨🔧🔨🔩🚿🆘
| | | | Claudio
| Inviato il: 28/02/2019 13:30:22
|
Serve
Un Arduino, quello che preferisci.
Un display 20x4
Adattatore IC2 per il display
Un sensore DHT11
quattro pulsanti
pin D2 al sensore
pin A4 su SDA adattatore IC2 display
pin A5 su SCL adattatore IC2 display
Pin D8 T-
Pin D9 T+
Pin 10 Is+
Pin 11 Is-
Relay D6 e D7
4 resistori da 4700 Ohm
Modificato da Claudio - 28/02/2019, 14:57:18
--------------- Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.
| | | | Claudio
| Inviato il: 28/02/2019 14:00:45
|
Schema elementare
Immagine Allegata: Termostato_.jpg
--------------- Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.
| | | | Claudio
| Inviato il: 28/02/2019 14:56:25
|
Prototipo su breadboard.
Non dimenticare i resistori da 4700 Ohm fra +5V e i pin 8-9-10-11
Immagine Allegata: Term_ist_bread.jpg
--------------- Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.
| | | | Sparkit
milliWatt  Gruppo:Utente Messaggi:4
Stato:
| Inviato il: 02/03/2019 16:45:00
|
Grazie claudio oggi tempo permettendo inizio con il copiare il tuo, se aggiungo qualcosa non ti arrabbi vero se riesco eventualmente chiedo lumi
--------------- 👌😦😎😨😬😴📩📨🔧🔨🔩🚿🆘
| | | | Sparkit
milliWatt  Gruppo:Utente Messaggi:4
Stato:
| Inviato il: 02/03/2019 18:16:41
|
Io ho questo display e non ho mai visto nulla come adattatore,provo a cercare.
Immagine Allegata: 1551546871582-2069246780.jpg
--------------- 👌😦😎😨😬😴📩📨🔧🔨🔩🚿🆘
| | | | Claudio
| Inviato il: 03/03/2019 10:28:17
|
Con il convertitore usi solo + - A4 A5, 4 fili invece di 15
LINK
Quel display è 16x2, ti serve un display 20x4 questo ha già l'adattatore I2C
LINK
Immagine Allegata: Convertitore I2C.jpg
Modificato da Claudio - 03/03/2019, 10:32:16
--------------- Inverter Sofar Solar HYD6000-EP, 5250W pannelli, 14kWh lifepo4.
| | | | veloxy
milliWatt  Gruppo:Utente Messaggi:1
Stato:
| Inviato il: 14/04/2020 00:14:29
|
Buonasera a tutti e complimenti per il progetto!
L'ho provato e funziona benissimo!
Vorrei modificarlo inserendo il DS18B20 al posto del DHT11 ma sono alle prime armi e provando a modificarlo non riesco a farlo funzionare. Protreste aiutarmi?
Grazie mille | |
| | |
|
Versione Mobile!
|
|
|
|
|
|
|
|
|
|
|
|
|
|