#include <DHT.h>
#include <LiquidCrystal.h>
#include <IRremote.h>
#include <Wire.h>
#include <RTClib.h>
#define LED_PIR 6
#define PIR 2
#define dht_pin 4
#define DHTTYPE DHT22
#define IR_PIN 13
#define trig_pin 22
#define echo_pin 5
#define a1 23
#define a2 25
#define a3 27
#define a4 29
#define a5 31
#define a6 33
#define a7 35
#define a8 37
#define a9 39
#define a10 41
#define ldr_pin 3
#define led_sw_1 49
#define led_sw_2 47
#define led_sw_3 45
#define led_sw_4 43
#define led_2 14
#define led_3 15
#define led_4 16
DHT dht(dht_pin, DHTTYPE);
LiquidCrystal lcd(12,11,10,9,8,7);
IRrecv rec(IR_PIN);
RTC_DS1307 rtc;
int val = 0;
float temp;
float hum;
int led_bar[] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41};
int num = 10;
int j = 0;
int m = 0;
int x = 0;
int next = 0;
int prev = 0;
int fill = 0;
String str1;
String res;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"};
void setup() {
pinMode(LED_PIR, OUTPUT);
pinMode(PIR, INPUT);
pinMode(dht_pin, INPUT);
pinMode(trig_pin, OUTPUT);
pinMode(echo_pin, INPUT);
pinMode(ldr_pin, INPUT);
for(int i=0; i<num; i++){
pinMode(led_bar[i], OUTPUT);
}
pinMode(led_sw_1, OUTPUT); pinMode(led_sw_2, OUTPUT);
pinMode(led_sw_3, OUTPUT); pinMode(led_sw_4, OUTPUT);
pinMode(led_2, OUTPUT); pinMode(led_3, OUTPUT); pinMode(led_4, OUTPUT);
// Serial.begin(115200);
dht.begin();
lcd.begin(16, 2);
rec.enableIRIn();
digitalWrite(led_sw_1, HIGH); digitalWrite(led_sw_2, HIGH);
digitalWrite(led_sw_3, HIGH); digitalWrite(led_sw_4, HIGH);
if (!rtc.begin()) {
// Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
// Serial.println("RTC is NOT running!");
} else {
// Serial.println("RTC is running!");
}
}
int menu(){
lcd.clear();
lcd.setCursor(0,0); lcd.print("1:Temp");
lcd.setCursor(10,0); lcd.print("2:date");
lcd.setCursor(0,1); lcd.print("3:water");
lcd.setCursor(10,1); lcd.print("4:lumi");
next = 0;
prev = 0;
fill = 0;
x = 0;
res = "";
return 1;
}
int readDistance(){
// distance by ultrasonic sensor
digitalWrite(trig_pin, LOW);
delayMicroseconds(2);
digitalWrite(trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(trig_pin, LOW);
int duration = pulseIn(echo_pin, HIGH);
return duration / 58;
}
void led_bar_control(int distance){
// the led bar
if(distance <= 35){
for(int i=0; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
else if(distance > 35 && distance <= 70){
for(int i=1; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
else if(distance > 70 && distance <= 105){
for(int i=2; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
else if(distance > 105 && distance <= 140){
for(int i=3; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
else if(distance > 140 && distance <= 175){
for(int i=4; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
else if(distance > 175 && distance <= 210){
for(int i=5; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
else if(distance > 210 && distance <= 245){
for(int i=6; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
else if(distance > 245 && distance <= 280){
for(int i=7; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
else if(distance > 280 && distance <= 315){
for(int i=8; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
else{
for(int i=9; i<num; i++){
digitalWrite(led_bar[i], HIGH);
}
}
delay(20);
for(int i=0; i<num; i++){
digitalWrite(led_bar[i], LOW);
}
delay(20);
}
void loop() {
temp = dht.readTemperature(); // dht temperature
hum = dht.readHumidity(); // dht humidity
val = digitalRead(PIR); // mvt detection (PIR)
int distance = readDistance(); // distance
led_bar_control(distance);
if(digitalRead(ldr_pin) == HIGH){
digitalWrite(led_2, HIGH); digitalWrite(led_3, HIGH); digitalWrite(led_4, HIGH);
delay(20);
}
else{
digitalWrite(led_2, LOW); digitalWrite(led_3, LOW); digitalWrite(led_4, LOW);
delay(20);
}
if(val == 1){
digitalWrite(LED_PIR, HIGH);
}
else{
digitalWrite(LED_PIR, LOW);
}
if(rec.decode()){
translateIR();
rec.resume();
}
}
void time(){
DateTime now = rtc.now();
lcd.clear();
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.setCursor(11,0);
lcd.print(now.hour()); lcd.print(":"); lcd.print(now.minute());
lcd.setCursor(3,1);
lcd.print(now.year()); lcd.print("/"); lcd.print(now.month());
lcd.print("/"); lcd.print(now.day());
}
void temp_hum(){
lcd.clear();
lcd.setCursor(0,0); lcd.print("Temp: ");
lcd.print(temp); lcd.print(" c");
lcd.setCursor(0,1); lcd.print("Humi: ");
lcd.print(hum); lcd.print(" %"); lcd.print(" ->");
next = 1;
prev = 0;
}
void control_temp(){
lcd.clear();
lcd.setCursor(3,0); lcd.print("T = "); lcd.print(temp);
lcd.print("c");
lcd.setCursor(0,1); lcd.print("Inc: +");
lcd.setCursor(10,1); lcd.print("Dec: -");
prev = 1;
next = 0;
}
void water_level(){
int distance = readDistance();
int w_level = (distance * 100) / 345;
w_level = 100 - w_level;
lcd.clear();
lcd.print("Water level: "); lcd.print(w_level); lcd.print("%");
if(w_level <= 60){
lcd.setCursor(0,1); lcd.print("Press 0 to fill");
fill = 1;
}
}
void control_water(String str){
res += str;
int number = res.toInt();
if(number <= 100 && number >= 60){
lcd.clear();
lcd.setCursor(3,0); lcd.print("Water Level");
lcd.setCursor(6,1); lcd.print(number); lcd.setCursor(9,1); lcd.print("%");
x = 0; fill = 0;
}
else if(number > 100){
lcd.setCursor(3,0); lcd.print("Water Level");
lcd.setCursor(6,1); lcd.print(100); lcd.setCursor(9,1); lcd.print("%");
x = 0; fill = 0;
}
}
void luminosity(){
lcd.clear();
lcd.setCursor(0,0); lcd.print("L1: ");
if(digitalRead(PIR) == 1) lcd.print("ON");
else lcd.print("OFF");
lcd.setCursor(9,0); lcd.print("L2: ");
if(digitalRead(ldr_pin) == HIGH) lcd.print("ON");
else lcd.print("OFF");
lcd.setCursor(0,1); lcd.print("L3: ");
if(digitalRead(ldr_pin) == HIGH) lcd.print("ON");
else lcd.print("OFF");
lcd.setCursor(9,1); lcd.print("L4: ");
if(digitalRead(ldr_pin) == HIGH) lcd.print("ON");
else lcd.print("OFF");
}
void translateIR(){
if(rec.decodedIRData.command == 162){
if(j % 2 == 0){
m = menu();
j = 1;
}else{
lcd.clear();
j = 0;
}
return;
}
if(j == 1){
if(rec.decodedIRData.command == 226){
m = menu();
}
else if(rec.decodedIRData.command == 144 && next == 1){
control_temp();
}
else if(prev == 1){
if (rec.decodedIRData.command == 224){
temp_hum();
}
else if(rec.decodedIRData.command == 2){
temp += 1;
if(temp <= 45){
lcd.setCursor(3,0); lcd.print("T = "); lcd.print(temp);
lcd.print("c");
}
else{
temp = 45.00;
lcd.setCursor(3,0); lcd.print("T = "); lcd.print(temp);
lcd.print("c");
}
}
else if(rec.decodedIRData.command == 152){
temp -= 1;
if(temp < -5){
temp = -5.00;
lcd.setCursor(3,0); lcd.print("T = "); lcd.print("-5.00");
lcd.print("c");
}
else if(temp >= 45){
temp = 45.00;
lcd.setCursor(3,0); lcd.print("T = "); lcd.print(temp);
lcd.print("c");
}
else{
lcd.setCursor(3,0); lcd.print("T = "); lcd.print(temp);
lcd.print("c");
}
}
}
else if(rec.decodedIRData.command == 104 && fill == 1 && x == 0){
lcd.clear();
lcd.setCursor(3,0); lcd.print("Water Level");
lcd.setCursor(6,1); lcd.print("-- %");
x = 1;
}
else if(fill == 1 && x == 1){
switch(rec.decodedIRData.command){
case 104:
str1 = "0";
control_water(str1);
break;
case 48:
str1 = "1";
control_water(str1);
break;
case 24:
str1 = "2";
control_water(str1);
break;
case 122:
str1 = "3";
control_water(str1);
break;
case 16:
str1 = "4";
control_water(str1);
break;
case 56:
str1 = "5";
control_water(str1);
break;
case 90:
str1 = "6";
control_water(str1);
break;
case 66:
str1 = "7";
control_water(str1);
break;
case 74:
str1 = "8";
control_water(str1);
break;
case 82:
str1 = "9";
control_water(str1);
break;
default:
// lcd.clear();
break;
}
}
else if(m == 1){
switch(rec.decodedIRData.command){
case 34:
break;
case 2:
break;
case 194:
break;
case 224:
break;
case 168:
break;
case 144:
break;
case 104:
break;
case 152:
break;
case 176:
break;
case 48:
temp_hum();
m = 0;
break;
case 24:
time();
m = 0;
break;
case 122:
water_level();
m = 0;
break;
case 16:
luminosity();
m = 0;
break;
case 56:
break;
case 90:
break;
case 66:
break;
case 74:
break;
case 82:
break;
default:
// lcd.clear();
break;
}
}
}
}