#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include "time.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define rowNum 4
#define colNum 4
char keys[rowNum][colNum] = {
{'1', '2', '3', 'A'}, // A : turn off alarm
{'4', '5', '6', 'B'}, // B : backspace
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'} // D : enter/input alarm
};
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const char* ssid = "Udi wiyono. Wifi"; // change with wifi name
const char* password = "bismillah"; // change with wifi password
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 25200;
const int daylightOffset_sec = 0;
const int ledPin = 23;
int pinState = 0;
int lastState = LOW;
char rowPins[rowNum] = {13, 12, 14, 27};
char colPins[colNum] = {26, 25, 33, 32};
String alr, hr, mn, sc;
bool alrExist = false;
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 10);
display.print("Connecting to ");
display.println(ssid);
display.display();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
display.print(".");
display.display();
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 10);
display.println("");
display.println("WiFi connected.");
display.display();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
for(char r = 0; r < rowNum; r++){
pinMode(rowPins[r], OUTPUT);
digitalWrite(rowPins[r], HIGH);
}
for(char c = 0; c < colNum; c++){
pinMode(colPins[c], INPUT_PULLUP);
}
pinMode(ledPin, OUTPUT);
display.clearDisplay();
}
void loop() {
printLocalTime();
getKey();
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
display.setTextColor(WHITE, BLACK);
display.setTextSize(1);
display.setCursor(0, 10);
display.println(&timeinfo, "%A, %d %B %Y %H:%M:%S");
display.display();
if (alrExist) {
char cHour[3];
char cMinute[3];
char cSecond[3];
strftime(cHour,3, "%H", &timeinfo);
strftime(cMinute,3, "%M", &timeinfo);
strftime(cSecond,3, "%S", &timeinfo);
String nowHour = String(cHour);
String nowMinute = String(cMinute);
String nowSecond = String(cSecond);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 45);
display.print("Active Alarm : ");
display.print(hr);
display.print(':');
display.print(mn);
display.print(':');
display.println(sc);
display.display();
if ((hr == nowHour) && (mn == nowMinute) && (sc == nowSecond)) {
digitalWrite(ledPin, HIGH);
alrExist = false;
display.clearDisplay();
}
}
}
void setAlarm() {
hr = alr.substring(0,2);
mn = alr.substring(2,4);
sc = alr.substring(4);
alrExist = true;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(10, 45);
display.println("ALARM SET");
display.display();
digitalWrite(ledPin, LOW);
delay(500);
display.clearDisplay();
}
void getKey() {
char key= '?';
for (char r = 0; r < rowNum; r++) {
digitalWrite(rowPins[r], LOW);
for (char c = 0; c < colNum; c++) {
if (digitalRead(colPins[c]) == LOW) {
delay(50);
while (digitalRead(colPins[c]) == LOW) {
pinState = digitalRead(colPins[c]);
if ((pinState == LOW) && (lastState == HIGH)) {
key = keys[r][c];
if (key == 'D') {
if (alr.length() == 6) {
setAlarm();
}
} else if (key == 'A') {
digitalWrite(ledPin, LOW);
} else if (key == 'B') {
int l = alr.length();
alr.remove(l-1,1);
display.clearDisplay();
} else if ((key != 'C') && (key != '*') && (key != '#')) {
alr += key;
}
lastState = pinState;
}
}
}
lastState = HIGH;
}
digitalWrite(rowPins[r], HIGH);
}
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 30);
display.print("Input Alarm : ");
display.println(alr);
display.display();
}