#include <Servo.h>
#include <avr/wdt.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
void(* Riavvia)(void) = 0;
LiquidCrystal_I2C lcd(0x27,20,4); // Set the LCD I2C address
// Definiamo il SERVO
Servo myServo;
// Predisponiamo array per le sonse
byte G_addr[10][8]; //qui memorizzo fino a 10 indirizzi
byte G_Devices; // variabile usata per tenere traccia del numero di sensori riconosciuti nel bus
// Il terminale data del sensore è sulla porta 43
#define ONE_WIRE_BUS 43
// Imposta oneWire per comunicare
OneWire oneWire(ONE_WIRE_BUS);
// Passaggio oneWire reference alla Dallas Temperature.
DallasTemperature sensors(&oneWire);
//DeviceAddress Sonda01 = { 0x28, 0x61, 0x64, 0x09, 0x50, 0x6E, 0xC8, 0x82 }; // Sonda temperatura
DeviceAddress Sonda01 = { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb }; // Sonda temperatura
DeviceAddress Sonda02 = { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb }; // Sonda temperatura
DeviceAddress Sonda03 = { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb }; // Sonda temperatura
//DeviceAddress Sonda02 = { 0x28, 0x61, 0x64, 0x09, 0x4A, 0x74, 0xE6, 0x95 }; // Sonda temperatura
//DeviceAddress Sonda03 = { 0x28, 0x61, 0x64, 0x09, 0x4B, 0x25, 0x88, 0xF7 }; // Sonda temperatura
//DeviceAddress Sonda04 = { 0x28, 0x61, 0x64, 0x09, 0x53, 0xD7, 0x5A, 0x7B }; // Sonda temperatura
//DeviceAddress Sonda05 = { 0x28, 0x61, 0x64, 0x09, 0x51, 0xB5, 0xE0, 0xB3 }; // Sonda temperatura
//DeviceAddress Sonda06 = { 0x28, 0x61, 0x64, 0x09, 0x53, 0x3D, 0x7F, 0xF5 }; // Sonsa temperatura
//DeviceAddress Sonda07 = { 0x28, 0x61, 0x64, 0x09, 0x4B, 0x28, 0xD0, 0x67 }; // Sonda temperatura
//DeviceAddress Sonda08 = { 0x28, 0x61, 0x64, 0x09, 0x57, 0x86, 0x11, 0x30 }; // Sonda temperatura
String readString;
bool LCDlight;
unsigned long time; // the last time the output pin was toggled
unsigned long tmpTimeLcd; // Variables tempory LCD
unsigned long tmpTimeCOM; // Variables tempory board Communication
String inString = ""; // string to EEPROM Write
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
#define RELE1 46
#define RELE2 47
#define RELE3 48
#define RELE4 49
#define RELE5 50
#define RELE6 51
#define RELE7 52
#define RELE8 53
#define TASTO1 38
#define TASTO2 40
#define TASTO3 42
#define TASTO4 44
#define INGRESSO1 36
#define INGRESSO2 3
//#define INGRESSO3 38
//#define INGRESSO4 37
#define LED_ROSSO 6
#define LED_VERDE 7
//Variabile per lettura sonde e invio dati
int k = 0;
// Sonde locali
int scSONDA1; //Temperatura Aria
int scSONDA2; //Temperatura Acqua Camino Andata
int scSONDA3; //Temperatura Acqua Camino Ritorno
// Sonde remote
int stSONDA1;
int stSONDA2;
int stSONDA3;
int stSONDA4;
int stSONDA5;
int stSONDA6;
int stSONDA7;
int stSONDA8;
// RELE Locali
int scREL1 = HIGH;
int scREL2 = HIGH;
int scREL3 = HIGH;
int scREL4 = HIGH;
int scREL5 = HIGH; //comando ventola off
int scREL6 = HIGH; //comando ventola minimo
int scREL7 = HIGH; //comando ventola medio
int scREL8 = HIGH; //comando ventola massimo
// RELE Remoti
int stREL1 = HIGH;
int stREL2 = HIGH;
int stREL3 = HIGH;
int stREL4 = HIGH;
int stREL5 = HIGH;
int stREL6 = HIGH;
int stREL7 = HIGH;
int stREL8 = HIGH;
int VE0 = 40; //Ventola aria spenta
int cmdVE0 = 0; //Comando ventola off inviato
int VE1 = 50; //Ventola aria spenta
int cmdVE1 = 0; //Comando ventola off inviato
int VE2 = 40; //Ventola aria spenta
int cmdVE2 = 0; //Comando ventola off inviato
int VE3 = 99; //Ventola aria massimo
int cmdVE3 = 0; //Comando ventola massimo inviato
int PAopen = 5; // Presa aria aperta
int PAclose = 175;// Presa aria chiusa
int CP;
int TP;
int CAMA; //Acqua Camino Andata
int CAMR; //Acqua Camino Ritorno
int TERA; //Acqua Termosifoni Andata
int TERR; //Acqua Termosifoni Ritorno
int STA; //Acqua Sotto Tetto Andata
int STR; //Acqua Sotto Tetto Ritorno
int PTA; //Acqua Piano Terra Andata
int PTR; //Acqua Piano Terra Ritorno
int PIA; //Acqua Piano Interrato
int PIR; //Acqua Piano Interrato Ritorno
int pos; // Posizione servo
int blocco = 99; //Variabile per blocco programma
String IPaddr;
int ME = 0;
int SM = 0;
//definizione caratteri personalizzati
byte min[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B01000,
B00000,
B00000,
};
byte med[8] = {
B00000,
B00000,
B00000,
B00000,
B00100,
B01100,
B00000,
B00000,
};
byte max[8] = {
B00000,
B00000,
B00000,
B00010,
B00110,
B01110,
B00000,
B00000,
};
byte enter[8] = {
B00000,
B00001,
B00001,
B00001,
B01001,
B11111,
B01000,
B00000,
};
byte ventola[8] = {
B00000,
B00000,
B11011,
B11011,
B00100,
B11011,
B11011,
B00000,
};
byte pompa[8] = {
B00000,
B00000,
B00111,
B01010,
B10101,
B01010,
B11100,
B00000,
};
byte su[8] = {
B00000,
B00100,
B00100,
B01110,
B01110,
B11111,
B11111,
B00000,
};
byte giu[8] = {
B00000,
B11111,
B11111,
B01110,
B01110,
B00100,
B00100,
B00000,
};
byte dx[8] = {
B10000,
B11000,
B11100,
B11110,
B11100,
B11000,
B10000,
B00000,
};
byte sx[8] = {
B00001,
B00011,
B00111,
B01111,
B00111,
B00011,
B00001,
B00000,
};
void setup() {
//init seriale
Serial.begin(115200);
Serial1.begin(19200);
Serial.println("ARDUINO ATTIVO - CAMINO -");
pinMode(45, OUTPUT);
digitalWrite(45, LOW);
lcd.init();
lcd.createChar(0, min);
lcd.createChar(1, med);
lcd.createChar(2, max);
lcd.createChar(3, enter);
lcd.createChar(4, ventola);
lcd.createChar(5, pompa);
pinMode(INGRESSO1, INPUT_PULLUP);
pinMode(INGRESSO2, INPUT_PULLUP);
//pinMode(INGRESSO3, INPUT_PULLUP);
//pinMode(INGRESSO4, INPUT_PULLUP);
pinMode(TASTO1, INPUT_PULLUP);
pinMode(TASTO2, INPUT_PULLUP);
pinMode(TASTO3, INPUT_PULLUP);
pinMode(TASTO4, INPUT_PULLUP);
pinMode(LED_ROSSO, OUTPUT);
digitalWrite(LED_ROSSO, LOW);
pinMode(LED_VERDE, OUTPUT);
digitalWrite(LED_VERDE, LOW);
pinMode(RELE1, OUTPUT);
digitalWrite(RELE1, scREL1);
pinMode(RELE2, OUTPUT);
digitalWrite(RELE2, scREL2);
pinMode(RELE3, OUTPUT);
digitalWrite(RELE3, scREL3);
pinMode(RELE4, OUTPUT);
digitalWrite(RELE4, scREL4);
pinMode(RELE5, OUTPUT);
digitalWrite(RELE5, scREL5);
pinMode(RELE6, OUTPUT);
digitalWrite(RELE6, scREL6);
pinMode(RELE7, OUTPUT);
digitalWrite(RELE7, scREL7);
pinMode(RELE8, OUTPUT);
digitalWrite(RELE8, scREL8);
//variabile tmp per timer disply
tmpTimeLcd = millis();
lcd.backlight();
byte address[8]; // questo array conterrà l'indirizzo locale dei sensori
lcd.setCursor(0,0);
lcd.print("Ricerca avviata"); // avvia la ricerca e lo scrive sulla porta seriale
delay(500); //Ritardo di 1 secondi (può essere modificato)
while (oneWire.search(address)) { // loop finchè trova nuovi dispositivi
// Se il primo byte dell'indirizzo è 0x10, si tratta di una sonda DS18S20
// il primo byte dell'indirizzo identifica il tipo di sensore
// se 0x10 è un DS18S20, se è 0x28 è un DS18B20 (notare la S e B)
if (address[0] == 0x10 || address[0] == 0x28) {
lcd.clear();
lcd.setCursor(0,0);
if (address[0] == 0x10) {
lcd.print("Found DS18S20 ");
lcd.print(G_Devices);
lcd.print(" :");
} else if (address[0] == 0x28) { // notare che la S invece che la B
lcd.print("Found DS18B20 ");
lcd.print(G_Devices);
lcd.print(" :");
}
PrintAddress(address);
//for(int aa=0;aa<8;aa++) G_addr[G_Devices][aa]=address[aa]; // copia l'indirizzo
G_Devices++; // incrementa il numero di devices memorizzati
}
delay(500); //Ritardo di 1,5 secondi (può essere modificato)
wdt_reset();
}
delay(1000);
sensors.begin();
sensors.setResolution(Sonda01, 9);
sensors.setResolution(Sonda02, 9);
sensors.setResolution(Sonda03, 9);
//sensors.setResolution(Sonda04, 9);
//sensors.setResolution(Sonda05, 9);
//sensors.setResolution(Sonda06, 9);
//sensors.setResolution(Sonda07, 9);
//sensors.setResolution(Sonda08, 9);
// Definiamo il pin al quale è collegato il servo
myServo.attach(34);
// Chiude bocchetta aria
Serial.print("Posizione iniziale: ");
myServo.write(PAopen);
Serial.println(myServo.read());
delay(1000);
myServo.write(PAclose);
Serial.println(myServo.read());
delay(5000);
//scrivo sul display
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Controllo");
lcd.setCursor(0,1);
lcd.print("Camino - Caloriferi");
lcd.setCursor(0,2);
lcd.print(" by");
lcd.setCursor(0,3);
lcd.print(" Michele - Daniele");
delay(2500);
lcd.clear();
tmpTimeLcd = millis();
}
void loop() {
while (blocco == 1 || blocco == 2) {
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
if (blocco == 1) {
lcd.print(" Scheda SD Mancante");
}
if (blocco == 2) {
lcd.print("File config Mancante");
}
lcd.setCursor(0,1);
lcd.setCursor(0,2);
lcd.print(" Programma BLOCCATO");
lcd.setCursor(0,3);
if (digitalRead(TASTO1) == LOW && digitalRead(TASTO4) == LOW) {
Riavvia();
}
delay(1000);
k = k + 1;
if (k == 30) {Riavvia();}
}
if (blocco == 98) { // Impostare 98 per simulatore altrimenti 99
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.setCursor(0,1);
lcd.print(" Attesa dati ...");
lcd.setCursor(0,2);
lcd.setCursor(0,3);
TX("ARDUINO CAMINO ATTIVO");
delay(1000);
tmpTimeLcd = millis();
} else {
// legge il valore delle sonde DS18 e invia i dati in tre tempi diversi per velocizzare LCD
k=k+1;
if (k == 3) {
sensors.requestTemperaturesByAddress(Sonda01);
scSONDA1 = sensors.getTempC(Sonda01);
}
if (k == 6) {
sensors.requestTemperaturesByAddress(Sonda02);
scSONDA2 = sensors.getTempC(Sonda02);
}
if (k == 9) {
sensors.requestTemperaturesByAddress(Sonda03);
scSONDA3 = sensors.getTempC(Sonda03);
}
if (k == 12) {
TX("INIZIO_INVIO");
TX("scSONDA1: " + String(scSONDA1));
TX("scSONDA2: " + String(scSONDA2));
TX("scSONDA3: " + String(scSONDA3));
TX("scREL1: " + String(digitalRead(RELE1)));
TX("scREL2: " + String(digitalRead(RELE2)));
TX("scREL3: " + String(digitalRead(RELE3)));
TX("scREL4: " + String(digitalRead(RELE4)));
TX("FINE_INVIO");
k = 0;
}
if (k == 15) {
}
if (k == 18) {
}
if (k == 21) {
}
if (k == 24) {
k = 0;
}
//Gestione comandi ventola aumento temperatura
if ((VE1 > 9) && (scSONDA1 > VE0) && (scSONDA1 <= VE1) && (cmdVE1 == 0)) {
scREL6 = LOW;
digitalWrite(RELE6,scREL6);
delay(1000);
scREL6 = HIGH;
digitalWrite(RELE6,scREL6);
cmdVE0 = 0;
cmdVE1 = 1;
cmdVE2 = 0;
cmdVE3 = 0;
}
if ((VE3 > 9) && (scSONDA1 > VE1) && (scSONDA1 < VE3) && (cmdVE2 == 0)) {
scREL7 = LOW;
digitalWrite(RELE7,scREL7);
delay(1000);
scREL7 = HIGH;
digitalWrite(RELE7,scREL7);
cmdVE0 = 0;
cmdVE1 = 0;
cmdVE2 = 1;
cmdVE3 = 0;
}
if ((VE0 > 9) && (scSONDA1 < VE0) && (cmdVE0 == 0)) {
scREL5 = LOW;
digitalWrite(RELE5,scREL5);
delay(1000);
scREL5 = HIGH;
digitalWrite(RELE5,scREL5);
cmdVE0 = 1;
cmdVE1 = 0;
cmdVE2 = 0;
cmdVE3 = 0;
}
if ((VE3 > 9) && (scSONDA1 >= VE3) && (cmdVE3 == 0)) {
scREL8 = LOW;
digitalWrite(RELE8,scREL8);
delay(1000);
scREL8 = HIGH;
digitalWrite(RELE8,scREL8);
cmdVE0 = 0;
cmdVE1 = 0;
cmdVE2 = 0;
cmdVE3 = 1;
}
// Controllo contatto presa ARIA
pos = myServo.read();
if ((digitalRead(INGRESSO1) == HIGH) && (pos == PAclose)) {
digitalWrite(LED_ROSSO,HIGH);
digitalWrite(LED_VERDE,LOW);
TX("LED_ROSSO: 1");
TX("LED_VERDE: 0");
} else if ((digitalRead(INGRESSO1) == LOW) && (pos == PAopen)) {
digitalWrite(LED_VERDE,HIGH);
digitalWrite(LED_ROSSO,LOW);
TX("LED_VERDE: 1");
TX("LED_ROSSO: 0");
} else {
digitalWrite(LED_ROSSO,HIGH);
digitalWrite(LED_VERDE,HIGH);
TX("LED_VERDE: 1");
TX("LED_ROSSO: 1");
}
// Temporaneo per test servo
if ((digitalRead(INGRESSO2) == LOW) && (pos != 175)) {myServo.write(PAclose);}
if ((digitalRead(INGRESSO2) == HIGH) && (pos != 5)) {myServo.write(PAopen);}
// MENU 0 - 0
if ((ME == 0) and (SM == 0)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
if (scSONDA1 < 10) {
lcd.print("Temp. Aria ");
} else if (scSONDA1 < 100) {
lcd.print("Temp. Aria ");
} else {lcd.print("Temp. Aria ");}
lcd.print(scSONDA1); //variabile per temperatura ARIA
lcd.print((char)223);
lcd.setCursor(0,1);
lcd.print("CAM A ");
lcd.print(scSONDA2); //variabile per temperatura ACQUA Andata Camino
lcd.print((char)223);
lcd.print(" R ");
lcd.print(scSONDA3); //variabile per temperatura ACQUA Ritorno Camino
lcd.print((char)223);
lcd.setCursor(0,2);
lcd.print("TER A ");
lcd.print(stSONDA1); //variabile per temperatura ACQUA Andata Termosifoni
lcd.print((char)223);
lcd.print(" R ");
lcd.print(stSONDA2); //variabile per temperatura ACQUA Ritorno Termosifoni
lcd.print((char)223);
lcd.setCursor(0,3);
lcd.print("1/3");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(6,3);
lcd.print("M");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
//lcd.write(byte(7));
lcd.setCursor(18,3);
//lcd.write(byte(3));
ComuniDisplay();
}
// MENU 0 - 1
if ((ME == 0) and (SM == 1)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(char(165)); //Sostituire con acceso-char(255)/spento-char(165)
lcd.print("ST A ");
lcd.print(stSONDA3); //variabile per temp. ACQUA Termo ST Andata
lcd.print((char)223);
lcd.print(" R ");
lcd.print(stSONDA4); //variabile per temp. ACQUA Termo ST Ritorno
lcd.print((char)223);
lcd.setCursor(0,1);
lcd.print(char(165)); //Sostituire con acceso-char(255)/spento-char(165)
lcd.print("PT A ");
lcd.print(stSONDA5); // variabile per temp. ACQUA Termo PT Andata
lcd.print((char)223);
lcd.print(" R ");
lcd.print(stSONDA6); //variabile per temp. ACQUA Termo PT Ritorno
lcd.print((char)223);
lcd.setCursor(0,2);
lcd.print(char(165)); //Sostituire con acceso-char(255)/spento-char(165)
lcd.print("PI A ");
lcd.print(stSONDA7); //variabile per temp. ACQUA Termo PI Andata
lcd.print((char)223);
lcd.print(" R ");
lcd.print(stSONDA8); //variabile per temp. ACQUA Termo PI Ritorno
lcd.print((char)223);
lcd.setCursor(0,3);
lcd.print("2/3");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(6,3);
lcd.print("M");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
//lcd.write(byte(3));
ComuniDisplay();
}
// MENU 0 - 2
if ((ME == 0) and (SM == 2)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print("Presa Aria ");
lcd.print("100"); //sostituire con variabile SERVO presa aria
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("Liv. Acqua ");
lcd.print("100"); //sostituire con variabile livello acqua
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("IP:");
lcd.print(IPaddr);
//lcd.print("TER A ");
//lcd.print("xx");
//lcd.print("° R ");
//lcd.print("xx");
//lcd.print("°");
lcd.setCursor(0,3);
lcd.print("3/3");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(6,3);
lcd.print("M");
lcd.setCursor(10,3);
//lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
//lcd.write(byte(3));
ComuniDisplay();
}
// MENU 1 - 0
if ((ME == 1) and (SM == 0)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" MENU PRINCIPALE");
lcd.setCursor(0,1);
lcd.print("Imposta Temperatura ");
lcd.setCursor(0,2);
lcd.print(" Aria ");
lcd.setCursor(0,3);
lcd.print("1/5");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("EXT");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
//lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 1 - 1
if ((ME == 1) and (SM == 1)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" MENU PRINCIPALE");
lcd.setCursor(0,1);
lcd.print("Imposta Temperatura ");
lcd.setCursor(0,2);
lcd.print(" Camino ");
lcd.setCursor(0,3);
lcd.print("2/5");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("EXT");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 1 - 2
if ((ME == 1) and (SM == 2)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" MENU PRINCIPALE");
lcd.setCursor(0,1);
lcd.print("Imposta Temperatura ");
lcd.setCursor(0,2);
lcd.print(" Termosifoni ");
lcd.setCursor(0,3);
lcd.print("3/5");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("EXT");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 1 - 3
if ((ME == 1) and (SM == 3)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" MENU PRINCIPALE");
lcd.setCursor(0,1);
lcd.print("Imposta Presa Aria");
lcd.setCursor(0,2);
lcd.setCursor(0,3);
lcd.print("4/5");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("EXT");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 1 - 4
if ((ME == 1) and (SM == 4)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" MENU PRINCIPALE");
lcd.setCursor(0,1);
lcd.print(" Imposta Livello");
lcd.setCursor(0,2);
lcd.print(" Acqua ");
lcd.setCursor(0,3);
lcd.print("5/5");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("EXT");
lcd.setCursor(10,3);
//lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 2 - 0
if ((ME == 2) and (SM == 0)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" IMPOSTA ARIA ");
lcd.setCursor(0,1);
lcd.print("OFF =< ");
lcd.print(VE0); //variabile per temperatura ARIA OFF
lcd.setCursor(0,2);
lcd.setCursor(0,3);
lcd.print("1/4");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
//lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
//ComuniDisplay();
}
// MENU 2 - 1
if ((ME == 2) and (SM == 1)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" IMPOSTA ARIA ");
lcd.setCursor(0,1);
lcd.print("MIN >< ");
lcd.print(VE1); // sostituire con variabile per temperatura ARIA MIN
//lcd.print(" >< ");
//lcd.print(VE1d); // sostituire con variabile per temperatura ARIA MIN
lcd.setCursor(0,2);
lcd.print(" >< ");
lcd.print(VE1); // sostituire con variabile per temperatura ARIA MIN
//lcd.print(" > ");
//lcd.print("48"); // sostituire con variabile per temperatura ARIA MIN
lcd.setCursor(0,3);
lcd.print("2/4");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
//ComuniDisplay();
}
// MENU 2 - 2
if ((ME == 2) and (SM == 2)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" IMPOSTA ARIA ");
lcd.setCursor(0,1);
lcd.print("MED >< ");
lcd.print(VE2); // sostituire con variabile per temperatura ARIA MED
//lcd.print(" < ");
//lcd.print("56"); // sostituire con variabile per temperatura ARIA MED
lcd.setCursor(0,2);
lcd.print(" >< ");
lcd.print(VE2); // sostituire con variabile per temperatura ARIA MED
//lcd.print(" > ");
//lcd.print("98"); // sostituire con variabile per temperatura ARIA MED
lcd.setCursor(0,3);
lcd.print("3/4");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
//ComuniDisplay();
}
// MENU 2 - 3
if ((ME == 2) and (SM == 3)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" IMPOSTA ARIA ");
lcd.setCursor(0,1);
lcd.print("MAX > ");
lcd.print("100"); // sostituire con variabile per temperatura ARIA MAX
lcd.setCursor(0,2);
lcd.setCursor(0,3);
lcd.print("4/4");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
//lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
//ComuniDisplay();
}
// MENU 3 - 0
if ((ME == 3) and (SM == 0)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" IMPOSTA CAMINO ");
lcd.setCursor(0,1);
lcd.print(" Temperatura Pompa");
lcd.setCursor(0,2);
lcd.print(" Circolazione");
lcd.setCursor(0,3);
lcd.print("1/3");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
//lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 3 - 1
if ((ME == 3) and (SM == 1)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" IMPOSTA CAMINO ");
lcd.setCursor(0,1);
lcd.print(" Temperatura Andata");
lcd.setCursor(0,2);
lcd.setCursor(0,3);
lcd.print("2/3");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 3 - 2
if ((ME == 3) and (SM == 2)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print(" IMPOSTA CAMINO ");
lcd.setCursor(0,1);
lcd.print(" Temperatura Ritorno");
lcd.setCursor(0,2);
lcd.setCursor(0,3);
lcd.print("3/3");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
//lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 4 - 0
if ((ME == 4) and (SM == 0)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print("IMPOSTA TERMOSIFONI ");
lcd.setCursor(0,1);
lcd.print(" Temperatura Pompa");
lcd.setCursor(0,2);
lcd.print(" Termosifoni");
lcd.setCursor(0,3);
lcd.print("1/3");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
//lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 4 - 1
if ((ME == 4) and (SM == 1)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print("IMPOSTA TERMOSIFONI ");
lcd.setCursor(0,1);
lcd.print(" Temperatura Andata");
lcd.setCursor(0,2);
lcd.setCursor(0,3);
lcd.print("2/3");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// MENU 4 - 2
if ((ME == 4) and (SM == 2)) {
lcd.createChar(6, su); //lcd.createChar(6, sx);
lcd.createChar(7, giu); //lcd.createChar(7, dx);
lcd.setCursor(0,0);
lcd.print("IMPOSTA TERMOSIFONI");
lcd.setCursor(0,1);
lcd.print("Temperatura Ritorno");
lcd.setCursor(0,2);
lcd.setCursor(0,3);
lcd.print("3/3");
// Indicazioni comuni per riga Pulsanti
lcd.setCursor(5,3);
lcd.print("BKW");
lcd.setCursor(10,3);
//lcd.write(byte(6));
lcd.setCursor(14,3);
lcd.write(byte(7));
lcd.setCursor(18,3);
lcd.write(byte(3));
}
// Verifica pressione tasti
int stTAS1 = digitalRead(TASTO1);
int stTAS2 = digitalRead(TASTO2);
int stTAS3 = digitalRead(TASTO3);
int stTAS4 = digitalRead(TASTO4);
// TASTO 1
if (stTAS1 == 0) {
Serial.println("TASTO 1");
tmpTimeLcd = millis();
if (ME == 0) {
lcd.backlight();
ME = 1;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 1) {
lcd.backlight();
ME = 0;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 2) {
lcd.backlight();
ME = 1;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 3) {
lcd.backlight();
ME = 1;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 4) {
lcd.backlight();
ME = 1;
SM = 2;
delay(200);
lcd.clear();
}
}
// TASTO 2
if (stTAS2 == 0) {
Serial.println("TASTO 2");
tmpTimeLcd = millis();
if (ME == 0 and SM == 0) {
lcd.backlight();
ME = 0;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 0 and SM == 1) {
lcd.backlight();
ME = 0;
SM = 2;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 0) {
lcd.backlight();
ME = 1;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 1) {
lcd.backlight();
ME = 1;
SM = 2;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 2) {
lcd.backlight();
ME = 1;
SM = 3;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 3) {
lcd.backlight();
ME = 1;
SM = 4;
delay(200);
lcd.clear();
} else
if (ME == 2 and SM == 0) {
lcd.backlight();
ME = 2;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 2 and SM == 1) {
lcd.backlight();
ME = 2;
SM = 2;
delay(200);
lcd.clear();
} else
if (ME == 2 and SM == 2) {
lcd.backlight();
ME = 2;
SM = 3;
delay(200);
lcd.clear();
} else
if (ME == 3 and SM == 0) {
lcd.backlight();
ME = 3;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 3 and SM == 1) {
lcd.backlight();
ME = 3;
SM = 2;
delay(200);
lcd.clear();
} else
if (ME == 4 and SM == 0) {
lcd.backlight();
ME = 4;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 4 and SM == 1) {
lcd.backlight();
ME = 4;
SM = 2;
delay(200);
lcd.clear();
}
}
// TASTO 3
if (stTAS3 == 0) {
Serial.println("TASTO 3");
tmpTimeLcd = millis();
if (ME == 0 and SM == 1) {
lcd.backlight();
ME = 0;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 0 and SM == 2) {
lcd.backlight();
ME = 0;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 1) {
lcd.backlight();
ME = 1;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 2) {
lcd.backlight();
ME = 1;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 3) {
lcd.backlight();
ME = 1;
SM = 2;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 4) {
lcd.backlight();
ME = 1;
SM = 3;
delay(200);
lcd.clear();
} else
if (ME == 2 and SM == 1) {
lcd.backlight();
ME = 2;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 2 and SM == 2) {
lcd.backlight();
ME = 2;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 2 and SM == 3) {
lcd.backlight();
ME = 2;
SM = 2;
delay(200);
lcd.clear();
} else
if (ME == 3 and SM == 1) {
lcd.backlight();
ME = 3;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 3 and SM == 2) {
lcd.backlight();
ME = 3;
SM = 1;
delay(200);
lcd.clear();
} else
if (ME == 4 and SM == 1) {
lcd.backlight();
ME = 4;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 4 and SM == 2) {
lcd.backlight();
ME = 4;
SM = 1;
delay(200);
lcd.clear();
}
}
// TASTO 4
if (stTAS4 == 0) {
Serial.println("TASTO 4");
tmpTimeLcd = millis();
if (ME == 0) {
lcd.backlight();
ME = 0;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 0) {
lcd.backlight();
ME = 2;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM ==1) {
lcd.backlight();
ME = 3;
SM = 0;
delay(200);
lcd.clear();
} else
if (ME == 1 and SM == 2) {
lcd.backlight();
ME = 4;
SM = 0;
delay(200);
lcd.clear();
}
}
// imposto time per spegnimento display
time = millis();
// Spengo il display dopo 60 sec se non premo tasti
if(time - tmpTimeLcd > 60000) {
lcd.noBacklight();
} else {
lcd.backlight();
}
// imposto time per mancata cominicazione moduli
time = millis();
// Riavvio se non ricevo entro 5 secondi
if(time - tmpTimeCOM > 5000) {
blocco = 99;
//delay(50000);
} else {
blocco = 0;
wdt_reset();
}
}
}
void ComuniDisplay() {
// Indicazioni comuni lato dx display
lcd.setCursor(17,0);
lcd.print("V");
lcd.write(byte(4));
lcd.setCursor(19,0);
lcd.write(byte(0)); // Sostituire con velocità ventola min-byte(0)/med-byte(1)/max-byte(2)
lcd.setCursor(17,1);
lcd.print("C");
lcd.write(byte(5));
lcd.setCursor(19,1);
lcd.print(char(255)); // Sostituire con acceso-char(255)/spento-vuoto
lcd.setCursor(17,2);
lcd.print("T");
lcd.write(byte(5));
lcd.setCursor(19,2);
lcd.print(char(255)); // Sostituire con acceso-char(255)/spento-vuoto
}
// Legge indirzzo sonda DS18xxxx
void PrintAddress(byte * address) {
lcd.setCursor(0,1);
int i;
for (i=0;i<8;i++) {
if (address[i] < 15) {
lcd.print("0");
Serial.print("0");
lcd.print(address[i],HEX);
Serial.print(address[i],HEX);
} else {
lcd.print(address[i],HEX);
Serial.print(address[i],HEX);
}
//if (i<7) lcd.print("-");
}
Serial.println("");
}
/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent1() {
while (Serial1.available() != 0) {
// get the new byte:
char inChar = Serial1.read();
//Serial.print(inChar);
if (inChar <= 126 && inChar >= 32){
// add it to the inputString:
inputString += inChar;
}
// if the incoming character is a CR, set a flag
// so the main loop can do something about it:
if (inChar == '\r') {
blocco = 0;
tmpTimeCOM = millis();
//Serial.println("RX:" + inputString);
if (inputString.substring(0,9) == "SD_NOCONF") {
blocco = 2;
}
if (inputString.substring(0,8) == "SD_EMPTY") {
blocco = 1;
}
if (inputString.substring(0,8) == "SD_READY") {
blocco = 0;
}
if (inputString.substring(0,8) == "PAclose:") {
int tmpPAclose = inputString.substring(9,12).toInt();
if (tmpPAclose > 0) { PAclose = tmpPAclose; }
}
if (inputString.substring(0,7) == "PAopen:") {
int tmpPAopen = inputString.substring(8,11).toInt();
if (PAopen > 0) { PAopen = tmpPAopen; }
}
if (inputString.substring(0,4) == "VE0:") {
int tmpVE0 = inputString.substring(5,7).toInt();
if (tmpVE0 > 9) { VE0 = tmpVE0; }
}
if (inputString.substring(0,5) == "VE1:") {
int tmpVE1 = inputString.substring(6,8).toInt();
if (tmpVE1 > 9) { VE1 = tmpVE1; }
}
if (inputString.substring(0,5) == "VE2:") {
int tmpVE2 = inputString.substring(6,8).toInt();
if (tmpVE2 > 9) { VE2 = tmpVE2; }
}
if (inputString.substring(0,4) == "VE3:") {
int tmpVE3 = inputString.substring(5,7).toInt();
if (tmpVE3 > 9) { VE3 = tmpVE3; }
}
if (inputString.substring(0,5) == "stIP:") {
IPaddr = inputString.substring(7,22);
}
if (inputString.substring(0,7) == "scREL1:") {
scREL1 = inputString.substring(8,9).toInt();
digitalWrite(RELE1,!scREL1);
}
if (inputString.substring(0,7) == "scREL2:") {
scREL2 = inputString.substring(8,9).toInt();
digitalWrite(RELE2,!scREL2);
}
if (inputString.substring(0,7) == "scREL3:") {
scREL3 = inputString.substring(8,9).toInt();
digitalWrite(RELE3,!scREL3);
}
if (inputString.substring(0,7) == "scREL4:") {
scREL4 = inputString.substring(8,9).toInt();
digitalWrite(RELE4,!scREL4);
}
if (inputString.substring(0,7) == "scREL5:") {
scREL5 = inputString.substring(8,9).toInt();
digitalWrite(RELE5,!scREL5);
}
if (inputString.substring(0,7) == "scREL6:") {
scREL6 = inputString.substring(8,9).toInt();
digitalWrite(RELE6,!scREL6);
}
if (inputString.substring(0,7) == "scREL7:") {
scREL7 = inputString.substring(8,9).toInt();
digitalWrite(RELE7,!scREL7);
}
if (inputString.substring(0,7) == "scREL8:") {
scREL8 = inputString.substring(8,9).toInt();
digitalWrite(RELE8,!scREL8);
}
if (inputString.substring(0,9) == "stSONDA1:") {
int stSONDA1tmp = inputString.substring(10,12).toInt();
if (stSONDA1tmp > 10 ) {
stSONDA1 = stSONDA1tmp;
}
}
if (inputString.substring(0,9) == "stSONDA2:") {
int stSONDA2tmp = inputString.substring(10,12).toInt();
if (stSONDA2tmp > 10 ) {
stSONDA2 = stSONDA2tmp;
}
}
if (inputString.substring(0,9) == "stSONDA3:") {
int stSONDA3tmp = inputString.substring(10,12).toInt();
if (stSONDA3tmp > 10 ) {
stSONDA3 = stSONDA3tmp;
}
}
if (inputString.substring(0,9) == "stSONDA4:") {
int stSONDA4tmp = inputString.substring(10,12).toInt();
if (stSONDA4tmp > 10 ) {
stSONDA4 = stSONDA4tmp;
}
}
if (inputString.substring(0,9) == "stSONDA5:") {
int stSONDA5tmp = inputString.substring(10,12).toInt();
if (stSONDA5tmp > 10 ) {
stSONDA5 = stSONDA5tmp;
}
}
if (inputString.substring(0,9) == "stSONDA6:") {
int stSONDA6tmp = inputString.substring(10,12).toInt();
if (stSONDA6tmp > 10 ) {
stSONDA6 = stSONDA6tmp;
}
}
if (inputString.substring(0,9) == "stSONDA7:") {
int stSONDA7tmp = inputString.substring(10,12).toInt();
if (stSONDA7tmp > 10 ) {
stSONDA7 = stSONDA7tmp;
}
}
if (inputString.substring(0,9) == "stSONDA8:") {
int stSONDA8tmp = inputString.substring(10,12).toInt();
if (stSONDA8tmp > 10 ) {
stSONDA8 = stSONDA8tmp;
}
}
inputString = "";
//Serial1.flush();
}
}
}
// --------------------- Invia dati sulla Seriale 485 ------------
void TX(String dato) {
digitalWrite(45, HIGH);
delay(50);
Serial1.println(dato);
//Serial.println("TX:" + dato);
delay(dato.length());
digitalWrite(45, LOW);
Serial1.flush();
}