#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
//U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS1307.h>
RtcDS1307<TwoWire> Rtc(Wire);
RtcDateTime now;
volatile bool interrupt = false;
volatile unsigned long bounce = 0;
volatile unsigned long lpress = 0;
int page = 0;
bool displayOn = true;
// '012', 30x30px
const unsigned char term_012 [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00,
0x00, 0x20, 0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x10, 0x1A, 0x00, 0x00, 0x10, 0x02, 0x00,
0x00, 0x10, 0x02, 0x00, 0x00, 0x10, 0x1A, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00,
0x00, 0xD0, 0x1A, 0x00, 0x00, 0xD0, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00,
0x00, 0xD0, 0x02, 0x00, 0x00, 0xD0, 0x0A, 0x00, 0x00, 0xD0, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00,
0x00, 0xD0, 0x02, 0x00, 0x00, 0xD0, 0x02, 0x00, 0x00, 0xE8, 0x05, 0x00, 0x00, 0xE8, 0x05, 0x00,
0x00, 0xE8, 0x05, 0x00, 0x00, 0xD8, 0x06, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// '013', 30x30px
const unsigned char term_013 [] PROGMEM = {
0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xBF, 0xFE, 0x3F, 0xFF, 0x03, 0xF8, 0x3F, 0xFF, 0xFC, 0xFF, 0x3F,
0x3F, 0xFF, 0xFF, 0x3F, 0xBF, 0xFF, 0x7F, 0x3F, 0xDF, 0xFF, 0xFF, 0x3E, 0xDF, 0xFF, 0xFF, 0x3E,
0xEF, 0xFF, 0x7F, 0x3C, 0xEF, 0xFF, 0x7F, 0x3C, 0x67, 0xE0, 0x03, 0x3C, 0x6F, 0xC3, 0x01, 0x3C,
0x6F, 0xC0, 0x00, 0x3C, 0xFF, 0xFF, 0x0E, 0x3C, 0xFF, 0xFF, 0x7F, 0x3C, 0xFF, 0xFF, 0x7D, 0x3C,
0xFF, 0x0B, 0x7C, 0x3E, 0xFF, 0xE1, 0x39, 0x3F, 0xFF, 0x03, 0x10, 0x3F, 0xFF, 0x7B, 0x18, 0x3F,
0xFF, 0xFF, 0x98, 0x3F, 0xFF, 0x7F, 0x88, 0x3F, 0xFF, 0x1D, 0x80, 0x3F, 0xBF, 0x04, 0x40, 0x3F,
0x9F, 0x00, 0x40, 0x3E, 0x87, 0x01, 0x40, 0x38, 0x81, 0x03, 0x60, 0x20, 0x80, 0x07, 0x70, 0x00,
0x80, 0x1F, 0x7C, 0x00, 0x80, 0xFF, 0x7F, 0x00
};
void buttons_interrupt_handler() {
interrupt = true;
bounce = millis();
lpress = millis();
}
void setup(void)
{
Serial.begin(9600);
u8g2.begin(); // begin the u8g2 library
u8g2.setContrast(255); // set display contrast/brightness
Rtc.Begin();
// RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
// Rtc.SetDateTime(compiled + 1 * 8 * 60 * 60);
//Rtc.SetDateTime(RtcDateTime(2018, 1, 17, 7, 53, 00));
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), buttons_interrupt_handler, FALLING);
pinMode(8, OUTPUT);
}
void loop(void) {
buttons();
PowSave();
display();
}
void buttons() {
bool impulse = false;
static bool longpress = false;
noInterrupts();
if (digitalRead(2)) lpress = millis();
else bounce = millis();
if (interrupt) {
if (millis() - bounce > 20) {
interrupt = false;
impulse = !longpress;
longpress = false;
}
}
if (impulse) {
if (displayOn) {
page++;
if (page > 3) page = 0;
} else displayOn = true;
}
if (!longpress) {
if (millis() - lpress > 1000) {
longpress = true;
displayOn = false;
}
}
if (displayOn) {
if (millis() - bounce > 60000) {
displayOn = false;
}
}
interrupts();
}
void PowSave() {
static bool laststate = !displayOn;
if (laststate != displayOn) {
laststate = displayOn;
if (displayOn) {
u8g2.setPowerSave(0);
digitalWrite(8, HIGH);
} else {
u8g2.setPowerSave(1);
digitalWrite(8, LOW);
}
}
}
void display() {
if (!displayOn) return;
static unsigned long elapse = millis();
if (millis() - elapse > 100) {
elapse = millis();
switch (page) {
case 0:
page0();
break;
case 1:
page1();
break;
case 2:
page2();
break;
case 3:
page3();
break;
default:
page0();
break;
}
}
}
void page0(void)
{
static char date[11];
static char time[ 9];
now = Rtc.GetDateTime();
bool err = !Rtc.IsDateTimeValid() | Rtc.LastError() != 0;
snprintf(date, 11, "%02u-%02u-%04u", now.Month(), now.Day(), now.Year());
snprintf(time, 9, "%02u:%02u:%02u", now.Hour(), now.Minute(), now.Second());
u8g2.firstPage();
do {
u8g2.drawRFrame(0, 0, 128, 64, 10);
u8g2.setFont(u8g2_font_t0_22b_mf);
u8g2.drawStr( 8, 27, date);
u8g2.drawStr(20, 53, time);
if (err) {
u8g2.setFont(u8g2_font_t0_12b_mf);
u8g2.drawStr( 37, 37, "error rtc");
}
} while (u8g2.nextPage());
}
void page1(void)
{
float t = random( 1000, 9999) / 100.0;
float u = random( 5000, 16000) / 100.0;
u8g2.firstPage();
do {
u8g2.drawFrame(0, 0, 128, 64);
u8g2.setFont(u8g2_font_unifont_tr);
u8g2.drawStr(20, 15, "Temperatura");
u8g2.setCursor(40, 30);
u8g2.print(t, 2);
u8g2.drawStr(80, 30, " C");
u8g2.drawStr(38, 45, "Umidita'");
u8g2.setCursor(40, 60);
u8g2.print(u, 2);
u8g2.drawStr(80, 60, " %");
u8g2.drawXBMP(1, 30, 30, 30, term_012);
} while (u8g2.nextPage());
}
void page2(void)
{
float t = random( 1000, 9999) / 100.0;
float u = random( 5000, 16000) / 100.0;
u8g2.firstPage();
do {
u8g2.drawFrame(0, 0, 128, 64);
u8g2.setFont(u8g2_font_t0_22b_mf);
u8g2.drawStr(5, 15, "Temp Page2");
u8g2.setCursor(10, 30);
u8g2.print(t, 2);
u8g2.drawStr(80, 30, " C");
u8g2.drawStr(38, 45, "UUUUUU'");
u8g2.setCursor(35, 60);
u8g2.print(u, 2);
u8g2.drawStr(80, 60, " %");
u8g2.drawXBMP(1, 30, 30, 30, term_013);
} while (u8g2.nextPage());
}
void page3(void)
{
float t = random( 1000, 9999) / 100.0;
float u = random( 5000, 16000) / 100.0;
u8g2.firstPage();
do {
u8g2.drawFrame(0, 0, 128, 64);
// u8g2.setFont(u8g_font_gdr12r);
u8g2.setFont(u8g2_font_t0_12b_mf);
u8g2.drawStr(5, 15, "Temp Page3");
u8g2.setCursor(12, 30);
u8g2.print(t, 2);
u8g2.drawStr(80, 30, " C");
u8g2.drawStr(38, 45, "UUUUUU'");
u8g2.setCursor(40, 60);
u8g2.print(u, 2);
u8g2.drawStr(80, 60, " %");
u8g2.drawXBMP(1, 30, 30, 30, term_012);
} while (u8g2.nextPage());
}