
Funciones de arduino no andan.
Publicado por Vladimir (1 intervención) el 16/08/2022 02:32:52
Buenas a todos. Espero alguien me pueda ayudar con este código ya que me vuelve loco.
el problema es el siguiente: quiero crear una función ( llamada voltímetro) y resulta que no me funciona. me parece que el problema viene porque la función que quiero crear cuenta con "Millis" pero no se como resolverlo.
probé con Float voltímetro, int voltímetro y con VOID voltímetro y de ninguna forma funciona.
compila bien, sin ningún error pero no funciona. Cabe aclarar que el código si lo hago en el void loop funciona perfectamente.
les dejo el código y ojala me puedan dar una mano. saludos a todos.
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
#include <Filters.h> //Biblioteca fácil para hacer los cálculos
#include <SPI.h> //Bibliotecas para la pantalla OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Ancho de pantalla OLED, en píxeles
#define SCREEN_HEIGHT 32 // Altura de la pantalla OLED, en píxeles
#define OLED_RESET -1 //
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaración del nombre para mostrar (display)
float testFrequency = 50; //frecuencia de la señal de prueba (Hz)
float windowLength = 40.0/testFrequency; // cuánto tiempo promediar la señal, para estadístico
int Sensor = 0; //Entrada analógica del sensor, aquí está A0
float intercept = -0.04; // para ser ajustado en base a las pruebas de calibración
float slope = 0.0405; // para ser ajustado en base a las pruebas de calibración
float current_Volts; // Voltaje
unsigned long printPeriod = 1000; //Frecuencia de actualización
unsigned long previousMillis = 0;
float amperimetro;
float potencia;
float amperaje;
float voltaje;
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Inicie la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(1,1);
display.print("Tecno industrial");
display.setCursor(1,20);
display.setTextSize(1);
display.print("AC vatimetro");
display.display();
delay(2000);
}
void loop() {
float voltaje = voltimetro();
display.clearDisplay();
display.setTextSize(4); //tamaño del texto que seguirá
display.setTextColor(WHITE); //su color
display.setCursor(1,1); //posición desde la que quieres empezar a escribir
display.print(voltaje,1);
display.setCursor(115,00);
display.setTextSize(2);
display.print("V");
display.setCursor(115,15);
display.setTextSize(1);
display.print("AC");
display.display();
}
float voltimetro() {
RunningStatistics inputStats; //Líneas de vida fáciles, el cálculo real del RMS requiere una gran cantidad de codificación
inputStats.setWindowSecs( windowLength );
while( true ) {
Sensor = analogRead(A0); // leer el análogo en valor
inputStats.input(Sensor); // iniciar sesión en la función de estadísticas
if((unsigned long)(millis() - previousMillis) >= printPeriod) {
previousMillis = millis(); // tiempo de actualización cada segundo
Serial.print( "\n" );
current_Volts = intercept + slope * inputStats.sigma(); //Calibraciones para compensación y amplitud
current_Volts= current_Volts*(40.3231); //Otras calibraciones para la amplitud
Serial.print( "\tVoltage: " );
Serial.print( current_Volts ); //El cálculo y la visualización del valor están hechos, el resto es si está utilizando una pantalla OLED
return current_Volts;
}
}
}
el problema es el siguiente: quiero crear una función ( llamada voltímetro) y resulta que no me funciona. me parece que el problema viene porque la función que quiero crear cuenta con "Millis" pero no se como resolverlo.
probé con Float voltímetro, int voltímetro y con VOID voltímetro y de ninguna forma funciona.
compila bien, sin ningún error pero no funciona. Cabe aclarar que el código si lo hago en el void loop funciona perfectamente.
les dejo el código y ojala me puedan dar una mano. saludos a todos.
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
#include <Filters.h> //Biblioteca fácil para hacer los cálculos
#include <SPI.h> //Bibliotecas para la pantalla OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Ancho de pantalla OLED, en píxeles
#define SCREEN_HEIGHT 32 // Altura de la pantalla OLED, en píxeles
#define OLED_RESET -1 //
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaración del nombre para mostrar (display)
float testFrequency = 50; //frecuencia de la señal de prueba (Hz)
float windowLength = 40.0/testFrequency; // cuánto tiempo promediar la señal, para estadístico
int Sensor = 0; //Entrada analógica del sensor, aquí está A0
float intercept = -0.04; // para ser ajustado en base a las pruebas de calibración
float slope = 0.0405; // para ser ajustado en base a las pruebas de calibración
float current_Volts; // Voltaje
unsigned long printPeriod = 1000; //Frecuencia de actualización
unsigned long previousMillis = 0;
float amperimetro;
float potencia;
float amperaje;
float voltaje;
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Inicie la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(1,1);
display.print("Tecno industrial");
display.setCursor(1,20);
display.setTextSize(1);
display.print("AC vatimetro");
display.display();
delay(2000);
}
void loop() {
float voltaje = voltimetro();
display.clearDisplay();
display.setTextSize(4); //tamaño del texto que seguirá
display.setTextColor(WHITE); //su color
display.setCursor(1,1); //posición desde la que quieres empezar a escribir
display.print(voltaje,1);
display.setCursor(115,00);
display.setTextSize(2);
display.print("V");
display.setCursor(115,15);
display.setTextSize(1);
display.print("AC");
display.display();
}
float voltimetro() {
RunningStatistics inputStats; //Líneas de vida fáciles, el cálculo real del RMS requiere una gran cantidad de codificación
inputStats.setWindowSecs( windowLength );
while( true ) {
Sensor = analogRead(A0); // leer el análogo en valor
inputStats.input(Sensor); // iniciar sesión en la función de estadísticas
if((unsigned long)(millis() - previousMillis) >= printPeriod) {
previousMillis = millis(); // tiempo de actualización cada segundo
Serial.print( "\n" );
current_Volts = intercept + slope * inputStats.sigma(); //Calibraciones para compensación y amplitud
current_Volts= current_Volts*(40.3231); //Otras calibraciones para la amplitud
Serial.print( "\tVoltage: " );
Serial.print( current_Volts ); //El cálculo y la visualización del valor están hechos, el resto es si está utilizando una pantalla OLED
return current_Volts;
}
}
}
Valora esta pregunta


0