Se sei già registrato           oppure    

Orario: 29/03/2024 13:15:40  

 

Energia Alternativa ed Energia Fai Da Te > Arduino

VISUALIZZA L'ALBUM

Pagine: (10)   1   2   3   4   5   6   7   8   9   [10]    (Ultimo Msg)


Termostato differenziale
FinePagina

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 18/05/2016 07:33:29

Grazie, ma non esagerare. Al momento la scheda è ancora quella del progetto differenziale, usata in altro modo. Per lo sviluppo successivo devo fare alcune prove, perchè temo che l'arduino con il suo atmega 328 sia già al limite. Penso che passerò a qualcosa di più serio, ma sempre restando fermo sulla possibilità di programmare con l'IDE di Arduino. Devo vedere se riesco a fare tutto con un ESP8266 tipo 201 oppure passare ad altro. Devo provare, ancora non so.



---------------
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.

 

codvali
milliWatt


Gruppo:Utente
Messaggi:1

Stato:



Inviato il: 27/01/2021 10:56:44

Poi darmi anche a me il codice per favore ? Grazie !

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 29/01/2021 17:37:13

devo cercare, non so se c'è ancora



---------------
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:4435

Stato:



Inviato il: 30/01/2021 11:20:37

Mi spiace, per la scheda termostato differenziale con arduino non ho più nulla.



---------------
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:4435

Stato:



Inviato il: 30/01/2021 11:46:37

Ed invece no, ho trovato qualcosa nell'archivio dei vecchi codici. Non so più se funziona ed ogni uso è comunque A PROPRIO RISCHIO E PERICOLO, OCCHIO A QUELLO CHE SI FA. Detto ciò se può essere utile, il codice è questo:



////////////// Prodotto da CALCOLA@INWIND.IT ////////
/////// DA NON DISTRIBUIRE ////////////
////// SI USA COSI' COME E', A PROPRIO RISCHIO E PERICOLO ////
////// NON ADATTO A PRINCIPIANTI ///////

#include "OneWire.h"
#include "Wire.h"
#include "avr/eeprom.h"
#include <LiquidCrystal_I2C.h>
#include <avr/io.h>
#include <avr/wdt.h>
#define CONFIG_EEPROM_ADDR ((byte*) 0x10)
OneWire  ds(4);//Setto come pin per la onewire il pin4 (pwm!!!)
LiquidCrystal_I2C lcd(0x27,16,2);

struct Config {
 int set_interval;
 int set_minimal;
 int set_secur;
 int set_secur_minimal;
 int antigelo_min;
 int antigelo_max;
 byte antigelo;
 byte pannello;
 byte boiler;
 byte valid; //lasciare alla fine!
 } config;
 
#define RELAY 3 //pompa
#define SECUR 2 //uscita sicurezza
const int aumento = 9;
const int diminuzione = 8;
const int scelta = 7;
float temp_pannello = -200;
float temp_boiler = -200;
byte stato_pompa = 0;
byte stato_secur = 0;
byte stato_scelta = 0;
//byte stato_antigelo = 0;
byte blocco = 12;
byte pompa_attiva =0;
byte c=0;


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.set_interval = 5;
        config.set_minimal = 1;
        config.set_secur = 95;
        config.set_secur_minimal = 10;
        config.pannello = 191;
        config.boiler = 203;
       
 }
}
  static void saveConfig() {
    for (byte i = 0; i < sizeof config; ++i)
        eeprom_write_byte(CONFIG_EEPROM_ADDR + i, ((unsigned char*) &config)[i]);
}




void setup()
{
  //Apro la comunicazion seriale
  Serial.begin(9600);
  Wire.begin();
  lcd.init();                      // apro LCD
  lcd.backlight();
  lcd.clear();
  
  pinMode(RELAY, OUTPUT);
  pinMode(SECUR, OUTPUT);
  pinMode(aumento, INPUT); 
  pinMode(diminuzione, INPUT); 
  pinMode(scelta, INPUT);
  
  loadConfig();
  Serial.println("Scheda solare termico 3.0"); 
  stato_scelta =0;
  stato_pompa = 0;
  stato_secur = 0;
  blocco =12;
   
 wdt_enable(WDTO_8S);  //abilito il watchdog e imposto come tempo di reset 8 secondi
 
}

void loop(){
  temperatura();
      
 if ((digitalRead(scelta) == HIGH) &&  (stato_scelta == 0)){stato_scelta = 1;delay(350);}
 if ((digitalRead(scelta) == HIGH) &&  (stato_scelta == 1)){stato_scelta = 2;delay(350);}
 if((digitalRead(scelta) == HIGH)  && (stato_scelta == 2)){stato_scelta = 3; delay(350);}
 if((digitalRead(scelta) == HIGH)  && (stato_scelta == 3)){stato_scelta = 4; delay(350);}
 else if ((digitalRead(scelta) == HIGH) &&  (stato_scelta == 4)){stato_scelta = 0;delay(350);} 
 
 switch (stato_scelta) { 
 
   case 1:  {
    //Pompa temperatura massima
  if  ((digitalRead(aumento) == HIGH)  && (config.set_interval < 30)){config.set_interval = config.set_interval + 1; saveConfig(); delay (250);}
  if  ((digitalRead(diminuzione) == HIGH) && (config.set_interval > 4)){config.set_interval = config.set_interval - 1; saveConfig(); delay (250);}
  
  break;
  
   case 2:{
    // Pompa temp minima
   if  ((digitalRead(aumento) == HIGH)  && (config.set_minimal < 10)){config.set_minimal = config.set_minimal + 1; saveConfig(); delay (250);}
  if  ((digitalRead(diminuzione) == HIGH)  && (config.set_minimal > 1)){config.set_minimal = config.set_minimal - 1; saveConfig(); delay (250);}
   if (config.set_minimal > config.set_interval - 1){config.set_minimal = config.set_interval - 1;saveConfig();delay(250);}}
  break;
  
   case 3:{
    //Sicurezza temp massima 
   if  ((digitalRead(aumento) == HIGH)  && (config.set_secur < 110)){config.set_secur = config.set_secur + 1; saveConfig(); delay (250);}
  if  ((digitalRead(diminuzione) == HIGH) && (config.set_secur > 1)){config.set_secur = config.set_secur - 1; saveConfig(); delay (250);}}
  break; 
  
    case 4:{
   //Sicurezza temp minima      
   if  ((digitalRead(diminuzione) == HIGH)  && (config.set_secur_minimal < 110)){config.set_secur_minimal = config.set_secur_minimal + 1; saveConfig(); delay (250);}
  if  ((digitalRead(aumento) == HIGH)  && (config.set_secur_minimal > 1)){config.set_secur_minimal = config.set_secur_minimal - 1; saveConfig(); delay (250);}
   if (config.set_secur_minimal > config.set_secur - 1){config.set_secur_minimal = config.set_secur - 1;saveConfig();delay(250);}}
    break;}
 }

{if (config.set_interval == 4 ){(pompa_attiva = 1);}
 else pompa_attiva = 0;}
if (pompa_attiva == 1) {pompa_continua();}
if (pompa_attiva == 0){pompa();}


//Gestione 2Rele'

  {if ((temp_pannello) >= (config.set_secur)){ digitalWrite(SECUR, HIGH); stato_secur = 1;}
  else if ((temp_pannello) <= (config.set_secur - config.set_secur_minimal)){ digitalWrite(SECUR, LOW); stato_secur = 0;}}

//Serial.println(config.set_interval);
//Serial.println(pompa_attiva);
//Serial.println(config.set_secur - config.set_secur_minimal);

 
  //LCD
  
lcd.home();
lcd.noBlink();
lcd.setCursor(0,0);
if(temp_pannello == -200){temp_pannello = 0;}
if(temp_boiler == -200){temp_boiler = 0;}
lcd.print("A:"); lcd.print(temp_pannello,1);

lcd.setCursor(6,0);
{if (stato_pompa == 1) {lcd.print(" D:"); lcd.print("ON"); }
else {lcd.print(" D:"); lcd.print("OF"); }}
lcd.setCursor(11,0);
{if (stato_secur == 1){lcd.print(" T:");lcd.print("ON"); }
else {lcd.print(" T:"); lcd.print("OF"); }}
lcd.setCursor(0,1);
lcd.print("B:"); lcd.print(temp_boiler,1);

if (stato_scelta  == 0) {lcd.setCursor(6,1); lcd.print("");}
if (stato_scelta  == 1) {lcd.setCursor(6,1); lcd.print(" DH:"); 
     if( config.set_interval == 4){lcd.print("0");}
     else {lcd.print(config.set_interval);}
     lcd.print("      ");}
if (stato_scelta  == 2) {lcd.setCursor(6,1); lcd.print(" DL:");lcd.print(config.set_minimal);lcd.print("     ");}
if (stato_scelta  == 3) {lcd.setCursor(6,1); lcd.print( " TH:"); lcd.print(config.set_secur);}
if (stato_scelta  == 4) {lcd.setCursor(6,1); lcd.print(" TL:"); lcd.print(config.set_secur - config.set_secur_minimal); lcd.print("  ");}
else lcd.print("           ");
wdt_reset(); //resetto il watchdog
}


//VOID

void temperatura(){
  byte i;
  byte present = 0;
  byte numero = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;

  if ( !ds.search(addr)) {
    ds.reset_search();
   // delay(250);
    return;
  }
  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;
  }
  switch (addr[0]) {
  case 0x10:
    type_s = 1;
    break;
  case 0x28:
    type_s = 0;
    break;
  case 0x22:
    type_s = 0;
    break;
  default:
    return;
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  //delay(500);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } 
  else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  Serial.print("Codice sonda =");
  Serial.print(" ");
  Serial.print(addr [2], DEC);
  Serial.write(' ');
  Serial.print("Sonda ");
  Serial.write(' ');
  numero = addr [2], HEX;
  
  if (numero == config.pannello) {
    Serial.print("   'A'   ");
    Serial.write(' ');
    temp_pannello = celsius;
  }
  if (numero == config.boiler) {
    Serial.print("   'B'   ");
    Serial.write(' ');
    temp_boiler = celsius;
  }
    //Serial.print("Temperatura = ");
  Serial.print(celsius,1);
  Serial.print(" C");
  Serial.println();
  Serial.println();
  
} //chiusura void temperatura

void pompa(){
if ((temp_pannello - temp_boiler) >= (config.set_interval)) {digitalWrite(RELAY, HIGH); stato_pompa = 1;}
if (((temp_pannello - temp_boiler) <= config.set_minimal)) { digitalWrite(RELAY, LOW); stato_pompa = 0;}
}

void pompa_continua(){
  if (pompa_attiva == 1) {digitalWrite(RELAY, HIGH); stato_pompa = 1;}
}


Se modificate il codice postate la nuova versione in questa discussione prima di usarla.



---------------
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.

 
 InizioPagina
 

Pagine: (10)   1   2   3   4   5   6   7   8   9   [10]    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum