// *************************************************
// * CONTROLLER CRUSCOTTO GENERICO *
// * Rel 1.09 *
// * *
// * By Cosimo Salvo 338-9128462 *
// *************************************************
// DICHIARAZIONE VARIABILI
#include <EEPROM.h>
#include <LiquidCrystal.h>
// Dichiarazione ingressi analogici
int pin_olio = A0;
int h2o_pin = A1;
int bat_pin = A2;
int pin_starter = A3;
int livello_gasolio = A4;
// --------------------------------
// Dichiarazione variabili sensori
int errore_olio = 0;
int preriscaldo = 0;
int errore_acqua = 0;
int riserva = 0;
// --------------------------------
// dichiarazione attuatori
const int avviamento = 2;
const int candelette = 3;
const int gasolio = 13;
const int buzzer = 4;
const int alrm_on = 5;
const int pwr_on = 6;
// --------------------------------
// Dichiarazione variabili di servizio
char stato = ' '; // quando lampeggia indica che il contaore è attivo
char stato_riserva = ' '; // segnala sul display quando la macchina e a riserva
char stato_contaore = ' '; // segnala sul display le ore della macchina
int contatore = 0; // trasporta il valore letto dall'eprom
int xtime = 500; // imposta un timer di attesa
int secondi = 0; // secondi che incrementa il contaore
int secondi2 = 0;
int secdisplay = 0;
int cke = 0; // stato errore
// Definisce un nuovo carattere personalizzato per la clessidra
byte clessidra[] = {
B11111,
B01010,
B00100,
B01010,
B11111
};
// --------------------------------
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
// STARTUP PROGRAMMA
void setup() {
Serial.begin(9600); // inizializza seriale
while (!Serial); // attende inizializzazione seriale
lcd.begin(16, 2); // Imposta LCD
EEPROM.get(0, contatore); // legge in contaore
pinMode(pwr_on, OUTPUT); // imposta variabile di uscita led verde
pinMode(alrm_on, OUTPUT); // imposta variabile di uscita led rosso
pinMode(buzzer, OUTPUT); // imposta variabile di uscita buzzer
pinMode(gasolio, OUTPUT); // imposta variabile di uscita solenoide gasolio
pinMode(candelette, OUTPUT); // imposta variabile di uscita preriscaldo
pinMode(avviamento, OUTPUT); // imposta variabile di uscita motorino avviamento
lcd.createChar(0, clessidra); // Crea il nuovo carattere personalizzato per la clessidra
// --------------------- INIZIO PROGRAMMA -------------------------------
digitalWrite(pwr_on, HIGH); // ACCENDE LED VERDE
digitalWrite(candelette, HIGH); // ACCENDE PRERISCALDO
intestazione(); // VISUALIZZA INTESTAZIONE
digitalWrite(candelette, LOW); // SPEGNE PRERISCALDO
}
void loop() {
// -LETTURA DEI SENSORI --------------------------------------------------------------------
float pressione_olio = analogRead(pin_olio); // Legge la pressione dell'olio
float ON_starter = analogRead(pin_starter); // Legge se è in fase di avviamento
float riserva = analogRead(livello_gasolio); // Legge il livello del gasolio
float h2o_value = analogRead(h2o_pin); // Legge sensore acqua
float bat_value = analogRead(bat_pin); // Legge se la dinamo è in funzione
// -FASE DI AVVIAMENTO --------------------------------------------------------------------
if (ON_starter >= 512) { // Fase di avviamento in ON
errore_olio = 0; // azzera errore olio
preriscaldo = 0; // preriscaldo
digitalWrite(gasolio, HIGH); // attiva gasolio
digitalWrite(avviamento, HIGH) ; // motorino avviamento
}
else digitalWrite(avviamento, LOW); // Fase di avviamento in OFF
// -GESTIONE ERRORI -----------------------------------------------------------------------
if (errore_olio <= 10 && errore_acqua <= 20) digitalWrite(gasolio, HIGH); // Tiene attivo il gasolio fino a 10 sec.
else digitalWrite(gasolio, LOW); // Chiude immediatamente il gasolio
// -GESTIONE LIVELLO CARBURANTE -----------------------------------------------------------
if (riserva > 512) { // Se il carburante è in riserva
lcd.setCursor(6,1), lcd.print(" RISERVA "); // Avvisa sul display
digitalWrite(alrm_on, HIGH); // accende led rosso
cke = 1 ;
}
else digitalWrite(alrm_on, LOW); //Se il carburante non è in riserva
// -GESTIONE OLIO -----------------------------------------------------------------------
if (pressione_olio > 512) { // Se scende la pressione dell'olio
lcd.setCursor(0,0), lcd.print( " ATTENZIONE!! ") ;
lcd.setCursor(6,1), lcd.print("Press.OLIO"); // ""
digitalWrite(alrm_on, HIGH), digitalWrite(buzzer, HIGH),// accende led rosso e attiva buzzer
errore_olio ++ ; // inizia a contare i secondi
cke = 1 ;
}
else errore_olio = 0 ; // Se la pressione dell'olio è regolare
// -GESTIONE PRERISCALDO ------------------------------------------------------------------
if (preriscaldo <= 3) digitalWrite(candelette, HIGH), preriscaldo ++; // Tiene attivo preriscaldo per 3 sec.
else digitalWrite(candelette, LOW); // Spegne preriscaldo
// -GESTIONE TEMPERATURA ACQUA ------------------------------------------------------------
if (h2o_value > 512) { // Se alza la temperatura dell'acqua
lcd.setCursor(0,0), lcd.print( " ATTENZIONE!! ") ;
lcd.setCursor(6,1), lcd.print("Temp.ACQUA"); // ""
digitalWrite(alrm_on, HIGH), digitalWrite(buzzer, HIGH);// accende led rosso e attiva buzzer
errore_acqua ++; // inizia a contare
cke = 1 ;
}
else errore_acqua = 0; // Se la temperatura acqua è regolare
// -GESTIONE LIVELLO DI CARICA ------------------------------------------------------------
if (bat_value > 512) { // Se il livello di carica non è regolare
lcd.setCursor(0,0), lcd.print( " ATTENZIONE!! ") ;
lcd.setCursor(6,1), lcd.print(" BATTERIA "); // ""
digitalWrite(alrm_on, HIGH), digitalWrite(buzzer, HIGH);// accende led rosso e attiva buzzer
cke = 1 ;
}
// -FINE CICLO PROGRAMMA ------------------------------------------------------------------
// -VISUALIZZAZIONE CONTAORE --------------------------------------------------------------
String stato_contaore = String(contatore,DEC); //Dichiara we riempe la variabile
stato_contaore = String(stato_contaore.length() < 4 ? "0000" + stato_contaore: stato_contaore);
stato_contaore = stato_contaore.substring(stato_contaore.length()-4);
// ----------------------------------------------------------------------------------------
lcd.setCursor(0,1), lcd.write(stato);
lcd.setCursor(1,1), lcd.print(stato_contaore);
delay(500), digitalWrite(alrm_on, LOW), digitalWrite(buzzer, LOW), delay(500); //Pausa (1SEC.)
if (cke == 0) lcd.setCursor(6,1), lcd.print(" "); // Avvisa sul display
if (stato == ' ') stato = byte(0); else stato = ' ' ;
lcd.setCursor(0,0), lcd.print(" RAMA Service "); // stampa intestazione sul display
// -GESTIONE CONTAORE ---------------------------------------------------------------------
if (digitalRead(gasolio) == 1) {
secondi = secondi + 1;
if (secondi == 3600) {
secondi = 0;
contatore = contatore +1;
EEPROM.put(0, contatore);
}
}
// -STAMPA SU SERIALE ---------------------------------------------------------------------
Serial.print(pressione_olio);
Serial.print(",");
Serial.print(h2o_value);
Serial.print(",");
Serial.print(bat_value);
Serial.print(",");
Serial.print(contatore);
Serial.print(",");
Serial.print(ON_starter);
Serial.print(",");
Serial.print(errore_olio);
Serial.print(",");
Serial.print(errore_acqua);
Serial.print(",");
Serial.print(secondi);
Serial.print(",");
Serial.print(riserva);
Serial.print(",");
Serial.print(digitalRead(gasolio));
Serial.print(",");
Serial.print(cke);
Serial.print(",");
Serial.print("18/05/2023");
Serial.print(",");
Serial.print("1.09");
Serial.print(",");
Serial.print(digitalRead(pwr_on));
Serial.print(",");
Serial.println(digitalRead(candelette));
cke = 0;
secondi2 ++;
if (secondi2 == 5) secondi2 =0, lcd.begin(16, 2), lcd.print(" RAMA Service "); // Imposta LCD
}
void intestazione() {
lcd.setCursor(0,0), lcd.print(" RAMA Service ");
lcd.setCursor(0,1), lcd.print(" " +String(contatore));
delay(xtime);
lcd.setCursor(0,1), lcd.print(" 0932 866960 ");
delay(xtime);
lcd.setCursor(0,1), lcd.print(" ");
delay(xtime);
lcd.setCursor(0,1), lcd.print(" 0932 866960 ");
delay(xtime);
lcd.setCursor(0,1), lcd.print(" ");
delay(xtime);
}