// CONTROLLER CRUSCOTTO GENERICO Rel 1.05
// 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
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
// --------------------- 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 OLIO -----------------------------------------------------------------------
if (pressione_olio > 512) { // Se scende la pressione dell'olio
lcd.setCursor(0,0), lcd.print(" ATTENZIONE!! "), // Avvisa sul display
lcd.setCursor(0,1), lcd.print(" OLIO"), // ""
digitalWrite(alrm_on, HIGH), digitalWrite(buzzer, HIGH),// accende led rosso e attiva buzzer
errore_olio ++ ; // inizia a contare i secondi
}
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!! "), // Avvisa sul display
lcd.setCursor(0,1), lcd.print("ACQUA"), // ""
digitalWrite(alrm_on, HIGH), digitalWrite(buzzer, HIGH);// accende led rosso e attiva buzzer
errore_acqua ++; // inizia a contare
}
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!! "), // Avvisa sul display
lcd.setCursor(0,1), lcd.print(" BATT"), // ""
digitalWrite(alrm_on, HIGH), digitalWrite(buzzer, HIGH);// accende led rosso e attiva buzzer
}
// -GESTIONE LIVELLO CARBURANTE -----------------------------------------------------------
if (riserva > 512) { // Se il carburante è in riserva
lcd.setCursor(9,1), lcd.print("RISERVA"), // Avvisa sul display
digitalWrite(alrm_on, HIGH); // accende led rosso
}
else digitalWrite(alrm_on, LOW);lcd.setCursor(9,1), lcd.print(" "); //Se il carburante non è in riserva
// -FINE CICLO PROGRAMMA ------------------------------------------------------------------
delay(500), digitalWrite(alrm_on, LOW), digitalWrite(buzzer, LOW), delay(500); //Pausa (1SEC.)
lcd.setCursor(0,0), lcd.print(" RAMA Service "); // stampa intestazione sul display
if (stato == ' ') stato = '*'; else stato = ' ' ; lcd.setCursor(0,1), lcd.print(stato);
// -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(1, 1); lcd.print(stato_contaore); //stampa 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.println("oil:(" + String(pressione_olio) + ")"+
"-h2o:(" + String(h2o_value) + ")"+
"-Batt.:(" + String(bat_value) + ")"+
"-ore:(" + String(contatore) + ")"+
"-Start:(" + String(ON_starter) + ")"+
"-ERRoil:(" + String(errore_olio) + ")"+
"-ERRh20:(" + String(errore_acqua) + ")"+
"-Sec.:(" + String(secondi) + ")"+
"-Ris.:(" + String(riserva) + ")"+
"-Gas.:(" + digitalRead(gasolio) + ")");
}
void intestazione() {
Serial.println(" *************************************************"); //invia a seriale
Serial.println(" * CONTROLLER CRUSCOTTO GENERICO *"); //invia a seriale
Serial.println(" * Rel 1.05 *"); //invia a seriale
Serial.println(" * *"); //invia a seriale
Serial.println(" * By Cosimo Salvo 338-9128462 *"); //invia a seriale
Serial.println(" *************************************************"); //invia a seriale
Serial.println("Contaore: " + String(contatore)); //invia a seriale
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);
}