/*******************************************************************************
* Alimentador Automatizado para Felinos (v1.1)
*
* Acionamento de um rele em hora e minuto preestabelecidos.
*
* HELP PETZ
* Programador Rafael (15/05/2023).
*
*******************************************************************************/
//Inclusao das bibliotecas
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
#include "HX711.h"
#include "soc/rtc.h"
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
// HX711 circuit wiring
const int PINO_DT = 16;
const int PINO_SCK = 4;
HX711 scale;
const int FATOR_CALIBRACAO = -45000;
//parâmetros de horário que serão atualizados
int horaAtual, minutoAtual;
//parâmetros primeira alimentação
int horaAlimentacao1, minutoAlimentacao1, demosComida1;
//parâmetros segunda alimentação
int horaAlimentacao2, minutoAlimentacao2, demosComida2;
int segundos = 20;
int flag1 = 0;
int flag2 = 0;
int peso = 0;
//As linhas de codigo a seguir devem ser comentadas, ou descomentadas, de acordo com o modelo de RTC utilizado (DS1307 ou DS3132)
//RTC_DS1307 rtc; //Objeto rtc da classe DS1307
RTC_DS3231 rtc; //Objeto rtc da classe DS3132
char diasDaSemana[7][12] = {"Domingo", "Segunda", "Terca", "Quarta", "Quinta", "Sexta", "Sabado"}; //Dias da semana
void setup () {
Serial.begin(9600); //Inicializa a comunicacao serial
Serial.println("Initializing the scale");
scale.begin (PINO_DT, PINO_SCK); //inicializacao e definicao dos pinos DT e SCK dentro do objeto ESCALA
scale.set_scale(420);
scale.set_gain(128); // Substituir o valor encontrado para escala
scale.tare(20); // O peso é chamado de Tare.
//determina o pino do relé
pinMode(2, OUTPUT);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Aliment. Auto");
lcd.setCursor(0,1);
lcd.print("HELP PETZ");
delay(2000);
//determina o horário da primeira alimentação
horaAlimentacao1 = 20;
minutoAlimentacao1 = 15;
//determina o horário da segunda alimentação
horaAlimentacao2 = 21;
minutoAlimentacao2 = 20;
//determina o status de alimentação. 0 equivale a não e 1 a sim
demosComida1 = 0;
demosComida2 = 0;
if (!rtc.begin()) { //Se o RTC nao for inicializado, faz
Serial.println("RTC NAO INICIALIZADO"); //Imprime o texto
while (1); //Trava o programa
}
//rtc.adjust(DateTime(2023, 4, 18, 7, 58, 00)); //Ajusta o tempo do RTC para a data e hora definida pelo usuario.
delay(100); //100 Milissegundos
digitalWrite(2, LOW);
}
void loop ()
{
//verifica se o modulo esta pronto para realizar leituras
if (scale.is_ready())
{
//mensagens de leitura no monitor serial
Serial.print(" Peso: ");
Serial.println(scale.get_units(), 1); //retorna a leitura da variavel escala com a unidade quilogramas
Serial.print(" kg");
}
else
{
Serial.print(" Aguarde . . . ");
}
delay(2000); //intervalo de espera para leitura
DateTime agora = rtc.now(); // Faz a leitura de dados de data e hora
Serial.print("Data: ");
Serial.print(agora.day(), DEC); //Imprime dia
Serial.print('/'); //Imprime barra
Serial.print(agora.month(), DEC); //Imprime mes
Serial.print('/'); //Imprime barra
Serial.print(agora.year(), DEC); //Imprime ano
Serial.print(" / Dia da semana: "); //Imprime texto
Serial.print(diasDaSemana[agora.dayOfTheWeek()]); //Imprime dia da semana
Serial.print(" / Horas: "); //Imprime texto
Serial.print(agora.hour(), DEC); //Imprime hora
Serial.print(':'); //Imprime dois pontos
Serial.print(agora.minute(), DEC); //Imprime os minutos
Serial.print(':'); //Imprime dois pontos
Serial.print(agora.second(), DEC); //Imprime os segundos
Serial.println(); //Quebra de linha
delay(1000); //1 Segundo
//verifica se é o horário da primeira alimentação
if ((agora.hour() == horaAlimentacao1) && (agora.minute() == minutoAlimentacao1 && demosComida1 == 0 )){
digitalWrite(2, HIGH);
delay(20000);
digitalWrite(2, LOW);
demosComida1 = 1; //altera status da comida1
flag1 = 1;
}
//verifica se é o horário da segunda alimentação
if ((agora.hour() == horaAlimentacao2) && (agora.minute() == minutoAlimentacao2 && demosComida2 == 0 )){
digitalWrite(2, HIGH);
delay(20000);
digitalWrite(2, LOW);
demosComida2 = 1; //altera status da comida2
flag2 = 1;
}
//Imprime o horário da próxima alimentação
if (demosComida1 == 0 || demosComida1 == 1 && demosComida2 == 1 ){
Serial.print("Horário atual: ");
Serial.print("Proxima alimentação: ");
Serial.print(horaAlimentacao1);
Serial.print("h:");
Serial.print(minutoAlimentacao1);
Serial.println("min");
Serial.println(" ");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Prox.alimentacao: ");
lcd.setCursor(0,1);
lcd.print(horaAlimentacao1);
lcd.print("h:");
lcd.print(minutoAlimentacao1);
lcd.println("min");
lcd.println(" ");
delay(2000);
}
if (demosComida1 == 1 && demosComida2 == 0){
Serial.print("Horário atual: ");
Serial.print("Proxima alimentação: ");
Serial.print(horaAlimentacao2);
Serial.print("h:");
Serial.print(minutoAlimentacao2);
Serial.println("min");
Serial.println(" ");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Prox.alimentacao: ");
lcd.setCursor(0,1);
lcd.print(horaAlimentacao2);
lcd.print("h:");
lcd.print(minutoAlimentacao2);
lcd.println("min");
lcd.println(" ");
delay(2000);
}
//meia noite reseta o status de comida do dia
if (agora.hour() == 0 && agora.minute() == 0){
demosComida1 = 0;
demosComida2 = 0;
}
//atualiza monitor serial
delay (1000);
}