posto qui il mio sketch attuale: <div class=spoiler align=center><div class=code_top align=left>
SPOILER (<a href=javascript:spoiler()>clicca per visualizzare)</div><div class=code align=left><div align=center><div class=code_top align=left>
CODICE</div><div class=code align=left>//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);
} [/quote] [/quote]
arduino collegato ai led, ai pulsanti, alla scheda relè e al sensore.
Senza carico leggo 0 Watt... in attesa ancora di testare con un carico conosciuto come una lampadina ad incandescenza per verificare l'attendibilità del codice e del sensore.
Poi se il valore è giusto (lo confronterò anche con misurazioni ottenute con qualche altro strumento), rimane di creare un sistema che legga bene i valori e non mi stacchi la corrente già per un picco ma solo per un consumo costante O.o
Intanto testerò se il valore viene letto bene...
P.s. ho provato anche un altra strada, ovvero quella di settare l'analogReference a (INTERNAL) in modo che arduino scomponesse in 1024 parti il voltaggio di 1.10v al posto dei 5v come DEFAULT ed avere una lettura così più precisa del sensore collegandolo DIRETTAMENTE alla porta analogica senza passare per lo schema attuale che è questo: