//Includo la libreria per il corretto funzionamento del display
#include <LiquidCrystal.h>
// Dichiaro i pin del display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Dichiaro il pin a cui sono collegati i bottoni e la variabile in cui viene memorizzato il valore letto dal pin
int buttonPin = A0;
int buttonValue = 0;
//Dichiaro il pin del sensore di corrente e la variabile in cui sarà memorizzato il valore letto dal sensore
int sensorPin = A5;
float sensorValue = 0.00;
//Dichiaro la variabile in cui sarà memorizzato il valore di Ampere totali assorbiti
float ampere = 0.00;
//Variabile per il consumo in watt (ottenuto moltiplicando il valore in Ampere ottenuto dal sensore di corrente per la tensione stabilita di 230v)
float tensione = 230.00;
int consumo = 0;
//Dichiaro i pin del buzzer, dei led e dei relè
int buzzer = 6;
int verde1 = 7;
int verde2 = 8;
int rosso1 = 1;
int rosso2 = 13;
int bagni = 9;
int stanze = 10;
//Dichiaro variabili per memorizzare lo stato (0 o 1) dei relè e dei bottoni
int rele1 = 0;
int rele2 = 0;
int buttonState = 0;
//Variabili per prevenire ritardi ai pulsanti e regolare il refresh del display
#define intervallcd 3000
long previousMillslcd = 0;
#define interval1 2000
long previousMills1 = 0;
#define interval2 2000
long previousMills2 = 0;
//Note di check funzionamento buzzer
int melody[] = {
4699, 4699};
//Durata delle note: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
8, 8};
void setup() {
//Imposto il voltaggio di riferimento per le letture analogiche a 1.10v o lascio 5v se commentato
//analogReference(INTERNAL);
//Definisco l'eventuale porta seriale per leggere dati dal monitor seriale N.B. si accenderà fisso il led sul PIN 1 !!!
//Serial.begin(9600);
//Inizializzo il display
lcd.begin(16, 2);
//Imposto i pin dei led e dei relè come uscite digitali
pinMode(verde1, OUTPUT);
pinMode(verde2, OUTPUT);
pinMode(rosso1, OUTPUT);
pinMode(rosso2, OUTPUT);
pinMode(bagni, OUTPUT);
pinMode(stanze, OUTPUT);
//Accendo i due led verdi e spengo i due rossi (i relè sono normalmente chiusi e la variabile dei relè è gia impostata a 0 di default all'avvio del programma)
digitalWrite(verde1, HIGH);
digitalWrite(verde2, HIGH);
digitalWrite(rosso1, LOW);
digitalWrite(rosso2, LOW);
digitalWrite(bagni, HIGH);
digitalWrite(stanze, HIGH);
//Codice di esecuzione delle note di check funzionamento buzzer
for (int thisNote = 0; thisNote < 2; thisNote++) {
int noteDuration = 1000/noteDurations[thisNote];
tone(buzzer, melody[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(buzzer);
}
}
void loop() {
//Lettura sensore e calcolo Ampere assorbiti e Watt consumati con eventuale distacco automatico in caso di esubero
sensorValue = analogRead(sensorPin);
//Il sensore restituisce da 0 a 1v se legge da 0 a 30 Ampere (valore max di lettura) e lo somma al voltaggio reference 5v diviso in 2.
//Utilizzeremo però 2.49v anzichè 2.50v poichè in lettura senza carico il valore letto oscillava tra 2.48 e 2.50.
//Per cui abbiamo [ 1.00v : 30 A = (sensorValue - 2.49v) : ampere ] quindi [ ampere = (sensorValue - 2.49) * 30.00 / 1.00 ]
//Trasformo il valore letto sulla A5 in volt sapendo che 5 è il voltaggio reference e 1024 sono le parti in cui viene suddiviso per la lettura.
sensorValue = (((5.00 * sensorValue) / 1024.00) - 2.49);
if (sensorValue < 0) sensorValue = 0;
ampere = sensorValue * 30.00;
consumo = ampere * tensione;
//Lettura pin dei bottoni e azioni di distacco manuale o ripristino della corrente nelle sezioni collegate ai contattori
buttonValue = analogRead(buttonPin);
if (millis() - previousMills1 > interval1 ) {
previousMills1 = millis();
if ((buttonValue >= 150) && (buttonValue <= 200)) {
switch (rele1) {
case 0:
if (buttonState == 0) {
digitalWrite(verde1, LOW);
digitalWrite(rosso1, HIGH);
digitalWrite(bagni, LOW);
rele1 = 1;
buttonState = 1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distacco manuale"
;
lcd.setCursor(0,1);
lcd.print("Linea 1 OFF"
;
}
break;
case 1:
if (buttonState == 0) {
digitalWrite(verde1, HIGH);
digitalWrite(rosso1, LOW);
digitalWrite(bagni, HIGH);
rele1 = 0;
buttonState = 1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Intervento:"
;
lcd.setCursor(0,1);
lcd.print("Linea 1 ON"
;
}
break;
}
}
}
if (millis() - previousMills2 > interval2 ) {
previousMills2 = millis();
if ((buttonValue >= 800) && (buttonValue <= 900)) {
switch (rele2) {
case 0:
if (buttonState == 0) {
digitalWrite(verde2, LOW);
digitalWrite(rosso2, HIGH);
digitalWrite(stanze, LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distacco manuale"
;
lcd.setCursor(0,1);
lcd.print("Linea 2 OFF"
;
rele2 = 1;
buttonState = 1;
}
break;
case 1:
if (buttonState == 0) {
digitalWrite(verde2, HIGH);
digitalWrite(rosso2, LOW);
digitalWrite(stanze, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Intervento:"
;
lcd.setCursor(0,1);
lcd.print("Linea 2 ON"
;
rele2 = 0;
buttonState = 1;
}
break;
}
}
}
if ((buttonValue >= 0) && (buttonValue <= 100)) {
if (millis() - previousMillslcd > intervallcd ) {
previousMillslcd = millis();
lcd.clear();
}
lcd.setCursor(0,0);
if ((rele1 == 0) && (rele2 == 0)) {
lcd.print("Linee ON"
;
}
if ((rele1 == 0) && (rele2 == 1)) {
lcd.print("L1 ON L2 OFF"
;
}
if ((rele1 == 1) && (rele2 == 0)) {
lcd.print("L1 OFF L2 ON"
;
}
if ((rele1 == 1) && (rele2 == 1)) {
lcd.print("Linee OFF"
;
}
lcd.setCursor(0,1);
lcd.print("Watt: "
;
lcd.setCursor(7,1);
lcd.print(consumo);
buttonState = 0;
}
//riga utilizzata per calibrare il sensore e i bottoni
//Serial.println(sensorValue);
}