// template id dan device name untuk menghubungkan ke blink
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPLXg0Ktn1I"
#define BLYNK_DEVICE_NAME "Hydro App"
#define BLYNK_AUTH_TOKEN "PuEWuKSG6-irZjNgLnAqTqf5vJJYXR8A"
// library untuk memproses LED DOT Matrix
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// library untuk memproses wifi dan iot getway blynk
#include <WiFi.h> // untuk kontrol wifi esp32
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h> // blynk sdk/library
// mendefinisikan jenis hadware
#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);
// konfigurasi wifi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// konstanta untuk perhitungan lux
const float GAMMA = 0.7;
const float RL10 = 50;
// fungsi untuk kata yang ditampilkan pada led matrix
void redled (float lux){
if(lux <= 10){
Serial.println(" => Malam");
Display.displayText("Malam", PA_CENTER, 10, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
} else if(lux <= 1000){
Serial.println(" => Pagi/Mendung");
Display.displayText("Pagi", PA_CENTER, 10, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
} else if(lux <= 10000){
Serial.println(" => Siang");
Display.displayText("Siang", PA_CENTER, 10, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
} else {
Serial.println(" => Siang Sangat Terang");
Display.displayText("Sangat Cerah", PA_CENTER, 10, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
}
delay(50);
}
// fungsi untuk mengelola analog data, otomatis nyala led dan mengirim data ke blink
void sendData(){
// mendeklarasikan nilai analog ke dalam variable 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 ke blynk
Blynk.virtualWrite(V2, lux); // mengirim data lux ke blynk
if (Display.displayAnimate()){
Serial.print("sending data...");
Serial.print(" analog: ");
Serial.print(light);
Serial.print(" lux: ");
Serial.print(lux);
if (lux <= 10){
digitalWrite(LED_PIN, HIGH);
Blynk.virtualWrite(V3, 255);
redled(lux);
} else {
digitalWrite(LED_PIN, LOW);
Blynk.virtualWrite(V3, 0); // matikan lampu di aplikasi
redled(lux);
}
Display.displayReset();
}
}
// mendeklarasikan fungsi timer Blynk
BlynkTimer timer;
// fungsi untuk menerima data dari server/ aplikasi
// berfungsi sebagai tombol on/of LED dari aplikasi blynk
BLYNK_WRITE(V3) {
if (param.asInt() == 255){
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
// fungsi utama yang akan dijalankan pertama kali
void setup() {
pinMode(LDR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
// initialize serial for debuging
Serial.begin(115200);
delay(1000);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// intialize object
Display.begin();
// set the intensity (brigness) of the display (0-15);
Display.setIntensity(0); // mengatur kecerahan
// bersihkan display
Display.displayClear();
timer.setInterval(1L, sendData); // untuk mengatur interval
}
// fungsi loop yang akan dijalankan berulang kali
void loop() {
Blynk.run();
timer.run();
}