// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi
/*
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 7*3600
#define UTC_OFFSET_DST 0
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
LCD.setCursor(15, 1);
LCD.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
LCD.setCursor(0, 1);
LCD.println("Connection Err");
return;
}
LCD.setCursor(8, 0);
LCD.println(&timeinfo, "%H:%M:%S");
LCD.setCursor(0, 1);
LCD.println(&timeinfo, "%d/%m/%Y %Z");
}
void setup() {
Serial.begin(115200);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi ");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Online");
LCD.setCursor(0, 1);
LCD.println("Updating time...");
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}
void loop() {
printLocalTime();
delay(250);
}
*/
#include "WiFi.h"
//#include "ESPAsyncWebServer.h"
#include "SPIFFS.h"
#include <RTClib.h>
// #include <Wire.h>
#include <WiFiAP.h>
RTC_DS3231 rtc;
#include "rtc.h"
#include <CSV_Parser.h>
#define pinrl 14
// Replace with your network credentials
const char* ssid = "anakkendali";
const char* password = "";
char daysOfTheWeek[7][12] = {"Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jum'at", "Sabtu"};
// Set LED GPIO
const int ledPin = 2;
// Stores LED state
String ledState;
#define pinbusy 32
struct Waktu {
uint8_t _jam;
uint8_t _menit;
};
struct Jadwalbel {
Waktu waktu;
uint8_t filemp3;
};
struct tablejadwal {
String str;
};
#include "DFRobotDFPlayerMini.h"
DFRobotDFPlayerMini myDFPlayer;
// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
// Replaces placeholder with LED state value
String processor(const String& var) {
Serial.println(var);
if (var == "STATE") {
if (digitalRead(ledPin)) {
ledState = "ON";
}
else {
ledState = "OFF";
}
Serial.print(ledState);
return ledState;
}
return String();
}
char buff[2046];
String hari;
String getjam; int lagu;
void setup() {
// Serial port for debugging purposes
Serial.begin(115200);
// pinMode(ledPin, OUTPUT);
pinMode(pinrl, OUTPUT);
Serial2.begin(9600);
// Initialize SPIFFS
if (!SPIFFS.begin(true)) {
Serial.println("An Error has occurred while mounting SPIFFS");
return;
}
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
pinMode (pinbusy, INPUT);
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
// When time needs to be set on a new device, or after a power loss, the
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
// Print ESP32 Local IP Address
Serial.println(WiFi.localIP());
// Route for root / web page
server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/index.html", String(), false, processor);
});
server.on("/setting", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/setting.html", String(), false, processor);
});
delay(1000);
if (!myDFPlayer.begin(Serial2)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while (true);
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
//----Set volume----
myDFPlayer.volume(30); //Set volume value (0~30).
myDFPlayer.volumeUp(); //Volume Up
myDFPlayer.volumeDown(); //Volume Down
//----Set different EQ----
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
// myDFPlayer.EQ(DFPLAYER_EQ_POP);
// myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
// myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
// myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
// myDFPlayer.EQ(DFPLAYER_EQ_BASS);
//----Set device we use SD as default----
// myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK);
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
// myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX);
// myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP);
// myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH);
//----Mp3 control----
// myDFPlayer.sleep(); //sleep
// myDFPlayer.reset(); //Reset the module
// myDFPlayer.enableDAC(); //Enable On-chip DAC
// myDFPlayer.disableDAC(); //Disable On-chip DAC
// myDFPlayer.outputSetting(true, 15); //output setting, enable the output and set the gain to 15
//----Mp3 play----
// myDFPlayer.next(); //Play next mp3
// delay(1000);
// myDFPlayer.previous(); //Play previous mp3
// delay(1000);
myDFPlayer.play(1); //Play the test 1 mp3
digitalWrite(pinrl, 1);
server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/favicon.ico", "image/x-icon");
});
server.on("/jquery.min.js", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/jquery.min.js", "text/js");
});
server.on("/bootstrap.min.js", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/bootstrap.min.js", "text/js");
});
server.on("/bootstrap.min.css", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/bootstrap.min.css", "text/css");
});
server.on("/datajadwal", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/data.csv", String(), false, processor);
});
// Route to get param
server.on("/getsetting", HTTP_GET, [](AsyncWebServerRequest * request) {
int paramsNr = request->params();
Serial.println(paramsNr);
for (int i = 0; i < paramsNr; i++) {
AsyncWebParameter* p = request->getParam(i);
Serial.print("name: ");
Serial.println(p->name());
Serial.print("value: ");
Serial.println(p->value());
Serial.println("------");
if (p->name() == "hari") {
hari = p->value();
} else if (p->name() == "jam") {
getjam = p->value();
} else if (p->name() == "mp3") {
lagu = p->value().toInt();
}
}
Serial.println(buff);
if (readFile(SPIFFS, "/data.csv") == 0) {
writeFile(SPIFFS, "/data.csv", "hari,jam,lagu\r\n");
sprintf(buff, "%s,%s,%d\r\n", hari, getjam, lagu);
appendFile(SPIFFS, "/data.csv", buff);
}
else {
sprintf(buff, "%s,%s,%d\r\n", hari, getjam, lagu);
appendFile(SPIFFS, "/data.csv", buff);
}
readFile(SPIFFS, "/data.csv");
request->send(SPIFFS, "/setting.html", String(), false, processor);
});
server.on("/hapus", HTTP_GET, [](AsyncWebServerRequest * request) {
deleteFile(SPIFFS, "/data.csv");
writeFile(SPIFFS, "/data.csv", "");
request->send(200, "text/html", "Berhasil menghapus semua jadwal <br><a href=\"/\">Return to Home Page</a>");
});
// Start server
server.begin();
delay(1000);
digitalWrite(pinrl, 0);
}
bool statealarm;
void loop() {
digitalWrite(pinrl, !digitalRead(pinbusy));
File file = SPIFFS.open("/data.csv");
if (!file || file.isDirectory()) {
Serial.println("− failed to open file for reading");
return;
delay(1000);
}
Serial.println("− read from file : ");
while (file.available()) {
String str = file.readString();
str.toCharArray(buff, 500);
CSV_Parser cp(buff, /*format*/ "ssL");
char **jadwalhari = (char**)cp["hari"];
char **jadwaljam = (char**)cp["jam"];
int32_t *filelagu = (int32_t*)cp["lagu"];
//
DateTime now = rtc.now();
for (int row = 0; row < cp.getRowsCount(); row++) {
String hm = jadwaljam[row];
String jh = jadwalhari[row];
if (jh == String(hariini) && hm.substring(3, 5).toInt() == menit && hm.substring(0, 2).toInt() == jam && detik == 0) {
Serial.print("Alarm aktif jadwal ke");
Serial.println(row);
myDFPlayer.play(filelagu[row]);
statealarm = 1;
}
// // _jam = hm.substring(0,2).toInt();
// // _menit = hm.substring(4,5).toInt();
//
Serial.print("Jadwal: ");
Serial.print(row);
Serial.print("\t");
Serial.print(jh);
Serial.print("\t");
Serial.print(hm.substring(0, 2).toInt());
Serial.print(":");
Serial.print(hm.substring(3, 5).toInt());
Serial.print("\tFile lagu: ");
Serial.println(filelagu[row], DEC);
// Serial.println(
// Serial.print(". Jadwal Jam = ");
// Serial.println(hm.substring(0,2));
// Serial.print(row, DEC);
// Serial.print(". File lagu = ");
// String();
}
Serial.println();
// Serial.println(str);
Serial.print(hariini);
Serial.print(" ");
Serial.printf("%02d", jam);
Serial.print(":");
Serial.printf("%02d", menit);
Serial.print(":");
Serial.println(detik);
}
// delay(1000);
}