Estoy tentado a darte la solución pero comprendo que el criterio de camerloco es hacerte pensar como hago yo también.
Tu for esta bien
[quote]
for (int contador=0; contador<5; contador++){
}
Yo te agregué una segunda llave que cierra lo que hace el for.
Dentro de esas dos llaves todo se repetirá 5 veces.
Ahora bien.
Ve agregando dentro lo que lee el sensor y piensa como lo harias en una hoja.
Tomarias la lectura 1, 2....5 las sumas y luego divides por 5 fuera del for para obtener el promedio.
Si tienes que sumar algo necesitas una variable para hacerlo.
Elige la variable de acuerdo a como será el resultado de lo que le introduzcas
a ver como resultan estos consejos.
paso a paso. Nadie nació sabiendo.
rawT=0.0; //Inicializamos a 0 antes del bucle for
for (int contador=0; contador<5; contador++){
rawT=float(analogRead(temperaturePin))+rawT;
}
voltageT=(rawT/5.0); //No dividas entre una variable de dentro del for, no funcionará. Usa un número directamente
Pruébalo. En el primer ciclo del bucle for, se suma el valor del analogRead+0, y en el resto de ciclos, se van sumando al total anterior.
Este tipo de promedio es lo que te da informacion de tu tendencia de temperatura y para un datalogger es lo que necesitas. Ya que debes registrar cada media hora, puedes hacerlo pero por lo menos cada minuto, no es necesario un segundo y dependiendo del sensor que uses tiene un tiempo de repuesta.
Ejemplo los DHT te entregan repuesta aprox cada dos segundos, y la variación entre ellas es insignificante en el caso de la temperatura ambiental.
Pero no hablo de ti carmeloco, hablo de jvasquez05 que primero hace un doble post porque estos hilos son semejantes. Además de preguntarlo en el foro en inglés también.
Y de nuevo comienza con el promedio para terminar en las 1800 muestras promediadas que tampoco juzgo.
Con 50 valores promedidados ya tienes algo estable y si no lo es tienes otro problema.
En el otro post hablaba de hacer o guardar datos... y veo que comienza una vez mas el tema ahora con 5, y supongo subirá a 1800 y luego a mas sensores y luego a guardarlos... un desperdicio de mensajes.
Este es un claro problema de un doble post. Hay distintas respuestas a un mismo problema. Yo no vi el otro post hasta haber respondido en este por primera vez, y continué mis respuestas aquí.
surbyte, ya sé que no te referías a mi en lo de las 1800 muestras.
A mi, ni me enfadas, ni me ofendes. Hechas las aclaraciones, vamos al tema. ¿Has probado el código que te puse? te lo vuelvo a poner para que no tengas que buscarlo en la página anterior.
rawT=0.0; //Inicializamos a 0 antes del bucle for
for (int contador=0; contador<5; contador++){
rawT=float(analogRead(temperaturePin))+rawT;
}
voltageT=(rawT/5.0); //No dividas entre una variable de dentro del for, no funcionará. Usa un número directamente
Puedes preguntar todo lo que quieras.
Tus preguntas no ofenden.
Violas las reglas haciendo dos post similares. MISMO TEMA. Promedio en Arduino o como lo quieras llamar.
el programa de promedio ya estaba hecho. A eso me refiero.
void loop()
{
if (millis()-Stime > 1000UL){// No se que obtengo con esto.
Stime=millis(); // Te toma un valor cada 1000 mseg y cuando millis - Stime son mayor que 1000 justamente toma el dato. Delay no es preciso y ademas detiene todo el programa. esto no.
rawT= 0; // rawT debe ser unsigned int no float
for (int contador=0; contador<5; contador++){
rawT+= analogRead(temperaturePin); // Calcula la suma de 5 valores de temperaturePin
}
total=(float) (rawT/5.0); // Aca si debo agregar (float)
voltageT=(total*0.004882814);// Con la lectura promedio anterior y esta ecuación obtengo los grados centígrados promedio de las lecturas.
degreesC=(voltageT-0.5)*100.0;
Serial.print(" total: ");
Serial.print(total); // aca ves la suma
Serial.print(" T= ");
Serial.print(voltageT);
Serial.print(" deg C: ");
Serial.println(degreesC); // Veo las lecturas en el monitor serial, pero realmente lo que me interesa ver es el valor promedio, pero de esta forma estoy vienod todos los datos, así que no me sirve.
// solo debías agregar la variable que te faltaba!!!
// PUEDES BORRAR TODO ESTO
//if (contador==5){// Se supone que cuando el contador cuenta 5 veces, comienza a contar, pero como algo de //lo de atrás está mal, esto no aporta nada.
// contador=0;
//delay (1000);//Según yo le doy un retardo de un minuto para estabilidad del código.
}
}
}
Recuenda que rawT debe ser unsigned int
Aclaro solo tome la parte del loop lo demas lo mantienes.
Si rawT es unsigned int, su valor máximo solo puede ser 65535. Si jvasquez05, finalmente hace un promedio de 1800 muestras, esto significa que el valor máximo que puede llegar a obtener rawT es:
rawT=1023*1800=1841400
Se nos sale del máximo de unsigned int, a no ser que utilicemos un due, que usa 32 bits y puede llegar a 4294967295.
Yo usé float, para evitar un cast en la división, pero es totalmente válido hacerlo como lo hace surbyte, si no se usan las 1800 muestras. Si usamos float, el máximo que puede usarse, es 3.4028235E+38, de forma que nos cabría el máximo de 1800 muestras.
Un apunte, para añadir más sensores, habría que hacerlo dentro del mismo bucle for.
Toda la parte de los millis y el contado fuera del for, no les veo utilidad. Quizá te lo debería explicar quien hizo esa parte (no sé si fué surbyte quien lo hizo).
Entiendo que, con guardar en la sd la variable promediada fuera del bucle for, es suficiente. Si usas 1800 muestras, deberías usar float. Según lo que hace el código ahora mismo, creo quepuedes quitar todo lo referente a millis.
Lo de millis, no está totalmente implementado, y no veo la forma de hacerlo dentro del for, de forma que quita lo de millis y pon un delay dentro del for (no me mates surbyte). Ya se que siempre se intenta evitar el delay, pero no veo gran problema a usarlo en este sketch.
Para mi delay se usa en programas simples y repetitivos.
Ahora cuando empezamos a sumar cosas que se deben hacer mientrassssssssssss se ejecuta delay ya sabemos que no podemos seguir usando delay.
En este caso no hay razón para no usarlo. Personalmente no me gusta su uso porque siempre surge la necesidad de hacer otra cosa y luego cambiarlo es mas complicado.
for (int contador=0; contador<30; contador++){
rawT+= analogRead(temperaturePin); // Calcula la suma de 5 valores de temperaturePin
delay (60000);
}
Se puede probar con un delay 59500, e ir probando, diferentes valores, para descontar los tiempos de procesamiento del resto del for, y hacerlo más preciso en el tiempo.