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;
}