#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
// OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// RTC
RTC_DS3231 rtc;
// PIN
int clk = 18;
int dt = 19;
int sw = 23;
int buzzer = 5;
int lastCLK;
int indexMenu = 0;
// Data informasi
String keluhan[] = {
"Internet Lambat",
"Tidak Konek",
"Sering Putus",
"WiFi Lemah",
"pencabutan client bulanan"
};
int total = 5;
void setup() {
Serial.begin(115200);
pinMode(clk, INPUT);
pinMode(dt, INPUT);
pinMode(sw, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
Wire.begin(21, 22);
// OLED
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// RTC
if (!rtc.begin()) {
Serial.println("RTC tidak terbaca");
while (1);
}
lastCLK = digitalRead(clk);
tampilMenu();
}
void loop() {
int currentCLK = digitalRead(clk);
// Rotary Encoder
if (currentCLK != lastCLK && currentCLK == HIGH) {
if (digitalRead(dt) != currentCLK) {
indexMenu++;
} else {
indexMenu--;
}
if (indexMenu < 0) indexMenu = total - 1;
if (indexMenu >= total) indexMenu = 0;
tampilMenu();
}
lastCLK = currentCLK;
// Tombol tekan
if (digitalRead(sw) == LOW) {
pilihKeluhan();
delay(300);
}
}
// TAMPIL MENU
void tampilMenu() {
DateTime now = rtc.now();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
// Judul
display.setCursor(0,0);
display.print("Keluhan WiFi");
// Jam RTC
display.setCursor(0,10);
display.print(now.hour());
display.print(":");
display.print(now.minute());
// Menu
display.setCursor(0,30);
display.print(keluhan[indexMenu]);
display.display();
}
// PILIH KELUHAN
void pilihKeluhan() {
display.clearDisplay();
display.setCursor(0,20);
display.print("Dipilih:");
display.setCursor(0,35);
display.print(keluhan[indexMenu]);
display.display();
// Buzzer bunyi
tone(buzzer, 1000);
delay(300);
noTone(buzzer);
Serial.println(keluhan[indexMenu]);
delay(1000);
tampilMenu();
}