#include <Servo.h>
#include <dht.h>
#include <Stepper.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(30, 32, 34, 36, 38, 40);
// defines pins numbers
dht DHT;
const int stepsPerRevolution = 2000; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 16, 17, 18, 19);
#define DHT22_PIN 14
const int trigPin = 9;
const int echoPin = 10;
//define variables
long duration;
int distance;
unsigned long time_Start;
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
struct {
uint32_t total;
uint32_t ok;
uint32_t crc_error;
uint32_t time_out;
uint32_t connect;
uint32_t ack_l;
uint32_t ack_h;
uint32_t unknown;
} stat = { 0, 0, 0, 0, 0, 0, 0, 0};
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
myservo.attach(6); // attaches the servo on pin 9 to the servo object
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
myStepper.setSpeed(200);
lcd.begin(16, 2);
// you can now interact with the LCD, e.g.:
lcd.setCursor(0,1) ; //sets cursor to second line first row
lcd.print("Welcome !!!");
lcd.setCursor(0,0); // cursor to first position first line
lcd.print("23157008");
delay(1000);
}
void tempControl(){
uint32_t start = micros();
int chk = DHT.read22(DHT22_PIN);
uint32_t stop = micros();
stat.total++;
switch (chk)
{
case DHTLIB_OK:
stat.ok++;
//Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
stat.crc_error++;
//Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
stat.time_out++;
//Serial.print("Time out error,\t");
break;
case DHTLIB_ERROR_CONNECT:
stat.connect++;
//Serial.print("Connect error,\t");
break;
case DHTLIB_ERROR_ACK_L:
stat.ack_l++;
//Serial.print("Ack Low error,\t");
break;
case DHTLIB_ERROR_ACK_H:
stat.ack_h++;
//Serial.print("Ack High error,\t");
break;
default:
stat.unknown++;
//Serial.print("Unknown error,\t");
break;
}
// DISPLAY DATA
/*Serial.print(DHT.humidity, 1);
Serial.print(",\t");
Serial.print(DHT.temperature, 1);
Serial.print(",\t");
Serial.print(stop - start);
Serial.print();*/
/*lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:0");*/
if(DHT.temperature<=25){
myStepper.step(0);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Speed of Fan:0\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("0");
}else if(DHT.temperature > 25 and DHT.temperature <= 29){
if(DHT.humidity >= 40 and DHT.humidity <= 60){
myStepper.step(10);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:2\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("2");
}
else if(DHT.humidity > 60 and DHT.humidity <= 80){
myStepper.step(50);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:3\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("3");
}
else if(DHT.humidity > 80 and DHT.humidity <= 100){
myStepper.step(100);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:4\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("4");
}
else{
myStepper.step(0);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:0\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("0");
}
}
else if(DHT.temperature > 29 and DHT.temperature <= 34){
if(DHT.humidity >= 40 and DHT.humidity <= 60){
myStepper.step(50);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:3\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("3");
}
else if(DHT.humidity > 60 and DHT.humidity <= 80){
myStepper.step(100);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:4\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("4");
}
else if(DHT.humidity > 80 and DHT.humidity <= 100){
myStepper.step(150);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:5\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("5");
}
else{
myStepper.step(0);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:0\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("0");
}
}
else if(DHT.temperature > 34 and DHT.temperature <= 39){
if(DHT.humidity >= 40 and DHT.humidity <= 60){
myStepper.step(100);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:4\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("4");
}
else if(DHT.humidity > 60 and DHT.humidity <= 100){
myStepper.step(150);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:5\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("5");
}
else{
myStepper.step(0);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:0\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("0");
}
}
else if(DHT.temperature > 39){
if(DHT.humidity >= 40 and DHT.humidity <= 100){
myStepper.step(150);
/*Serial.print("Temperature: ");
Serial.print(DHT.temperature);
Serial.print(" ;Humidity: ");
Serial.print(DHT.humidity);
Serial.print(" ;Speed of Fan:5\n");*/
lcd.setCursor(0,0) ; //sets cursor to second line first row
lcd.print("T(C):");
lcd.print(DHT.temperature);
lcd.setCursor(0,1); // cursor to first position first line
lcd.print("H(%):");
lcd.print(DHT.humidity);
lcd.print(" Fan:");
lcd.print("5");
}
}
}
void lightControl(){
const float GAMMA = 0.7;
const float RL10 = 50;
// Convert the analog value into lux value:
int analogValue = analogRead(A0);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
//Serial.print(lux);
if(lux<400){
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
//delay(1000); // wait for a second
}else{
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
//delay(1000);
}
}
void doorControl(){
if (stat.total % 20 == 0)
{
/*Serial.print("\nTOT\tOK\tCRC\tTO\tCON\tACK_L\tACK_H\tUNK");
//Serial.print(stat.total);
Serial.print("\t");
Serial.print(stat.ok);
Serial.print("\t");
Serial.print(stat.crc_error);
Serial.print("\t");
Serial.print(stat.time_out);
Serial.print("\t");
Serial.print(stat.connect);
Serial.print("\t");
Serial.print(stat.ack_l);
Serial.print("\t");
Serial.print(stat.ack_h);
Serial.print("\t");
Serial.print(stat.unknown);
Serial.print("\n");*/
}
delay(5);
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance = (duration * 0.034 / 2)+3;
// Prints the distance on the Serial Monitor
// Serial.print(distance);
// Serial.print(",");
// Serial.print(duration);
// Serial.print("\n");
if(distance<200){
for (pos = 90; pos >= 0; pos -= 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
//delay(15); // waits 15ms for the servo to reach the position
}
//Serial.print("door open for 3 sec");
//Serial.print(distance);
time_Start=millis();
delay(3000);
for (pos = 0; pos <= 90; pos += 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
//delay(15); // waits 15ms for the servo to reach the position
}
}else{
myservo.write(90);
//Serial.print("door closed");
}
}
void loop() {
tempControl();
lightControl();
if (millis() - time_Start > 3000)
{
// Close the door
for (pos = 0; pos <= 90; pos += 1)
{
myservo.write(pos);
//delay(15);
time_Start=0;
}
doorControl();
}
}