Hola comunidad, estuve leyendo acerca sobre la frecuencia de muestreo, encontré justo lo que necesitaba en un post de Luis Llamas, lo implementé con un sensor de temperatura solo para probarlo, el codigo que diseñé es este:
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire ourWire(2); //Se establece el pin 2 como bus OneWire
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
void setup() {
float measureT = MeasureT(100, temp);
delay(1000);
Serial.begin(9600);
sensors.begin(); //Se inicia el sensor
}
void loop() {
sensors.requestTemperatures(); //Se envía el comando para leer la temperatura
float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
Serial.print("Temperatura= ");
Serial.print(temp);
Serial.println(" C");
delay(100);
}
float MeasureT(int msInterval, float(*funct)())
{
float sum;
long startTime = millis();
int samplesNumber = 0;
while (millis() - startTime < msInterval)
{
samplesNumber++;
sum += temp();
}
return sum / samplesNumber;
}
//Funcion que simula la medicion de un sensor
float temp()
{
return 0.0;
}
creo que no comprendí bien, porque no veo ningún cambio en el monitor serie, entiendo que el valor que debo hacer variar se encuentra en esta línea de código:
float measureT = MeasureT(100, temp);
cambio de 100 a 200, y 500 y no hay variación en los resultados, ¿estoy interpretando incorrectamente el código?, por ejemplo, si quiero que me tome las mediciones de temperatura cada 1 segundo, haga una media aritmética de los valores recogidos por el sensor dentro de ese segundo y luego los muestre, de eso trata la sección " ADQUISICIÓN EN TIEMPO CONSTANTE" en el post que linkee más arriba (este)?
Creo mas bien que devuelve constamtemente el valor de la temperatura que da el sensor. @and_jc Observa que tu loop no llamas ala funcion de frecuencia de muestreos , solo llamas al sensor con las dos primeras lineas y el te devuelve directamente la temperatura:
sensors.requestTemperatures(); //Se envía el comando para leer la temperatura
float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
estas dos lineas has de incluirlas en la funcion de simulacion que quedaria :
//Funcion que hace una medicion
float temp(){
sensors.requestTemperatures(); //Se envía el comando para leer la temperatura
float temp = sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
return temp;
}
y sustituirlas en el loop por la llamada a la rutina de muestreo.
Saludos.
Muchas gracias por tu orientación, cambié mi codigo según tus consejos, pero ahora no sé porque me sale el error "'temp' was not declared in this scope" y ya está declarado en las líneas precedentes según yo, me quedó asi:
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire ourWire(2); //Se establece el pin 2 como bus OneWire
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
void setup() {
float measureT = MeasureT(100, temp);
delay(1000);
Serial.begin(9600);
sensors.begin(); //Se inicia el sensor
}
void loop() {
//Funcion que simula la medicion de un sensor
float temp()
{ sensors.requestTemperatures(); //Se envía el comando para leer la temperatura
float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
return temp;
}
Serial.print("Temperatura= ");
Serial.print(temp);
Serial.println(" C");
delay(100);
}
float MeasureT(int msInterval, float(*funct)())
{
float sum=0;
long startTime = millis();
int samplesNumber = 0;
while (millis() - startTime < msInterval)
{
samplesNumber++;
sum += temp();
}
return sum / samplesNumber;
}
En realidad, no me manejo mucho en programación con Arduino, lo que quiero hacer es unir el código de medición de temperatura, este:
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire ourWire(2); //Se establece el pin 2 como bus OneWire
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
void setup() {
float measureT = MeasureT(10,temp);
delay(1000);
Serial.begin(9600);
sensors.begin(); //Se inicia el sensor
}
void loop() {
sensors.requestTemperatures(); //Se envía el comando para leer la temperatura
float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
Serial.print("Temperatura= ");
Serial.print(temp);
Serial.println(" C");
delay(100);
}
float MeasureT(int msInterval, float(*funct)())
{
float sum;
long startTime = millis();
int samplesNumber = 0;
while (millis() - startTime < msInterval)
{
samplesNumber++;
sum += temp();
}
return sum / samplesNumber;
}
//Funcion que simula la medicion de un sensor
float temp()
{ sensors.requestTemperatures(); //Se envía el comando para leer la temperatura
float temp = sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
return temp;
}
con el codigo de Luis Llamas, que es este:
float MeasureT(int msInterval, float(*funct)())
{
float sum;
long startTime = millis();
int samplesNumber = 0;
while (millis() - startTime < msInterval)
{
samplesNumber++;
sum += getMeasure();
}
return sum / samplesNumber;
}
//Funcion que simula la medicion de un sensor
float getMeasure()
{
return 0.0;
}
void setup()
{
float measureT = MeasureT(50, getMeasure);
}
void loop()
{
}
Lo que quiero es una medida por seguno o cada dos segundos pero que el codigo haga un promedio de los valores recibidos por el sensor, tal como lo dice Luis Llamas en su blog: