Proyecto de Cambio Automatico de Acuario con ultrasonidos.

Hola a todos y Buenas noches.
Estoy trabajando en un proyecto con arduino para vaciar y llenar un acuario.

Consta de los siguientes componentes:

  • Arduino Due
  • RTC DS3231
  • Placa de 8 rele
  • Electrovalvulas
  • Sensor de distancia ultrasonico
  • Pantalla 20x4 LCD i2c
  • Pantalla de 16x2 con keypad (shield de uno)

De momento ando con el inicio pero no me entra en loop, al cargarlo. Me explico, entra en setup y pero no llega a loop que hace llamadas a dos funciones. Os dejo el codigo, para ver si me podeis hechar una mano

Otra historia seria montar un menu el cual se moviera con el keypad. Me han recomendado phimenu pero no he conseguido nada, tambien he visto una libreria de maquina de estado que podria servir para ello.

El codigo solo consta de una presentación en las dos pantalla pero no entra en loop como os he dicho:
Aqui esta:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Ultrasonic.h>
#include <DS3231.h>
#include <LiquidCrystal.h> 

#define BUTTON_ADC_PIN           A0  // A0 is the button ADC input
#define LCD_BACKLIGHT_PIN         3  // D3 controls LCD backlight
//some example macros with friendly labels for LCD backlight/pin control, tested and can be swapped into the example code as you like
#define LCD_BACKLIGHT_OFF()     digitalWrite( LCD_BACKLIGHT_PIN, LOW )
#define LCD_BACKLIGHT_ON()      digitalWrite( LCD_BACKLIGHT_PIN, HIGH )
#define LCD_BACKLIGHT(state)    { if( state ){digitalWrite( LCD_BACKLIGHT_PIN, HIGH );}else{digitalWrite( LCD_BACKLIGHT_PIN, LOW );} }
/*--------------------------------------------------------------------------------------
  Variables
--------------------------------------------------------------------------------------
byte buttonJustPressed  = false;         //this will be true after a ReadButtons() call if triggered
byte buttonJustReleased = false;         //this will be true after a ReadButtons() call if triggered
byte buttonWas          = BUTTON_NONE;   //used by ReadButtons() for detection of button events
*/
LiquidCrystal_I2C lcdi2c(0x27,20,4);
DS3231  rtc(SDA1, SCL1); //RELOJ
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 );

//Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN)
Ultrasonic ultrasonic(11,12,3000); 
float LAct;

void setup(float LAct) {
  //Iniciamos el fondo retroiluminado
  lcdi2c.backlight();
  //Iniciamos la pantalla
  lcdi2c.init();
  rtc.begin();
  /* put your setup code here, to run once:
     pinMode( BUTTON_ADC_PIN, INPUT );         //ensure A0 is an input
   digitalWrite( BUTTON_ADC_PIN, LOW );      //ensure pullup is off on A0*/
   //lcd backlight control
   digitalWrite( LCD_BACKLIGHT_PIN, HIGH );  //backlight control pin D3 is high (on)
   pinMode( LCD_BACKLIGHT_PIN, OUTPUT );     //D3 is an output
   //set up the LCD number of columns and rows: 
   lcd.begin( 16, 2 );
     lcdi2c.print("Cambio automatico");//Escribimos en la primera linea
}

void loop(float Lact) {
  lcdi2c.clear();//Limpiamos la LCD
  calnivel(Lact);
  presentacion(Lact);
  // put your main code here, to run repeatedly:


}
void calnivel(float LAct){
  float LMax;
  int CmMax;
  int CmAct;
  LMax=150;
  CmMax=48;
  CmAct=48-ultrasonic.Ranging(CM);
  LAct=(CmAct*LMax)/CmMax;
  }
  
void presentacion(float LAct){
  int porcent;
  lcdi2c.clear();//Limpiamos la LCD
  lcdi2c.print("Cambio automatico de nivel");//Escribimos en la primera linea
  lcdi2c.setCursor(0,1);//Saltamos a la segunda linea
   lcdi2c.print("Fecha: ");
  lcdi2c.print(rtc.getDateStr());
   lcdi2c.setCursor(0,2);//Saltamos a la segunda linea
   lcdi2c.print("Hora: ");
  lcdi2c.print(rtc.getTimeStr());
  lcdi2c.setCursor(0,2);//Saltamos a la tercera linea
     lcdi2c.print(" Seleccione con boton ");
   
   lcd.setCursor(0,0);
   porcent = (LAct*100)/150;
   
   lcd.print("Nivel Actual: ");
   lcd.print(porcent);
    lcd.print("%");
     delay(500);

 }

Las funciones setup y loop no llevan parametros ,no se donde lo has visto.
void setup()
void loop()

y como paso las variables a las funciones si no le dejo parametros...

arkand2:
y como paso las variables a las funciones si no le dejo parametros...

Esas dos funciones son un poco especiales en arduino ,pero en las que tu definas lo puedes hacer perfectamente.

Saludos
Si declaraste LAct como global no necesitas estar pasandola entre funciones. Asi que eliminala de los argumentos.

Muchas gracias por todo ya va tirando.. Me hechais una mano con los menus? Alguna sugerencia???

Otra cosilla. Como refresco solo una parte de la pantalla???? La hora por ejemplo.

Saludos
Para refrescar una parte de la pantalla debes darle formato a tus datos y que siempre consuman la misma cantiadad de caracteres, asi usando lcd.setCursor(x,y); colocas el puntero de la pantalla donde comienza el dato y luego escribes.

Ejemplo la hora:
si tienes 1 y 25 min, tienes que colocar 01:25 usar 5 espacios para cuando tengas 10:12, entonces decides donde mostrar la hora en la pantalla. lcd.setCursor(1,10); lcd.print(hora); asi colocas siempre la hora en la parte inferior izquierda de una pantalla lcd 16x02

si si el problema esque me refresca toda la pantalla del tiron, yo quiero que solo refresque una parte cada segundo no que parpadee constante mente.

Has una rutina de tiempo con millis

Revisa el ejemplo blink without delay

solucionado muchas gracias

Coloca [SOLUCIONADO] en el titulo