#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#include <OneWire.h> //library OneWire
#include <DallasTemperature.h> //library DS18B20
#include <DS3231.h> //mengincludekan library DS3231
#include <Wire.h>
#include <ezButton.h>
#define DHTPIN 3 // definisikan pin yang digunakan utk sensor DHT11
#define DHTTYPE DHT11 // DHT 11 // Saat ini yang dipilih adalah DHT11
#define ONE_WIRE_BUS 2 // pin data DS18B0 konek ke pin 2 Arduino UNO
#define buz 11
#define IN1 7 // deklarasi pin IN1
#define IN2 6 // deklarasi pin IN2
#define IN3 10 // deklarasi pin IN3
#define IN4 11 // deklarasi pin IN4
#define ENA 4 // deklarasi pin ENA
#define PB1 8 // Push Button Set
#define PB2 9 //Push Button +
#define PB3 22 // Push Button Manual
//ezButton limitSwitch(22); //limitswith pin 22
LiquidCrystal_I2C lcd(0x23, 16, 2);
LiquidCrystal_I2C lcd1(0x27, 16, 2);
OneWire oneWire(ONE_WIRE_BUS);// Setup komunikasi one wire
DallasTemperature sensors(&oneWire); // mereferensikan sensor ke library one wire
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");
pinMode(PB1, INPUT_PULLUP); // button1 is connected to pin 8
pinMode(PB2, INPUT_PULLUP); // button2 is connected to pin 9
pinMode(PB3, INPUT_PULLUP); // button1 is connected to pin 22
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
dht.begin();
lcd.begin(20,4);
lcd1.begin(20,4);
lcd.backlight();
sensors.begin();
//limitSwitch.setDebounceTime(50); // set debounce time to 50 milliseconds
Wire.begin();
//setting pertama download program
//rtc.setDate(02, 07, 2022); //mensetting tanggal 07 april 2018
//rtc.setTime(9, 30, 00); //menset jam 22:00:00
// rtc.setDOW(2); //menset hari "Sabtu"
//setelah didownload awal selesai, download kedua dengan memberi tanda komen "//"
}
char Time[] = "TIME: : : ";
char Calendar[] = "DATE: / /20 ";
byte i, second, minute, hour, date, month, year;
void DS1307_display(){
// Convert BCD to decimal
second = (second >> 4) * 10 + (second & 0x0F);
minute = (minute >> 4) * 10 + (minute & 0x0F);
hour = (hour >> 4) * 10 + (hour & 0x0F);
date = (date >> 4) * 10 + (date & 0x0F);
month = (month >> 4) * 10 + (month & 0x0F);
year = (year >> 4) * 10 + (year & 0x0F);
// End conversion
Time[12] = second % 10 + 48;
Time[11] = second / 10 + 48;
Time[9] = minute % 10 + 48;
Time[8] = minute / 10 + 48;
Time[6] = hour % 10 + 48;
Time[5] = hour / 10 + 48;
Calendar[14] = year % 10 + 48;
Calendar[13] = year / 10 + 48;
Calendar[9] = month % 10 + 48;
Calendar[8] = month / 10 + 48;
Calendar[6] = date % 10 + 48;
Calendar[5] = date / 10 + 48;
lcd1.setCursor(0, 0);
lcd1.print(Time); // Display time
lcd1.setCursor(0, 1);
lcd1.print(Calendar); // Display calendar
Serial.print(minute);
}
void blink_parameter(){
byte j = 0;
while(j < 10 && digitalRead(PB1) && digitalRead(PB2)){
j++;
delay(25);
}
}
byte edit(byte x, byte y, byte parameter){
char text[3];
while(!digitalRead(PB1)); // Wait until button (pin #8) released
while(true){
while(!digitalRead(PB2)){ // If button (pin #9) is pressed
parameter++;
if(i == 0 && parameter > 23) // If hours > 23 ==> hours = 0
parameter = 0;
if(i == 1 && parameter > 59) // If minutes > 59 ==> minutes = 0
parameter = 0;
if(i == 2 && parameter > 31) // If date > 31 ==> date = 1
parameter = 1;
if(i == 3 && parameter > 12) // If month > 12 ==> month = 1
parameter = 1;
if(i == 4 && parameter > 99) // If year > 99 ==> year = 0
parameter = 0;
sprintf(text,"%02u", parameter);
lcd1.setCursor(x, y);
lcd1.print(text);
delay(200); // Wait 200ms
}
lcd1.setCursor(x, y);
lcd1.print(" "); // Display two spaces
blink_parameter();
sprintf(text,"%02u", parameter);
lcd1.setCursor(x, y);
lcd1.print(text);
blink_parameter();
if(!digitalRead(PB1)){ // If button (pin #8) is pressed
i++; // Increament 'i' for the next parameter
return parameter; // Return parameter value and exit
}
}
}
void loop() {
if(!digitalRead(PB1)){ // If button (pin #8) is pressed
i = 0;
hour = edit(5, 0, hour);
minute = edit(8, 0, minute);
date = edit(5, 1, date);
month = edit(8, 1, month);
year = edit(13, 1, year);
// Convert decimal to BCD
minute = ((minute / 10) << 4) + (minute % 10);
hour = ((hour / 10) << 4) + (hour % 10);
date = ((date / 10) << 4) + (date % 10);
month = ((month / 10) << 4) + (month % 10);
year = ((year / 10) << 4) + (year % 10);
// End conversion
// Write data to DS1307 RTC
Wire.beginTransmission(0x68); // Start I2C protocol with DS1307 address
Wire.write(0); // Send register address
Wire.write(0); // Reset sesonds and start oscillator
Wire.write(minute); // Write minute
Wire.write(hour); // Write hour
Wire.write(1); // Write day (not used)
Wire.write(date); // Write date
Wire.write(month); // Write month
Wire.write(year); // Write year
Wire.endTransmission(); // Stop transmission and release the I2C bus
delay(200); // Wait 200ms
}
Wire.beginTransmission(0x68); // Start I2C protocol with DS1307 address
Wire.write(0); // Send register address
Wire.endTransmission(false); // I2C restart
Wire.requestFrom(0x68, 7); // Request 7 bytes from DS1307 and release I2C bus at end of reading
second = Wire.read(); // Read seconds from register 0
minute = Wire.read(); // Read minuts from register 1
hour = Wire.read(); // Read hour from register 2
Wire.read(); // Read day from register 3 (not used)
date = Wire.read(); // Read date from register 4
month = Wire.read(); // Read month from register 5
year = Wire.read(); // Read year from register 6
DS1307_display(); // Diaplay time & calendar
delay(50); // Wait 50ms
// Baca humidity dan temperature
float h = dht.readHumidity();
float t = dht.readTemperature();
//int state = limitSwitch.getState();
//limitSwitch.loop(); // MUST call the loop() function first
// Cek hasil pembacaan, dan tampilkan bila ok
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
Serial.print("Humidity: ");//kelembaban
Serial.print(h);
Serial.print(" %t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
}
//LCD1
//Sensor DHT11
sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("Humidity:");
lcd.setCursor(9,0);
lcd.print(h);
lcd.setCursor(15,0);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("T1:");
lcd.setCursor(3,1);
lcd.print(t,1);
lcd.setCursor(8,1);
lcd.print("T2:");
lcd.setCursor(11,1);
lcd.print(sensors.getTempCByIndex(0));
lcd.setCursor(15,1);
lcd.print("C");
//MOTOR_OTOMATIS
if(date==10 && hour==07 && minute==00 && second== 00 || date==20 && hour==07 && minute==00 && second== 00 || date==30 && hour==07 && minute==00 && second== 00){
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 150);
Serial.print("Motor ON");
delay (30000);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
analogWrite(ENA, 0);
/*if(state == LOW){
Serial.println("The limit switch: TOUCHED");
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(ENA, 0);
Serial.print("Motor ON");
}*/
}
else{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
analogWrite(ENA, 0);
Serial.print("Motor OFF");
}
//MOTOR_MANUAL
if(!digitalRead(PB3)){
Serial.print("PB3_ON");
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 200);
}
//POMPA AIR
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay (300000);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
/*Sensor DS18B20
sensors.requestTemperatures(); //kirim perintah ke sensor
lcd.setCursor(0,0);
lcd.print(" Sensor DS18B20");//tampilan baris 1
lcd.setCursor(0,1);//set ke baris 2
lcd.print("Temp :");//tampilan baris 2
lcd.setCursor(7,1);//set ke baris 2 kolom 4
lcd.print(sensors.getTempCByIndex(0));//ambil data suhu dan tampilkan hasilnya ke LCD
lcd.print(" C ");//Celcius
delay(5000);//tunda 1 detik
lcd.clear();
delay(1000);*/
}