[code]
//collegamenti
// due fili alla batteria servizi
// 3 fili ad Allegro ACS758 50A bipolare
// alimentazione 12V
#include <LiquidCrystal.h>
#include <swRTC.h>
swRTC rtc;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
float ingressoVolt;
float ingressoAmpere;
int rele = 8;
int buzzer = 9;
int ledRosso =13;
float volt;
float voltMax; //volt max (hold)
float voltMin = 1023; //volt min (hold)
float ampere;
float ampereMax = 1023; //ampere consumo max (hold)
float ampereBil; //ampere in bilancio tra caricati e scaricati
float ampereKa; // aampre caricando
float ampereKaMax; //ampere caricando max (hold)
int watt;
int wattKa; //watt caricando
int carica; // per percentuale stato carica batteria
unsigned long msec =0; // per wattOre, amperOre in carica, consumo e in bilancio
unsigned long millisec; //
unsigned long secondi; //
unsigned long ore; //
unsigned long minuti; //
float millivolt; //
float tempo; //
int avanzare; //
float caricaTot ; //
float caricaTotKa ; //
float caricaTotBil; //
float ampMedio; //
float ampMedioKa; //
float ampMedioBil; //
float ampOre; //
float ampOreKa; //
float ampOreBil; //
int wattOre; //
int wattOreKa; //
int wattOreBil; //
int tastoTaci; // tacitazione allarme
int puls; // pulsante sequenze lcd
int cambia =0; // cambio di stato
int state = 0; // cambio di stato
int ciao = 0; // cambio di stato
int miao = 0; // cambio di stato
int ziao = 0; // cambio di stato
int piao = 0; // cambio di stato
void setup() {
lcd.begin(20, 4);
Serial.begin (9600);
rtc.stopRTC();
rtc.setTime(00, 00, 00);
rtc.startRTC();
pinMode(13, OUTPUT);
pinMode(10, INPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
lcd.clear();
}
void loop() {
lcd.setCursor(0, 0); //cursore vai al primo carattere della prima rica
lcd.print("D ");
lcd.print(rtc.getDay(), DEC); // fammi vedere i giorni
lcd.setCursor(5, 0);
lcd.print("H ");
lcd.print(rtc.getHours(), DEC); // fammi vedere le ore
lcd.print(":");
lcd.print(rtc.getMinutes(), DEC); // fammi vedere i minuti
lcd.print(":");
lcd.print(rtc.getSeconds(), DEC); // fammi vedere i secondi
lcd.print(" ");
ingressoVolt = analogRead (A3); //collego batteria servizi
delay(50);
volt = ingressoVolt*(20.1 / 1023.0); //calcolo del partitore di tensione, 20V in, 5V out
delay(50); // consiglio 4 resistenze identiche tra loro, meglio da 10Kohm,
// 3 in parallelo tra il meno e pin arduino, 1 tra segnale e pin arduino
ingressoAmpere = analogRead (A2); //collego sensore mpere ACS 758
millivolt = ingressoAmpere * (5000.0 / 1023.0); //calcoli per Allegro ACS 758 50A bi
millivolt = millivolt - 2500 ; //calcoli per Allegro ACS 758 50A bi
delay(50); //calcoli per Allegro ACS 758 50A bi
ampere = millivolt/40; //calcoli per Allegro ACS 758 50A bi
if (ampere > 0){ // solo negativi, consumando
ampere=0;
}
delay(50);
watt = volt * ampere; // calcolo dei watt consumando
delay(50);
avanzare = avanzare + 1; // calcolo per i wattOra, amperOra consumate
millisec = millis(); // calcolo per i wattOra, amperOra consumate
tempo = millisec/1000.0/3600.0 ; // calcolo per i wattOra, amperOra consumate
caricaTot = caricaTot + ampere; // calcolo per i wattOra, amperOra consumate
ampMedio = caricaTot / avanzare; // calcolo per i wattOra, amperOra consumate
ampOre = ampMedio*tempo ; // calcolo per amperOra consumate
delay(50);
wattOre = volt * ampOre; //wattOre consumate
delay(50);
carica = ingressoVolt/(1023.0/20.0/100.0) -1180; //calcolo percentuale carica batteria, 11,80v == 0%,, 12,80v == 100%
carica = constrain (carica, 0, 100); //calcolo percentuale carica batteria, 11,80v == 0%,, 12,80v == 100%
delay(50);
ampereKa = millivolt/40; //calcoli per Allegro ACS 758 50A bi
if (ampereKa < 0){ // solo positivi, caricando
ampereKa=0;
}
delay(50);
wattKa = volt * ampereKa; //watt caricando
delay(50);
caricaTotKa = caricaTotKa + ampereKa; // calcolo per i wattOra, amperOra caricate
ampMedioKa = caricaTotKa / avanzare; // calcolo per i wattOra, amperOra caricate
ampOreKa = ampMedioKa*tempo ; // calcolo per amperOra caricate
delay(50);
wattOreKa = volt * ampOreKa; // wattOra caricate
delay(50);
ampereBil = millivolt/40; // calcolo per i wattOra, amperOra in bilancio
delay(50);
caricaTotBil = caricaTotBil + ampereBil; // calcolo per i wattOra, amperOra in bilancio
ampMedioBil = caricaTotBil / avanzare; // calcolo per i wattOra, amperOra in bilancio
ampOreBil = ampMedioBil*tempo ; // calcolo per amperOra in bilancio
wattOreBil = volt * ampOreBil; // watt in bilancio
delay(50);
voltMax = max(volt, voltMax); // per far restare inpresso i volt max raggiunti
voltMin = min(volt, voltMin); // per far restare inpresso i volt min raggiunti
ampereMax = min(ampere, ampereMax); // per far restare inpresso gli ampere min raggiunti in consumo
ampereKaMax = max(ampereKa, ampereKaMax); // per far restare inpresso gli ampere max raggiunti in carica
//----------------------------------------
lcd.setCursor(15, 0);
lcd.print("% ");
lcd.print(carica);
lcd.print(" ");
//--------------------------------------------
tastoTaci = digitalRead (10);
if ((volt <11.80)and(tastoTaci ==LOW)and(cambia == 0)) {
digitalWrite(ledRosso,HIGH); // segnalazione allarme batt scarica
analogWrite (buzzer, 1000); // allarme
digitalWrite (rele,HIGH); // rele fai qualcosa
cambia=1;
}
else if ((volt <11.80)&& (tastoTaci ==HIGH)&&(cambia==1)){
digitalWrite(ledRosso,LOW);
analogWrite (buzzer, LOW);
digitalWrite (rele,LOW);
cambia=1;
}
if (volt > 11.80){
digitalWrite(ledRosso,LOW);
analogWrite (buzzer, LOW);
digitalWrite (rele,LOW);
cambia=0;
}
//------------------------------------------------------------------------------------------------------------------------------
puls = digitalRead(6); // faccio pigiare il pulsante alla ragazza di turno
if ((puls==HIGH )&& (state==0)){
lcd.setCursor(0, 1);
lcd.print("Ti Amo ");
lcd.setCursor(0, 2);
lcd.print("che fai ");
lcd.setCursor(0, 3);
lcd.print("stasera ? ");
state=1;
ziao=0;
}
//-----------------------------------------------------
if ((puls==LOW )&& (state==1)) { // rilascia il pulsante
lcd.setCursor(0, 1);
lcd.print("Volt BS ");
lcd.print(volt,2);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("Volt Max ");
lcd.print(voltMax);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("Volt Min ");
lcd.print(voltMin);
lcd.print(" ");
ciao=1;
}
//---------------------------------------------------------------------------------------------------------------------------------
if ((puls==HIGH )&& (ciao==1)){ //faccio rischiacciare il pulsante alla ragazza di turno
lcd.setCursor(0, 1);
lcd.print("Ti Amo ");
lcd.setCursor(0, 2);
lcd.print("che fai ");
lcd.setCursor(0, 3);
lcd.print("stasera ? ");
state=3;
ciao=2;
}
//-----------------------------------
if ((puls==LOW )&& (ciao==2)) { // rilascia il pulsante
lcd.setCursor(0, 1);
lcd.print("A Konsumo ");
if (ampere>=0){
lcd.setCursor(14, 1);
}
lcd.print(ampere,1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("A KonsumoMax ");
lcd.print(ampereMax,1);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("W konsumo ");
lcd.setCursor(13, 3);
if (ampere >= 0){
lcd.setCursor(14, 3);
}
lcd.print(watt);
lcd.print(" ");
state=3;
miao=1;
}
//----------------------------------------------------------------------------------------------------------------------
if ((puls==HIGH )&& (miao==1)) { //magari non ha capito
lcd.setCursor(0, 1);
lcd.print("Ti Amo ");
lcd.setCursor(0, 2);
lcd.print("che fai ");
lcd.setCursor(0, 3);
lcd.print("stasera ? ");
state=3;
ciao=3;
miao=2;
}
//----------------------------------------
if ((puls==LOW )&& (miao==2)) {
lcd.setCursor(0, 1);
lcd.print("A Karika ");
lcd.setCursor(13, 1);
lcd.print("+");
lcd.print(ampereKa,1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("W Karika ");
lcd.setCursor(13, 2);
lcd.print("+");
lcd.print(wattKa);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("A KarikaMax ");
lcd.setCursor(13, 3);
lcd.print("+");
lcd.print(ampereKaMax,1);
lcd.print(" ");
state=3;
ciao=3;
ziao=1;
}
//----------------------------------------------------------------------------------------------------------
if ((puls==HIGH )&& (ziao==1)) { //magari non ha capito
lcd.setCursor(0, 1);
lcd.print("Ti Amo ");
lcd.setCursor(0, 2);
lcd.print("che fai ");
lcd.setCursor(0, 3);
lcd.print("stasera ? ");
state=3;
ciao=3;
miao=3;
ziao=2;
}
//---------------------------------------------
if ((puls==LOW )&& (ziao==2)) {
lcd.setCursor(0, 1);
lcd.print("Ah konsumo ");
lcd.setCursor(13, 1);
if (ampOre >= 0){
lcd.setCursor(14, 1);
}
lcd.print(ampOre,1);
lcd.print(" ");
//--------------
lcd.setCursor(0, 2);
lcd.print("Ah Karika ");
lcd.setCursor(13, 2);
lcd.print("+");
lcd.print(ampOreKa,1);
lcd.print(" ");
//----------
lcd.setCursor(0, 3);
lcd.print("Ah Bilancio ");
if (ampOreBil > 0){
lcd.setCursor(13, 3);
lcd.print("+");
}
lcd.setCursor(14, 3);
if (ampOreBil < 0){
lcd.setCursor(13, 3);
}
lcd.print(ampOreBil,1);
lcd.print(" ");
state=3;
ciao=3;
miao=3;
piao=1;
}
//-------------------------------------------------------------------------------------------------------
if ((puls==HIGH )&& (piao==1)) {
lcd.setCursor(0, 1);
lcd.print("Ti Amo ");
//----
lcd.setCursor(0, 2);
lcd.print("che fai ");
//---
lcd.setCursor(0, 3);
lcd.print("stasera ? ");
state=3;
ciao=3;
miao=3;
ziao=3;
piao=2;
}
//---------------------------------
if ((puls==LOW )&& (piao==2)) {
lcd.setCursor(0, 1);
lcd.print("Wh konsumo ");
lcd.setCursor(13, 1);
if (wattOre >= 0){
lcd.setCursor(14, 1);
}
lcd.print(wattOre);
lcd.print(" ");
//----
lcd.setCursor(0, 2);
lcd.print("Wh Karika ");
lcd.setCursor(13, 2);
lcd.print("+");
lcd.print(wattOreKa);
lcd.print(" ");
//---
lcd.setCursor(0, 3);
lcd.print("Wh Bilancio ");
if (wattOreBil > 0){
lcd.setCursor(13, 3);
lcd.print("+");
}
lcd.setCursor(14, 3);
if (wattOreBil < 0){
lcd.setCursor(13, 3);
}
lcd.print(wattOreBil);
lcd.print(" ");
state=0;
ciao=3;
miao=3;
ziao=3;
piao=3;
}
}
[/code]
Modificato da camperos il 30/03/2013 alle 21:25:09