Buona sera a tutti , mentre mi districavo tra una serie di if e di comparatori ero consapevole dell'esistenza del costrutto switch/ case di cui ho letto e riletto (invano) . Ma non riesco a comprenderlo ; posto il codice su cui sto lavorando e che funziona per quella che al momento è la versione di base .
Magari vi va di darmi un calcio nella giusta direzione ![]()
Grazie mille.
//******VERSIONE 0.2 DEL TESTER DI BATTERIE************//
/*FUNZIONAMENTO : ACCENDO E IL DISPLAY MOSTRA LA SCRITTA DEL SETUP. DOPO 2 SECONDI :
SE LA BATTERIA E' INFERIORE A 0,9V ( O NON E' COLLEGATA ) SCRIVO SUL DISPLAY "INSERIRE BATTERIA"
ALTRIMENTI LEGGO LA TENSIONE PRESENTE IN TEMPO REALE.
SE LA BATTERIA CONNESSA HA UNA TENSIONE MAGGIORE DI 2,8 V E' POSSIBILE AVVIARE IL CICLO DI TEST CHE SI PUO' AVVIARE PREMENDO IL PULSANTE START.
A QUESTO PUNTO IL FUNZIONAMENTO E' AUTOMATICO E A SECONDA DEI PARAMETRI IMPOSTATI SI AVRA' UN RISULTATO POSITIVO O NEGATIVO.*/
//******FUNZIONA CORRETTAMENTE**********//
//******PASSO ALLA VERSIONE 0.3**********//
#include <Wire.h>
#include <PCF8574_HD44780_I2C.h>
PCF8574_HD44780_I2C lcd(0x27,16,2);
// VOLTMETRO A0 //ingresso voltmetro
// AMPEROMETRO A1 //ingresso amperometro
// TASTO START PIN2 //avvio ciclo di inserzione carico
// SCL $ SDA DIPLAY I2C
// RELE DI CARICO PIN 6 //rele di carico
// LED BLU PIN 7 //led blu di scarica in corso (sarebbe bello se lampeggiasse)
// LED VERDE PIN 8 //led rosso di fine scarica con esito negativo
// LED ROSSO PIN 9 //led verde di fine scarica con esito positivo
#define tasto_start 2 //Definizione pin pulsante di avvio
#define carico 6 //rele di carico
#define led_blu 7 //led blu di scarica in corso (sarebbe bello se lampeggiasse)
#define led_verde 8 //led rosso di fine scarica con esito negativo
#define led_rosso 9 //led verde di fine scarica con esito positivo
int era_tasto_start ; // Variabile valore tasto di avvio
float voltmetro ; //qui assegno la tensione rilevata sul pin A0
float amperometro ; //qui assegno la corrente rilevata sul pin A1
unsigned long millis_iniziali ;
unsigned long ritardo = 60000; //al momento un minuto(sarà poi da impostare con encoder)
int ciclo =0;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" BATTERY TESTER");
lcd.setCursor(0, 1);
lcd.print(" VERSIONE V 0.2"); //VERSIONE 0.2
pinMode (tasto_start, INPUT_PULLUP); //pin tasto_start ingresso
pinMode (carico, OUTPUT); //pin relè carico
pinMode (led_blu, OUTPUT); //ciclo in corso
pinMode (led_verde, OUTPUT); //ciclo finito con esito positivo
pinMode (led_rosso, OUTPUT); //ciclo finito con esito negativo
millis_iniziali = millis() ; //tengo traccia del tempo dall'avvio
era_tasto_start = digitalRead(tasto_start) ;
voltmetro = digitalRead (A0);
amperometro = digitalRead (A1);
delay(2000);
}
void loop() {
/****calcolo ampere****/
float Acslettura=0.0,campioni=0.0,media=0.0;
for (int a = 0; a < 150; a++){ //ricavo 15 valori
Acslettura = analogRead(A1) ; //leggo valore ritorno acs712 c.to 1
campioni = campioni + Acslettura; //sommo i valori per calcolare la media
delay (10); }
media=(campioni/150); //calcolo la media dei valori
amperometro = (2.5 - (media * (5.0 / 1024.0)) )/0.0315; //formula per ottenere il valore definitivo
if (amperometro < 0.10){
amperometro = 0.00;}
delay(20);
/****calcolo volt****/
voltmetro = ((5.0/1024.0)*analogRead(A0))*((30+7.5)/7.5);
delay(20);
int ora_tasto_start = digitalRead(tasto_start) ; // Leggo valori tempo reale
if((ora_tasto_start != era_tasto_start)&&(voltmetro > 2.8)){
digitalWrite(carico, HIGH);
digitalWrite(led_blu, HIGH);
ciclo = 1;
ora_tasto_start = era_tasto_start ;
}
if(((voltmetro <= 2.8) && ((millis()-millis_iniziali) <= ritardo)) && (ciclo == 1)){
ciclo = 2; //mi serve per impedire l'accavallamento dei due fine ciclo.
millis_iniziali = millis(); //aggirno millis
digitalWrite(carico, LOW);
digitalWrite(led_blu, LOW);
digitalWrite(led_rosso, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BATTERIA DA ");
lcd.setCursor(0, 1);
lcd.print("BUTTARE ");
delay(250);
}
if(((voltmetro <= 2.8) && ((millis()-millis_iniziali) >= ritardo)) && (ciclo == 1)){
ciclo = 3; //mi serve per impedire l'accavallamento dei due fine ciclo.
millis_iniziali = millis(); //aggirno millis
digitalWrite(carico, LOW);
digitalWrite(led_blu, LOW);
digitalWrite(led_verde, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BATTERIA DA ");
lcd.setCursor(0, 1);
lcd.print("UTILIZZARE ");
delay(250);
}
if ((voltmetro > 2.8) && (ciclo == 1)){
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("SCARICA ");
lcd.setCursor(0, 1);
lcd.print("V= ");
lcd.setCursor(3, 1);
lcd.print(voltmetro);
lcd.setCursor(8, 1);
lcd.print("A= ");
lcd.print(amperometro);
delay(2000);
}
if ((ciclo == 0) &&(voltmetro >= 0.8)){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TENSIONE ");
lcd.setCursor(0, 1);
lcd.print("V= ");
lcd.setCursor(4, 1);
lcd.print(voltmetro);
delay(250);
}
if ((ciclo == 0) &&(voltmetro <= 0.8)){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("INSERIRE ");
lcd.setCursor(0, 1);
lcd.print("BATTERIA");
delay(250);
}
}
