//Library yang digunakan
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <Wire.h>
#include "Font7Seg.h"
#include "DHT.h"
//relay module
const int RELAY_PIN = A0;
const int ROW_NUM = 4;
const int COLUMN_NUM = 4;
//keypad
char keys[ROW_NUM][COLUMN_NUM] =
{
{'1','2','3', 'A'},
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};
byte pin_rows[ROW_NUM] = {9, 8, 7, 6};
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2};
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
//lcd 20x4
const int en1 = 26;
LiquidCrystal lcd1(50, en1, 22, 23, 24, 25);
const int en2 = 27;
LiquidCrystal lcd2(50, en2, 22, 23, 24, 25);
//push button
const int button1 = 31;
const int button2 = 41;
int buttonState = 0;
int buttonState2 = 0;
//dotmatrix
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
#define CLK_PIN 52
#define DATA_PIN 51
#define CS_PIN 53
#define SPEED_TIME 75
#define PAUSE_TIME 0
#define MAX_MESG 20
//rtc
#define DS1307_ADDRESS 0x68
//dht22
#define DHTPIN 49
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//buzzer
const int buzzer = 12;
//led
int red = 10;
int green = 11;
//password
String pw = "1234";
String input_password;
//variabel global
int kondisi = 0; //variabel kondisi
uint8_t wday, mday, month, year; //hari, bulan, dan tahun
uint8_t hours, minutes, seconds; //jam, menit, dan detik
//kondisi delay
static uint32_t lastTime = 0;
static uint32_t lastTime2 = 0;
static uint32_t lastTime3 = 0;
static uint32_t lastTime4 = 0;
static uint8_t display = 0;
static bool flasher = false;
char szTime[9]; // mm:ss\0
char szMesg[MAX_MESG + 1] = "";
uint8_t clear = 0x00;
// Hardware SPI connection
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
uint8_t decToBcd(uint8_t value)
{
return ((value / 10 * 16) + (value % 10));
}
uint8_t bcdToDec(uint8_t value)
{
return ((value / 16 * 10) + (value % 16));
}
char *dow2str(uint8_t code, char *psz, uint8_t len)
{
static const __FlashStringHelper* str[] =
{
F("Minggu"), F("Senin"), F("Selasa"), //array nama hari
F("Rabu"), F("Kamis"), F("Jumat"),
F("Sabtu")
};
strncpy_P(psz, (const char PROGMEM *)str[code - 1], len);
psz[len] = '\0';
return (psz);
}
char *mon2str(uint8_t mon, char *psz, uint8_t len)
{
static const __FlashStringHelper* str[] =
{
F("Januari"), F("Februari"), F("Maret"), F("April"), //array nama bulan
F("Mei"), F("Juni"), F("Juli"), F("Agustus"),
F("September"), F("Oktober"), F("November"), F("Desember")
};
strncpy_P(psz, (const char PROGMEM *)str[mon - 1], len);
psz[len] = '\0';
return (psz);
}
void beginDS1307() //fungsi module RTC
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(clear);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 0x07);
seconds = bcdToDec(Wire.read());
minutes = bcdToDec(Wire.read());
hours = bcdToDec(Wire.read() & 0xff);
wday = bcdToDec(Wire.read());
mday = bcdToDec(Wire.read());
month = bcdToDec(Wire.read());
year = bcdToDec(Wire.read());
}
void getTime(char *psz, bool f = true)//fungsi membaca waktu
{
sprintf(psz, "%02d%c%02d", hours, (f ? ':' : ' '), minutes);
}
void getDate(char *psz)//fungsi membaca tanggal
{
char szBuf[10];
sprintf(psz, "%d %s %04d", mday , mon2str(month, szBuf, sizeof(szBuf) - 1), (year + 2000));
}
void setpw()//fungsi setting password
{
char key = keypad.getKey();
if (key)
{
if(key == '*') //reset password
{
input_password = "";
lcd1.clear();
lcd1.setCursor(5, 0);
lcd1.print("--Closed--");
lcd1.setCursor(1, 1);
lcd1.print("Masukkan Password");
lcd1.setCursor(1, 3);
lcd1.print("Enter=# -- Reset=*");
}
else if(key == '#') //enter password
{
lcd1.clear();
if(input_password == pw) //kondisi jika password benar
{
lcd1.setCursor(4, 0);
lcd1.print("--Welcome--");
lcd1.setCursor(1, 2);
lcd1.print("Tekan Tombol Untuk");
lcd1.setCursor(3, 3);
lcd1.print("Membuka Pintu");
kondisi = 1;
}
else //kondisi jika password salah
{
lcd1.setCursor(2, 1);
lcd1.print("Password Salah!");
lcd1.setCursor(2, 2);
lcd1.print("Silahkan Ulangi");
input_password = "";
delay(2000);
lcd1.clear();
lcd1.setCursor(5, 0);
lcd1.print("--Closed--");
lcd1.setCursor(1, 1);
lcd1.print("Masukkan Password");
lcd1.setCursor(1, 3);
lcd1.print("Enter=# -- Reset=*");
}
}
else
{
input_password += key; // append new character to input password string
lcd1.setCursor(input_password.length(), 2); // move cursor to new position
lcd1.print('*'); // print * key as hiden character
}
}
}
void matrix() //fungsi LED dot matrix
{
beginDS1307();
P.displayAnimate();
if (P.getZoneStatus(0))
{
switch (display)
{
case 0: //menampilkan waktu
P.setFont(1, numeric7Seg);
P.setTextEffect(0, PA_PRINT, PA_NO_EFFECT);
if ((millis() - lastTime) >= 1000)
{
lastTime = millis();
getTime(szMesg, flasher);
flasher = !flasher;
}
if ((seconds == 00) || (seconds == 30)) { //transisi dari waktu ke hari
display++;
P.setTextEffect(0, PA_PRINT, PA_WIPE_CURSOR);
}
break;
case 1: // menampilkan hari
P.setFont(0, nullptr);
P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
if ((millis() - lastTime) >= 1000)
{
lastTime = millis();
dow2str(wday, szMesg, MAX_MESG);
}
display++; //transisi dari hari ke tanggal
break;
default: // menampilkan tanggal, bulan, dan waktu
P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
if ((millis() - lastTime) >= 1000)
{
lastTime = millis();
getDate(szMesg);
}
display = 0; //transisi dari tanggal kembali ke waktu
break;
}
P.displayReset(0); //reset display led dot matrik
}
}
void dhtsuhu() //fungsi suhu dan kelembapan ruangan
{
float humi = dht.readHumidity();
float tempC = dht.readTemperature();
if ((millis() - lastTime2) >= 3000)
{
lastTime2 = millis();
lcd2.clear();
if (isnan(humi) || isnan(tempC))
{
lcd2.setCursor(0, 0);
lcd2.print("Failed");
}
else //menampilkan suhu dan kelembapan ruangan pada lcd 2
{
lcd2.setCursor(3, 0);
lcd2.print("Suhu Ruangan : ");
lcd2.setCursor(6, 1);
lcd2.print(tempC);
lcd2.print((char)223);
lcd2.print("C");
lcd2.setCursor(0, 2);
lcd2.print("Kelembapan Ruangan : ");
lcd2.setCursor(6, 3);
lcd2.print(humi);
lcd2.print("%");
}
}
}
void btn() //fungsi push button
{
buttonState = digitalRead(button1);
buttonState2 = digitalRead(button2);
if((buttonState == HIGH)) //push button 1
{
if ((millis() - lastTime3) >= 5000)
{
lastTime3 = millis();
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(green, LOW);
digitalWrite(red, HIGH);
}
}
else
{
digitalWrite(red, LOW);
digitalWrite(green, HIGH);
digitalWrite(RELAY_PIN, LOW);
}
if((buttonState2 == HIGH)) //push button 2
{
if ((millis() - lastTime3) >= 5000)
{
lastTime3 = millis();
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(green, LOW);
digitalWrite(red, HIGH);
}
}
else
{
digitalWrite(red, LOW);
digitalWrite(green, HIGH);
digitalWrite(RELAY_PIN, LOW);
}
}
void alarm() //fungsi buzzer/alarm
{
beginDS1307();
if (hours == 0 && minutes == 55 && seconds == 0) //contoh buzzer aktif pada jam 11
{
tone(buzzer, 300, 3000);
}
if (hours == 0 && minutes == 56 && seconds == 0) //dan buzzer aktif lagi pada jam 12
{
tone(buzzer, 300, 3000);
}
}
void setup()
{
input_password.reserve(32);
//relay
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH);
//buzzer
pinMode(buzzer, OUTPUT);
//lcd
lcd1.begin(20, 4);
lcd1.setCursor(5, 0);
lcd1.print("--Closed--");
lcd1.setCursor(1, 1);
lcd1.print("Masukkan Password");
lcd1.setCursor(1, 3);
lcd1.print("Enter=# -- Reset=*");
lcd2.begin(20, 4);
//dht22
dht.begin();
//button
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
//led
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
digitalWrite(red, HIGH);
//dot matrix
P.begin(CS_PIN);
P.setInvert(false);
P.setZone(0, MAX_DEVICES - 4, MAX_DEVICES - 1);
P.setZone(1, MAX_DEVICES - 4, MAX_DEVICES - 1);
P.displayZoneText(1, szTime, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(0, szMesg, PA_CENTER, SPEED_TIME, 0, PA_PRINT , PA_NO_EFFECT);
Wire.begin();
}
void loop()
{
switch (kondisi)
{
case 0:
setpw();
break;
case 1:
matrix();
dhtsuhu();
btn();
alarm();
break;
default :
break;
}
}