자료실




int pulsante = LOW; // variabile di memorizzazione dello stato del pulsante

int i; // variabile intera utilizzata nei cicli di for

int j; // variabile intera utilizzata nei cicli di for

int z; // variabile intera utilizzata nei cicli di for

int h; // variabile intera utilizzata nei cicli di for

long tempo=61; // tempo di countdown, in minuti; viene inizializzato a 61 per forzare

// il ciclo di prima volta

long tempoinizio = 0; // momento di inizio pressione del pulsante (millisecondi trascorsi

// dal momento di accensione di arduino)

int decaminuti = 0; // decine di minuti da visualizzare sul display

int minuti = 0; // minuti da visualizzare sul display

int decasecondi = 0; // decine di secondi da visualizzare sul display

int secondi =0; // secondi da visualizzare sul display

int numero = 0; // numero da visualizzate nella cifra che viene di volta in volta trattata

int secondiresidui= 0; // tempo residuo, in secondi,

int lapse= 0; // tempo di suono del buzzer, in millisecocndi)

long iniziocountdown= 0; // momento di inizio del countdown, in millisecondi

long iniziobuzzer=0; // momento di inizio del suono del buzzer, in millisecondi

// Le routine che seguono hanno il compito di visualizzare i numeri e vengono eseguite solo

// nel momento in cui sono richiamate da istruzioni presenti nel percorso attivo del programma

// *************************** routine di visualizzazione del numero 1 ********************

void uno(void)

// Arduino: timer da cucina, display a 4 cifre

{

digitalWrite(4,LOW);

digitalWrite(6,LOW);

}

// ************************ routine di visualizzazione del numero 2 ***********************

void due(void)

{

digitalWrite(3,LOW);

digitalWrite(4,LOW);

digitalWrite(1,LOW);

digitalWrite(8,LOW);

digitalWrite(7,LOW);

}

// ************************ routine di visualizzazione del numero 3 ************************

void tre(void)

{

digitalWrite(3,LOW);

digitalWrite(4,LOW);

digitalWrite(1,LOW);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

}

// ********************** routine di visualizzazione del numero 4 ************************

void quattro(void)

{

digitalWrite(2,LOW);

digitalWrite(1,LOW);

digitalWrite(4,LOW);

digitalWrite(6,LOW);

}

// *********************** routine di visualizzazione del numero 5 ***********************

void cinque(void)

{

digitalWrite(3,LOW);

digitalWrite(2,LOW);

digitalWrite(1,LOW);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

}

// ************************** routine di visualizzazione del numero 6 ***********************

void six(void)

{

digitalWrite(2,LOW);

digitalWrite(1,LOW);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

digitalWrite(8,LOW);

}

// ************************* routine di visualizzazione del numero 7 *************************

void sette(void)

// Arduino: timer da cucina, display a 4 cifre

{

digitalWrite(3,LOW); // disattiva la porta 3 e accende il segmento orizzontale alto

digitalWrite(4,LOW); // disattiva la porta 4 e accende il segmento verticale alto destro

digitalWrite(6,LOW); // disattiva la porta 6 e accende il segmento verticale basso destro

}

// *********************** routine di visualizzazione del numero 8 ****************************

void otto(void)

{

digitalWrite(1,LOW);

digitalWrite(2,LOW);

digitalWrite(3,LOW);

digitalWrite(4,LOW);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

digitalWrite(8,LOW);

}

// *********************** routine di visualizzazione del numero 9 *************************

void nove(void)

{

digitalWrite(1,LOW);

digitalWrite(2,LOW);

digitalWrite(3,LOW);

digitalWrite(4,LOW);

digitalWrite(6,LOW);

}

// **************************** routine di visualizzazione del numero 0 ***********************

void zero(void)

{

digitalWrite(2,LOW);

digitalWrite(3,LOW);

digitalWrite(4,LOW);

digitalWrite(6,LOW);

digitalWrite(7,LOW);

digitalWrite(8,LOW);

}

// ********** routine di gestione del display (di esposizione del tempo residuo) ***************

// viene gestita una cifra per volta attivando e disattivando le porte da 9 a 12 alle quali sono

// collegati gli anodi delle quattro cifre del display

void esponi (void)

{

for (z=9; z<=12; z++) // for di gestione delle porte (da 9 a 12, alle quali sono

// collegati i quattro anodi delle quattro cifre)

{

for (j=1; j<=8; j++)

digitalWrite (j, HIGH); // attiva tutti i catodi, per iniziare con tutti i segmenti spenti

digitalWrite (z, HIGH); // attiva l'anodo della cifra da esporre

switch (z) {

case 9: // se si sta trattando la porta 9 (prima cifra di sinistra)

numero = decaminuti; // inserisce le decine di minuti nel numero da esporre

break;

// Arduino: timer da cucina, display a 4 cifre

case 10: // se si sta trattando la porta 10 ( seconda cifra da sinistra)

numero = minuti; // inserisce i minuti nel numero esporre

digitalWrite (5, LOW); // accende il punto decimale come separatore dei minuti dai secondi

break;

case 11: // se si sta trattando la porta 11 (terza cifra da sinistra)

numero = decasecondi; // inserisce le decine di secondi nella porta da esporre

break;

case 12 : // se si sta trattando la porta 12 (quarta ed ultima cifra a destra)

numero = secondi; // inserisce i secondi nel numero da esporre

break;

}

visualizzanumeri (); // lancia la routine di visualizzazione del numero nella cifra corrente

digitalWrite (z,LOW); // disattiva (spegne) l'anodo della cifra appena visualizzata

}

}

// ******************routine di visualizzazione dei numeri ****************************

// La routine si limita ad attivare i catodi dei vari segmenti

// poiche' l'anodo della cifra corrente e' stato gia' attivato dalla routine chiamante

void visualizzanumeri (void)

{

switch (numero) {

 

case 0:

zero ();

break;

 

case 1:

uno();

break;

 

case 2:

due();

break;

case 3:

tre();

break;

 

case 4:

quattro();

break;

 

case 5:

cinque();

break;

 

case 6:

six();

break;

 

// Arduino: timer da cucina, display a 4 cifre

case 7:

sette();

break;

 

case 8:

otto();

break;

 

case 9:

nove();

break;

}

}

void setup()

{

for(i=0;i<=12;i++)

pinMode(i,OUTPUT); // definisce le porte da 0 a 12 come porte di output

pinMode (13, INPUT); // definisce la porta 13 (il pulsante) come porta di input

}

void loop()

{

pulsante = 0;

pulsante = digitalRead (13); // acquisisce lo stato del pulsante

while (pulsante==1) // settaggio del timer; se il pulsante e' premuto si innesca

// la routine di settaggio, che aumenta di 1 minuto il tempo

// di countdown per ogni secondo continuativo di pressione;

// arrivati a 60 minuti il settaggio ricomincia da 0

{

pulsante = digitalRead (13);

if (tempo >= 60) { // se sono stati superati i 60 minuti, ricomincia il settaggio da 0 minuti

tempo = 0;

tempoinizio = millis ();

}

else

{

tempo = (millis() - tempoinizio)/1000; //calcola il tempo trascorso dall’inizio pressione pulsante

}

decaminuti = (tempo / 10); // memorizza nelle decine di minuti il risultato di tempo/10

minuti = (tempo%10); // memorizza in minuti il resto della divisione per 10 del tempo

decasecondi = 0;

secondi = 0;

esponi (); // visualizza i minuti di settaggio del timer

secondiresidui = tempo * 60; // memorizza i secondi sino ad ora settati (minuti * 60)

iniziocountdown = millis(); // memorizza il momento di inizio del countdown, da utilizzare

// nel caso il pulsante fosse stato rilasciato e dovesse iniziare il countdown

}

// *********************ciclo di gestione del countdown **************************************

tempoinizio = millis();

if (secondiresidui >=1) { // gestione del tempo residuo e della relativa visualizzazione

decaminuti = secondiresidui/600;

minuti = (secondiresidui - (decaminuti*600))/60;

decasecondi = (secondiresidui - (decaminuti*600)-(minuti*60))/10;

secondi = (secondiresidui - (decaminuti*600)-(minuti*60) - (decasecondi*10));

// Arduino: timer da cucina, display a 4 cifre

esponi ();

secondiresidui = ((iniziocountdown + tempo*60000)-millis())/1000; //calcola i secondi residui di

// coundown

iniziobuzzer = millis ();

}

else

{ // gestione del fine countdown e attivazione del buzzer

if ((tempo <= 60) && (lapse < 5000))

{

digitalWrite (0,HIGH); //attiva il buzzer per 5 secondi (5000 millisecondi)

decaminuti =0;

minuti = 0;

decasecondi = 0;

secondi = 0;

esponi ();

lapse = millis() - iniziocountdown;

}

else // se e’ cessato l’allarme predispone il sistema ad un nuovo settaggio

{

digitalWrite (0,LOW);

tempo = 61;

lapse = 0;

}

}

}