#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();
      }
    }
  }
}





$abcdeabcde151015202530354045505560fghijfghij
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