//Inclusao das bibliotecas
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include <Arduino.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
#include "HX711.h" //Bibliothek für HX711 Sensor
//Messdose
const int MESSDOSE_TARA_PIN = 15;
const int MESSDOSE_DOUT_PIN = 23;
const int MESSDOSE_SCK_PIN = 19;
const int MESSDOSE_GAIN = 128; //Folgende Verstärkungen sind möglich: 32, 64, 128
const float MESSDOSE_ANZ_MESSWERTE = 1; //Anzahl der Messwerte (wirkt als gleitender Mittelwert / Hochpass)
const float MESSDOSE_FAKTOR = 420; //Skalierung ADC Wert zu Kraft (ADC Wert / Kraft)
//Schalter, Potis etc.
bool button_TARA = 0;
//***** Weitere Initialisierung *****
HX711 Messdose; //Initialisiere Messdose
//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;
float peso = 0; //Variável que vai receber o peso da balança
//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);
setup_codigo1(); // remova o serial.begin
setup_codigo2(); // remova o serial.begin
}
void setup_codigo1(){
Serial.println("Initializing the scale");
// Messdose
Messdose.begin(MESSDOSE_DOUT_PIN, MESSDOSE_SCK_PIN); //Starte Messdose
Messdose.set_gain(MESSDOSE_GAIN); //Verstärkung
Messdose.set_scale(MESSDOSE_FAKTOR); //Skalierung (konvertiert ADC Wert in Newton)
}
void setup_codigo2(){
//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 = 8;
minutoAlimentacao1 = 52;
//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(){
int i=1;
if(i<3){
if(i==1){
loop_codigo1();
i=i+1;
}
if(i==2){
loop_codigo2();
i=0;
}
}
}
void loop_codigo1(){
Serial.print("Peso: ");
Serial.println(func_Messung(), 3); // Mit 3 Nachkommastellenfunc_Messung();
Serial.println(" kg ");
peso = func_Messung();
digitalRead(peso);
// Definiere lokal
delay(1000);
//delay(10);
}
// **** func_Messung ****
// Diese Funktion liest die Lastzelle aus.
float func_Messung() {
// Definiere lokale Variablen
static float float_Messwert;
static unsigned long ulng_lastRead;
// Wenn mindestens 100 ms seit letzter Lesung Vergangen sind, lese den Wert ein.
if (millis() - ulng_lastRead >= 1000) {
ulng_lastRead = millis();
float_Messwert = Messdose.get_units(MESSDOSE_ANZ_MESSWERTE);
}
return float_Messwert;
}
void loop_codigo2() {
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)){
if(peso<0.2){
digitalWrite(2, HIGH);
}else{
digitalWrite(2,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("finalizado: ");
demosComida1 = 1; //altera status da comida1
}
}
//verifica se é o horário da segunda alimentação
if ((agora.hour() == horaAlimentacao2) && (agora.minute() == minutoAlimentacao2 && demosComida2 == 0 )){
if(peso<0.2){
digitalWrite(2, HIGH);
}else{
digitalWrite(2,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("finalizado: ");
demosComida2 = 1; //altera status da comida1
}
}
//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);
}