#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <Wire.h>
#include <dht.h>
#include <ezBuzzer.h>
#include <stdio.h>
#include <stdlib.h>

dht DHT;
RTC_DS1307 rtc;

LiquidCrystal_I2C lcd(0x27, 20, 4);

#define DHT22_PIN   5
#define servo       3
#define mosfet      10
const int BUZZER_PIN = 13;
const int ok = A1;
const int UP = A2; //BOTOES
const int DOWN = A3;
ezBuzzer buzzer(BUZZER_PIN); // create ezBuzzer object that attach to a pin;

int pwmluz;

int Hor;
int Min;
int Sec;
int Data;
int falta = 22;// 31.680 segundos
int8_t dia;
int agenda;
int desperta;
int i;

uint8_t   date;

// notes in the melody:
int melody[] = {
  NOTE_E5, NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,
  NOTE_E5,
  NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,
  NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,
  NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5,
  NOTE_D5, NOTE_G5
};

// note durations: 4 = quarter note, 8 = eighth note, etc, also called tempo:
int noteDurations[] = {
  8, 8, 4,
  8, 8, 4,
  8, 8, 8, 8,
  2,
  8, 8, 8, 8,
  8, 8, 8, 16, 16,
  8, 8, 8, 8,
  4, 4
};

int noteLength;


void setup() {
  rtc.begin();
  pinMode(mosfet, OUTPUT);
  pinMode(ok, INPUT);
  pinMode(UP, INPUT);
  pinMode(DOWN, INPUT);
  analogWrite(servo, 80);
  lcd.init();
  lcd.backlight();

  Serial.begin(9600);
  noteLength = sizeof(noteDurations) / sizeof(int);
}

void loop() {
  // DEVE chamar a função buzzer.loop() em loop()
  buzzer.loop();
  //rtc.adjust(DateTime(2024, 1, 1, 23, 59, 59));
  DateTime now = rtc.now();
  Hor = rtc.now().hour();
  Min = rtc.now().minute();
  Sec = rtc.now().second();
  Data = rtc.now().day();

  //if (Hor < 24) {
  if ( Hor == 18 &&  (Min == 55 || Min == 00) && Sec == 01) {// 1
    //while (Hor <= 24) {
      agenda = 0;
      if (agenda == 0) {
        (desperta = desperta + 1);
        delayMicroseconds(500);
      }
      if ( desperta == 1) {
        dia = (falta - 0^0);
        return (0);
      }
      //for (int i = 80; i >= 50; i--) {
      Serial.println(dia);
      delay(100);
    //}
  }
  if ( Hor == 16 &&  (Min == 19 || Min == 00) && Sec == 01) {//2
    agenda = 0;
    if (agenda == 0) {
      (desperta = desperta + 1);
      delayMicroseconds(500);
    }
    if ( desperta <= falta) {
      dia = (dia - 1);
    }
    //for (int i = 80; i >= 50; i--) {
    Serial.println(dia);
    delay(100);
  }

  if ( Hor == 16 &&  (Min == 20 || Min == 00) && Sec == 01) {//3
    agenda = 0;
    if (agenda == 0) {
      (desperta = desperta + 1);
      delayMicroseconds(500);
    }
    if ( desperta <= falta) {
      dia = (dia - 1);
    }
    //for (int i = 80; i >= 50; i--) {
    Serial.println(dia);
    delay(100);
  }
  if ( desperta >= falta) {
    desperta == 1;
  }
  //}

  // Se faltar mais de 4 dias para a choca move os motores as 6:00, 12:00, 17:56 e 23:59
  if (falta > 4) {
    if ( Hor == 6 &&  (Min == 00 || Min == 00) && Sec == 01) {
      //analogWrite(servo, 80);
      for (int i = 50; i <= 80; i++) {
        analogWrite(servo, i);
        delay(100);
      }
    }

    if ( Hor == 12 &&  (Min == 00 || Min == 00) && Sec == 01) {
      //analogWrite(servo, 50);
      for (int i = 80; i >= 40; i--) {
        analogWrite(servo, i);
        delay(100);
      }
    }

    if ( Hor == 17 &&  (Min == 56 || Min == 00) && Sec == 01) {
      //analogWrite(servo, 80);
      for (int i = 50; i <= 80; i++) {
        analogWrite(servo, i);
        delay(100);
      }
    }

    if ( Hor == 23 &&  (Min == 59 || Min == 00) && Sec == 01) {
      //analogWrite(servo, 120);
      for (int i = 80; i <= 120; i++) {
        analogWrite(servo, i);
        delay(100);
      }
    }
  }

  // Se faltar 4 dias ou menos para chocar a chocadeira para na posição 80
  if (falta <= 4) {
    analogWrite(servo, 80);
  }

  uint32_t start = micros();
  int chk = DHT.read22(DHT22_PIN);
  uint32_t stop = micros();

  if (isnan(DHT.humidity) || isnan(DHT.temperature))  {
    return;
  }

  // Imprime as informações de temperatura e umidade no display
  lcd.setCursor(0, 0);
  lcd.print("U:");
  lcd.print(DHT.humidity);
  lcd.print("  T:");
  lcd.print(DHT.temperature);

  // Imprime as informações de hora e tempo que falta para a eclosão
  lcd.setCursor(0, 1);
  lcd.print(Hor);
  lcd.print(":");
  lcd.print(Min);
  lcd.print(" ");
  lcd.print("F");
  lcd.print(":");
  lcd.print(falta);
  lcd.print(" D:");
  lcd.print(dia);


  // Realiza o cálculo de pwm da luz de acordo com a temperatura
  pwmluz = -(DHT.temperature - 37.9) * 255;

  if (pwmluz > 255)  {
    analogWrite(mosfet, 255);
  }

  if (pwmluz <= 255)  {
    analogWrite(mosfet, pwmluz);
  }

  if (pwmluz <= 1)  {
    digitalWrite(mosfet, LOW);
    delay(5000);
  }

  if (DHT.humidity <= 40) {
    if (buzzer.getState() == BUZZER_IDLE) { // if stopped
      buzzer.playMelody(melody, noteDurations, noteLength); // playing
    }
  }
  //Serial.println(dia);
  //Serial.print("OK,\t");
  //Serial.println(Data);
}
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
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND
servo1:GND
servo1:V+
servo1:PWM
GND5VSDASCLSQWRTCDS1307+
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW
NOCOMNCVCCGNDINLED1PWRRelay Module
relay1:VCC
relay1:GND
relay1:IN
relay1:NC
relay1:COM
relay1:NO
bz1:1
bz1:2
r1:1
r1:2