Relay Lampu 2
3. Program Arduino
Serial.println("[" + String(type) + "] " + String(data)); \ delay(1)
70
//Alamat eeprom untuk history pintu dan servo
#define SERVO_ADDR_EEPROM_DEGREE 1
#define SERVO_ADDR_EEPROM_STATE 0
//Status masukan
int outputFlag[5] = {0, 0, 0, EEPROM.read(SERVO_ADDR_EEPROM_STATE), 0};
//Inisialisasi struktur data untuk pengiriman ke website //menggunakan protokol MQTT
StaticJsonBuffer<200> JSONPayloadBuffer;
//Inisialisasi fungsi modul keypad const byte Rows = 4;
const byte Cols = 4;
char keymap[Rows][Cols] = { {'1', '2', '3', 'A'},
{'7', '8', '9', 'C'}, {'4', '5', '6', 'B'}, {'*', '0', '#', 'D'}};
byte rPins[Rows] = {KEYPAD_PIND, KEYPAD_PINC, KEYPAD_PINB, KEYPAD_PINA};
byte cPins[Cols] = {KEYPAD_PIN4, KEYPAD_PIN3, KEYPAD_PIN2, KEYPAD_PIN1};
Keypad kpd = Keypad(makeKeymap(keymap), rPins, cPins, Rows, Cols);
//Inisialisasi fungsi penggunaan pustaka password Password password = Password("1234");
byte maxPasswordLength = 4;
byte currentPasswordLength = 0;
bool isPasswordCorrect = false;
int startInsert = 0;
72
//Inisialisasi LCD
LiquidCrystal_I2C lcd_1(0x27, 16, 2);
LiquidCrystal_I2C lcd_2(0x26, 16, 2);
//Inisialisasi servo untuk pintu depan Servo myServo;
bool isDoorOpen = EEPROM.read(0);
//Inisalisasi sensor suhu ****GANTI KE DS18B20 OneWire oneWire(DALLAS_PIN);
* Membuka dan menutup pintu * @param int
* @return void */
void drivingServo(int state) {
//Baca masukkan dari parameter, //Jika perintah membuka pintu,
//maka gerakkan servo untuk membuka pintu, //Jika tidak, maka sebaliknya
if (state) {
debug("servo", "keadaan pintu bukan");
outputFlag[3] = HIGH; //flag
// for (int pos = EEPROM.read(2); pos >= 120; pos--) //gerakkan servo // {
// myServo.write(pos);
// delay(50);
// }
myServo.write(80);
// EEPROM.write(SERVO_ADDR_EEPROM_DEGREE, 120); //catat ke eeprom
EEPROM.write(SERVO_ADDR_EEPROM_STATE, outputFlag[3]); //catat ke eerpom keadaan pintu
SendToWEB("/servo", LOW); //kirim ke website }
else {
debug("servo", "keadaan pintu tutup");
outputFlag[3] = LOW; //flag
// for (int pos = EEPROM.read(2); pos <= 180; pos++) //gerakkan servo // {
// myServo.write(pos);
// delay(50);
// }
myServo.write(-180);
// EEPROM.write(SERVO_ADDR_EEPROM_DEGREE, 180); //catat ke eerpom posisi
74
EEPROM.write(SERVO_ADDR_EEPROM_STATE, outputFlag[3]); //catat ke eerpom keadaan pintu
SendToWEB("/servo", HIGH); //kirim ke website }
}
/*
* Menampilkan pemberitahuan buzzer 1 hidup ke LCD 2 * @param void
* @return void */
void Buzzer1ToLCD() {
static unsigned long previousMillis;
unsigned long currentMillis = millis();
//Tampilkan setiap 500 milidetik sekali if (currentMillis - previousMillis >= 500) {
previousMillis = currentMillis;
debug("buzzer 1", "Buzzer 1 ON!");
* Menampilkan pemberitahuan buzzer 2 hidup ke LCD 2 * @param void
* @return void */
void Buzzer2ToLCD() {
static unsigned long previousMillis;
unsigned long currentMillis = millis();
//Tampilkan setiap 500 milidetik sekali if (currentMillis - previousMillis >= 500) {
previousMillis = currentMillis;
debug("buzzer 2", "Buzzer 2 ON!");
* Menampilkan data pembacaan suhu DS18b20 ke LCD 2 * @param void
* @return void */
void DallasAndRTCToLCD() {
//Jika pada fungsi 'ScanMQ02' mendeteksi asap, //jangan tampilkan nilai suhu ke lcd
if (interuptForDallas) {
return;
}
76
debug("dallas", tempDallas);
debug("rtc", String(globalTime[0]) + ":" + String(globalTime[1]));
//tampilkan suhu lcd_2.clear();
lcd_2.setCursor(0, 0);
lcd_2.print("Suhu : ");
lcd_2.setCursor(7, 0);
lcd_2.print(tempDallas);
lcd_2.setCursor(11, 0);
lcd_2.print(" C");
//tampilkan jam lcd_2.setCursor(0, 1);
lcd_2.print("Waktu : ");
lcd_2.setCursor(8, 1);
lcd_2.print(String(globalTime[0]) + ":" + String(globalTime[1]));
}
lcd_1.setCursor(0, 0);
lcd_1.print("Selamat Datang");
debug("intro", "Selamat Datang");
delay(1000);
//tampilkan ke lcd lcd_1.clear();
lcd_1.print("Password");
debug("intro", "Password");
}
/*
* Membaca sensosr MQ02, mengirim ke website dan menampilkan ke LCD * @param void
* @return void */
void ScanMQ02() {
static int oldState;
int newState;
//baca nilai sensor mq02
int mq02reading = analogRead(MQ02_PIN);
debug("mq 02", "pembacaan mq02: " + String(mq02reading));
//Jika nilai mq02 dibawah 500,
//maka sensor mq02 mendeteksi asap if (mq02reading > 500)
{
debug("mq02", "MQ02 melewati angka 500");
//hidupkan buzzer
digitalWrite(BUZZER_MQ02_PIN, HIGH);
78
debug("mq02", "MQ02 dibawah angka 500");
//matikan buzzer
digitalWrite(BUZZER_MQ02_PIN, LOW);
//hentikan pemberitahuan interpsi pembacaan mq02 interuptForDallas = false;
newState = false;
}
//Jika nilai pembacaan mq02 sebelumnya dan sekarang tidak sama, //maka kirim ke website
debug("mq02", "kirim ke website status HIGH");
SendToWEB("/mq02", HIGH);
} else {
debug("mq02", "kirim ke website status LOW");
SendToWEB("/mq02", LOW);
* Membaca sensor PIR, menyalakan lampu * @param void
* @return void */
void ScanPIR() {
debug("pir", "membaca sensor pir...");
//Lampu 1 //baca sensor pir
int readPir = digitalRead(PIR_PIN);
//jika pir mendeteksi gerakan
if (readPir == HIGH) //scan sensor PIR {
debug("pir", "pir terdeteksi");
if (outputFlag[4] == 0) {
debug("pir", "lampu 1 hidup");
outputFlag[4] = HIGH; //flag
digitalWrite(RELAY_LAMP1_PIN, !HIGH); //hidupkan lampu 1 SendToWEB("/lamp1", HIGH); //kirim ke website }
80
else {
debug("pir", "lampu 1 mati");
outputFlag[4] = LOW; //flag
digitalWrite(RELAY_LAMP1_PIN, !LOW); //matikan lampu 1 SendToWEB("/lamp1", LOW); //kirim ke website }
} }
/*
* Membaca sensor DS, mengirim ke website dan menampilkan ke LCD * @param void
* @return void */
void ScanDallas() {
static int flagForFan;
static unsigned long previousMillis;
unsigned long currentMillis = millis();
//olah setiap 2 detik sekali
if (currentMillis - previousMillis >= 2000) {
previousMillis = currentMillis;
//baca nilai suhu
sensors.requestTemperatures();
// tampilkan dengan nilai celcius
tempDallas = sensors.getTempCByIndex(0);
//kirim ke website
SendToWEB("/dallas", tempDallas);
debug("dallas", "kirim ke website...");
}
//kirim ke lcd
DallasAndRTCToLCD();
//Jika suhu diatas 29 celsius //maka hidupkan kipas
if ((int)tempDallas >= 29 && flagForFan) {
flagForFan = 0;
debug("dallas", "Suhu diatas 29");
debug("load", "Kipas hidup");
outputFlag[2] = HIGH; //flag
digitalWrite(RELAY_FAN_PIN, !HIGH); //hidupkan kipas SendToWEB("/fan", HIGH); //kirim ke website }
else if ((int)tempDallas < 29 && !flagForFan) {
flagForFan = 1;
debug("dallas", "Suhu dibawah");
debug("load", "Kipas mati");
outputFlag[2] = LOW; //flag
digitalWrite(RELAY_FAN_PIN, !LOW); //matikan kipas SendToWEB("/fan", LOW); //kirim ke website }
}
82
/*
* Memeriksa Waktu sebagai Alarm * @param void
* @return void */
void ScanRTC() {
debug("rtc", "scanning....");
debug("rtc", "Jam: " + String(globalTime[0]));
//Jika waktu sekarang sama dengan waktu alarm, //maka matikan lampu
if (globalTime[0] == clockTime) {
digitalWrite(RELAY_LAMP2_PIN, !LOW); //matikan lampu }
}
/*
* Membaca Input password melalui keypad * @param void
* @return void */
void ScanPassword() {
//Dapatkan ketikan input karakter char key = kpd.getKey();
//Jika ketikan ada if (key != NO_KEY) {
//Hitung setiap ketikan untuk kebutuhan membedakan antara
//ketikan pertama atau seterusnya startInsert++;
//Jika ketikan pertama kali, bersihkan lcd dan //Mulai tampilkan tanda '*'
//Jika setelah ketikan pertama, lanjutkan //tampilan tanda '*'
//Hitung setiap ketikan input password currentPasswordLength++;
//Simpan ketikan password.append(key);
//Jika ketikan input password sudah sama dengan panjang password //maka periksa password
84
if (currentPasswordLength == maxPasswordLength) {
debug("pass", "checking password....");
CheckPassword();
} } }
/*
* Memeriksa kebenaran password * @param void
* @return void */
void CheckPassword() {
//Jika nilai password yang sudah di input benar, //maka tampilkan password benar
if (password.evaluate()) {
//Reset password password.reset();
currentPasswordLength = 0;
startInsert = 0;
//tampilkan pemberitahuan ke lcd delay(100);
lcd_1.clear();
lcd_1.print("Password Benar!");
isPasswordCorrect = true;
//debug
debug("pass", "Password Benar!");
}
//Jika nilai password yang sudah di input salah, //maka tampilkan password salah
else
//tampilkan pemberitahuan ke lcd delay(100);
lcd_1.clear();
lcd_1.print("Password Gagal!");
isPasswordCorrect = false;
//debug
debug("pass", "Password Gagal!");
} }
/*
* Memeriksa sensor magnetic door * @param void
* @return void */
void ScanMagneticDoor1() {
// debug("magnetik", " memeriksa sensor magnetik door....");
//tempat nilai pembacaan sebelumnya static int oldState;
//membaca sensor magnetic door
86
int readScan = digitalRead(MAGNETIC_PIN);
//debug
debug("megnetik", "pembacaan sensor: " + String(readScan));
//jika sensor magnetik door mendeteksi pembukaan pintu, //tapi password masih belum dimasukkan atau salah, maka //hidupkan buzzer
if (readScan == 1 && !isPasswordCorrect) {
// debug("magnetik", "pintu dibuka tanpa password");
digitalWrite(BUZZER_MAGNETIC_PIN, HIGH);
Buzzer1ToLCD();
}
//lewatkan jika password sudah benar else if (readScan == 0)
{
// debug("magnetik", "pintu tidak terbuka");
digitalWrite(BUZZER_MAGNETIC_PIN, LOW);
}
//periksa kondisi sekarang dan sebelumnya if (oldState != readScan)
{
oldState = readScan;
if (readScan) {
// debug("magnetik", "kirim ke website kondisi HIGH");
SendToWEB("/magneticdoor", HIGH);
} else
{
// debug("magnetik", "kirim ke website kondisi LOW");
SendToWEB("/magneticdoor", LOW);
} return;
}
//masukkan nilai sekarang menjadi nilai sebelumnya oldState = readScan;
}
/*
* Gerakkan beban sesuai tekanan pushbutton * @param {int, int, int ,int}
* @return void */
void ScanButtonAndDriveLoad() {
debug("button", "memeriksa tekanan push button");
//Lampu 1
if (digitalRead(PUSH_LAMP1_PIN) == HIGH) //scan pushbutton 1 {
if (outputFlag[0] == 0) {
debug("load", "Lampu 1 hidup");
outputFlag[0] = HIGH; //flag
digitalWrite(RELAY_LAMP1_PIN, !HIGH); //hidupkan lampu 1 SendToWEB("/lamp1", HIGH); //kirim ke website }
else
88
{
debug("load", "Lampu 1 mati");
outputFlag[0] = LOW; //flag
digitalWrite(RELAY_LAMP1_PIN, !LOW); //matikan lampu 1 SendToWEB("/lamp1", LOW); //kirim ke website }
}
//Lampu 2
if (digitalRead(PUSH_LAMP2_PIN) == HIGH) //scan pushbutton 2 {
if (outputFlag[1] == 0) {
debug("load", "Lampu 2 hidup");
outputFlag[1] = HIGH; //flag
digitalWrite(RELAY_LAMP2_PIN, !HIGH); //hidupkan lampu 2 SendToWEB("/lamp2", HIGH); //kirim ke website
digitalWrite(RELAY_LAMP2_PIN, !LOW); //matikan lampu 2 SendToWEB("/lamp2", LOW); //kirim ke website }
}
//kipas
if (digitalRead(PUSH_FAN_PIN) == HIGH) //scan pushbutton 3 {
if (outputFlag[2] == 0) {
debug("load", "Kipas hidup");
outputFlag[2] = HIGH; //flag
digitalWrite(RELAY_FAN_PIN, !HIGH); //hidupkan kipas SendToWEB("/fan", HIGH); //kirim ke website
digitalWrite(RELAY_FAN_PIN, !LOW); //matikan kipas SendToWEB("/fan", LOW); //kirim ke website }
}
// servo pintu depan
if (digitalRead(PUSH_SERVO_PIN) == LOW) //scan pushbutton 4 {
90
* Mengirim data ke website * @param char*, in
* @return void */
void SendToWEB(const char *topic, int data) {
//siapkan lokasi memori sebesar 100byte char JSONPayloadSend[100];
//buat objek Json
JsonObject &root = JSONPayloadBuffer.createObject();
//tentukan topic dan data untuk protokol MQTT root["topic"] = topic;
root["data"] = data;
//tampilkan topic dan data dalam bentuk JSON, //dan isi ke lokasi memori yang sudah disiapkan
root.printTo(JSONPayloadSend, sizeof(JSONPayloadSend));
debug("json", "Data yang dikirim: " + String(JSONPayloadSend));
//kirim ke nodemcu
NodeMCUSerial.println(JSONPayloadSend);
//bersihkan buffer
JSONPayloadBuffer.clear();
//tunggu 1 detik delay(1000);
}
/*
* Menerima event dari nodemcu melalui komunikasi serial
debug("serial", "Data diterima dari node mcu");
String command = "";
//Jika koneksi komunikasi serial tersedia if (NodeMCUSerial.available())
{
command = NodeMCUSerial.readString();
}
debug("serial", "Data: " + String(command));
//Olah data //lampu 1
if (command == "b1ON") {
debug("[lampu]", "Lampu 1 hidup");
outputFlag[0] = HIGH; //flag
digitalWrite(RELAY_LAMP1_PIN, !HIGH); //hidupkan lampu 1 SendToWEB("/lamp1", HIGH); //kirim ke website }
else if (command == "b1OFF") {
debug("[lampu]", "Lampu 1 mati");
92
outputFlag[0] = LOW; //flag
digitalWrite(RELAY_LAMP1_PIN, !LOW); //hidupkan lampu 1 SendToWEB("/lamp1", LOW); //kirim ke website }
//lampu 2
if (command == "b2ON") {
debug("[lampu]", "Lampu 2 hidup");
outputFlag[1] = HIGH; //flag
digitalWrite(RELAY_LAMP2_PIN, !HIGH); //hidupkan lampu 2 SendToWEB("/lamp2", HIGH); //kirim ke website }
else if (command == "b2OFF") {
debug("[lampu]", "Lampu 2 mati");
outputFlag[1] = LOW; //flag
digitalWrite(RELAY_LAMP2_PIN, !LOW); //hidupkan lampu 2 SendToWEB("/lamp2", LOW); //kirim ke website }
//kipas
if (command == "b3ON") {
debug("[kipas]", "kipas hidup");
outputFlag[2] = HIGH; //flag
digitalWrite(RELAY_FAN_PIN, !HIGH); //hidupkan kipas SendToWEB("/fan", HIGH); //kirim ke website }
else if (command == "b3OFF")
{
debug("[kipas]", "kipas mati");
outputFlag[2] = LOW; //flag
digitalWrite(RELAY_FAN_PIN, !LOW); //hidupkan kipas SendToWEB("/fan", LOW); //kirim ke website
//Inisialisasi pin servo untuk pintu depan myServo.attach(SERVO_PIN);
//Ambil kondisi pintu depan sebelumnya,
//walaupun sistem tiba-tiba reset atau terputus dari sumber daya
//Inisialisasi sensor temperature dallas sensors.begin();
//Inisialisasi RTC rtc.begin();
//Insialisasi lcd 1 dan 2
94
lcd_2.begin();
lcd_1.begin();
//Inisialisasi komunikasi serial dengan komputer untuk //keperluan debuging
Serial.begin(9600);
//Inisialisasi module tiny RTC if (!rtc.begin())
{
debug("rtc", "Tidak dapat menemukan RTC");
//Jika module RTC tidak terdeteksi
//Jika modul RTC tidak berjalan, maka tampilkan //Atur waktu sesuai laptop
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
if (!rtc.isrunning()) {
debug("rtc", "RTC tidak berjalan!");
// // following line sets the RTC to the date & time this sketch was compiled // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// // This line sets the RTC with an explicit date & time, for example to set // // January 21, 2014 at 3am you would call:
// // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
//Tampilkan ke lcd lcd_1.clear();
lcd_1.setCursor(0, 0);
lcd_1.print("RTC tidak");
lcd_1.setCursor(0, 1);
lcd_1.print("berjalan");
}
//Inisialisasi komunikasi serial dengan NodeMCU //baud rate = 19200
NodeMCUSerial.begin(115200);
//Inisialisasi mode pin pushbutton lampu pinMode(PUSH_LAMP1_PIN, INPUT);
pinMode(PUSH_LAMP2_PIN, INPUT);
//Inisialisasi mode pin sensor PIR pinMode(PIR_PIN, INPUT);
//Inisialisasi mode pin relay kipas pinMode(PUSH_FAN_PIN, INPUT);
//Inisialisasi mode pin servo untuk pintu depan pinMode(PUSH_SERVO_PIN, INPUT);
//Inisialisasi mode pin sensor magnetik door untuk pintu depan pinMode(MAGNETIC_PIN, INPUT_PULLUP);
//Inisialisasi mode pin relay lampu pinMode(RELAY_LAMP1_PIN, OUTPUT);
pinMode(RELAY_LAMP2_PIN, OUTPUT);
96
//Inisialisasi mode pin relay lampu pinMode(RELAY_FAN_PIN, OUTPUT);
//Inisialisasi mode pin kedua buzzer pinMode(BUZZER_MQ02_PIN, OUTPUT);
pinMode(BUZZER_MAGNETIC_PIN, OUTPUT);
//Inisialisasi kondisi awal relay lampu dan kipas digitalWrite(RELAY_LAMP1_PIN, !LOW);
digitalWrite(RELAY_LAMP2_PIN, !LOW);
digitalWrite(RELAY_FAN_PIN, !LOW);
digitalWrite(PUSH_SERVO_PIN, EEPROM.read(SERVO_ADDR_EEPROM_STATE));
//Kirim ke website semua kondisi mati, lampu, kipas, pintu SendToWEB("/lamp1", LOW);
SendToWEB("/lamp2", LOW);
SendToWEB("/fan", LOW);
SendToWEB("/servo", LOW);
SendToWEB("/mq02", LOW);
SendToWEB("/magneticdoor", LOW);
//Tampilkan pertama-tama pesan pemberitahuan awal displayIntro();
}
void loop() {
//Dapatkan waktu dari module RTC DateTime now = rtc.now();
globalTime[0] = now.hour();
globalTime[1] = now.minute();
globalTime[2] = now.second();
//Looping inputan password //Jika salah, maka terus looping, //Jika benar, keluar dari looping
while (!isPasswordCorrect) {
//Baca inputan password ScanPassword();
//Baca sensor magnetik door untuk pintu depan ScanMagneticDoor1();
}
// debug("pass", "program lanjut...");
//Baca masukkan sensor pir ScanPIR();
//Baca masukkan pushbutton ScanButtonAndDriveLoad(); //belum //Baca masukkan sensor DS18d20 ScanDallas();
//Baca masukkan sensor MQ02 ScanMQ02();
//Baca masukkan module RTC ScanRTC();
}
4. Data sheet Relay
98
100
5. Data sheet Arduino Mega 2560
102
104
6. Datasheet NodeMCU ESP8266
106
7. Data Sheet RTC 1307
108
8. Data sheet MQ2
110
112
9. Data Sheet PIR
114
10. Data Sheet Keypad
11.Data Sheet Magnetick Door
116
12. Datasheet Servo Motor