orologio in tempo reale con allarme

Ciao a tutti,

vorrei settare degli allarmi a particolari orari della durata di pochi secondi,

ho collegato arduino uno con l'RTC DS3231 con il seguente sketch per determinare l'ora in tempo reale,

ora dovrei settare gli allarmi in particolari orari che fanno partire delle sirene per 5 secondi

potete aiutarmi pls?

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return( (val/1016) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16
10) + (val%16) );
}
void setup()
{
Wire.begin();
Serial.begin(9600);
// set the initial time here:
// DS3231 seconds, minutes, hours, day, date, month, year
// setDS3231time(30,44,16,7,1,8,15);

}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();

}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)

{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
// send it to the serial monitor
Serial.print(hour, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(":");
if (minute<10)
{
Serial.print("0");
}
Serial.print(minute, DEC);
Serial.print(":");
if (second<10)
{
Serial.print("0");
}
Serial.print(second, DEC);
Serial.print(" ");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.print(year, DEC);
Serial.print(" Day of week: ");
switch(dayOfWeek){
case 1:
Serial.println("Domenica");
break;
case 2:
Serial.println("Lunedi");
break;
case 3:
Serial.println("Martedi");
break;
case 4:
Serial.println("Mercoledi");
break;
case 5:
Serial.println("Giovedi");
break;
case 6:
Serial.println("Venerdi");
break;
case 7:
Serial.println("Sabato");
break;
}
}
void loop()
{
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second
}

Intanto elimina quel delay(1000) ed usa millis().
Se non sai gestirlo qui trovi un'ottima spiegazione.
L'istruzione delay blocca tutto il codice e potresti perdere qualche evento

ok grazie mille per il consiglio, ma per gli allarmi come posso fare?

Trasforma l' ora, minuti e secondi in secondi e fai il confronto con l' orario di Alarme.
Ciao Uwe

grazie mille risolto :slight_smile:

ora volevo chiedere ma per far aggiornare con l'ora legale o solare in automatico come si può fare?

googla "calcolo ora legale"

ho cercato su google e ho trovato una libreria ma non ho capito bene come funziona e se fa al caso mio, ancora non ho tanta esperienza e quindi chiedo!

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

L'ora legale, in Europa, INIZIA l'ultima Domenica di Marzo e TERMINA l'ultima Domenica di Ottobre.

Se usi la libreria Time hai tutte le funzioni che ti ritornano in che mese sei, in che giorno sei ed in che giorno della settimana sei ...
... con un po' di calcoli riesci a determinare quando sei nella ultima Domenica di Marzo e di Ottobre e quindi aggiornare di conseguenza una flag che ti indica se c'è l'ora legale o meno :wink:

Guglielmo

quindi la libreria swRTC2 non mi serve? metto anche in allegato il codice. grazie

ora_arduino_uno_con_modulo.ino (11.1 KB)

... non avevo visto che usavi la swRTC2 ... ::slight_smile:
... ma allora hai già tutto (come dice l'autore QUI) ... tocca solo che te la studi !!! :smiling_imp:

Guglielmo

Grazie mille ora vedo

ho dato una lettura sulla libreria solo non ho capito come usarla!!!! ho letto anche la guida sul sito di Leonardo, come devo fare?