Medidor de caixa da agua com sensor HC-SR04

Prezados gostaria da opinião de vcs em relação ao código q escrevi para essa funcionalidade, mas no entanto estou tento alguns problemas de aperfeiçoamento do código.

1- O sensor está, em alguns momentos, variando muito, dando erro de mais de 2%, as vezes até 10% de leitura, mas outras vezes ele funciona normalmente com erro tolerável.

2-A parte referente ao autobrilho (FADE) só funciona corretamente qual o comando “Serial.println(ledVal);” está ativado e se comunicando com o PC, se desabilitarmos e energizarmos essa função para de funcionar e o LED do display simplesmente acende ou apaga, perdendo o efeito do FADE.

3-Quando o BUZZER está ativo o som que foi programado anteriormente difere (som de ambulância) do atual, apresentando distorção.

Eu montei os códigos de cada parte do projeto individualmente ao final juntei todos e apresentou esses “erros”, tive que substituir os delays por millis para dar fluidez ao sistema e o “multitarefa”, pincipalmente no Auto-brilho(fade) e no buzzer, só q não sei como conserta o programa.

Segue a baixo o Sketch:

//SENSOR ULTRASONICO
#define trigPin1 10 // onde esta o pino
#define echoPin1 11 // onde esta o pino

float distance, duration, porcento;
int max_distanceLinha = 200;// distancia max em cm da linha dágua, lembrando o max é 400
int preSet = 10;// correcao da diferenca entre o sensor e a linha d'água em cm

const unsigned long eventSensor = 500; //intervalo de atualizacao do sensor, dura 49 dias em loop
unsigned long previousTimesensor = 0; //necessita de ter o seu proprio zero

//Filtro ULtrasonico
#define N 100 //N numeros q seram somados e divididos por N
int filtered;
int vals[N];

//LCD
#include <LiquidCrystal.h>   //incluindo biblioteca do display 

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //setando os pinos do display

//variaveis e pinos do auto brilho
#define ledlcdPin 9 //led do display
#define ldrPin1 A0 //ldr1
#define ldrPin2 A1 //ldr2
int ldrVal1, ldrVal2, currentldrM; //variavel ldr - leitura
int previousldrM = 0; // ldr comecando do zero
#define ldrVal 3// erro de leitura aceitavel do ldr e tb o start de inicializacao do for para o efeito fade
float sinVal; //variavel para armazenar o valor do seno
int ledVal; // variavel para armazenar a transformcao do seno em int

const unsigned long eventFade = 500;// tempo do fade
const unsigned long eventLdr = 2500; //intervalo de atualizacao do autobrilho
unsigned long previousTime = 0;

//Botao retencao e Led
#define ledPin 8
#define pinBotao 12
bool pinBotaoRetencao();

//Alarme
#define pinBuzzer 13
float sinVal2;
int toneVal;
const unsigned long eventBuzzer = 10;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  //setando pinos do auto brilho
  pinMode(ledlcdPin, OUTPUT);
  digitalWrite(ledlcdPin, HIGH);

  // escrevendo o texto
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(5, 0);
  lcd.print("Projeto");
  lcd.setCursor(2, 1);
  lcd.print("Felipe Ishii");
  delay(3000);
  lcd.clear();
  lcd.print("V_1: ");

  //Botao e Led
  pinMode(ledPin, OUTPUT);
  pinMode(pinBotao, INPUT);

  //Alarme
  pinMode(pinBuzzer, OUTPUT);

  //Sensor
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  unsigned long currentTime = millis();

  //esquema de autobrilho
  if (currentTime - previousTime >= eventLdr) {
    ldrVal1 = analogRead(ldrPin1);//leitura do ldr1
    ldrVal2 = analogRead(ldrPin2);
    currentldrM = (ldrVal1 + ldrVal2) / 2; //Media
    previousTime = currentTime;
  }
  //ascendendo em FADE
  if (currentldrM - previousldrM >= ldrVal) {
    for (int x = previousldrM; x < currentldrM; x++) {
      sinVal = (sin(x * (3.1416 / 180)));
      ledVal = int(sinVal * 255);
      //Serial.print("ledVal:");
      //Serial.println(ledVal);// tenho q exxecutar o ledVal gradativamente para o aanalogwirte funcionar corretamente
      analogWrite(ledlcdPin, ledVal);
      if (currentTime - previousTime >= eventFade) {
      }
      previousTime = currentTime;
    }
    previousldrM = currentldrM;
  }
  //apagando em FADE
  if (currentldrM - previousldrM <= -ldrVal) {
    for (int x = previousldrM; x > currentldrM; x--) {
      sinVal = (sin(x * (3.1416 / 180)));
      ledVal = int(sinVal * 255);
      //Serial.print("ledVal:");
      //Serial.println(ledVal);// tenho q exxecutar o ledVal gradativamente para o aanalogwirte funcionar corretamente
      analogWrite(ledlcdPin, ledVal);
      if (currentTime - previousTime >= eventFade) {
      }
      previousTime = currentTime;
    }
    previousldrM = currentldrM;
  }


  //SENOR ULTRASONICO
  if (currentTime - previousTimesensor >= eventSensor) {
    digitalWrite(trigPin1, LOW);
    delayMicroseconds(2);

    digitalWrite(trigPin1, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin1, LOW);

    duration = pulseIn(echoPin1, HIGH);//duracao do pulso

    previousTimesensor = currentTime;
  }
  //======================================================
  for (int i = N - 1; i > 0; i--) {                 /////// Filtro do pulso com 10 ultimos pulsos
    vals[i] = vals[i - 1];
  }
  vals[0] = duration;

  long sum = 0;
  for (int i = 0; i < N; i++) {
    sum = sum + vals[i];
  }
  filtered = sum / N;// pulso filtrado, media movel
  //======================================================
  distance = (filtered / 2) * 0.0343;//calculo distancia em cm

  porcento = 100 * (max_distanceLinha - (distance - preSet)) / max_distanceLinha;      ///porcentagem

  if (distance < preSet ) {
    lcd.setCursor(5, 0);
    lcd.print("100.00%");// nao ultrapassar 100%
  }
  if ((porcento >= 10) && (porcento < 100)) {
    lcd.setCursor(5, 0);
    lcd.print("0");
    lcd.print(porcento);
    lcd.print("%");
  }
  if ((porcento >= 0) && (porcento < 10)) {
    lcd.setCursor(5, 0);
    lcd.print("0");
    lcd.setCursor(6, 0);
    lcd.print("0");
    lcd.print(porcento);
    lcd.print("%");
  }
  Serial.print("Caixa_1: ");
  Serial.print(porcento);
  Serial.print("% ");
  Serial.print(distance);
  Serial.println("cm ");



  //Botao rentencao
  if (pinBotaoRetencao()) {                    // quando botao precionado(ligado led) ira armar o sistema
    digitalWrite(ledPin, HIGH);                //liga led e buzzer
    if (porcento >= 98) {
      for (int y = 0; y < 180; y++) {
        sinVal2 = (sin(y * (3.1416 / 180)));
        toneVal = 2000 + (int(sinVal2 * 1000));
        tone(pinBuzzer, toneVal);
        if (currentTime - previousTime >= eventBuzzer) {
        }
        previousTime = currentTime;
      }
    } else {
      noTone(pinBuzzer);
    }
  } else {
    digitalWrite(ledPin, LOW);//desliga led e buzzer
    noTone(pinBuzzer);
  }
}

bool pinBotaoRetencao() {
#define tempoDebounce 50 //(tempo para eliminar o efeito Bounce EM MILISEGUNDOS)

  bool estadoBotao;
  static bool estadoBotaoAnt;
  static bool estadoRet = true;
  static unsigned long delayBotao = 0;

  if ((millis() - delayBotao) > tempoDebounce) {
    estadoBotao = digitalRead(pinBotao);
    if (estadoBotao && (estadoBotao != estadoBotaoAnt)) {
      estadoRet = !estadoRet;
      delayBotao = millis();
    }
    estadoBotaoAnt = estadoBotao;
  }
  return estadoRet;
}

Ola,

quanto ao item 1, sugiro vc utilizar médias de coletas para considerar uma leitura.
quanto ao item 2 e 3, acredito que possa ser algo relacionado à como vc desenvolveu o código. Usar esta forma de desenvolvimento que não bloqueia o código é boa, mas ao mesmo tempo mais complexa e delicada. Qualquer linha de código que demore mais para acontecer, pode impactar em todo o código. No caso, você tem alguns “for loops” que pode estar causando estes problemas.