#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>



// Διαμόρφωση ακροδεκτών
const int DHT_PIN = 7;     
const int HEATER_PIN = 4;  
const int FAN_PIN = 8;     
const int BUTTON_TEMP_UP_PIN = 2;
const int BUTTON_TEMP_DOWN_PIN = 3;
const int BUTTON_HUMIDITY_UP_PIN = 5;
const int BUTTON_HUMIDITY_DOWN_PIN = 6;

// Σταθερές τιμές
const float TEMP_MARGIN = 0.5;
float targetTemp = 37.5;
float targetHumidity = 50;

// Παράδειγμα DHT22
DHT dht(DHT_PIN, DHT22);

// Παράδειγμα I2C LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);

//μοτερ αυγων

const int EGG_MOTOR_PIN = 13;
const unsigned long EGG_TURN_INTERVAL = 100000; // 2 ώρες σε χιλιοστά του δευτερολέπτου
const unsigned long EGG_TURN_DURATION = 6000; // 1 λεπτό σε χιλιοστά του δευτερολέπτου


int eggMotor=EGG_MOTOR_PIN;
unsigned long previousEggTurnTime = 0;
unsigned long eggTurnStartTime = 0;
bool eggTurning = false;

void setup() {
  Serial.begin(9600);
  dht.begin();
  pinMode(HEATER_PIN, OUTPUT);
  pinMode(FAN_PIN, OUTPUT);
  pinMode(BUTTON_TEMP_UP_PIN, INPUT_PULLUP);
  pinMode(BUTTON_TEMP_DOWN_PIN, INPUT_PULLUP);
  pinMode(BUTTON_HUMIDITY_UP_PIN, INPUT_PULLUP);
  pinMode(BUTTON_HUMIDITY_DOWN_PIN, INPUT_PULLUP);

  // Αρχικοποίηση LCD
  lcd.init();
  lcd.backlight();


  pinMode(eggMotor,OUTPUT);
digitalWrite(eggMotor, LOW); // Αρχική θέση
}

void loop() {
  // Διαβάστε τη θερμοκρασία και την υγρασία
  float temp = dht.readTemperature();
  float humidity = dht.readHumidity();

  // Έλεγχος θερμάστρας και ανεμιστήρα
  if (temp < targetTemp - TEMP_MARGIN) {
    digitalWrite(HEATER_PIN, HIGH);
  } else {
    digitalWrite(HEATER_PIN, LOW);
  }

  if (humidity < targetHumidity) {
    digitalWrite(FAN_PIN, HIGH);
  } else {
    digitalWrite(FAN_PIN, LOW);
  }

  // Ελέγξτε τα κουμπιά και προσαρμόστε τη θερμοκρασία και την υγρασία
  if (digitalRead(BUTTON_TEMP_UP_PIN) == LOW) {
  targetTemp += 0.1;
  delay(200);
}
if (digitalRead(BUTTON_TEMP_DOWN_PIN) == LOW) {
  targetTemp -= 0.1;
  delay(200);
}
if (digitalRead(BUTTON_HUMIDITY_UP_PIN) == LOW) {
  targetHumidity += 1;
  delay(200);
}
if (digitalRead(BUTTON_HUMIDITY_DOWN_PIN) == LOW) {
  targetHumidity -= 1;
  delay(200);
}

  unsigned long currentTime = millis();

if (!eggTurning && currentTime - previousEggTurnTime >= EGG_TURN_INTERVAL) {
  eggTurning = true;
  eggTurnStartTime = currentTime;
  digitalWrite(eggMotor, HIGH); // Ενεργοποίηση κινητήρα για να γυρίσει τα αυγά
}

if (eggTurning && currentTime - eggTurnStartTime >= EGG_TURN_DURATION) {
  eggTurning = false;
  previousEggTurnTime = currentTime;
  digitalWrite(eggMotor, LOW); // Απενεργοποίηση κινητήρα και επιστροφή στην αρχική θέση

}

  // Εμφάνιση θερμοκρασίας, υγρασίας και στόχων στην οθόνη LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T: ");
  lcd.print(temp);
  lcd.print(" C S:");
  lcd.print(targetTemp);
  lcd.setCursor(0, 1);
  lcd.print("H: ");
  lcd.print(humidity);
  lcd.print(" % S:");
  lcd.print(targetHumidity);

  // Περιμένετε προτού διαβάσετε ξανά
  delay(2000);
}

uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
lcd:GND
lcd:VCC
lcd:SDA
lcd:SCL
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
led1:A
led1:C
r1:1
r1:2
led2:A
led2:C
r2:1
r2:2
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
led3:A
led3:C
r3:1
r3:2