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