/*
orologio con ESP32 C3 con display 1306, libreria Adafruit
e RTC DS3231 con RTCLib di Adafruit x DS1307
con impostazione dell'orario:
il pulsante Ora modifica l'ora a ogni pressione del pulsante
il pulsante Min modifica i minuti a ogni pressione del pulsante
il pulsante Allarme interrompe la suoneria e la disattiva
*/
// impostazioni libreria grafica Adafruit ---------------
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//#include <U8x8lib.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for SSD1306 display connected using I2C
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
//crea oggetto display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#include <Fonts/FreeMono9pt7b.h>
#include <Fonts/FreeMono12pt7b.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSans12pt7b.h>
#include <Fonts/FreeSerif9pt7b.h>
#include <Fonts/FreeSerif12pt7b.h>
// fine impostazioni libreria grafica Adafruit ---------------
// impostazioni libreria RTC ---------------
#include "RTClib.h"
RTC_DS3231 rtc;
DateTime now;
// fine impostazioni libreria RTC ---------------
// impostazioni libreria OneButton ---------------
#include "OneButton.h" //OneButton library
int pinButton = 3;
OneButton button(pinButton, true); //oggetto button su pinButton
// fine impostazioni libreria OneButton ---------------
int cursx = 5;
int cursy = 15;
int offset = 18;
int ch, cm, cs;
int seth, setm, sets = 0; // variabili per orario corrente
int alarmh, alarmm, alarms = 0; // variabili per orario allarme
String orarioCorrente;
String orarioAllarme;
bool orarioSuoneria = false;
bool ALARM = false;
int attesa = 2000;
unsigned long t1, dt;
bool FIRST = true;
char str[9]; // buffer per la formattazione orario
int stato = 0; // variabile per i vari stati
void setup () {
Serial.begin(9600);
// initialize the OLED object ---------------
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.clearDisplay();
//display.setFont(&FreeMono9pt7b);
//display.setFont(&FreeMono12pt7b);
display.setFont(&FreeSans9pt7b);
//display.setFont(&FreeSans12pt7b);
//display.setFont(&FreeSerif9pt7b);
//display.setFont(&FreeSerif12pt7b);
display.setTextSize(1);
display.setTextColor(WHITE);
//display.setCursor(0, 0);
display.display();
// initialize the RTC object ---------------
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
/*
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, offset14 at 3am you would call:
// rtc.adjust(DateTime(offset14, 1, 21, 3, 0, 0));
}
*/
// initialize the button object ---------------
button.setClickTicks(400);
button.attachDoubleClick(doubleclick); // link the function to be called on a doubleclick event.
button.attachClick(singleclick); // link the function to be called on a singleclick event.
//button.attachLongPressStop(longclick);// link the function to be called on a longpress event.
// initialize outputs
//pulsanti Ora e Min
pinMode(4, INPUT); // imposta ora
pinMode(5, INPUT); // imposta minuti
pinMode(6, INPUT); // imposta suoneria
pinMode(7, OUTPUT); // uscita suoneria
// end setup
}
void loop () {
button.tick(); // check the status of the button
//Serial.print(".");
delay(10);
switch(stato){
//scelta dello stato
case 0: //visualizza orario,data e giorno
// stato principale
displayTime();
break;
case 1: // impostazione orario
setOrario();
break;
case 2: // impostazione orario allarme
setOrarioAllarme();
break;
case 3: // impostazione suoneria on/off
setSuoneria();
break;
case 4: // impostazione melodia suoneria
ringing();
break;
case 5: // viualizzazione informazioni meteo
displayMeteo();
break;
}
}
void singleclick(){ // azioni durante il single click
// impostazioni allarme
Serial.println("impostazione allarme");
FIRST = true;
//setOrarioAllarme();
stato = 2;
}
void doubleclick(){ // azioni durante il single click
// impostazione orario corrente
Serial.println("impostazione orario");
FIRST = true;
stato = 1;
}
void displayTime() {
//button.tick();
if (FIRST) {
display.clearDisplay();
t1 = millis();
FIRST = false;
}
dt = millis() - t1;
//Serial.println(dt);
if (dt > 300) {
now = rtc.now();
ch = now.hour();
cm = now.minute();
cs = now.second();
display.clearDisplay();
display.setCursor(cursx,cursy);
sprintf(str, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
orarioCorrente = str;
display.print(orarioCorrente);
if (ALARM) {
display.setCursor(cursx,cursy+offset);
display.print("Suoneria :");
if (orarioSuoneria) {
display.setCursor(cursx,cursy+offset*2);
display.print(orarioAllarme);
} else {
display.setCursor(cursx,cursy+offset*2);
display.print("------------");
}
}
display.display();
t1 = millis();
}
if (ALARM){
if ((ch == alarmh) && (cm == alarmm) && (cs == alarms)) {
stato = 4;
FIRST = true;
//Serial.println(alarms);
}
}
/*
if (digitalRead(4) | digitalRead(5)) {
//imposta orario
stato = 1;
delay(100);
FIRST = true;
}
*/
if (digitalRead(6)) {
//imposta allarme
//ALARM = false;
stato = 3;
FIRST = true;
delay(100);
}
}
void setOrario() { //stato 1
//Serial.print(".");
if (FIRST) {
//display.clearDisplay();
now = rtc.now();
seth = now.hour();
setm = now.minute();
sets = now.second();
t1 = millis();
FIRST = false;
//Serial.print("FIRST");
//Serial.println(seth);
}
display.clearDisplay();
display.setCursor(cursx,cursy);
now = rtc.now();
//Serial.println("now.second");
//Serial.println(now.second());
sprintf(str, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
orarioCorrente = str;
display.print(orarioCorrente);
//seth = now.hour();
display.setCursor(cursx,cursy+offset);
display.print("Set ora:");
sprintf(str, "%02d", seth);
display.print(str);
Serial.println(seth);
display.setCursor(cursx,cursy+offset*2);
display.print("Set min:");
sprintf(str, "%02d", setm);
display.print(str);
display.display();
if (digitalRead(4)) {
seth++;
if (seth >= 24) seth = 0;
t1 = millis();
delay(100);
}
if (digitalRead(5)) {
setm++;
if (setm >= 60) setm = 0;
t1 = millis();
delay(100);
}
if ((millis() - t1) > attesa) {
now = rtc.now();
rtc.adjust(DateTime(now.year(), now.month(), now.day(), seth, setm, now.second()));
stato = 0;
FIRST = true;
delay(100);
}
}
void setOrarioAllarme() { //stato 2
//erial.print("in orario allarme");
if (FIRST) {
//Serial.println("in orario allarme");
//display.clearDisplay();
now = rtc.now();
alarmh = now.hour();
alarmm = now.minute();
//alarms = now.second();
//Serial.print(alarmh);
//Serial.println(alarmm);
t1 = millis();
//Serial.println(t1);
FIRST = false;
}
display.clearDisplay();
display.setCursor(cursx,cursy);
now = rtc.now();
sprintf(str, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
orarioCorrente = str;
display.print(orarioCorrente);
display.setCursor(cursx,cursy+offset);
display.print("Alm ora:");
sprintf(str, "%02d", alarmh);
display.print(str);
display.setCursor(cursx,cursy+offset*2);
display.print("Alm min:");
sprintf(str, "%02d", alarmm);
display.print(str);
display.display();
sprintf(str, "%02d:%02d:%02d", alarmh, alarmm, alarms);
orarioAllarme = str;
//Serial.println(orarioAllarme);
if (digitalRead(4)) {
alarmh++;
if (alarmh >= 24) alarmh = 0;
//Serial.print(alarmh);
t1 = millis();
delay(100);
}
if (digitalRead(5)) {
alarmm++;
if (alarmm >= 60) alarmm = 0;
t1 = millis();
delay(100);
}
if ((millis() - t1) > attesa) {
//rtc.adjust(DateTime(now.year(), now.month(), now.day(), alarmh, alarmm, now.second()));
//Serial.print("millis ");
//Serial.println(millis());
//Serial.print("t1 ");
//Serial.println(t1);
orarioSuoneria = true;
stato = 0;
FIRST = true;
delay(100);
//Serial.println(alarmh);
//Serial.println(alarmm);
//Serial.println(alarms);
}
}
void displayMeteo(){
// viualizzazione informazioni meteo -> stato 5
stato = 0; // ritorno allo stato principale
}
void ringing(){
// impostazione melodia suoneria -> stato 4
if (FIRST) {
display.clearDisplay();
display.setCursor(cursx,cursy);
display.print("SVEGLIA!!");
display.display();
FIRST = false;
}
tone(7, 440, 100);
delay(100);
if (digitalRead(6)){
//alarmh, alarmm, alarms=0;
//Serial.println(alarmh);
ALARM = false;
FIRST = true;
stato = 0;
}
delay(300);
//Serial.println(stato);
}
void setSuoneria(){
// impostazione suoneria on/off -> stato 3
if (FIRST) {
t1 = millis();
/*
display.clearDisplay();
display.setCursor(0,10);
display.println("set Sveglia:");
display.display();
*/
FIRST = false;
}
if (digitalRead(6)) {
ALARM = !ALARM;
delay(100);
}
display.clearDisplay();
display.setCursor(cursx,cursy);
display.println("Suoneria:");
display.setCursor(cursx,cursy+offset);
//Serial.println("setSuoneria");
if (ALARM) {
display.print("ATTIVA ");
} else {
display.print("NON ATTIVA");
}
display.display();
/*
if (digitalRead(4)) {
if (!ALARM) stato = 0; // ritorno allo stato principale
else stato = 2;
delay(1);
FIRST = true;
}
*/
if ((millis() - t1) > attesa) {
//rtc.adjust(DateTime(now.year(), now.month(), now.day(), seth, setm, now.second()));
stato = 0;
FIRST = true;
delay(100);
}
}
Ora
Min
Orario/Allarme
Suoneria