Salve forum,
chiedo aiuto per completare questo sketch che vado a descrivere.
Ho modificato lo sketch di Banzi relativo a una sveglia bomba pubblicata su Wired 2010.
Ho tolto i pezzi di codice relativi alla combinazione dei tasti per disattivare la sveglia e l'ho modificata per utilizzare l' RTC 1307.
Sembrerebbe funzionare il tutto.
In più ho aggiunto un ulteriore variabile (a_ss) che viene incrementata alla pressione del tasto 2 e che dovrebbe permettere di avere il pin 13 alto per tutto il tempo impostato su questa variabile.
Il tutto funziona e ottengo il risultato voluto utilizzando la funzione delay().
Mi chiedevo se ci fosse qualcosa di più "elegante" da utilizzare per ottenere lo stesso risultato....
Consigli od opinioni ?
Grazie a tutti!!
// Sveglia Tutorial Wired Settembre 2010
// libreria I2C per parlare con l'RTC
#include <Wire.h>
// Codice di gestione del RTC (Real Time Clock)
#include <DS1307RTC.h>
#include <Time.h>
// include the library code:
#include <LiquidCrystal.h>
// inizializza la libreria che gestisce gli LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Diamo un nome ai piedini connessi ai pulsanti
const int btn01Pin = 10;
const int btn02Pin = 9;
const int btn03Pin = 8;
const int btn04Pin = 7;
// variabili che contengono lo stato dei pulsanti
int btn01State = HIGH;
int btn02State = HIGH;
int btn03State = HIGH;
int btn04State = HIGH;
// variabli che contengono lo stato precedente del pulsante
int btn01Prev = HIGH;
int btn02Prev = HIGH;
int btn03Prev = HIGH;
int btn04Prev = HIGH;
// flag che segnale se un certo pulsante è stato effettivamente premuto
int btn01Pressed = false;
int btn02Pressed = false;
int btn03Pressed = false;
int btn04Pressed = false;
// Definizione stati
const int NORMAL = 0;
const int ALARM1 = 1;
const int ALARM2 = 2;
const int ALARM3 = 3;
const int ALARM4 = 4;
// partiamo con stato NORMAL
int state = NORMAL;
// cache ore e minuti
int a_hh = 0;
int a_mm = 0;
unsigned long a_ss = 0;
// stampa un numero aggiungendo uno zero prima
// dei valori inferiori a 10
void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}
// legge i 4 pulsati
void readButtons() {
btn01State = digitalRead(btn01Pin);
btn02State = digitalRead(btn02Pin);
btn03State = digitalRead(btn03Pin);
btn04State = digitalRead(btn04Pin);
if ((btn01State == LOW) && (btn01Prev == HIGH)) {
btn01Pressed = true;
}
btn01Prev = btn01State;
if ((btn02State == LOW) && (btn02Prev == HIGH)) {
btn02Pressed = true;
}
btn02Prev = btn02State;
if ((btn03State == LOW) && (btn03Prev == HIGH)) {
btn03Pressed = true;
}
btn03Prev = btn03State;
if ((btn04State == LOW) && (btn04Prev == HIGH)) {
btn04Pressed = true;
}
btn04Prev = btn04State;
}
// Dato il numero di un pulsante imposta il flag
// corrispondente se è premuto
int buttonPressed(int btn) {
int result = false;
switch(btn) {
case 1:
if (btn01Pressed) result = true;
break;
case 2:
if (btn02Pressed) result = true;
break;
case 3:
if (btn03Pressed) result = true;
break;
case 4:
if (btn04Pressed) result = true;
break;
}
btn01Pressed = false;
btn02Pressed = false;
btn03Pressed = false;
btn04Pressed = false;
return result;
}
// inizializza la scheda
void setup()
{
// mettiamo a INPUT gli ingressi dei pulsanti
pinMode(btn01Pin,INPUT);
pinMode(btn02Pin,INPUT);
pinMode(btn03Pin,INPUT);
pinMode(btn04Pin,INPUT);
// LED 13 usato per il debug e per il cicalino
pinMode(13,OUTPUT);
// Apre comunicazione con l'RTC e lo inizializza
Wire.begin();
Serial.begin(9600); // per debugging
// imposta il display
// il nostro display è 1 riga di 16 caratteri ma internamente
// crede di avere 2 righe di 8 caratteri
// dovete aggiustare il codice in base al vostro display
lcd.begin(8, 2);
}
void loop()
{
tmElements_t tm;
// Legge l'RTC
RTC.read(tm);
// legge i pulsanti
readButtons();
// visualizza l'ora o l'allarme in base al pulsante 1
// se il pulsante 01 NON è premuto visualizzo l'ora
if (btn01State == HIGH) {
// se il pulsante 3 è premuto aumento le ore
if (btn03Pressed) {
tm.Hour++;
// dopo 23 torna a 0
if (tm.Hour > 23) tm.Hour = 0;
// scrivi nell'RTC l'ora impostata
RTC.write(tm);
// dopo aver gestito l'evento azzero il flag
btn03Pressed = false;
}
// stessa cosa per i minuti
if (btn04Pressed) {
tm.Minute++;
if (tm.Minute > 59) tm.Minute = 0;
RTC.write(tm);
btn04Pressed = false;
}
// visualizza ora
lcd.setCursor(0,0);
Serial.print(" ");
lcd.setCursor(0,1);
print2digits(tm.Hour);
Serial.print(":");
print2digits(tm.Minute);
Serial.print(":");
print2digits(tm.Second);
Serial.println();
delay(1000);
}
else {
// pulsante 1 premuto allora aggiorniamo l'ora
// dell'allarme
if (btn02Pressed) {
a_ss++;
if (a_ss > 1801) a_ss = 0;
btn02Pressed = false;
}
if (btn03Pressed) {
a_hh++;
if (a_hh > 23) a_hh = 0;
btn03Pressed = false;
}
if (btn04Pressed) {
a_mm++;
if (a_mm > 59) a_mm = 0;
btn04Pressed = false;
}
//visualizza l'allarme
lcd.setCursor(0,0);
Serial.print("Alarm ");
lcd.setCursor(0,1);
print2digits(a_hh);
Serial.print(":");
print2digits(a_mm);
Serial.print(":");
print2digits(0);
Serial.println();
Serial.print("Duration ");
print2digits(a_ss);
Serial.println();
delay (1000);
}
// banale verifica se è l'ora di far partire l'allarme
if ((tm.Hour == a_hh) && (tm.Minute == a_mm) && (tm.Second == 0)) {
digitalWrite(13,HIGH);
delay(a_ss*1000);
digitalWrite(13,LOW);
}
}