Che fosse scontato! Se è per questo non ho elencato nemmeno le resistenze in base ai transistor, i transistor stessi, le resistenze dei partitori, i numerosi condensatori di disaccopiamento , i diodi sulle bobine dei reed relè e di protezione, il fusibile, i connettori, ecc. Ti metto il listato, è molto commentato perché ho la memoria corta quindi così vedi cosa ho fatto. Dato che è la seconda volta che faccio un programma o meglio la seconda versione perché la prima con hardware più ristretto e relè bistabili è più di un anno che funziona suggerimenti su come migliorare il programma sono molto graditi. Non considerare le temporizzazioni,
i valori delle resistenze dei partitori invece ti diranno qualcosa...
Grazie, buona giornata.
/*
Se la tensione di batteria è bassa accende caricabatteria e manda notifica.
Se tensione batteria è troppo bassa stacca il carico.
Se tensione batteria è alta e il caricabatterie è acceso spegne caricabatteria e manda notifica.
Se la tensione di batteria va troppo alta stacca anche i pannelli.
Se temperatura step down è alta accende ventola e la spegne quando scende.
Se temperatura step down è troppo alta spegne il caricabatteria e lo riaccende quando scende.
Alimentazione telecomando e Wemos On e Off con abilitazioni step down separate.
xxxxxxxxxxxxxxxxxxx solo test poi mettere valori giusti xxxxxxxxxxxxxxxxxxx
*/
#include <Wire.h> // carica libreria
#include <OneWire.h> // carica libreria
#include <DallasTemperature.h> // carica libreria
#include <LiquidCrystal_I2C.h> // carica libreria
#define ONE_WIRE_BUS 2 // Pin Arduino D2 collegato al pin DQ dei sensori che va con resistenza 4K7 al +5 V
#define On 3 // accende caricabatteria
#define Off 4 // spegne caricabatteria
#define sw 5 // alimentazione telecomando
#define txON 7 // wemos invia acceso
#define txOFF 8 // wemos invia spento
#define ventola 9 // comando relè ventola
#define overTemp 13 // comando relè caricabatteria
#define load 11 // comando relè utenze
#define pannOff 10 // comando relè pannelli
#define alWemOn 12 // alimentazione wemos on
#define alWOff 6 // alimentazione wemos off
// // (A4) collegato a SDA e (A5) collegato a SCL display I2C
OneWire oneWire(ONE_WIRE_BUS); // Imposta la connessione OneWire
DallasTemperature sensors(&oneWire); // Passa il riferimento oneWire al Dallas Temperature.
LiquidCrystal_I2C lcd(0x27, 16, 2); // Setta LCD a 0x27 2 linee 16 caratteri I2C
float vA0; // tensione batteria letta da A0
float vBatt; // tensione batteria
float R1 = 5920; // valore in Ohm del partitore A0 2k7 + 3k3
float R2 = 972; // 17.5 V max
float vA1; // tensione caricabatteria letta da A1
float vCar; // tensione caricabatterie on prima step down
float R3 = 11860; // valore in Ohm del partitore A1
float R4 = 970; // 33 V max
float tensMin = 12.00; // valore di tensione batteria inizio ricarica
float tensMax = 14.40; // valore di tensione batteria fine carica estiva
float reteOn = 18.0; // capisce se caricabatteria è acceso
float vOver = 15.2; // scollega i pannelli per sovratensione
float panOn = 14.3; // ricollega i pannelli
float minLoad = 11.8; // tensione di stacco utenze
float recLoad = 12.2; // tensione ripristino utenze
float t1; // temperatura sensore 1
float t2; // temperatura sensore 2
float onFan = 40; // attiva relè accensione ventola D9 quando si superano i xx gradi xxxxxxxxxxxxxxxxxxx
float offFan = 34; // disattiva relè accensione ventola D9 quando temperatura scende a xx gradi xxxxxxxxxxxxxxxxxxx
float soglia = 56; // attiva relè stacco caricabatteria overTemp D10 se si superano i xx °C xxxxxxxxxxxxxxxxxxx
float ripristino = 44; // disattiva relè stacco caricabatteria overTemp D10 quando temperatura scende a xx °C xxxxxxxxxxxxxxxxxxx
// int pausa = 1; // Pausa tra le letture in minuti
//----------------------------------------------------------------------------------------------
void setup() {
pinMode(On, OUTPUT); // D3 accende
pinMode(Off, OUTPUT); // D4 spegne
digitalWrite(sw, LOW); // D5 step up 9V telecomando (disabilitato)
pinMode(sw, OUTPUT); // D5 alimenta telecomando
pinMode(pannOff, OUTPUT); // D13 relè stacca pannelli
pinMode(txON, OUTPUT); // D7 wemos notifica on
pinMode(txOFF, OUTPUT); // D8 wemos notifica off
pinMode(ventola, OUTPUT); // D9 relè ventola
digitalWrite(overTemp, LOW); // D13 assicura siano spenti
pinMode(overTemp, OUTPUT); // D13 relè caricabatteria e led Arduino
pinMode(load, OUTPUT); // D11 relè utenze
digitalWrite(alWemOn, LOW); // D12 step down 5V wemos on (disabilitato)
pinMode(alWemOn, OUTPUT); // D12 alimenta wemos on
digitalWrite(alWOff, LOW); // D6 step down 5V wemos off (disabilitato)
pinMode(alWOff, OUTPUT); // D6 alimenta wemos off
analogReference(EXTERNAL); // IMPORTANTE altrimenti può danneggiarsi
lcd.begin(); // inizializza lcd
sensors.begin(); // inizializza sensori temperatura
Serial.begin(9600); // inizializza seriale per stampa a video
}
//----------------------------------------------------------------------------------------------
void loop() {
for (int k = 1; k <= 10; k++) {
vA0 = analogRead(A0);
delay(10);
}
vBatt = (vA0 * 2.50 / 1024.0) / R2 * (R1 + R2); // calcolo tensione batteria V ref 2.5 V MAX873
Serial.print("V. batt.: ");
Serial.println(vBatt);
// Stampa tensione batteria su seconda riga lcd
lcd.setCursor(0, 1);
lcd.print("V. batt.: ");
lcd.print(vBatt);
lcd.print("");
//----------------------------------------------------------------------------------------------
// legge tensione ingresso caricabatteria per vedere se acceso
for (int k = 1; k <= 10; k++) {
vA1 = analogRead(A1);
delay(10);
}
vCar = (vA1 * 2.50 / 1024.0) / R4 * (R3 + R4); // calcolo tensione prima step down
Serial.print("V rete on : ");
Serial.print(vCar);
Serial.println();
//------------------------------- ACCENDE SE SCARICA -------------------------------------------
if (vBatt <= tensMin) {
digitalWrite(alWemOn, HIGH); //abilita 5V wemos on e poi 9 V telecomando
delay(1000);
digitalWrite(sw, HIGH); // a 12.0 V accende telecomando e manda 5 on
delay(1000);
for (int i = 0; i < 5; i++) {
digitalWrite(On, HIGH);
delay(1000);
digitalWrite(On, LOW);
delay(1000);
}
digitalWrite(sw, LOW); // spegne slimentazione 9 V telecomando
delay(15000); // attende che wemos sia online xxxxxxxxxxxxxxxxxxx
digitalWrite(txON, HIGH); // notifica accensione
delay(1000);
digitalWrite(txON, LOW);
delay(2000); // attende che wemos trasmetta xxxxxxxxxxxxxxxxxxx
digitalWrite(alWemOn, LOW); // spegne 5V wemos on
}
//------------------------------ SPEGNE SE CARICA ----------------------------------------------
if ((vBatt >= tensMax) && (vCar > reteOn)) {
digitalWrite(alWOff, HIGH); // abilita step down 5V wemos off e poi 9 V telecomando
delay(1000);
digitalWrite(sw, HIGH); // a 14.4 V spegne caricabatteria e manda notifica
delay(1000);
for (int i = 0; i < 5; i++) {
digitalWrite(Off, HIGH);
delay(1000);
digitalWrite(Off, LOW);
delay(1000);
}
digitalWrite(sw, LOW); // spegne telecomando
delay(15000); // attende che wemos sia online xxxxxxxxxxxxxxxxxxx
digitalWrite(txOFF, HIGH); // notifica spegnimento
delay(1000);
digitalWrite(txOFF, LOW);
delay(2000); // attende che wemos trasmetta xxxxxxxxxxxxxxxxxxx
digitalWrite(alWOff, LOW); // spegne 5V wemos off
}
//------------------------------ EMERGENZA ANOMALIE --------------------------------------------
if (vBatt >= vOver) {
digitalWrite(pannOff, HIGH); // relè D6 stacca pannelli se tensione alta 15.2 V
}
if (vBatt <= panOn) { // ricollega pannelli a 14.2 V
digitalWrite(pannOff, LOW);
}
if (vBatt <= minLoad) { // se tensione batteria minore di 11.8 V (minLoad)
digitalWrite(load, HIGH); // attiva D11 relè che stacca utenze
}
if (vBatt >= recLoad) { // se tensione batteria maggiore di 12.2 V (recLoad)
digitalWrite(load, LOW); // disattiva D11 relè che ricollega utenze
}
//------------------------------ ALLARMI TEMPERATURA -----------------------------------------
sensors.requestTemperatures(); // legge temperatura sensori
t1 = sensors.getTempCByIndex(0); // legge sensore 1 (A)
// stampa su lcd temperatura primo sensore ( t1 - A )
lcd.setCursor(0, 0);
lcd.print("A:");
lcd.print(t1);
lcd.print(" ");
// stampa a monitor temperatura sensore 1
Serial.print("Sensore 1 ");
Serial.print(" : ");
Serial.print(t1);
Serial.print(" °C ");
t2 = sensors.getTempCByIndex(1); // legge sensore 2 (B)
// stampa su lcd temperatura sensore 2 ( t2 - B )
lcd.setCursor(8, 0);
lcd.print("B:");
lcd.print(t2);
lcd.print("");
// stampa a monitor temperatura sensore 2
Serial.print("Sensore 2 ");
Serial.print(" : ");
Serial.print(t2);
Serial.print(" °C ");
Serial.println();
// se la temperatura del sensore 1 oppure 2 supera la soglia impostata ( ventola ) attiva uscita D9 ventola
if ((t1 >= onFan) || (t2 >= onFan)) {
digitalWrite(ventola, HIGH);
}
// se la temperatura del sensore 1 oppure 2 supera la soglia impostata ( soglia ) attiva uscita D10 overTemp
if ((t1 >= soglia) || (t2 >= soglia)) {
digitalWrite(overTemp, HIGH);
}
//se la temperatura dei sensori 1 e 2 è più bassa di ( ripristino ) disattiva uscita D10 overTemp
if ((t1 < ripristino) && (t2 < ripristino)) {
digitalWrite(overTemp, LOW);
}
//se la temperatura dei sensori 1 e 2 è più bassa di ( offFan ) disattiva uscita D9 ventola
if ((t1 < offFan) && (t2 < offFan)) {
digitalWrite(ventola, LOW);
}
// pausa tra le misure
//delay(pausa * 60000);
delay(30000);
}