#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREENWIDTH 128 //OLED display width in pixels
#define SCRRENHEIGHT 64 //OLED display height in pixels
#define OLEDRESET -1 //Reset pin
#define SCRRENADDRESS 0x3C /// < see data sheet for address
#define BUZZER 5
#define LED_1 15
Adafruit_SSD1306 display(SCREENWIDTH,SCRRENHEIGHT, &Wire, OLEDRESET );
//global variables
int days = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
unsigned long timeNow = 0;
unsigned long timeLast = 0;
bool alarm_enabled = true;
int n_alarms = 2;
int alarm_hours[] = {0,1};
int alarm_minutes[] = {1,10};
bool alarm_triggered []= {false,false};
int n_notes = 8;
int C =262;
int D =294;
int E =330;
int F =349;
int G =392;
int A =440;
int B =494;
int C_H =523;
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);
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCRRENADDRESS )){
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// show initial display buffer contents on the screen
// the library initializes this with an Adafruit splash scrren.
display.display();
delay(500);
//clear the buffer
display.clearDisplay();
print_line("welcome medibox",10,20,2);
display.clearDisplay();
}
void loop() {
// put your main code here, to run repeatedly:
//delay(10); // this speeds up the simulation
update_time_with_check_alarm();
}
void print_line(String text, int column, int row, int text_size){
display.setTextColor(SSD1306_WHITE);
display.setTextSize(text_size);
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; //milisec convert to sec
seconds= timeNow - timeLast;
if (seconds >= 60){
minutes += 1;
timeLast += 60;
}
if(minutes == 60){
minutes = 0;
hours += 1;
}
if (hours == 24){
hours = 0;
days += 1;
}
//enable the alarms again
/* for (int i =0; i<n_alarms; i++){
alarm_triggered[i] = false;
}*/
}
void ring_alarm(){
display.clearDisplay();
print_line("MEDICINE TIME",0,0,2) ;
digitalWrite(LED_1, HIGH);
//ring the buzzer
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){
display.clearDisplay();
update_time();
print_time_now();
if (alarm_enabled){
for(int i = 0; i<n_alarms; i++){
if(alarm_triggered[i] == false && hours == alarm_hours[i] && minutes == alarm_minutes[i]){
ring_alarm();
alarm_triggered[i] = true;
}
}
}
}Loading
ssd1306
ssd1306