Es bastante largo mi código, espero no sea una molesta pero he tenido que recortar algunas partes de él,espero no afecte en algo. Y muchas gracias.
#include <DS1307.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <HX711.h>
#include <Arduino.h>
#include <Wire.h>
#include <Servo.h>
//----------------------------------------------------------------------------
//
LiquidCrystal_I2C lcd(0x27,16,2);
int rtc[7];
int Alarm [21];
int Ahora [21] ;
int Amin [21] ;
int Acontime [21] ;
float Apeso [21];
int estadoA =0 ;
int resulhora;
int resulmin;
int contador=0;
int conteo=0;
float calibration_factor = 48100;
float units;
float ounces;
//Variables de configuracion de hora
int Choras =0 ;
int Cminutos=0 ;
int Csegundos=0 ;
int Cdia=0 ;
int Cmes=0 ;
int Cano=0 ;
char fechaActual[20], horaActual[20]; //string para mostrar las lineas completas hora y fecha
//Variables de set cursor lcd
int columna ;
int fila ;
// Declaracion de botones
const int boton1= 2;
const int boton2= 3;
const int boton3= 4;
const int boton4= 5;
//Declaración de Leds
Servo motor;
#define servo_abierto
HX711 scale(7,8);
int i;
//-----------------------------------------------------------------------------
void setup() {
//Leds de comandos
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
//Inicialización de calibración del sensor de peso
Serial.begin(9600);
Serial.println("HX711 calibration sketch");
Serial.println("Remove all weight from scale");
Serial.println("After readings begin, place known weight on scale");
Serial.println("Press + or a to increase calibration factor");
Serial.println("Press - or z to decrease calibration factor");
scale.set_scale();
scale.tare();
long zero_factor = scale.read_average();
Serial.print("Zero factor: ");
Serial.println(zero_factor);
//Declaracion de botones como entrada
pinMode(boton1, INPUT); // Arriba
pinMode(boton2, INPUT); // Abajo
pinMode(boton3, INPUT);
pinMode(boton4, INPUT); //ok
Wire.begin();
lcd.begin(16, 2);
Wire.begin();
lcd.init();
lcd.backlight();
lcd.clear();
fila=5;
Menu_principal();
}
void loop () {
}
//---------------Menu principal----------------
void Menu_principal (){
do{
lcd.clear();
do{
lcd.setCursor(0, 0);
lcd.print("1- Reloj");
lcd.setCursor(0, 1);
lcd.print("2- Alarmas");
if (digitalRead (boton1)==HIGH){
delay(50);
Reloj ();
}
if (digitalRead (boton2)==HIGH){
delay(50);
Alarmas ();
}
} while(digitalRead(boton4) != HIGH);
delay(100);
} while(digitalRead(boton4) != HIGH);
delay(100);
esperar_activacion();
}
//----------Menu mostrar y ajustar reloj-----------------------
void Reloj (){
do{
lcd.setCursor(0, 0);
lcd.print("1- Mostrar Reloj");
lcd.setCursor(0, 1);
lcd.print("2- Ajustar Reloj");
if (digitalRead (boton1)==HIGH){
delay(50);
lcd.clear ();
Mostrar_Fecha_Hora ();
}
if (digitalRead (boton2)==HIGH){
lcd.clear ();
delay(50);
sprintf(horaActual, "%02d:%02d:%02d", Choras,Cminutos, Csegundos);
lcd.setCursor(4, 1); // abajo a la izquierda
lcd.print(horaActual);
Ajustar_Fecha_Hora ();
}
} while(digitalRead(boton4) != HIGH);
Menu_principal();
}
//----------Ajustar alarmas-----------------
void Alarmas (){
do{
lcd.setCursor(0, 0);
lcd.print("1- Mostrar Alarmas");
lcd.setCursor(0, 1);
lcd.print("2- Ajustar Alarma");
if (digitalRead (boton1)==HIGH){
delay(50);
lcd.clear ();
Mostrar_Alarmas ();
}
if (digitalRead (boton2)==HIGH){
lcd.clear ();
delay(50);
sprintf(horaActual, "%02d:%02d:%02d", Choras,Cminutos, Csegundos);
lcd.setCursor(4, 1); // abajo a la izquierda
lcd.print(horaActual);
Ajustar_Alarmas ();
}
} while(digitalRead(boton4) != HIGH);
Menu_principal();
}
//--------------------------------------
void Mostrar_Alarmas (){
lcd.clear ();
do{
lcd.setCursor(0, 0);
lcd.print("Seleccionar Alarma");
lcd.setCursor(0, 1);
lcd.print("Alarma #:");
if (digitalRead (boton1)==HIGH){
estadoA=estadoA+1;
delay(50);
if (estadoA>20){
lcd.clear ();
estadoA=0;
}
}
if (digitalRead (boton2)==HIGH){
estadoA=estadoA-1;
delay(50);
if (estadoA<0){
lcd.clear ();
estadoA=20;
}
}
lcd.setCursor(9, 1);
lcd.print(estadoA);
if (digitalRead (boton3)==HIGH){
delay(100);
ver_alarma ();
}
} while(digitalRead(boton4) != HIGH);
delay(100);
Alarmas();
}
//---------------peso--------------------
do{
lcd.setCursor(0, 0);
lcd.print("Configurar peso");
if (digitalRead (boton1)==HIGH){
Apeso[estadoA]=Apeso[estadoA]+0.1;
delay(50);
if (Apeso[estadoA]>5){
lcd.clear ();
Apeso[estadoA]=0.5;
}
}
if (digitalRead (boton2)==HIGH){
Apeso[estadoA]=Apeso[estadoA]-0.1;
delay(50);
if (Apeso[estadoA]<0.5){
lcd.clear ();
Apeso[estadoA]=5;
}
}
lcd.setCursor(0, 1);
lcd.print("Peso:");
lcd.setCursor(6, 1);
lcd.print(Apeso[estadoA]);
lcd.print("Kg");
Acontime[estadoA]=Apeso[estadoA]*100 ;
} while(digitalRead(boton3) != HIGH);
estadoA=0;
delay(100);
Ajustar_Alarmas ();
}
void esperar_activacion(){
lcd.clear ();
do{
lcd.setCursor(0, 0);
lcd.print("Esperando alarma");
for (contador = 0; contador <=20; contador++){
lcd.setCursor(0, 1);
RTC.get(rtc,true);
resulhora=rtc[2]-Ahora[contador];
resulmin=rtc[1]-Amin[contador];
lcd.setCursor(4, 1);
sprintf(horaActual, "%02d:%02d:%02d",rtc[2],rtc[1],rtc[0]);
lcd.print(horaActual);
if (resulhora==0 & resulmin==0){
lcd.clear ();
Activar_servo ();
}
}
} while(digitalRead(boton4) != HIGH);
delay(100);
Menu_principal();
}
void Activar_servo (){
lcd.setCursor(0, 0);
lcd.print("Alarma on #:");
lcd.print(contador);
lcd.setCursor(0, 1);
lcd.print("Peso: ");
lcd.print(Apeso[contador]);
lcd.print("Kg");
for (int i = 0; i <=180; i += 1){
motor.attach(6) ;
motor.write(i);
delay(15);
}
motor.detach();
Llenado_de_plato ();
}
void Llenado_de_plato (){
digitalWrite(9, HIGH);
while(digitalRead(9)==HIGH){
scale.set_scale(calibration_factor);
Serial.print("Reading: ");
units = scale.get_units(), 10;
if (units < 0){
units = 0.00;
}
Serial.print(units);
Serial.print(" kg");
Serial.print(Apeso[contador]);
Serial.print(" kg");
Serial.println(" calibration_factor: ");
Serial.print(calibration_factor);
Serial.println();
delay(1000);
}
if(Serial.available()) {
char temp = Serial.read();
if(temp == '+' || temp == 'a')
calibration_factor += 1;
else if(temp == '-' || temp == 'z')
calibration_factor -= 1;
}
lcd.clear();
if ((units)>=(Apeso[contador])){
lcd.setCursor(0, 0);
lcd.print("Alimento servido");
lcd.setCursor(0, 1);
lcd.print("Peso: ");
lcd.print(Apeso[contador]);
lcd.print("Kg");
Desactivar_servo ();
}
}
void Desactivar_servo (){
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
for (int i = 180; i >=0; i -= 1){
motor.attach(6) ;
motor.write(i);
delay(15);
}
motor.detach();
esperar ();
}
void esperar (){
do{
lcd.setCursor(0, 0);
lcd.print("Reactivacion en :");
lcd.setCursor(2, 1);
RTC.get(rtc,true);
resulhora=rtc[2]-Ahora[contador];
resulmin=rtc[1]-Amin[contador];
conteo=60-rtc[0] ;
lcd.print(conteo);
lcd.print(" Segundos");
} while(resulhora==0 & resulmin==0);
lcd.clear();
esperar_activacion();
}
La activación del servo si ocurre, se pasa al void Llenado_de_plato. He modificado un poco el programa, ya que en la pantalla Serial no me detectaba ningún peso con "Masa", pero al poner "Apeso[contador]" aparece el peso que establecí, el problema sigue siendo el mismo, no me detecta que units sea mayor que "Apeso" y por lo tanto no entra al void Desactivar_servo.