Como sumar y acumular la suma de una variable?

Buen día

Necesito saber como escribir un comando que me sume una variable y la acumule hasta que se cumpla el criterio de sumar 5 veces la variable medida.

Por ejemplo:

Tengo un sensor de temperatura que me da un dato por segundo, y deseo calcular el promedio cada 5 datos, y mostrarlo en el monitor serial.

Muchas gracias

Bucle FOR:

http://arduino.cc/en/Reference/For

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.

pero eso ya te lo hice.
Esta en el otro post, porque repites el mismo tema?

Lo que necesitas es algo así:

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.

carmeloco

que diferencia hay en

   rawT= analogRead(temperaturePin)+rawT;
   //y entre
   rawT+= analogRead(temperaturePin);

Es lo mismo?

Cual es el sentido de poner dos veces lo mismo?
Otra vez hablas de promediar 1800 valores cuando ya te lo había resuelto en Cálculo de valores

Porque de nuevo?

max_saeta Sí, es lo mismo, lo que pasa es que yo elijo la primera forma por hacerlo más visual.

http://arduino.cc/en/Reference/IncrementCompound

Ojo, que edité mi post anterior, ya que había un posible error de cast por usar el analogRead sin ser float, en una suma con una variable float.

A mi, también me parece una barbaridad hacer un promedio de 1800 mediciones, pero cada cual tendrá sus motivos.

Yo creo que jvasquez05 lo que necesita es estudiar un poco mas el promedio móvil, este creo es el que mas se aplica para lo que el necesita.

Ejemplo de promedio movil simple.

Otro ejemplo en youtube.

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.

Parece que va en círculos.

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.

Dicho esto, no hablo mas. Suerte!!

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).

Solo sugerí unsigned int porque habla de 5 valores.
Si miras el otro post verás justamente ese análisis

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.

Pues sería algo así:

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.

Recuerda dividir el total por 30.