/**************************************************************************
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
Aggiungere 5 tasti sx, dx, up, down, sel/hold
colonna 20=mode
0 = ALWAYS OFF
1 = ON/OFF MODE
2 = FADER in 5 sec
3 = fader in 15 sec
4 = Fader in 30 sec
5 = fader in 1 min
6 = fader in 5 min
7= fader in 15 min
8 = fader in 30 min
9 = fader in 60 min
dopo la D di Domeniva mettere spazio ed M di Menù
posizionale il mouse a sinistra del Menù
**************************************************************************/
//#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 -1 // Reset pin # (or -1 if sharing Arduino reset pin)
volatile Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define UP 13
#define LF 12
#define RG 11
#define DW 10
#define MS 9
#define HO 8
bool D4_state = LOW;
bool D5_state = LOW;
volatile byte portB_state=B00000000;
byte portB_oldstate=B00000000;
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 out_mode[8]={1,2,3,6,0,7,8,9};
bool out_state[8]= {false,false,false,false,false,false,false,false};
int start_h=17, start_m=59, clk=53;
long start_mm, dtime;
char *outstr;
char ch,outstr1[30];
void setup() {
outstr=&(outstr1[0]); // esercizio sui puntatori
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();
pinMode(UP, INPUT);
pinMode(LF, INPUT);
pinMode(RG, INPUT);
pinMode(DW, INPUT);
pinMode(MS, INPUT);
pinMode(HO, INPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
start_mm=millis();
display.write("START");
display.display();
delay(300);
display.clearDisplay();
display.setCursor(6,0);
//display.print("LMMGVSD M^v");
sprintf(outstr,"LMMGVSD M%c%c",30,31);
display.print(outstr);
write_list();
reset_watch();
check_list();
//PCICR |= B00000100; //Bit2 = 1 -> "PCIE2" enabeled (PCINT16 to PCINT23)
//PCMSK2 |= B00110000; //D4 and D5 will trigger interrupt
PCICR |= B00000001; //Bit0 = 1 -> "PCIE0" enabeled (PCINT8 to PCINT13)
PCMSK0 |= B00111111;
portB_state=B00000000;
display.setTextColor(SSD1306_WHITE);
display.setCursor(121,(0+1)*8);
sprintf(outstr,"%c",219);
display.print(outstr);
display.display();
PORTD = B11111100;
delay(1000);
PORTD &= B10000100;
delay(1000);
PORTD &= B00000000;
/* digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH); */
display.setTextColor(SSD1306_BLACK);
display.setCursor(121,(0+1)*8);
display.print(outstr);
display.display();
}
void write_list (void) {
/* questa funzione scrive le "8" righe che terminano con OUTmode */
display.setTextColor(SSD1306_WHITE);
for (int i=0;i<7;i++){
display.setCursor(0,(i+1)*8);
sprintf(outstr,"%dooo-ooo ",i+1);
display.print(outstr);
display.setCursor(50,(i+1)*8);
sprintf(outstr,"%02d",on_ora[i]);
display.print(outstr);
display.setCursor(64,(i+1)*8);
sprintf(outstr,"%02d ",on_min[i]);
display.print(outstr);
display.setCursor(74,(i+1)*8);
sprintf(outstr,"%c",179);
display.print(outstr);
display.setCursor(79,(i+1)*8);
sprintf(outstr,"%02d",off_ora[i]);
display.print(outstr);
display.setCursor(94,(i+1)*8);
sprintf(outstr,"%02d",off_min[i]);
display.print(outstr);
display.setCursor(104,(i+1)*8);
sprintf(outstr,"%c",179);
display.print(outstr);
display.setCursor(110,(i+1)*8);
sprintf(outstr,"%1d.",out_mode[i]);
display.print(outstr);
}
display.display();
}
ISR (PCINT2_vect)
{ if(digitalRead(4)) D4_state = !D4_state;
if(digitalRead(5)) D5_state = !D5_state;
}
ISR (PCINT0_vect)
{
if ((PORTD = (PINB & B00111111) << 2) !=0) portB_state=PORTD;
//PCIFR = B00000001; non serve
}
void loop() {
static long now,last;
static int k=3,k2=0;
// K va inizializzato con l'unità in secondi dello start
//PORTD |=0b00111111;
now=millis(); // sostituire con timer di 1 sec
if( (now-last) > 1000L) {
clock(); // simulatore RTC
if(portB_state != portB_oldstate)
{ // stampa un quadratino sull'ultima colonna
// per memorizzare l'ultimo tasto premuto
// +0.01 serve a compensare un errore di log10()
sprintf(outstr,"%c",219);
display.setTextColor(SSD1306_BLACK);
display.setCursor(121,(int(log10(portB_oldstate>>2)/log10(2)+0.01)+1)*8);
display.print(outstr);
display.setTextColor(SSD1306_WHITE);
display.setCursor(121,(int(log10(portB_state>>2)/log10(2)+0.01)+1)*8);
display.print(outstr);
display.display();
portB_oldstate=portB_state;
}
last=now;
k++;k2++;
if(k==10){ // simulatore controllo ogni 10 secondi
k=0;
check_list();
}
if(k2==300){ // solo x debug : reset ogni 5 minuti
k2=0;
reset_watch();
}
}
}
int start,stop,now;
void reset_watch (void){
// resetta l'orario alle 17:49:53
display.setCursor(80, 0);
display.setTextColor(SSD1306_BLACK);
sprintf(outstr,"%02d:%02d:%02d",start_h,start_m,clk);
display.print(outstr);
start_h=17;
start_m=59;
clk=53;
clock();
}
void check_list (void){
/* Questa funzione verifica se l'uscita di uno dei timer deve essere attivata */
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;
if(now>=start && now<stop)
{ display.setTextColor(SSD1306_WHITE);
out_state[i]=true;
}
else
{ display.setTextColor(SSD1306_BLACK);
out_state[i]=false;
}
display.setCursor(0,(i+1)*8);
sprintf(outstr,"%c",219);
display.print(outstr);
}
display.display();
}
void clock(void)
{ /* questa funzione simula la stampa dell'orario corrente nella prima riga */
// cancella orario precedete
display.setCursor(80, 0);
display.setTextColor(SSD1306_BLACK);
sprintf(outstr,"%02d:%02d:%02d",start_h,start_m,clk);
display.print(outstr);
// cambio del minuto
if(clk==59) {
// cambio dell'ora
if(start_m==59){
if(start_h==23) start_h=0;
else start_h++;
start_m=-1;
}
start_m++;
clk=-1;
}
// incremento dei secondi
clk++;
// stampa nuovo orario
display.setCursor(80, 0);
display.setTextColor(SSD1306_WHITE);
sprintf(outstr,"%02d:%02d:%02d",start_h,start_m,clk);
display.print(outstr);
display.display();
}