#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include "RTClib.h"
Servo myservo;
Servo myservo1;
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc;
int redPin = 12;
int greenPin = 10;
int bluePin = 9;
int btnPin = 7;
int btnledPin = 2;
int fadePin = 5;
int servoPin = 6;
int servo1Pin = 11;
int pos;
int pirPin = 8;
int ldr1Pin = A0;
int ldr2Pin = A1;
int ldr3Pin = A2;
int ldr4Pin = A3;
unsigned long curTime = 0;
unsigned long redPre = 0;
unsigned long greenPre = 0;
unsigned long bluePre = 0;
unsigned long btnPre = 0;
unsigned long fadePre = 0;
unsigned long servoPre = 0;
unsigned long lcdPre = 0;
int redTime = 200;
int greenTime = 500;
int blueTime = 300;
int btnTime = 50;
int fadeTime = 10;
int servoTime = 15;
int lcdTime = 1000;
int redState = LOW;
int greenState = LOW;
int blueState = LOW;
int btnledState = 1;
int btnState;
int fadeState = 0;
int lcdState = LOW;
int servoIncrement = 1;
int servoPos = 90;
int servo1Pos = 90;
int cen;
int pir;
int pirState = LOW;
int val1;
int val2;
int val3;
int val4;
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"};
void setup() {
Serial.begin(115200);
rtc.begin();
myservo.attach(servoPin);
myservo1.attach(servo1Pin);
lcd.init();
lcd.backlight();
myservo.write(servoPos);
myservo1.write(servo1Pos);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(btnPin, INPUT_PULLUP);
pinMode(btnledPin, OUTPUT);
pinMode(fadePin, OUTPUT);
pinMode(3, INPUT);
pinMode(4, OUTPUT);
pinMode(pirPin, INPUT);
pinMode(ldr1Pin, INPUT);
pinMode(ldr2Pin, INPUT);
pinMode(ldr3Pin, INPUT);
pinMode(ldr4Pin, INPUT);
}
void loop() {
curTime = millis();
val1 = analogRead(ldr1Pin);
val2 = analogRead(ldr2Pin);
val3 = analogRead(ldr3Pin);
val4 = analogRead(ldr4Pin);
float voltage = val1 / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
val1 = map(val1, 8, 1015, 180, 0);
val2 = map(val2, 8, 1015, 180, 0);
val3 = map(val3, 8, 1015, 180, 0);
val4 = map(val4, 8, 1015, 180, 0);
lcd.setCursor(0, 0);
lcd.print("V1=");
lcd.print(val1);
lcd.print(" ");
lcd.print("V2=");
lcd.print(val2);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("V3=");
lcd.print(val3);
lcd.print(" ");
lcd.print("V4=");
lcd.print(val4);
lcd.print(" ");
/////////////////////////////////////////////////servo
if (val1 > val2) {
servoPos++;
myservo.write(servoPos);
if (servoPos >= 180) {
servoPos = 180;
}
}
if (val2 > val1) {
servoPos--;
myservo.write(servoPos);
if (servoPos <= 0) {
servoPos = 0;
}
}
////////////////////////////////////////////////servo1
if (val3 > val4) {
servo1Pos++;
myservo1.write(servo1Pos);
if (servo1Pos >= 180) {
servo1Pos = 180;
}
}
if (val4 > val3) {
servo1Pos--;
myservo1.write(servo1Pos);
if (servo1Pos <= 0) {
servo1Pos = 0;
}
}
delay(50);
}////////////////////////end loop
void blink() {
////////////////////// red
if (curTime - redPre >= redTime) {
redPre = curTime;
if (redState == LOW) {
redState = HIGH;
redTime = 2000;
} else {
redState = LOW;
redTime = 500;
}
digitalWrite(redPin, redState);
} /////////////////////end red
//////////////////////// green
if (curTime - greenPre >= greenTime) {
greenPre = curTime;
if (greenState == LOW) {
greenState = HIGH;
greenTime = 2000;
} else {
greenState = LOW;
greenTime = 1000;
}
digitalWrite(greenPin, greenState);
}
////////////////////////////end green
//////////////////////////// blue
if (curTime - bluePre >= blueTime) {
bluePre = curTime;
if (blueState == LOW) {
blueState = HIGH;
blueTime = 3000;
} else {
blueState = LOW;
blueTime = 500;
}
digitalWrite(bluePin, blueState);
}
//////////////////////////end blue
}//////////////////////////end blink
void button() {
if (curTime - btnPre >= btnTime) {
btnPre = curTime;
btnState = digitalRead(btnPin);
if (btnState == LOW) {
btnledState = !btnledState;
// } else {
// btnledState = LOW;
}
digitalWrite(btnledPin, btnledState);
if (btnledState == LOW) {
date();
//delay(1000);
//lcd.clear();
}
else {
distance();
//delay(1000);
// lcd.clear();
}
}
}
void fade() {
if (curTime - fadePre >= fadeTime) {
fadePre = curTime;
fadeState++;
if (fadeState >= 255) {
fadeState = 0;
}
analogWrite(fadePin, fadeState);
}
}
void servo() {
if (curTime - servoPre >= servoTime) {
servoPre = curTime;
servoPos += servoIncrement;
myservo.write(servoPos);
if (servoPos >= 180 || servoPos <= 0) {
servoIncrement = -servoIncrement;
}
}
}
void distance() {
digitalWrite(4, HIGH);
delayMicroseconds(10);
digitalWrite(4, LOW);
// Read the result:
int duration = pulseIn(3, HIGH);
cen = duration / 58;
lcd.setCursor(0, 0);
lcd.print("Dist CM: ");
if (cen >= 100) {
// myservo.write(90);
}
else {
//delay(3000);
// myservo.write(0);
}
if (curTime - lcdPre >= lcdTime) {
lcdPre = curTime;
if (lcdState == LOW) {
lcdState = HIGH;
lcd.print(cen);
lcdTime = 1000;
} else {
lcdState = LOW;
lcd.setCursor(9, 0);
lcd.print(" ");
lcdTime = 10;
}
}
}
void date() {
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print("Date ");
lcd.print(now.day());
lcd.print('/');
lcd.print(now.month());
lcd.print('/');
lcd.print(now.year());
lcd.print(" ");
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
//Serial.print(") ");
lcd.setCursor(0, 1);
lcd.print("Time ");
lcd.print(now.hour());
lcd.print(':');
lcd.print(now.minute());
lcd.print(':');
lcd.print(now.second());
}
void Motion() {
pir = digitalRead(pirPin);
if (pir == HIGH) {
digitalWrite(2, HIGH);
if (pirState == LOW) {
Serial.println("Motion detected!");
pirState = HIGH;
}
} else {
digitalWrite(2, LOW);
if (pirState == HIGH) {
Serial.println("Motion ended!");
pirState = LOW;
}
}
}