/**************************************************************************
This is an example
write the six componet of an array on
- Arduino serial monitor
- SSD1306 Monochrome OLEDs display
https://github.com/adafruit/Adafruit_SSD1306
https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts
FreeMono12pt7b.h FreeSansBoldOblique12pt7b.h FreeMono18pt7b.h FreeSansBoldOblique18pt7b.h
FreeMono24pt7b.h FreeSansBoldOblique24pt7b.h FreeMono9pt7b.h FreeSansBoldOblique9pt7b.h
FreeMonoBold12pt7b.h FreeSansOblique12pt7b.h FreeMonoBold18pt7b.h FreeSansOblique18pt7b.h
FreeMonoBold24pt7b.h FreeSansOblique24pt7b.h FreeMonoBold9pt7b.h FreeSansOblique9pt7b.h
FreeMonoBoldOblique12pt7b.h FreeSerif12pt7b.h FreeMonoBoldOblique18pt7b.h FreeSerif18pt7b.h
FreeMonoBoldOblique24pt7b.h FreeSerif24pt7b.h FreeMonoBoldOblique9pt7b.h FreeSerif9pt7b.h
FreeMonoOblique12pt7b.h FreeSerifBold12pt7b.h FreeMonoOblique18pt7b.h FreeSerifBold18pt7b.h
FreeMonoOblique24pt7b.h FreeSerifBold24pt7b.h FreeMonoOblique9pt7b.h FreeSerifBold9pt7b.h
FreeSans12pt7b.h FreeSerifBoldItalic12pt7b.h FreeSans18pt7b.h FreeSerifBoldItalic18pt7b.h
FreeSans24pt7b.h FreeSerifBoldItalic24pt7b.h FreeSans9pt7b.h FreeSerifBoldItalic9pt7b.h
FreeSansBold12pt7b.h FreeSerifItalic12pt7b.h FreeSansBold18pt7b.h FreeSerifItalic18pt7b.h
FreeSansBold24pt7b.h FreeSerifItalic24pt7b.h FreeSansBold9pt7b.h FreeSerifItalic9pt7b.h
**************************************************************************/
//#include <SPI.h> // protocollo SPI alternativo al i2c
#include <Wire.h> // protocollo i2c per settare ad esempio la velocità
#include <Adafruit_GFX.h> // font
#include <Adafruit_SSD1306.h>
#include <stdio.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int on_ora[8]= {18,18,18,15,18,17,18,19};
int on_min[8]= {02,04,00,30,03,50,01,30};
int off_ora[8]= {18,18,18,15,18,18,18,20};
int off_min[8]= {03,05,01,40,04,00,02,20};
int durara[8]={3,3,3,3,3,3,3,3};
int start_h=17, start_m=59, clk=53;
long start_mm, dtime;
char ch,outstr[30];
void setup() {
Serial.begin(9600);
//Wire.begin();
//Wire.setClock(400000L); // velocità dell' i2c
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0, 0); // Start at top-left corner
display.cp437(true); // Use full 256 char 'Code Page 437' font
// Clear the buffer
display.clearDisplay();
start_mm=millis();
display.write("START");
display.display();
delay(300);
display.clearDisplay();
display.setCursor(6,0);
display.print("LMMGVSD");
write_list();
check_watch();
check_list();
}
void write_list (void) {
display.setTextColor(SSD1306_WHITE);
for (int i=0;i<7;i++){
display.setCursor(0,(i+1)*8);
sprintf(outstr,"%dxxx-xxx%02d:%02d-%02d:%02d",i+1,on_ora[i],on_min[i],off_ora[i],off_min[i]);
display.print(outstr);
}
display.display();
}
void loop() {
static long now,last;
static int k=0,k2=0;
now=millis(); // sostituire con timer di 1 sec
if( (now-last) > 1000L) {
clock();
last=now;
k++;k2++;
if(k==10){ // 10 secondi
k=0;
check_list();
}
if(k2==900){ // 15 minuti
k2=0;
check_watch();
}
}
}
int start,stop,now;
void check_watch (void){
// aggiorna l'ora corrente con RTC
start_h=17;
start_m=59;
clk=53;
}
void check_list (void){
for (int i=0;i<7;i++){
start=on_ora[i]*3600+on_min[i]*60;
stop=off_ora[i]*3600+off_min[i]*60-12;
now=start_h*3600+start_m*60;
display.setCursor(120,(i+1)*8);
display.setTextColor(SSD1306_BLACK);
sprintf(outstr,"%c",178);
display.print(outstr);
display.setCursor(120,(i+1)*8);
display.setTextColor(SSD1306_WHITE);
if(now>=start && now<stop) display.print("Y");
else display.print("N");
}
display.display();
}
void clock(void)
{ display.setCursor(80, 0);
display.setTextColor(SSD1306_BLACK);
sprintf(outstr,"%02d:%02d:%02d",start_h,start_m,clk);
display.print(outstr);
if(clk==59) {
if(start_m==59){
if(start_h==23) start_h=0;
else start_h++;
start_m=-1;
}
start_m++;
clk=-1;
}
clk++;
display.setCursor(80, 0);
display.setTextColor(SSD1306_WHITE);
sprintf(outstr,"%02d:%02d:%02d",start_h,start_m,clk);
display.print(outstr);
display.display();
}