// Fahreza Ramadhan dan Rahmat Ladiku
// UAS IOT
// Template ID dan Device Name serta Auth Token untuk menyambungkan ke Blynk
#define BLYNL_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL9IU_oO-i"
#define BLYNK_DEVICE_NAME "CAHAYA"
#define BLYNK_AUTH_TOKEN "BwbASGg2eJeH5LZnrlsbI4a5IhJzrrk1"
//library untuk memproses LED DOT
#include <MD_Parola.h>
#include <MD_MAX72xx.h> // mengimplementasikan fungsi yang memungkinkan MAX72xx digunakan untuk matriks LED (64 LED individu)
#include <SPI.h>
// Library untuk memproses WiFi dan Int Gateway
#include <WiFi.h> // wifi control
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
//mendefinisikan jenis hardware
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
//mendefinisikan pin yang digunakan
#define MAX_DEVICES 4
#define CS_PIN 5
#define LDR_PIN 36
#define LED_PIN 22
MD_Parola Display = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
char auth[] = BLYNK_AUTH_TOKEN;
//konfigurasi wifi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//konstanta untuk perhitungan lux
const float GAMMA = 0.7;
const float RL10 = 50;
//fungsi mengatur kata yang akan ditampilkan pada LED MATRIX
void redled (float lux) {
if (lux <= 10) {
Serial.println("=> Rendah");
Display.displayText("Rendah", PA_CENTER, 10, 0, PA_SCROLL_LEFT);
} else if (lux <= 1000 ) {
Serial.println("=> Ideal");
Display.displayText("Ideal", PA_CENTER, 10, 0, PA_SCROLL_LEFT);
} else if (lux <= 10000) {
Serial.println("=> Tinggi");
Display.displayText("Tinggi", PA_CENTER, 10, 0, PA_SCROLL_LEFT);
} else {
Serial.println("=> Tinggi");
Display.displayText("Tinggi", PA_CENTER, 10, 0, PA_SCROLL_LEFT);
}
delay(500);
}
// fungsi untuk mengolah analog data, otomatisasi led dan mengirim data ke blynk
void sendData() {
//menjelaskan nilai analog ke dalam virtual light
int light = analogRead(LDR_PIN);
//volt atau tegangan
float voltage = light / 4095. * 5;
//hambatan
float resistance = 2000 * voltage / (1 - voltage / 5);
//lux merupakan satuan turunan SI dari pencahayaan dan daya pancar cahaya
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
Blynk.virtualWrite(V1, light); // mengirim data light atau cahaya ke blynk
Blynk.virtualWrite(V2, lux); // mengirim data lux ke blynk
if (Display.displayAnimate()) {
Serial.print("Mengirim Data...");
Serial.print("Analog: ");
Serial.print(light);
Serial.print("Mengirim Data");
Serial.print(lux);
if(lux <= 10){
digitalWrite(LED_PIN, HIGH); //turn on LED
Blynk.virtualWrite(V3, 255); //hidupkAN LED di aplikasi
redled(lux);
}
else if (lux >= 1000) {
digitalWrite(LED_PIN, HIGH); //turn on LED
Blynk.virtualWrite(V3, 255); //hidupkAN LED di aplikasi
redled(lux);
}
else {
digitalWrite(LED_PIN, LOW); //turn of LED
Blynk.virtualWrite(V3, 0); //hidupkAN LED di aplikasi
redled(lux);
}
Display.displayReset();
}
}
//menyampaikan fungsi timer blynk
BlynkTimer timer;
//fungsi untuk menerima data dari server atau aplikasi
//berfungsi sebagai tombol on/off LED dari Aplikasi atau Web
BLYNK_WRITE(V3) {
if (param.asInt()==255){
digitalWrite(LED_PIN, HIGH);
}
else {
digitalWrite(LED_PIN, LOW);
}
}
BLYNK_CONNECTED()
{
Serial.println("CONNECTED");
Blynk.syncVirtual(V1,V2,V3);
}
//fungsi utama yang akan dijalankan pertama kali
void setup() {
pinMode(LDR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
// initialize serial for debugging
Serial.begin (115200);
delay(1000);
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
//initialize object
Display.begin();
//set the brightness of the display
Display.setIntensity(0);
//membersikan display
Display.displayClear();
timer.setInterval(1L, sendData);
}
//fungsi loop untuk bisa dijalankan berulang kali
void loop() {
Blynk.run();
timer.run();
}