Pembahasan saya kali ini merupakan kesimpulan dari 4 tulisan saya sebelumnya dan juga merupakan evaluasi dari pengumpulan tugas dari mahasiswa saya di jurusan teknik listrik - fakultas vokasi - unesa Surabaya. Tugas yang saya berikan bertujuan untuk memperkenalkan konsep elektronika daya modern yang terhubung dengan IOT sehingga mahasiswa mampu membayangkan kedepannya akan berhadapan dengan kelistrikan model terbaru.
Untuk menghubungkan Triac dimmer ke IOT sebenarnya bisa pembaca rangkai sendiri dengan menelusuri tulisan saya sebelumnya mengenai konsep mikrokontroller dengan protokol IOT MQTT.
Ada 2 buah konsep PUBLISH dan SUBSCRIBE yang bisa dibaca dipenjelasan tulisan saya disini.
- Dimmer IOT tanpa ZCD
Perhatikan rangkaian dibawah ini, yang merupakan rangkaian dimmer yang sering dijumpai dan dapat dibeli di toko online, dan telah saya bahas sebelumnya disini.
Dari rangkaian sederhana diatas dapat dilihat bahwa pengaturan trigger dari Triac didapatkan oleh delay R-C yang terhubung dengan Diac. Dengan merubah nilai VR / potensiometer pada rangkaian diatas maka dapat pula merubah kecerahan dari lampu/beban akibat delay "firing angle" pada triac. Bagaimana kalau resistansinya ini kita ubah secara IOT ? Perhatikan ulasan pameran saya terdahulu yang bisa dibaca disini.
Pada pameran ini saya mendapatkan ide untuk mengontrol lampu menggunakan fitting lampu ber LDR (yang umum ada di toko listrik) dimana saya akan menyalakan lampu dan mematikannya secara IOT. Untuk itu kita akan tiru konsepnya namun kini saya akan dengan merubah resistansi pada potensiometer dengan menggantinya dengan LDR dan memberikannya sumber cahaya dari LED. Jadi dengan merubah-ubah kecerahan lampu LED maka resistansi dari LDR akan ikut berubah dan berefek pada Triac dan beban lampu.
#include <ESP8266WiFi.h>
#include <PubSubClient.h> //library pubsub MQTT
const char *ssid = "nama wifi"; // Gunakan sesuai wifi kamu
const char *pass = "passwordnya"; // password
//inisialisasi broker
const char *mqtt_server = "broker.hivemq.com"; //BROKER GRATIS
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "namamu123456"; // Client connections random dan gak boleh sama
// Ubah nama topik biar unik gak nabrak sama rekan lainnya
#define TOPIC "/aisi555/dimmer"
//IO pin
#define LED_DIM D4 //prot D4 ke LED lalu menyinari LDR
WiFiClient wclient; //wifi client terhubung lib pubsub
PubSubClient client(wclient);
void setup() {
pinMode(LED_DIM, OUTPUT); //inisialisasi LED
digitalWrite(LED_DIM,LOW);
//Inisialisasi broker & Callback sub message
client.setServer(mqtt_server, mqtt_port);
client.setCallback(mqtt_callback);
Serial.begin(9600);
delay(10);
Serial.println();
Serial.println();
setupwifi();
}
void setupwifi()
{
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Terhubung Ke Wifi: ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi Terhubung");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
}
void reconnectmqtt() //function mengatur koneksi ke broker
{
Serial.println("Connecting to MQTT server..");
if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) {
Serial.println("Connected to MQTT server");
} else {
Serial.println("Could not connect to MQTT server");
}
if (client.connected()){
Serial.print("subscribe to topic: ");
Serial.println(TOPIC);
client.subscribe(TOPIC); //subscribe ke topic
}
}
//function callback saat ada pesan SUB yg masuk
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
String message;
for (int i = 0; i < length; i++) {
message = message + (char)payload[i]; //Conver *byte to String
}
Serial.print(message);
analogWrite(LED_DIM, message.toInt()); //angka yg masuk 0-255 jadi sesuaikan
Serial.println();
Serial.println("-----------------------");
}
void loop() {
if (!client.connected())
{
reconnectmqtt();
}
else client.loop(); //cek terus kalau ada data masuk
}
Hasil dari script diatas seperti video praktek mahasiswa saya dibawah. Perhatikan bahwa perlu adanya penyesuaian jarak antara led vs LDR sehingga nilai yang didapatkan sesuai. Bisa juga dengan mengatur angka yang dikirim dicari minimum dan maksimum yang sesuai dengan tingkat kecerahan lampu.
- Dimmer Menggunakan ZCD
Script yang digunakan oleh mahasiswa saya kebanyakan menggunakan library dimmer dari robodyn, namun kesulitan mereka adalah memahami konsep dimmernya, apa sih yang dilakukan oleh Triac?
Sebenarnya konsepnya bisa dibaca pada tulisan saya sebelumnya disini, dimana yang diatur adalah delay firing angle atau "derajat tembak" dari triac setelah terjadi momen Zero crossing. Scriptnya cukup sederhana, hanya merubah sedikit saja.
#include <ESP8266WiFi.h> #include <PubSubClient.h> //library pubsub by o'leary const char *ssid = "nama wifi"; // Gunakan sesuai wifi kamu const char *pass = "passwordnya"; // //inisialisasi broker const char *mqtt_server = "broker.hivemq.com"; //BROKER GRATIS const int mqtt_port = 1883; const char *mqtt_user = ""; const char *mqtt_pass = ""; const char *mqtt_client_name = "namamu123456"; // Client connections random dan gak boleh sama // Ubah nama topik biar unik gak nabrak sama rekan lainnya #define TOPIC "/aisi555/dimmer" //IO pin #define zcd_pin 3 //sesuaikan dengan pin zcd kamu #define triac_pin 4 //sesuaikan dengan pin triac kamu int nilai = 0; WiFiClient wclient; //wifi client terhubung lib pubsub PubSubClient client(wclient); void setup() { pinMode(zcd_pin, INPUT_PULLUP); pinMode(triac_pin, OUTPUT); attachInterrupt(zcd_pin, deteksi, FALLING); // attach Interrupt digitalWrite(triac_pin, LOW); //Inisialisasi broker & Callback sub message client.setServer(mqtt_server, mqtt_port); client.setCallback(mqtt_callback); Serial.begin(9600); delay(10); Serial.println(); Serial.println(); setupwifi(); } void setupwifi() { if (WiFi.status() != WL_CONNECTED) { Serial.print("Terhubung Ke Wifi: "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); if (WiFi.waitForConnectResult() != WL_CONNECTED) return; Serial.println("WiFi Terhubung"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } } void reconnectmqtt() //function mengatur koneksi ke broker { Serial.println("Connecting to MQTT server.."); if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) { Serial.println("Connected to MQTT server"); } else { Serial.println("Could not connect to MQTT server"); } if (client.connected()){ Serial.print("subscribe to topic: "); Serial.println(TOPIC); client.subscribe(TOPIC); //subscribe ke topic } } //function callback saat ada pesan SUB yg masuk void mqtt_callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived in topic: "); Serial.println(topic); Serial.print("Message:"); String message; for (int i = 0; i < length; i++) { message = message + (char)payload[i]; //Conver *byte to String } Serial.print(message); nilai= map(message.toInt(),0,100, 200,7200); // merubah message ke range yang sesuai 0-100 Serial.println(); Serial.println("-----------------------"); } ICHACE_RAM_ATTR void deteksi() //deteksi Zerro cross dan delay on triac { delayMicroseconds(nilai); digitalWrite(triac_pin, HIGH); delayMicroseconds(50); //delay 50 uSec on output pulse to turn on triac digitalWrite(triac_pin, LOW); } void loop() { if (!client.connected()) { reconnectmqtt(); } else client.loop(); //cek terus kalau ada data masuk }
Hasilnya bisa dilihat pada video mahasiswa saya dibawah ini :