#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ==== BITMAPS ====
// 'Digits_0', 9x17px
const unsigned char num_zero [] PROGMEM = {
0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0, 0x4f, 0xe4, 0xe0, 0x0e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e,
0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xe0, 0x0e, 0x40, 0x04, 0x00, 0x00, 0x40, 0x04, 0xe0, 0x0e,
0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xe0, 0x0e,
0x4f, 0xe4, 0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0
};
// 'Digits_1', 9x17px
const unsigned char num_one [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0e,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e,
0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'Digits_2', 9x17px
const unsigned char num_two [] PROGMEM = {
0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0, 0x0f, 0xe4, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x07, 0xce, 0x0f, 0xe4, 0x1f, 0xf0, 0x4f, 0xe0, 0xe7, 0xc0,
0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xe0, 0x00,
0x4f, 0xe0, 0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0
};
// 'Digits_3', 9x17px
const unsigned char num_three [] PROGMEM = {
0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0, 0x0f, 0xe4, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x07, 0xce, 0x0f, 0xe4, 0x1f, 0xf0, 0x0f, 0xe4, 0x07, 0xce,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e,
0x0f, 0xe4, 0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0
};
// 'Digits_4', 9x17px
const unsigned char num_four [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0xe0, 0x0e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e,
0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xe7, 0xce, 0x4f, 0xe4, 0x1f, 0xf0, 0x0f, 0xe4, 0x07, 0xce,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e,
0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'Digits_5', 9x17px
const unsigned char num_five [] PROGMEM = {
0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0, 0x4f, 0xe0, 0xe0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xe7, 0xc0, 0x4f, 0xe0, 0x1f, 0xf0, 0x0f, 0xe4, 0x07, 0xce,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e,
0x0f, 0xe4, 0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0
};
// 'Digits_6', 9x17px
const unsigned char num_six [] PROGMEM = {
0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0, 0x4f, 0xe0, 0xe0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xe7, 0xc0, 0x4f, 0xe0, 0x1f, 0xf0, 0x4f, 0xe4, 0xe7, 0xce,
0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xe0, 0x0e,
0x4f, 0xe4, 0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0
};
// 'Digits_7', 9x17px
const unsigned char num_seven [] PROGMEM = {
0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0, 0x0f, 0xe4, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0e,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e,
0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'Digits_8', 9x17px
const unsigned char num_eight [] PROGMEM = {
0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0, 0x4f, 0xe4, 0xe0, 0x0e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e,
0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xe7, 0xce, 0x4f, 0xe4, 0x1f, 0xf0, 0x4f, 0xe4, 0xe7, 0xce,
0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xe0, 0x0e,
0x4f, 0xe4, 0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0
};
// 'Digits_9', 9x17px
const unsigned char num_nine [] PROGMEM = {
0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0, 0x4f, 0xe4, 0xe0, 0x0e, 0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e,
0xf0, 0x1e, 0xf0, 0x1e, 0xf0, 0x1e, 0xe7, 0xce, 0x4f, 0xe4, 0x1f, 0xf0, 0x0f, 0xe4, 0x07, 0xce,
0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e,
0x0f, 0xe4, 0x1f, 0xf0, 0x3f, 0xf8, 0x1f, 0xf0
};
const unsigned char* num_allArray[10] = {
num_zero, num_one, num_two, num_three, num_four,
num_five, num_six, num_seven, num_eight, num_nine
};
// 'Humid_9x13px', 9x17px
const unsigned char Hum_9x13px [] PROGMEM = {
0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x80, 0x80, 0x82, 0x80, 0x82, 0x80,
0x82, 0x80, 0x82, 0x80, 0x84, 0x80, 0x41, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
};
// 'Temp_9x17px', 9x17px
const unsigned char Temp_9x17px [] PROGMEM = {
0x08, 0x00, 0x14, 0x00, 0x20, 0x00, 0x2b, 0x80, 0x20, 0x00, 0x2b, 0x00, 0x20, 0x00, 0x28, 0x00,
0x22, 0x00, 0x41, 0x00, 0x80, 0x80, 0x82, 0x80, 0x82, 0x80, 0x82, 0x80, 0x84, 0x80, 0x41, 0x00,
0x3e, 0x00
};
// 'Celcius_10x11px', 9x17px
const unsigned char Celc_10x11px [] PROGMEM = {
0x03, 0x00, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
};
// dots
const unsigned char dot3_4x16px [] PROGMEM = {
0x60, 0x90, 0x90, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x60
};
const unsigned char dot2_4x16px [] PROGMEM = {
0x60, 0xf0, 0xf0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xf0, 0xf0, 0x60
};
const unsigned char dot_4x16px [] PROGMEM = {
0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0
};
// 'perc_8x8px', 8x8px
const unsigned char perc_8x8px [] PROGMEM = {
0x41, 0xa2, 0x44, 0x08, 0x10, 0x22, 0x45, 0x82
};
// 'Celcius_10x11px', 10x11px
const unsigned char cel_10x11px [] PROGMEM = {
0x03, 0x80, 0x44, 0x40, 0xa8, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00,
0x08, 0x00, 0x04, 0x40, 0x03, 0x80
};
//==== Змінні датчиків =====
int sensTemp = 25;
int sensHumid = 98;
//==== Розмір цифр=====
int didgH = 27; //висота
int didgW = 15; //ширина
// Завантаження
int progress = 0;
// ==== Час ====
int hours = 22;
int minutes = 38;
int seconds = 0;
unsigned long lastMillis = 0;
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
lastMillis = millis(); // запам'ятовуємо стартовий час
display.setTextSize(1);
display.setTextColor(WHITE);
// Анімація завантаження
while (progress <= (SCREEN_WIDTH - 20)) {
loading();
progress++;
delay(20);
}
delay(50);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - lastMillis >= 1000) { // 1 секунда пройшла
lastMillis += 1000;
incrementTime();
drawTime();
midBlink();
}
}
void loading(){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(40,5);
display.println("BEARDED_i");
display.drawRect(1, 1, 126, 30, 1);//по розміру в пікселях
display.drawRect(10,15, 108,8,1);//по розміру в пікселях
display.fillRect(10,15, progress,8,1);
display.setTextSize(1);
display.setTextColor(WHITE);
display.display();
}
void incrementTime() {
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
}
if (minutes >= 60) {
minutes = 0;
hours++;
}
if (hours >= 24) {
hours = 0;
}
}
void drawTime() {
display.clearDisplay();
drawSens();
// Перша цифра годин
display.drawBitmap(46, 1, num_allArray[hours / 10], didgW, didgH, WHITE);
// Друга цифра годин
display.drawBitmap(64, 1, num_allArray[hours % 10], didgW, didgH, WHITE);
//Крапки розділу
// Перша цифра хвилин
display.drawBitmap(93, 1, num_allArray[minutes / 10], didgW, didgH, WHITE);
// Друга цифра хвилин
display.drawBitmap(111, 1, num_allArray[minutes % 10], didgW, didgH, WHITE);
display.display();
}
void midBlink(){
display.drawBitmap(84, 8, dot3_4x16px, 4, 16, WHITE);
display.display();
delay(1000);
// Стерти область
display.fillRect(84, 8, 4, 16, BLACK);
display.drawBitmap(84, 8, dot2_4x16px, 4, 16, WHITE);
display.display();
delay(1000);
}
void drawSens() {
// Риска розділу
display.drawRect(41, 0, 1, 31, 1);//по розміру в пікселях
// Значок термометра
display.drawBitmap(0, 0, Temp_9x17px, 9, 17, WHITE);
display.drawBitmap(28, 2, cel_10x11px, 10, 11, WHITE);
display.setCursor(13,5);
display.setTextSize(1);
display.setTextColor(WHITE);
display.println(sensTemp);
// Значок вологості
display.drawBitmap(0, 19, Hum_9x13px, 9, 13, WHITE);
display.drawBitmap(30, 21, perc_8x8px, 8, 8, WHITE);
display.setCursor(13,22);
display.setTextSize(1);
display.setTextColor(WHITE);
display.println(sensHumid);
}