/* UJIAN TENGAH SEMESTER (UTS)
INTERNET OF THINGS
OLEH
AFANDI YUSUF ASSALAM
TOLI 5 - 2003411016 */
//Deklarasi library
#include <WiFi.h> //wifi
#include "DHTesp.h" //sensor DHT
#include "ThingSpeak.h" //koneksi Thingspeak
//Deklarasi sensor ultrasonik
#define SOUND_SPEED 0.034
//Deklarasi PIN I/O PushButton
#define SV1 15
#define SV2 2
#define SV3 4
//Deklarasi PIN I/O Pompa (relay)
#define PUMP_1 5
#define PUMP_2 18
#define PUMP_3 19
//Deklarasi PIN I/O untuk LED PIN sebagai level air
#define LED_LOW 25
#define LED_MEDIUM 26
#define LED_HIGH 27
#define LED_HIGHHIGH 14
//user password WiFi internal WokWi
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
WiFiClient client;
//properti yang dibutuhkan untuk koneksi dengan ThingSpeak
unsigned long myChannelNumber = 1932013;
const char* ReadAPIKey = "5POSSPYN5DZYH9PC";
const char* server = "api.thingspeak.com";
//Deklarasi status PushButton
int ButtonState_SV1 = 0;
int ButtonState_SV2 = 0;
int ButtonState_SV3 = 0;
//Deklarasi pin HC - SR04
const int TRIG_PIN = 12;
const int ECHO_PIN = 13;
long DURATION;
float DISTANCE_CM;
//Deklarasi DHT_PIN
const int DHT_PIN = 23;
float TemperatureValue;
float HumidityValue;
DHTesp dhtSensor;
int interval = 2000;
int currentTime=0;
// ========================= HC- SR04 ==============================
// Ketinggian Air
void bacaJarak(void * parameter){
for(;;){
Serial.println("BACA JARAK TERBACA");
Serial.print("JARAK : ");
Serial.print(DISTANCE_CM);
Serial.println(" CM");
delay((1000));
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
DURATION = pulseIn(ECHO_PIN, HIGH);
DISTANCE_CM = DURATION * SOUND_SPEED/2 ;
vTaskDelay(1000/ portTICK_PERIOD_MS); // delay 1 sekon
}
}
//===================================================================
// ================= WATER DISTRIBUTION SYSTEM ======================
void bacaWaterDistSyst(void * parameter){
for(;;){
if(DISTANCE_CM <= 100 && digitalRead(PUMP_1) == HIGH ){
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(LED_LOW, HIGH);
digitalWrite(LED_MEDIUM, LOW);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_HIGHHIGH, LOW);
} else if(DISTANCE_CM <= 200 && digitalRead(PUMP_1) == HIGH ){
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_MEDIUM, HIGH);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_HIGHHIGH, LOW);
} else if(DISTANCE_CM <= 300 && digitalRead(PUMP_1) == HIGH){
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_MEDIUM, LOW);
digitalWrite(LED_HIGH, HIGH);
digitalWrite(LED_HIGHHIGH, LOW);
} else if(DISTANCE_CM < 390 && digitalRead(PUMP_1) == HIGH){
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_MEDIUM, LOW);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_HIGHHIGH, HIGH);
} else if(DISTANCE_CM >= 390 && digitalRead(PUMP_1) == HIGH ){
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_MEDIUM, LOW);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_HIGHHIGH, LOW);
digitalWrite(PUMP_1, LOW);
Serial.println("PUMP 1 TIDAK BEKERJA");
if( digitalRead(PUMP_1) == LOW && DISTANCE_CM < 390 ) {
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(PUMP_2, HIGH);
digitalWrite(PUMP_3, LOW);
Serial.println("PUMP 2 BEKERJA");
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_MEDIUM, LOW);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_HIGHHIGH, HIGH);
}
if( digitalRead(PUMP_1) == LOW && DISTANCE_CM < 300 ) {
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(PUMP_2, HIGH);
digitalWrite(PUMP_3, LOW);
Serial.println("PUMP 2 BEKERJA");
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_MEDIUM, LOW);
digitalWrite(LED_HIGH, HIGH);
digitalWrite(LED_HIGHHIGH, LOW);
}
if( digitalRead(PUMP_1) == LOW && DISTANCE_CM < 200 ) {
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(PUMP_3, HIGH);
digitalWrite(PUMP_2, LOW);
Serial.println("PUMP 3 BEKERJA");
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_MEDIUM, HIGH);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_HIGHHIGH, LOW);
}
if( digitalRead(PUMP_1) == LOW && DISTANCE_CM < 100 ) {
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(PUMP_3, HIGH);
digitalWrite(PUMP_2, LOW);
Serial.println("PUMP 3 BEKERJA");
digitalWrite(LED_LOW, HIGH);
digitalWrite(LED_MEDIUM, LOW);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_HIGHHIGH, LOW);
}
if( digitalRead(PUMP_1) == LOW && DISTANCE_CM < 10 ) {
vTaskDelay(5000/portTICK_PERIOD_MS);
digitalWrite(PUMP_3, LOW);
Serial.println("PUMP 3 TIDAK BEKERJA");
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_MEDIUM, LOW);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_HIGHHIGH, LOW);
}
}
vTaskDelay(1000/ portTICK_PERIOD_MS); // delay 1 sekon
}
}
//===================================================================
// ================== Push Button =====================
// SV1, SV2, SV3
void bacaPushButton(void * parameter){
for(;;){
ButtonState_SV1 = digitalRead(SV1);
ButtonState_SV2 = digitalRead(SV2);
ButtonState_SV3 = digitalRead(SV3);
if (ButtonState_SV1 == LOW || ButtonState_SV2 == LOW || ButtonState_SV3 == LOW) {
// Switch on the PUMP 1
digitalWrite(PUMP_1, HIGH);
Serial.println("PUMP 1 BEKERJA");
delay(1000);
} else if ( ButtonState_SV1 == HIGH || ButtonState_SV2 == HIGH || ButtonState_SV3 == HIGH ){
// Switch off the PUMP 1
digitalWrite(PUMP_1, LOW);
Serial.println("PUMP 1 TIDAK BEKERJA");
delay(1000);
}
vTaskDelay(1000/ portTICK_PERIOD_MS); // delay 1 sekon
}
}
//===================================================================
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); //Komunikasi Serial
Serial.println("DHT22 & HC-SR04 sensor with Arduino ESP32 !");
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
WiFi.begin(ssid, pass);
ThingSpeak.begin(client);
while(WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.println(".");
}
Serial.println("Wifi Connected!");
Serial.println(WiFi.localIP());
// Push Button menggunakan Input Pull Up
pinMode(SV1, INPUT_PULLUP);
pinMode(SV2, INPUT_PULLUP);
pinMode(SV3, INPUT_PULLUP);
// HCSR-04
pinMode(ECHO_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
//PUMP atau POMPA
pinMode(PUMP_1, OUTPUT);
pinMode(PUMP_2, OUTPUT);
pinMode(PUMP_3, OUTPUT);
// LED Pin sebagai Indikator Water Level Control
pinMode(LED_LOW, OUTPUT);
pinMode(LED_MEDIUM, OUTPUT);
pinMode(LED_HIGH, OUTPUT);
pinMode(LED_HIGHHIGH, OUTPUT);
// Task to run forever
xTaskCreate( //Use xTaskCreate() in FreeRTOS
bacaPushButton, //Function to be called
"BACA PUSHBUTTON ", // Name of task
1000,
NULL, //Parameter to pass to function
1, //Task priority ( 0 to configMAX_PRIORITIES - 1)
NULL);
xTaskCreate( //Use xTaskCreate() in FreeRTOS
bacaWaterDistSyst, //Function to be called
"BACA WaterDistSyst ", // Name of task
1000,
NULL, //Parameter to pass to function
1, //Task priority ( 0 to configMAX_PRIORITIES - 1)
NULL);
// Task to run forever
xTaskCreate( //Use xTaskCreate() in FreeRTOS
bacaJarak, //Function to be called
" BACA JARAK ", // Name of task
1000,
NULL, //Parameter to pass to function
1, //Task priority ( 0 to configMAX_PRIORITIES - 1)
NULL);
// xTaskCreate( //Use xTaskCreate() in FreeRTOS
// bacaKelembaban, //Function to be called
// "BACA TEMP& HUM", // Name of task
// 1000,
// NULL, //Parameter to pass to function
// 1, //Task priority ( 0 to configMAX_PRIORITIES - 1)
// NULL);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("BACA KELEMBABAN TERBACA");
TempAndHumidity data = dhtSensor.getTempAndHumidity();
TemperatureValue = data.temperature;
HumidityValue = data.humidity;
Serial.println("Temp : " + String(data.temperature, 2) + "°C");
Serial.println("Humidity : " + String(data.humidity, 1) + "%");
delay(1000);
ThingSpeak.setField(1, data.temperature);
ThingSpeak.setField(2, data.humidity);
int x = ThingSpeak.writeFields(myChannelNumber, ReadAPIKey);
vTaskDelay(1000/ portTICK_PERIOD_MS); // delay 1 sekon
}