#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_WEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
#define Buzzer 5
#define LED_1 15
#define PB_CANCEL 34
//declare objects
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_WEIGHT, &Wire, OLED_RESET);
//global variables
int days = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
//update time details
unsigned long timeNow = 0;
unsigned long timeLast = 0;
//Alarm details
bool alarm_enabled = true;
int n_alarms = 3;
int alarm_hours[] = {0, 1};
int alarm_minutes[] = {1, 10};
bool alarm_triggered[] = {false, false};
//buzzer tones details
int n_notes = 8;
int C = 262;
int D = 294;
int E = 330;
int F = 350;
int G = 395;
int A = 442;
int B = 497;
int C_H = 525;
int notes[] = {C, D, E, F, G, A, B, C_H};
void setup() {
// put your setup code here, to run once:
pinMode(Buzzer, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(PB_CANCEL, INPUT);
Serial.begin(9600);
//SSD1306
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
delay(2000);
//clear the buffer
display.clearDisplay();
print_line("Welcome to Medibox!", 10, 20, 2);
display.clearDisplay();
}
void loop() {
// put your main code here, to run repeatedly:
update_time_with_check_alarm();
}
void print_line(String text, int column, int row, int text_size) {
display.setTextSize(text_size);
display.setTextColor(SSD1306_WHITE);
display.setCursor(column, row);
display.println(text);
display.display();
}
void print_time_now(void) {
display.clearDisplay();
print_line(String(days), 0, 0, 2);
print_line(":", 20, 0, 2);
print_line(String(hours), 30, 0, 2);
print_line(":", 50, 0, 2);
print_line(String(minutes), 60, 0, 2);
print_line(":", 80, 0, 2);
print_line(String(seconds), 90, 0, 2);
}
void update_time() {
timeNow = millis() / 1000; //seconds passed from bootup
seconds = timeNow - timeLast;
if (seconds >= 60) {
minutes += 1; //minutes=minutes+1
timeLast += 60;
}
if (minutes == 60) {
hours += 1;
minutes = 0;
}
if (hours == 24) {
days += 1;
hours = 0;
}
}
void ring_alarm() {
display.clearDisplay();
print_line("MEDICINE TIME!", 0, 0, 2);
digitalWrite(LED_1, HIGH);
//ring the buzzer
while (digitalRead(PB_CANCEL) == HIGH) {
for (int i = 0; i < n_notes; i++) {
tone(Buzzer, notes[i]);
delay(500);
noTone(Buzzer);
delay(2);
}
}
digitalWrite(LED_1, LOW);
display.clearDisplay();
}
void update_time_with_check_alarm(void) {
update_time();
print_time_now();
if (alarm_enabled == true) {
for (int i = 0; i < n_alarms; i++) {
if (alarm_triggered[i] == false && alarm_hours[i] == hours && alarm_minutes[i] == minutes) {
ring_alarm();
}
}
}
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
oled1:GND
oled1:VCC
oled1:SCL
oled1:SDA
bz1:1
bz1:2
led1:A
led1:C
r1:1
r1:2
r2:1
r2:2
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
r3:1
r3:2