Skip to content

Instantly share code, notes, and snippets.

@barraIhsan
Last active May 31, 2022 02:11
Show Gist options
  • Save barraIhsan/8eeb1d8068ec136f3fceb1c7d676b144 to your computer and use it in GitHub Desktop.
Save barraIhsan/8eeb1d8068ec136f3fceb1c7d676b144 to your computer and use it in GitHub Desktop.
IoT IDN Boarding School
#include "UbidotsESPMQTT.h" // Library untuk Ubidots MQTT ESP
#include <NewPing.h> // Library untuk HC-SR04
#include <DHT.h> // Library untuk DHT11
#include <MQUnifiedsensor.h> // Library untuk MQ135
#define TRIGGER_PIN D5 // Pin Trigger HC-SR04 pada NodeMCU
#define ECHO_PIN D6 // Pin Echo HC-SR04 pada NodeMCU
#define MAX_DISTANCE 250 // Maksimum Pembacaan Jarak (cm)
#define DHTPIN D4 // Define Pin DHT
#define DHTTYPE DHT11 // Define Jenis DHT
#define Pompa D0 // Define Pin Relay 1
#define Minum D1 // Define Pin Relay 2
#define placa "ESP8266" // Define jenis board yang digunakan
#define Voltage_Resolution 5 // Tegangan yang digunakan
#define pin A0 // Pin yang digunakan untuk MQ-135
#define type "MQ-135" // Jenis MQ yang digunakan
#define ADC_Bit_Resolution 10 // Resolusi Bit ADC
#define RatioMQ135CleanAir 3.6 // Nilai Udara dianggap bersih
#define TOKEN "YOUR_TOKEN" // Token dari Ubidots
#define WIFINAME "YOUR_SSID" // SSID Wi-Fi
#define WIFIPASS "YOUR_SSID_PASSWORD" // Password Wi-Fi
MQUnifiedsensor MQ135(placa, Voltage_Resolution, ADC_Bit_Resolution, pin, type); // Aktifkan fungsi MQ-135
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Aktifkan Fungsi HCSR-04
DHT dht(DHTPIN, DHTTYPE); // Aktifkan Fungsi DHT
Ubidots client(TOKEN); // Aktifkan fungsi Ubidots dengan Token
unsigned long durasiKirim = 0;
unsigned long jedaKirim = 2000;
// Untuk menerima perintah dari Dashboard Ubidots dengan isi Topik dan Nilai Pesannya
void callback(char* topic, byte* payload, unsigned int length) {
// Mencetak Topik dan Nilai Pesan yang masuk dari Dashboard Ubidots
Serial.print("Pesan Diterima: [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length;i++) {
Serial.print((char)payload[i]);
}
// Kondisi apabila Topik yang masuk Relay 1 dan Membaca Nilai Pesan yang dikirimkan untuk menyalakan Pompa
if (strcmp(topic, "/v1.6/devices/smart-farm/relay1/lv") == 0) {
if ((char)payload[0] == '0') {
digitalWrite(Pompa, LOW);
} else {
digitalWrite(Pompa, HIGH);
}
Serial.println();
}
// Kondisi apabila Topik yang masuk Relay 2 dan Membaca Nilai Pesan yang dikirimkan untuk Menyalakan Air
if (strcmp(topic, "/v1.6/devices/smart-farm/relay2/lv") == 0) {
if ((char)payload[0] == '0') {
digitalWrite(Minum, LOW);
} else {
digitalWrite(Minum, HIGH);
}
Serial.println();
}
}
void setup() {
Serial.begin(115200); // Baudrate untuk Serial Komunikasi
client.ubidotsSetBroker("industrial.api.ubidots.com"); // Set Broker Ubidots
client.setDebug(true);
client.wifiConnection(WIFINAME, WIFIPASS); // Mencoba Koneksi dengan Wi-Fi
client.begin(callback); // Aktifkan fungsi Callback
pinMode(Pompa, OUTPUT); // Set Relay 1 sebagai Output
pinMode(Minum, OUTPUT); // Set Relay 2 sebagai Output
digitalWrite(Pompa, HIGH); // Set Relay 1 dengan Nilai HIGH
digitalWrite(Minum, HIGH); // Set Relay 2 dengan Nilai HIGH
client.ubidotsSubscribe("smart-farm", "relay1"); // Subscribe ke Topik Relay1 dan Device smart-farm
client.ubidotsSubscribe("smart-farm", "relay2"); // Subscribe ke Topik Relay2 dan Device smart-farm
dht.begin(); // Memulai fungsi DHT
MQ135.setRegressionMethod(1); // _PPM axratio^b // Set Method yang digunakan untuk MQ-135
MQ135.init(); // Memulai fungsi MQ-135
// Fungsi untuk kalibrasi MQ-135
float calcR0 = 0;
for (int i = 1; i <= 10; i++) {
MQ135.update();
calcR0 += MQ135.calibrate(RatioMQ135CleanAir);
Serial.print(".");
}
MQ135.setR0(calcR0 / 10);
}
void loop() {
unsigned long time = millis(); // Fungsi Millis
MQ135.update(); // Update Nilai MQ-135
MQ135.setA(102.2); MQ135.setB(-2.473); // Set Nilai Sampling untuk NH4 / Amonia
float NH4 = MQ135.readSensor(); // Hasil Pembacaan nilai Amonia
int jarak = sonar.ping_cm(); // Hasil Pembacaan Jarak
float h = dht.readHumidity(); // Hasil Pembacaan Humidity
float t = dht.readTemperature(); // Hasil Pembacaan Suhu
// Reconnect apabila Sambungan Koneksi NodeMCU terputus dan resubscribe topik dan device yang ada
if (!client.connected()) {
client.reconnect();
client.ubidotsSubscribe("smart-farm", "relay1");
client.ubidotsSubscribe("smart-farm", "relay2");
}
// Kondisi untuk mengirimkan hasil pembacaan sensor ke Device Ubidots setiap 2 detik
if ((unsigned long)(time - durasiKirim) >= jedaKirim) {
// Mengirimkan hasil pembacaan sensor ke Device Ubidots
client.add("ketinggian", jarak);
client.add("suhu", t);
client.add("kelembaban", h);
client.add("amonia", NH4);
client.ubidotsPublish("smart-farm");
durasiKirim = millis();
}
client.loop();
}
#include <ESP8266WiFi.h> // Library untuk konek ke Wi-Fi
#include <ThingerESP8266.h> // Library untuk terhubung ke Thinger
#include <NewPing.h> // Library untuk HC-SR04
#define USERNAME "YOUR_USERNAME" // Username Thinger IO
#define DEVICE_ID "YOUR_DEVICE_ID" // Device ID Thinger IO
#define DEVICE_CREDENTIAL "YOUR_DEVICE_CREDENTIAL" // Device Credential
#define SSID "YOUR_SSID" // SSID Wi-Fi
#define SSID_PASSWORD "YOUR_SSID_PASSWORD" // Password Wi-Fi
#define TRIGGER_PIN D5 // Pin Trigger HC-SR04 pada NodeMCU
#define ECHO_PIN D6 // Pin Echo HC-SR04 pada NodeMCU
#define MAX_DISTANCE 250 // Maksimum Pembacaan Jarak (cm)
#define pinYL A0 // Pin Analog YL-69
#define Lampu D2 // Pin LED
ThingerESP8266 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); // Aktifkan Fungsi Thinger IO
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Aktifkan Fungsi HC_SR04
int outputValue; // Variable untuk Output YL-69
void setup() {
pinMode(Lampu, OUTPUT); // Set LED sebagai Output
digitalWrite(Lampu, LOW); // Set nilai LED = 0
thing.add_wifi(SSID, SSID_PASSWORD); /// Mencoba terhubung ke Wi-Fi dan Thinger IO
// Fungsi untuk Kontrol Lampu dengan Topik Lampu
thing["Lampu"] << [](pson& in) {
if (in.is_empty()) {
in = (bool)digitalRead(Lampu);
} else {
digitalWrite(Lampu, in ? HIGH : LOW);
}
};
// Mengirim Pembacaaan Senosr HC-SR04 Ke Thinger IO
thing["HCSR04"] >> [](pson& out) {
out["Jarak"] = sonar.ping_cm();
};
// Menigirim Pembacaan Sensor YL-69 Ke Thinger IO
thing["Soil_Moisture"] >> [](pson& out) {
outputValue = analogRead(pinYL);
outputValue = map(outputValue, 1024, 250, 0, 100);
out["Moisture"] = outputValue;
};
}
void loop() {
// Menjalakan fungsi Thinger IO
thing.handle();
}
#define BLYNK_TEMPLATE_ID "YOUR_TEMPLATE_ID"
#define BLYNK_DEVICE_NAME "Smart Home Blynk"
#define BLYNK_AUTH_TOKEN "YOUR_AUTH_TOKEN"
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#include <MQUnifiedsensor.h>
char ssid[] = "YOUR_SSID";
char pass[] = "YOUR_SSID_PASSWORD";
#define DHTPIN D4
#define DHTTYPE DHT11
#define Board ("ESP8266")
#define Pin (A0) // Pin dari MQ9
#define Type ("MQ-9") // MQ9
#define Voltage_Resolution (5)
#define ADC_Bit_Resolution (10) // For arduino UNO/MEGA/NANO
#define RatioMQ9CleanAir (9.6) // RS / R0 = 60 ppm
DHT dht(DHTPIN, DHTTYPE); // Variable dht, memanggil fungsi
MQUnifiedsensor MQ9(Board, Voltage_Resolution, ADC_Bit_Resolution, Pin, Type);
BlynkTimer timer;
void sendSensor() {
MQ9.update();
MQ9.setA(1000.5); MQ9.setB(-2.186);
float LPG = MQ9.readSensor();
MQ9.setA(599.65); MQ9.setB(-2.244);
float CO = MQ9.readSensor();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Blynk.virtualWrite(V5, t);
Blynk.virtualWrite(V6, h);
Blynk.virtualWrite(V7, LPG);
Blynk.virtualWrite(V8, CO);
}
void setup() {
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
dht.begin();
MQ9.setRegressionMethod(1);
MQ9.init();
float calcR0 = 0;
for (int i = 0; i < 10; i++) {
MQ9.update();
calcR0 += MQ9.calibrate(RatioMQ9CleanAir);
Serial.print(".");
}
MQ9.setR0(calcR0 / 10);
timer.setInterval(1000L, sendSensor);
}
void loop() {
Blynk.run();
timer.run();
}
#include <ESP8266WiFi.h> // Library untuk terhubung ke Wi-Fi
#include "Adafruit_MQTT.h" // Library Adafruit MQTT
#include "Adafruit_MQTT_Client.h" // Library MQTT Client
#include <DHT.h> // Library DHT11
#include <MQUnifiedsensor.h> // Library untuk MQ-135
#define WLAN_SSID "YOUR_WIFI_SSID" // Nama Wi-Fi
#define WLAN_PASS "YOUR_WIFI_PASS" // Password
#define AIO_SERVER "io.adafruit.com" // Broker atau Server
#define AIO_SERVERPORT 1883 // Port MQTT
#define AIO_USERNAME "YOUR_USERNAME" // Username Adafruit IO
#define AIO_KEY "YOUR_API" // Key Adafruit IO
#define Relay1 D0 // Pin Relay 1 di NodeMCU
#define Relay2 D1 // Pin Relay 2 di NodeMCU
#define LED D2 // Pin LED di NodeMCU
#define DHTPIN D4 // Pin DHT di NodeMCU
#define DHTTYPE DHT11 // Jenis DHT yang digunakkan
#define placa "ESP8266" // Define jenis board yang digunakkan
#define Voltage_Resolution 5 // Tegangan yang digunakkan
#define pin A0 // Pin yang digunakkkan untuk MQ-135
#define type "MQ-135" // Jenis MQ yang digunakkan
#define ADC_Bit_Resolution 10 // Resolusi Bit ADC
#define RatioMQ135CleanAir 3.6 // Nilau Udara dianggap bersih
DHT dht(DHTPIN, DHTTYPE); // Aktifkan fungsi DHT
MQUnifiedsensor MQ135(placa, Voltage_Resolution, ADC_Bit_Resolution, pin, type); // Aktifkan fungsi MQ
char str_hum[8]; // Membuat Variable Char str_hum dengan panjang 8 karakter
char str_temp[8]; // Membuat Variable Char str_temp dengan panjang 8 karakter
char str_co[8]; // Membuat Variable Char str_co dengan panjang 8 karakter
char str_co2[8]; // Membuat Variable Char str_co2 dengan panjang 8 karakter
unsigned long durasiKirim = 0; // Untuk membantu fungsi Millis
unsigned long jedaKirim = 6000; // Untuk membantu fungsi Millis
WiFiClient client; // Mengaktifkan fungsi WiFi Client
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); // Aktifkan fungsi MQTT dan check informasi ke Adafruit IO
Adafruit_MQTT_Subscribe lampu1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/led"); // Fungsi untuk Subscribe ke Topik LED
Adafruit_MQTT_Subscribe lampu2 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/relay1"); // Fungsi untuk Subscribe ke Topik Relay1
Adafruit_MQTT_Subscribe lampu3 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/relay2"); // Fungsi untuk Subscribe ke Topik Relay2
Adafruit_MQTT_Publish suhu = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/suhu"); // Fungsi untuk Publish ke Topik Suhu
Adafruit_MQTT_Publish kelembapan = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/kelembapan"); // Fungsi untuk Publish ke Topik kelembapan
Adafruit_MQTT_Publish KCO = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/CO"); // Fungsi untuk Publish ke Topik CO
Adafruit_MQTT_Publish KCO2 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/CO2"); // Fungsi untuk Publish ke Topik CO2
void MQTT_connect(); // Untuk terhubung ke Adafruit MQTT
void setup() {
Serial.begin(115200); // Baundrate untuk Komunikasi Serial
pinMode(LED, OUTPUT); // Set LED sebagai Output
pinMode(Relay1, OUTPUT); // Set Relay1 sebagai Output
pinMode(Relay2, OUTPUT); // Set Relay2 sebagai Output
digitalWrite(LED, LOW); // Set Nilai LED
digitalWrite(Relay1, HIGH); // Set Nilai Relay1
digitalWrite(Relay1, HIGH); // Set Nilai Relay2
dht.begin(); // Memulai fungsi DHT
MQ135.setRegressionMethod(1); //_PPM = a*ratio*b // Set Method yang digunakkan untuk MQ-135
MQ135.init(); // Memulai fungsi MQ-135
// Fungsi untuk Kalibrasi MQ-135
float calcR0 = 0;
for (int i = 0; i <= 10; i++) {
MQ135.update();
calcR0 += MQ135.calibrate(RatioMQ135CleanAir);
Serial.print(".");
}
MQ135.setR0(calcR0 / 10);
delay(10);
// Untuk memulai terhubung dengan jaringan Wi-Fi
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Subscribe Topik Lampu1, Lampu2, dan Lampu3
mqtt.subscribe(&lampu1);
mqtt.subscribe(&lampu2);
mqtt.subscribe(&lampu3);
}
void loop() {
unsigned long time = millis(); //Fungsi Millis
MQTT_connect(); //Untuk fungsi reconnect ke Adafruit MQTT
MQ135.update(); //Update nilai sensor MQ-135
// Pembacaan Nilai CO oleh Sensor MQ-135
MQ135.setA(605.10); MQ135.setB(-3.937);
float CO = MQ135.readSensor();
//Pembacaan Nilai CO2 oleh Sensor DHT11
MQ135.setA(110.47); MQ135.setB(-2.862);
float CO2 = MQ135.readSensor();
//Pembacaan nilai Suhu Humidity oleh Sensor DHT11
float h = dht.readHumidity();
float t = dht.readTemperature();
//Konversi Variabel Foat / Double ke String dengan 4 nilai di depan koma dan 2 nilai di belakang koma
dtostrf(t, 4, 2, str_temp);
dtostrf(h, 4, 2, str_hum);
dtostrf(CO, 4, 2, str_co);
dtostrf(CO2, 4, 2, str_co2);
// Pengiriman Nilai Hasil Pembacaan Sensor ke Adafruit IO setiap 6 Detik
if ((unsigned long)(time - durasiKirim) >= jedaKirim) {
suhu.publish(str_temp);
kelembapan.publish(str_hum);
KCO.publish(str_co);
KCO2.publish(str_co2);
durasiKirim = millis();
}
// Menjalankan fungsi subscribe
Adafruit_MQTT_Subscribe* subscription;
// Pembacaan Nilai berdasarkan Subscribe yang diterima
while ((subscription = mqtt.readSubscription(5000))) {
// Kondisi untuk menghidupkan LED apabila subscribe yang diterima adalah LED
if (subscription == &lampu1) {
Serial.print(F("Got: "));
Serial.println((char*)lampu1.lastread);
if (strcmp((char*)lampu1.lastread, "ON") == 0) {
digitalWrite(LED, HIGH);
}
if (strcmp((char*)lampu1.lastread, "OFF") == 0) {
digitalWrite(LED, LOW);
}
}
// Kondisi untuk menghidupkan Relay1 apabila subscribe yang diterima adalah Relay1
if (subscription == &lampu2) {
Serial.print(F("Got: "));
Serial.println((char*)lampu2.lastread);
if (strcmp((char*)lampu1.lastread, "ON") == 0) {
digitalWrite(Relay1, LOW);
}
if (strcmp((char*)lampu2.lastread, "OFF") == 0) {
digitalWrite(Relay1, HIGH);
}
}
// Kondisi untuk menghidupkan Relay2 apabila subscribe yang diterima adalah Relay2
if (subscription == &lampu3) {
Serial.print(F("Got: "));
Serial.println((char*)lampu3.lastread);
if (strcmp((char*)lampu3.lastread, "ON") == 0) {
digitalWrite(Relay2, LOW);
}
if (strcmp((char*)lampu3.lastread, "OFF") == 0) {
digitalWrite(Relay2, HIGH);
}
}
}
}
// Fungsi untuk koneksi ke Adafruit MQTT
void MQTT_connect() {
int8_t ret;
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retry = 3;
while ((ret = mqtt.connect()) != 0) {
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Reconnecting . . .");
mqtt.disconnect();
delay(5000);
retry--;
if (retry == 0) {
while (1);
}
}
Serial.println("MQTT Connected!");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment