Se sei già registrato           oppure    

Orario: 21/10/2019 15:07:51  

 

Energia Alternativa ed Energia Fai Da Te > Arduino

VISUALIZZA L'ALBUM

Pagine: (5)   1   2   3   4   [5]    (Ultimo Msg)


Termostato con isteresi regolabile
FinePagina

calcola
GigaWatt


Gruppo:Utente
Messaggi:4345

Stato:



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

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:7237

Stato:



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
 
ForumEA/T/Termostato.jpg



Modificato da Claudio - 11/11/2018, 01:08:53


---------------
Inverter PIP4048MS, 15 pannelli 250W, 500A FIAMM 12FIT100

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4345

Stato:



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
GigaWatt


Gruppo:Utente
Messaggi:4345

Stato:



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.

 

Claudio

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:7237

Stato:



Inviato il: 11/11/2018 10:00:17

Perfetto OK

Non ci sarei mai arrivato,



---------------
Inverter PIP4048MS, 15 pannelli 250W, 500A FIAMM 12FIT100

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4345

Stato:



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

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:7237

Stato:



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 PIP4048MS, 15 pannelli 250W, 500A FIAMM 12FIT100

 

Claudio

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:7237

Stato:



Inviato il: 28/02/2019 14:00:45

Schema elementare



Immagine Allegata: Termostato_.jpg
 
ForumEA/T/Termostato_.jpg



---------------
Inverter PIP4048MS, 15 pannelli 250W, 500A FIAMM 12FIT100

 

Claudio

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:7237

Stato:



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
 
ForumEA/T/Term_ist_bread_1.jpg


Scarica allegato

Salvataggio_ultimo_OK_DHT11.ino ( Numero download: 38 )



---------------
Inverter PIP4048MS, 15 pannelli 250W, 500A FIAMM 12FIT100

 

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
 
ForumEA/T/1551546871582-2069246780.jpg



---------------
👌😦😎😨😬😴📩📨🔧🔨🔩🚿🆘

 

Claudio

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:7237

Stato:



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
 
ForumEA/T/Convertitore I2C.jpg



Modificato da Claudio - 03/03/2019, 10:32:16


---------------
Inverter PIP4048MS, 15 pannelli 250W, 500A FIAMM 12FIT100

 
 InizioPagina
 

Pagine: (5)   1   2   3   4   [5]    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum