/******************************************************************************* * * 106 - Métodos de filtros digitais - Média móvel * Autor: Angelo Luis Ferreira * 20/11/2022 * http://squids.com.br/arduino * *******************************************************************************/ #include // biblioteca para comunicação I2C #include // biblioteca para sensor BH1750 #include // biblioteca para o display LCD I2C // variáveis globais float lux; // variável para a leitura real do sensor unsigned long anterior = 0; // variável para o temporizador // criar instâncias (bibliotecas) BH1750 sensor; // cria a instancia sensor LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); // cria a instância lcd void setup() { // inicializações Serial.begin(9600); // inicializa a comunicação serial sensor.begin(); // incializa o sensor BH1750 lcd.begin(16,2); // inicializa o lcd 16X2 com I2C } void loop() { // le os valores do sensor de lux lux = sensor.readLightLevel(); // faz a leitura direta do sensor analógico para digital float luxFiltered = filterMediaMovel(lux); // filtra valor lido pelo método filtro média móvel (função) showLux(luxFiltered); // exibe valor filtrado no lcd (função) showReadsFilters(luxFiltered); // exibe valores no plotter serial (função) delay(100); // delay 100ms } void showLux(float luxMedia) { // verifica o tempo atual (temporizador) unsigned long atual = millis(); // mostra as informacoes no LCD a cada 200ms if(atual - anterior > 200) { lcd.setCursor(0, 0); lcd.print(" Ilum. Ambiente"); lcd.setCursor(0, 1); lcd.print("Lumin.: lux"); lcd.setCursor(8, 1); lcd.print(luxMedia,1); //imprime valor filtrado no lcd com uma casa decimal anterior = atual; // atualiza temporizador } } void showReadsFilters(float luxMedia) { // Mostra o valor real Serial.print(lux,1); // imprime valor real com uma casa decimal Serial.print(" "); // Mostra valor filtro média móvel Serial.print(luxMedia,1); // imprime valor médio (filrado) com uma casa decimal - média móvel Serial.println(" "); } // FUNÇÃO FILTRO - MÉTODO MÉDIA MÓVEL float filterMediaMovel(float xis) { static float media = 0.0; static int indice = 1; if (indice == 0 || indice == 100) { indice = 1; media = 0.0; } media = media + (xis - media) / indice++; return media; }