#define NAME "Alimentatore!"
#define VERSION "2.2"
#include <LiquidCrystal.h> //inclusione della libreria LCD
// definizione dei pin
const int currentSensor = A0;
const int voltageSensor = A1;
#define BUTTON_PIN 8
#define RELE 9
//definizione valori integer e float per calcolo valori corrente e tensione
float vOUT = 0.0;
float vIN = 0.0;
float R1 = 51500.0; // !! Valore della resistenza R1 !!
float R2 = 10000.0; // !! Valore della resistenza R2 !!
float Vdata = 0;
float V,I,I1;
float Cdata;
float value;
// definizione debounce pulsante
byte lastButtonState = HIGH;
unsigned long debounceDuration = 5; // millis
unsigned long lastTimeButtonStateChanged = 0;
int ReleState = LOW; // the current state of LED
//definizione dei pin LCD
int RS = 7;
int EN = 6;
int D7 = 2;
int D6 = 3;
int D5 = 4;
int D4 = 5;
//inizializzazione libreria LCD
LiquidCrystal lcd(RS,EN,D4,D5,D6,D7);
void setup(){
analogRead(currentSensor); // prima lettura analogica della corrente
analogRead(voltageSensor); // prima lettura analogica della tensione
pinMode(BUTTON_PIN, INPUT); // definizione pin pulsante
pinMode(RELE, OUTPUT); // definizione pin rele'
lcd.begin(16,2); //inizializzazione lcd 16x2
delay (10);
// Messaggio iniziale
lcd.print(NAME) ; // messaggio di test
lcd.setCursor(0,1); //setta il cursore sulla seconda linea display
lcd.print("Versione ");
lcd.print(VERSION);
delay(2000); // pausa di 2 secondi
lcd.clear(); // cancellazione display
delay(10); // pausa per effettuazione operazione
}
void loop(){
PulsantePower();
for(int i = 0; i < 300; i++) // leggendo 300 volte per ottenere un risultato medio più stabile
{
Cdata = Cdata + analogRead(currentSensor);
Vdata = Vdata + analogRead(voltageSensor);
delay(1);
}
Cdata=Cdata/300;
V=(Cdata/1024.0)*5000;
I=((V - 2500)/ 96);
Vdata=Vdata/300;
vOUT = (Vdata * 5.0) / 1024.0;
vIN = (vOUT / (R2/(R1+R2)));
// Stampa del valore di tensione sullo schermo
lcd.setCursor(0,0); // setta il cursore sulla prima linea display
lcd.print("V: "); // scrive la parola VOLTS:
lcd.print(vIN); // riporta il valore calcolato dei volts
// Stampa del valore dell'amperaggio sullo schermo
lcd.setCursor(0,1); //setta il cursore sulla seconda linea display
lcd.print("A: "); //scrivi la parola AMPS:
if (I<0) {lcd.print("0.0");} else {lcd.print(I);} // riporta il valore calcolato degli ampere
// Stampa del valore dei watt sullo schermo
lcd.setCursor(9,0); //setta il cursore sulla prima linea display
lcd.print("W: "); //scrivi la parola AMPS:
value=(I * vIN);
if (value<0){lcd.print("0.0");} else {lcd.print(value);}
// Reimposta i valori
Cdata=0;
I=0;
V=0;
Vdata=0;
vIN=0;
value;
}
void PulsantePower() {
if (millis() - lastTimeButtonStateChanged > debounceDuration) {
byte buttonState = digitalRead(BUTTON_PIN);
if (buttonState != lastButtonState) {
lastTimeButtonStateChanged = millis();
lastButtonState = buttonState;
if (buttonState == LOW) {
ReleState = !ReleState;
digitalWrite(RELE, ReleState);
// Stampa del valore dell'uscita
if (ReleState == HIGH) {
lcd.setCursor(9,1); //setta il cursore sulla seconda linea display
lcd.print("Out ON ");
}
else {
lcd.setCursor(9,1); //setta il cursore sulla seconda linea display
lcd.print("Out OFF");
}
}
}
}
}