• Tidak ada hasil yang ditemukan

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

Dokumen terkait