//Tiga parameter di bawah ini biasanya ada saat kita membuat template baru
#define BLYNK_TEMPLATE_ID "TMPL6IJ2Bo1s6"
#define BLYNK_TEMPLATE_NAME "Mentoring P6 Sensor"
#define BLYNK_AUTH_TOKEN "x6QntwBiJrfwswJHII-YfcwAj-mR4_Gt"
#define BLYNK_PRINT Serial //Kita menggunakan Blynk serial
#include <WiFi.h> //Library WiFi
#include <WiFiClient.h> //Library WiFiClient
#include <BlynkSimpleEsp32.h> //Library BlynkESP32
char ssid[] = "Wokwi-GUEST"; //Nama WiFi yang digunakan
char pass[] = ""; //Password WiFi yang digunakan
BlynkTimer timer; //Untuk push data dibutuhkan blynk timer (untuk code push data dapat dilihat di blynk example)
//SENSOR DHT
#include <DHTesp.h> //Library untuk sensor DHT
const int DHT_PIN = 18; //Pin signal DHT
byte led = 5; //Pin LED adalah D5
DHTesp dhtSensor; //Buat objek bernama dhtSensor
float suhu, kelembaban, k, f; //Variabel suhu dan kelembaban
//Ultrasonik
const int trigPin = 25;
const int echoPin = 26;
//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
long duration;
float distanceCm;
float distanceInch;
int led_state = 0;
int buttonPin = 4;
int buttonState = 0;
#define unPressed HIGH
#define pressed LOW
boolean activationMode;
boolean last_activationMode;
void setup()
{
Serial.begin(115200); //Menginisiasi serial monitor
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); //Menginisiasi Blynk
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); //Mendefine dht sensor (DHT22 merupakan jenis DHT yang digunakan)
timer.setInterval(1000L, myTimerEvent); //Mengirim data tiap satu detik
pinMode(buttonPin, INPUT);
pinMode(led, OUTPUT);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}
void SensorUltrasonik()
{
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
// Prints the distance in the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
delay(1000);
Blynk.virtualWrite(V5, distanceCm); //Mengirim data jarak pin V5
}
bool GetToggleSwitchState() {
// "static" makes variables persistant over function calls
static bool toggleState = false;
static bool lastToggleState = false;
static byte buttonStateOld = unPressed;
static unsigned long buttonScanStarted = 0;
unsigned long buttonDebounceTime = 50;
static unsigned long buttonDebounceTimer;
byte buttonStateNew;
if ( TimePeriodIsOver(buttonDebounceTimer, buttonDebounceTime) ) {
// if more time than buttonDebounceTime has passed by
// this means let pass by some time until
// bouncing of the button is over
buttonStateNew = digitalRead(buttonPin);
if (buttonStateNew != buttonStateOld) {
// if button-state has changed
buttonStateOld = buttonStateNew;
if (buttonStateNew == unPressed) {
// if button is released
toggleState = !toggleState; // toggle state-variable
} // the attention-mark is the NOT operator
} // which simply inverts the boolean state
} // !true = false NOT true is false
// !false = true NOT false is true
return toggleState;
}
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
unsigned long currentMillis = millis();
if ( currentMillis - startOfPeriod >= TimePeriod ) {
// more time than TimePeriod has elapsed since last time if-condition was true
startOfPeriod = currentMillis; // a new period starts right here so set new starttime
return true;
}
else return false; // actual TimePeriod is NOT yet over
}
void myTimerEvent()
{
activationMode = GetToggleSwitchState(); // must be executed all the time
if (activationMode != last_activationMode) {
if(led_state == LOW){
// turn LED on:
Serial.println("lampu menyala");
led_state = HIGH;
digitalWrite(led, HIGH);
Blynk.virtualWrite(V4, 1);
}
else {
// turn LED off:
Serial.println("lampu mati");
led_state = LOW;
digitalWrite(led, LOW);
Blynk.virtualWrite(V4, 0);
}
last_activationMode = activationMode;
}
Serial.println(led_state);
TempAndHumidity data = dhtSensor.getTempAndHumidity(); //Inisiasi pengambilan data
suhu = data.temperature; //Mendefinisikan variabel suhu
kelembaban = data.humidity; //Mendefinisikan variabel kelembaban
f = (9/5 * suhu) + 32;
k = suhu + 273;
Serial.println("Suhu (C): " + String(suhu, 1) + "C");
Serial.println("Suhu (F): " + String(f, 1) + "F");
Serial.println("Suhu (K): " + String(k, 1) + "K");
Serial.println("Kelembaban: " + String(kelembaban, 1) + "%");
Serial.println(suhu);
//KODE UNTUK MENGIRIM NOTIFIKASI
if (suhu > 35) //Jika suhu lebih dari 35,maka...
{
Serial.println("Suhu Naik");
Blynk.logEvent("high_temp"); //...Blynk akan mengirimkan notifikasi ke Gmail, dgn event "suhu_naik"
}
delay(1000);
SensorUltrasonik();
Blynk.virtualWrite(V0, suhu); //Mengirim data suhu menurut pin V0 di Blynk
Blynk.virtualWrite(V1, kelembaban); //Mengirim data kelembaban pin V1
Blynk.virtualWrite(V2, f); //Mengirim data farenheit pin V2
Blynk.virtualWrite(V3, k); //Mengirim data kelvin pin V3
}
BLYNK_WRITE(V4) //V4, sesuai dengan pin Blynk yang ingin dipakai
{
led_state = param.asInt();
Serial.print("V4 Switch value is: ");
Serial.println(led_state);
digitalWrite(led, led_state);
}
void loop()
{
Blynk.run(); //Menjalankan Bylnk
timer.run(); //Menjalankan timer
}