CITAZIONE Quote://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() {
ADCSRA&=0X90+ 0b100; //Setta ADC prescaler a 16 quindi la velocita delle conversioni
//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() {
ampere = 0.00;
int NumCampionamenti = 0;
long start = millis() ;
//Serial.println(analogRead(sensorPin));
do
{
NumCampionamenti++;
//508 è la lettura senza carico quindi l'offset e lo sottraiamo alle letture
ampere+= abs(analogRead(sensorPin) - 508);
}
while((millis()-start)<20); // 20 sono i millisecondi che verranno campionati
ampere=(ampere/NumCampionamenti) * 0.055; //0.055 è il fattore di conversione
consumo = ampere * tensione;
//Per evitare letture negative in assenza di carico
if (consumo < 0) consumo = 0;
//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,1);
lcd.print("Watt: ");
lcd.setCursor(7,1);
lcd.print(consumo);
}
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");
}
buttonState = 0;
}
}