#include <EEPROM.h> // Libreria per l'utilizzo della memoria EEPROM
#include <SD.h>
#include <FlexiTimer2.h> // Libreria display fornita dalla casa madre
String t0 = "************************************************************";
String t1 = "* GESTIONE TAGLIA ASFALTO PER CAT299 *";
String t2 = "* *";
String t3 = "* By Cosimo Salvo (338-9128462) Rel 1.01 *";
String t4 = "************************************************************";
#define uchar unsigned char
#define uint unsigned int
// Definizione generale delle variabili
int modotest = 0;
int controlloPC = 1;
// ------------------------------------
int display_dat;
int key_value;
// ------------------------------------ CONTROLLO DEL DISPLAY 74HC595 ------------------------------------
int latchPin = 5; //Pin connesso al latch del display
int clockPin =6; //Pin connesso al clock del display
int dataPin = 3; //Pin connesso al data del display
int OE_595 = 4; //Pin connesso al 595_OE del display
/* NO.:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 23 24 25 26 27 28
/*Character :0,1,2,3,4,5,6,7,8,9,A, b, C, c, d, E, F, H, h, L, n, N, o, P, r, t, U, -, ,*/
uchar TUBE_SEG[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x58,0x5e,0x79,0x71,0x76,0x74,0x38,0x54,0x37,0x5c,0x73,0x50,0x78,0x3e,0x40,0x00}; //galleria comune dei caratteri digitali
uchar TUBE_NUM[8]={0xfe,0xff,0xfd,0xff,0xfb,0xff,0xf7,0xff,};//Tavola dei numeri
uchar dat_buf[8];
//***********************************************
// dat : Data to be displayed
// com_num : Digital Tube Common
//relay_port : Relay port
//***********************************************
uchar dat;
uchar com_num;
uchar relay_port;
void TubeDisplayOneBit()
{
uchar tube_dat,bit_num;
uchar display_l,display_h,relay_dat;
//digitalWrite(13,!digitalRead(13));
tube_dat = TUBE_SEG[dat]; //Common Cathode Digital Tube,bit negated
bit_num = TUBE_NUM[com_num];
//ground latchPin and hold low for as long as you are transmitting
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, bit_num);
shiftOut(dataPin, clockPin, MSBFIRST, tube_dat);
//return the latch pin high to signal chip that it
//no longer needs to listen for information
digitalWrite(latchPin, HIGH);
}
uint OneSecondCnt=500;
// ----------------------------------FINE CONTROLLO DEL DISPLAY 74HC595 ----------------------------------
// Dichiarazione delle costanti per i pin dei pulsanti e dei relè
const int Grilletto = 17; // Definisce Grilletto per Avvia Ruota
const int opzione1 = 18; // Definisce Opzione 1
const int opzione2 = 19; // Definisce Opzione 2
const int pulsante1 = 20; // Definisce Pulsante 3
const int pulsante2 = 21; // Definisce Pulsante 4
const int ruotaFR = 40; // Definisce l'uscita per far ruotare in avanti la ruota
const int ruotaBK = 41; // Definisce l'uscita per far ruotare indietro la ruota
const int nastroFR = 42; // Definisce l'uscita per far andare avanti il nastro
const int nastroBK = 43; // Definisce l'uscita per far andare indietro il nastro
const int auxDX = 44; // Definisce l'uscita ausiliare destra
const int auxSX = 45; // Definisce l'uscita ausiliare sinistra
const int opzione = 46; // Definisce l'uscita della valvola opzionale
const int sirena = 47; // Definisce l'uscita della sirena
unsigned long Millisecondi = 0; // Variabile per memorizzare il tempo in millisecondi
unsigned long TotMinuti = 0; // Variabile per memorizzare il totale di minuti di funzionamento
// Variabile per memorizzare lo stato del pulsante Grilletto nell'iterazione precedente
bool grillettoPremutoPrecedente = false;
// Funzione per inizializzare i pin dei pulsanti e dei relè
// Switch on LED on and off each half second
void setup() {
//Inizializzazione pin Display
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(OE_595, OUTPUT);
// Inizializzazione dei pin dei pulsanti come input con pull-up interni
pinMode(Grilletto, INPUT_PULLUP);
pinMode(opzione1, INPUT_PULLUP);
pinMode(opzione2, INPUT_PULLUP);
pinMode(pulsante1, INPUT_PULLUP);
pinMode(pulsante2, INPUT_PULLUP);
// Inizializzazione dei pin dei relè come output
pinMode(ruotaFR, OUTPUT);
pinMode(ruotaBK, OUTPUT);
pinMode(nastroFR, OUTPUT);
pinMode(nastroBK, OUTPUT);
pinMode(auxDX, OUTPUT);
pinMode(auxSX, OUTPUT);
pinMode(opzione, OUTPUT);
pinMode(sirena, OUTPUT);
// azzera tutte le uscite inizializzate
digitalWrite(ruotaFR, LOW);
digitalWrite(ruotaBK, LOW);
digitalWrite(nastroFR, LOW);
digitalWrite(nastroBK, LOW);
digitalWrite(auxDX, LOW);
digitalWrite(auxSX, LOW);
digitalWrite(opzione, LOW);
digitalWrite(sirena, LOW);
// Inizializza la comunicazione seriale
Serial.begin(9600);
// Leggi il tempo totale di funzionamento dalla memoria EEPROM-
EEPROM.put(0, TotMinuti); // Azzera memoria EEPROM |
EEPROM.get(0, TotMinuti); // |
// ------------------------------------------------------------
Serial.println(t0);
Serial.println(t1);
Serial.println(t2);
Serial.println(t3);
Serial.println(t4);
Serial.println(TotMinuti);
FlexiTimer2::set(2, 1.0/1000, TubeDisplay4Bit); // call every 2ms "ticks"
FlexiTimer2::start();
key_value = TotMinuti/60; // Aggiorna le ore di lavoro sul display
delay (1000); // Aspetta un secondo prima di avviare tutto
digitalWrite(OE_595, LOW);// Abilita il display 74HC595
// ----- ACCENDE LA SIRENA PER 2 SECONDI E AVVIA IL NASTRO TRASPORTATORE -----
beeplungo();
digitalWrite(nastroFR, HIGH) ; // Accende l'uscita del nastroBK |
// ---------------------------------------------------------------------------
}
void loop() {
// Controllo dello stato dei comandi
bool grillettoPremuto = digitalRead(Grilletto) == LOW; // Verifica se il pulsante Grilletto è premuto
bool opzione1premuto = digitalRead(opzione1) == LOW; // Verifica se il pulsante opzione 1 è premuto
bool opzione2premuto = digitalRead(opzione2) == LOW; // Verifica se il pulsante opzione 2 è premuto
bool pulsante1premuto = digitalRead(pulsante1) == LOW; // Verifica se il pulsante 1 è premuto
bool pulsante2premuto = digitalRead(pulsante2) == LOW; // Verifica se il pulsante 2 è premuto
// ------------- PARTE RIGUARDANTE IL NASTRO ----------------------------------------------
if (pulsante1premuto && !pulsante2premuto && !opzione1premuto && !opzione2premuto) { // P1(ON)-P2(OFF)-OP1(OFF)-OP2(OFF)
digitalWrite(nastroFR,LOW); // Spegne l'uscita del nastroFR
beepcorto();
digitalWrite(nastroBK,HIGH); // Attiva l'uscita del nastroBK
while (digitalRead(pulsante1) == LOW) { // Attendi finché il pulsante 1 non viene rilasciato
// Attendi
}
digitalWrite(nastroBK,LOW); // Spegne l'uscita del nastroBK
beepcorto();
digitalWrite(nastroFR,HIGH); // Attiva l'uscita del nastroFR
}
// ----------------------------------------------------------------------------------------
// -------------- PARTE RIGUARDANTE LA RUOTA ----------------------------------------------
if (!pulsante1premuto && !pulsante2premuto && !opzione1premuto && !opzione2premuto && !grillettoPremutoPrecedente && grillettoPremuto) { // // P1(OFF)-P2(ON)-OP1(OFF)-OP2(OFF)
digitalWrite(ruotaFR, !digitalRead(ruotaFR));
}
if (!pulsante1premuto && pulsante2premuto && !opzione1premuto && !opzione2premuto) { // P1(OFF)-P2(ON)-OP1(OFF)-OP2(OFF)
digitalWrite(ruotaFR,LOW); // Spegne l'uscita del ruotaFR
beepcorto();
digitalWrite(ruotaBK, HIGH) ; // Accende l'uscita del ruotaBK
while (digitalRead(pulsante2) == LOW) { // Attendi finché il pulsante 1 non viene rilasciato
// Attendi
}
digitalWrite(ruotaBK, LOW); // Attiva l'uscita del ruotaFR
}
grillettoPremutoPrecedente = grillettoPremuto; // Memorizza lo stato del pulsante Grilletto per l'iterazione successiva
// ----------------------------------------------------------------------------------------
// -------------- PARTE RIGUARDANTE LE SLITTE ---------------------------------------------
if (opzione1premuto && !opzione2premuto && pulsante1premuto && !pulsante2premuto) { // P1(ON)-P2(OFF)-OP1(ON)-OP2(OFF)
digitalWrite(auxDX, HIGH); // Avvia sollevamento delle slitte
while (digitalRead(pulsante1) == LOW) { // Attendi finché il pulsante 1 non viene rilasciato
// Attendi
}
digitalWrite(auxDX, LOW); // Arresta sollevamento delle slitte
}
if (opzione1premuto && !opzione2premuto && !pulsante1premuto && pulsante2premuto) { // P1(OFF)-P2(ON)-OP1(ON)-OP2(OFF)
digitalWrite(auxSX, HIGH); // Avvia abbassamento delle slitte
while (digitalRead(pulsante2) == LOW) { // Attendi finché il pulsante 2 non viene rilasciato
// Attendi
}
digitalWrite(auxSX, LOW); // Arresta abbassamento delle slitte
}
// ----------------------------------------------------------------------------------------
// -------------- PARTE RIGUARDANTE LA TRASLAZIONE ----------------------------------------
if (!opzione1premuto && opzione2premuto && pulsante1premuto && !pulsante2premuto) { // P1(ON)-P2(OFF)-OP1(OFF)-OP2(ON)
digitalWrite(auxDX, HIGH); // Avvia traslazione a destra
digitalWrite(opzione, HIGH); // Avvia opzione
while (digitalRead(pulsante1) == LOW) { // Attendi finché il pulsante 1 non viene rilasciato
// Attendi
}
digitalWrite(auxDX, LOW); // Arresta traslazione a destra
digitalWrite(opzione, LOW); // Arresta opzione
}
if (!opzione1premuto && opzione2premuto && !pulsante1premuto && pulsante2premuto) { // P1(OFF)-P2(ON)-OP1(OFF)-OP2(ON)
digitalWrite(auxSX, HIGH); // Avvia traslazione a sinistra
digitalWrite(opzione, HIGH); // Avvia opzione
while (digitalRead(pulsante2) == LOW) { // Attendi finché il pulsante 2 non viene rilasciato
// Attendi
}
digitalWrite(auxSX, LOW); // Arresta traslazione a sinistra
digitalWrite(opzione, LOW); // Arresta opzione
}
// ----------------------------------------------------------------------------------------
// --------------- CONDIZIONE DI FUNZIONAMENTO IN SICUREZZA -------------------------------
// Imposta la condizione che se si ferma il nastro, si fermerà anche la ruota.
if (digitalRead(nastroFR) == LOW && digitalRead(nastroBK) == LOW ) {
digitalWrite(ruotaFR, LOW);
}
// ----------------------------------------------------------------------------------------
// Implementazione dell'Orologio ----------------------------------------------------------------
Millisecondi += 100 ;// |
if (Millisecondi == 60000) { // |
Millisecondi = 0; // |
TotMinuti ++ ;// Aggiorna il tempo totale di funzionamento |
EEPROM.update(0, TotMinuti); // Salva il tempo totale di funzionamento nella memoria EEPROM |
key_value = TotMinuti/60; // Aggiorna il display digitale |
} // |
// ----------------------------------------------------------------------------------------------
// ------------ Stampa situazione Pulsanti e Uscite sulla SERIALE --------------------
if (controlloPC == 1) {
Serial.print(String(TotMinuti /60)+",");
Serial.print("1,");
Serial.print(String(digitalRead(Grilletto)) + ",");
Serial.print(String(digitalRead(opzione1))+ ",");
Serial.print(String(digitalRead(opzione2))+ ",");
Serial.print(String(digitalRead(pulsante1))+ ",");
Serial.print(String(digitalRead(pulsante2))+ ",");
Serial.print(String(digitalRead(ruotaFR))+ ",");
Serial.print(String(digitalRead(ruotaBK))+ ",");
Serial.print(String(digitalRead(nastroFR)) + ",");
Serial.print(String(digitalRead(nastroBK)) + ",");
Serial.print(String(digitalRead(auxDX))+ ",");
Serial.print(String(digitalRead(auxSX))+ ",");
Serial.print(String(digitalRead(opzione))+ ",");
}
if (modotest == 1) {
Serial.print(String(TotMinuti/60) + " HF(");
Serial.print("ON");
Serial.print(") Gri(");
Serial.print(grillettoPremuto ? " ON" : "OFF");
Serial.print(") P1(");
Serial.print(opzione1premuto ? " ON" : "OFF");
Serial.print(") P2(");
Serial.print(opzione2premuto ? " ON" : "OFF");
Serial.print(") P3(");
Serial.print(pulsante1premuto ? " ON" : "OFF");
Serial.print(") P4(");
Serial.print(pulsante2premuto ? " ON" : "OFF");
Serial.print(") Uscite:" + String(digitalRead(ruotaFR))+String(digitalRead(ruotaBK))+String(digitalRead(nastroFR)) +String(digitalRead(nastroBK)) +String(digitalRead(auxDX))+String(digitalRead(auxSX))+String(digitalRead(opzione)));
Serial.println(")");
}
// ------------------------------------------------------------------------------------------
delay(100); // Aggiungi un piccolo ritardo per evitare di sovraccaricare la porta seriale
}
void beepcorto(){
digitalWrite(sirena,HIGH); // accende la sirena
delay(500);
digitalWrite(sirena,LOW); // accende la sirena
delay(500);
digitalWrite(sirena,HIGH); // accende la sirena
delay(500);
digitalWrite(sirena,LOW); // accende la sirena
}
void beeplungo(){
digitalWrite(sirena, HIGH) ; // Accende la sirena |
delay (1000); // attende 2 secondi |
digitalWrite(sirena, LOW) ; // Spegne la sirena |
}
void TubeDisplay4Bit(void){
if(com_num<7) com_num ++;else com_num=0;
dat = dat_buf[com_num];
TubeDisplayOneBit();
OneSecondCnt--;
display_dat = TotMinuti/60;
dat_buf[0] = display_dat/1000;
display_dat = display_dat%1000;
dat_buf[2] = display_dat/100;
display_dat = display_dat%100;
dat_buf[4] = display_dat/10;
dat_buf[6] = display_dat%10;
}