Sketch que compila en Arduino pero en UnoArduSim no

Hola.
Tengo un programa sacado de (https://naylampmechatronics.com/blog/48_tutorial-sensor-de-corriente-acs712.html) que al cargar en UnoArduSim dice Error Analizar: un módulo funcional debe de tener una declaración 'return'. y marca el corchete de cierre de loop(). Sé que algo tienen que ver las lineas 34 y 35 que mencionan get_corriente(), pero a partir de ahí ya no sé que pueda pasar, está fuera de mis conocimientos.
Me interesa el programa para depurarlo y adaptarlo a mis necesidades. A lo mejor a otros también les pueda aportar conocimiento. Saludos y gracias.


#include <Adafruit_LiquidCrystal.h>
Adafruit_LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

float Sensibilidadcc = 0.190;     // Modelo 5A [A/A]
float Sensibilidadca = 0.055;     
int NumMuestras = 200;           
const int PulsadorPin = 2;
int Pulsador = 0;
float corriente;
float corrienteRMS;
float potencia;
float corrienteSuma = 0;
float voltaje = 0;

void setup() 
{
	Serial.begin(9600);             
	lcd.begin(16, 2);
	pinMode(PulsadorPin, INPUT);
}

void MostrarMedicion(String magnitud, float valor, String unidad)
{
	Serial.print(magnitud);
	Serial.print(valor, 3);
	Serial.println(unidad);
}

void loop() {
	if (Pulsador == HIGH)                             //pulsador
	{ 
		Serial.print("Corriente Alterna ,");   
		float get_corriente();
		corriente = get_corriente ();               //obtenemos la corriente pico
		corrienteRMS = corriente * 0.707;           //Intensidad RMS = Ipico/(2A1/2)
		potencia = corrienteRMS * 223.2;      // P=IV watts
		MostrarMedicion("Intensidad: ", corriente, "A ,");
		MostrarMedicion("Irms: ", corrienteRMS, "A ,");
		MostrarMedicion("Potencia: ", potencia, "W");
	}

	if ( (corriente < 0.100) && (corriente > -0.100) )
	{
		lcd.clear();
		lcd.setCursor(2, 0);
		lcd.print("Sin lectura");
		lcd.setCursor(6, 1);
		lcd.print("CA");
		delay(1000);
	}
	else
	{
		lcd.clear();
		lcd.setCursor(0, 0);
		lcd.print("Irms= ");
		lcd.print(corrienteRMS, 3);
		lcd.print(" A");
		lcd.setCursor(14, 0);
		lcd.print("CA");
		lcd.setCursor(0, 1);
		lcd.print("Prma= ");
		lcd.print(potencia, 3);
		lcd.print(" W");
		delay(1000);
	}
}

float get_corriente()                                           
{
	float voltaje;
	float promedio;
	float corriente = 0;
	long tiempo = millis();
	float Imax = 0;
	float Imin = 0;
	while (millis() - tiempo < 500) //realizamos mediciones durante 0.5 segundos
	{
		voltaje = analogRead(A0) * (5.0 / 1023.0);//lectura del sensor
		corriente = 0.9 * corriente + 0.1 * ((voltaje - 2.4955) / Sensibilidadca); //EcuaciOn para obtener la corriente
		if (corriente > Imax)Imax = corriente;
		if (corriente < Imin)Imin = corriente;
	}
	return ((Imax - Imin) / 2);  // put your main code here, to run repeatedly:

}
Serial.print("Corriente Alterna ,");   
float get_corriente();  // <-- esta linea no va 
corriente = get_corriente ();

Ten presente que UnoArduSim es muy limitado, te recomiendo Wokwi.com (obviamente es online).

Saludos

Hola. gatul gracias por responder. Para lo que preciso y mis conocimientos UnoArduSim es mas que suficiente , lo tiene todo y por otro lado lo que mencionas de Wokwi.com lo he visto muy árido.
De todas formas mi pregunta iba sobre la construcción del sketch, saber por que no da por buenas esas dos líneas. El programa en sí no funciona del todo bien pero como me interesa trataré de arreglarlo de alguna forma. Saludos.
JoseV

Ya te marqué que hay una línea que no va, está de más. Eso provoca el error

Saludos

Esta claro que en la forma de expresar el error hay una limitacón del UnoArduSim.

@jjosev La línea en cuestión "da a entender" al precompilador que vas a declarar una función (lo que no se puede hacer en medio de otra, como lo es loop() ) entonces el precompilador de UnoArduSim, porque es limitado, en lugar de marcarte éste error que es más importante (o sea que no puedes declarar una función dentro de otra) se limita a decirte que a la declaración le falta el return (porque cualquier función que no se declare void debe retornar un valor).

¿Esto es lo que querías saber?

Saludos

Hola. Gracias a los dos. Traté de arreglar eso y el ide de Arduino arrojó mas errores así que el proyecto por ese camino lo abandono. Algo habré aprendido. Saludos
JoseV

Porqué lo abandonas? No entiendo.

Hola Surbyte. Son Programas que he sacado de publicaciones en la Red. He elegido los que a mi entender me parecen mas completos.
Suelen tener errores y algunos hay que copiar las fotos, tranformarlas a pdf y aplicar un OCR y a ver que sale.
No me importa porque de los errores aprendo buscando la solución y así tengo activasmis pocas neuronas que me quedan.
Es para el watímetro con ACS712 del que hay varias versiones. Estoy progresando con otro que parece mas completo.
Gracias por tu interés. Saludos a todos.
JoseV

@jjosev Pruébalo así

#include <Adafruit_LiquidCrystal.h>
Adafruit_LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

float Sensibilidadcc = 0.190;     // Modelo 5A [A/A]
float Sensibilidadca = 0.055;     
int NumMuestras = 200;           
const int PulsadorPin = 2;
int Pulsador = 0;
float corriente;
float corrienteRMS;
float potencia;
float corrienteSuma = 0;
float voltaje = 0;

void setup() 
{
	Serial.begin(9600);             
	lcd.begin(16, 2);
	pinMode(PulsadorPin, INPUT);
}

void MostrarMedicion(String magnitud, float valor, String unidad)
{
	Serial.print(magnitud);
	Serial.print(valor, 3);
	Serial.println(unidad);
}

void loop() {
	if (Pulsador == HIGH)                             //pulsador
	{ 
		Serial.print("Corriente Alterna ,");   
		corriente = get_corriente ();               //obtenemos la corriente pico
		corrienteRMS = corriente * 0.707;           //Intensidad RMS = Ipico/(2A1/2)
		potencia = corrienteRMS * 223.2;      // P=IV watts
		MostrarMedicion("Intensidad: ", corriente, "A ,");
		MostrarMedicion("Irms: ", corrienteRMS, "A ,");
		MostrarMedicion("Potencia: ", potencia, "W");
	}

	if ( (corriente < 0.100) && (corriente > -0.100) )
	{
		lcd.clear();
		lcd.setCursor(2, 0);
		lcd.print("Sin lectura");
		lcd.setCursor(6, 1);
		lcd.print("CA");
		delay(1000);
	}
	else
	{
		lcd.clear();
		lcd.setCursor(0, 0);
		lcd.print("Irms= ");
		lcd.print(corrienteRMS, 3);
		lcd.print(" A");
		lcd.setCursor(14, 0);
		lcd.print("CA");
		lcd.setCursor(0, 1);
		lcd.print("Prma= ");
		lcd.print(potencia, 3);
		lcd.print(" W");
		delay(1000);
	}
}

float get_corriente()                                           
{
	float promedio;
	corriente = 0;
	long tiempo = millis();
	float Imax = 0;
	float Imin = 0;
	while (millis() - tiempo < 500) //realizamos mediciones durante 0.5 segundos
	{
		voltaje = analogRead(A0) * (5.0 / 1023.0);//lectura del sensor
		corriente = 0.9 * corriente + 0.1 * ((voltaje - 2.4955) / Sensibilidadca); //EcuaciOn para obtener la corriente
		if (corriente > Imax)Imax = corriente;
		if (corriente < Imin)Imin = corriente;
	}
	return ((Imax - Imin) / 2);  // put your main code here, to run repeatedly:

}

Eliminé la línea que estaba mal y corregí un par de redefiniciones de variables (que tampoco eran correctas) y ahora corre sin problemas.
Mira

Saludos y no te desmoralices!

Hola. Gracias por el interés. con la información que ya tengo haré una síntesis de todo y al final terminaré este proyecto. Saludos
JoseV

What!!!! te tomas toda esa tarea en lugar de simplemente transcribirlo y de paso aprendes?

Esto esta mal

float get_corriente();

o pones una variable antes o no tiene sentido.
Esto si, pero corregido. porque la versión de tu post es errónea.

   float corriente = get_corriente (); 

EDITO: Ya lo había indicado @anon90500195 asi que es redundante.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.