Go Down

Topic: Calculo de média - Dúvida (Read 538 times) previous topic - next topic

angesan50

Fala Arduiners,

Estou com uma dúvida na lógica do meu código, estou com um sensor, um rtc e um sd card.
É possível fazer com que, por exemplo:
* O Arduíno leia a entrada analógica e calcule a média com leitura anterior
* E sempre a cada 15 min (quando o minuto do rtc marcar 15, 30, 45 ou 00) ele grava esse dado no cartão SD

Não sei como fazer essa lógica da média, alguém pode me ajudar??

luisilva

Sim é possível fazer, no entanto, penso que nem tudo está explicado.
Quando são feitas as leituras? apenas nos minutos 0, 15, 30 e 45? Ou existem mais instantes em que são feitas leituras?
Em relação à média, se é necessária a leitura anterior para calcular esta média, ela tem que estar guardada na memória, então deia ser feita uma coisa do género:

Code: [Select]

int leitura_atual=0;       // para guardar a leitura atual
int leitura_anterior=0; // para guardar a leitura anterior
int leitura_media=0;     // para guardar a média das 2 leituras
int num_leitura;             // para no início (quando não haja nada na leitura anterior não fazer média com zero
int realizar_leitura=0;    // flag ativada, por exemplo quando o RTC tem o minuto 0, 15, 30 ou 45

void setup() {
// inicializações necessárias
}

void loop() {
// restante código necessário para o funcionamento do programa
// nomeadamente ativação da flag realizar_leitura

   if (realizar_leitura == 1)  {
      // linha que realiza a leitura e guarda valor em leitura_atual
      if (num_leitura >= 1) {
         leitura_media = (leitura_atual + leitura_anterior) / 2;
         // guarda resultado no cartão SD
      }
      num_leitura = 1;
      leitura_anterior = leitura_atual;
   }
}


Não sei se isto ajuda.

Cumprimentos.

FernandoGarcia

Olá!

Se você não quiser um horário específico o RTC é desnecessário.

Se você fizer algo deste tipo vai ter problemas pois, a gravação será executada várias vezes durante o minuto.

Code: [Select]
if((minuto == 0) || (minuto == 15) || (minuto == 30) || (minuto == 45))
{
      // Executa a gravação
}


A melhor opção é usar o millis() desta maneira:

Code: [Select]

if((millis() - millis_antes) > 900000)
{
   // Executa a gravação
    millis_antes = millis();
}


Abraço.

Fernando Garcia

bubulindo

Code: [Select]


if (minuto%15 == 0 && lock == 0) {
lock = 1;
dado = analogRead();
dado+=analogRead();
dado = dado/2;
}
if (minuto%15 != 0) lock = 0;

Nao faz sentido fazer uma media com um espaco de 15 minutos entre leituras.
This... is a hobby.

Go Up