Cheguei num ponto onde estou tendo dificuldades para finalizar o meu código. Ele será usado da seguinte maneira: Será feito para contar a entrada e saída de abelhas de uma colmeia através passagem delas na frente de um sensor de luminosidade. Porém a questão é: ao passar pelo sensor ele conta várias vezes a depender do tempo que a "abelha" fica na frente dele, mas isso pensei em resolver com o debounce. A outra questão é que o estado não permanece após a passagem das abelhas pelo sensor e não cheguei numa solução para isso ainda. Ou seja, se eu passo no sensor de fora, o estado de entrada só fica ativo enquanto estou na frente do sensor e não logo após. Como vocês resolveriam isso?
#define sensorfora 6
#define sensordentro 7
#define tempo 100
int abelhasEntrando = 0;
int abelhasSaindo = 0;
bool sinalFora = digitalRead(sensorfora); // negativa ou não? (!!!!!)
bool sinalDentro = digitalRead(sensordentro);
// INCLUSÃO DE BIBLIOTECAS
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// DEFINIÇÕES
#define endereco 0x27 // Endereços comuns: 0x27, 0x3F
#define colunas 16
#define linhas 2
// INSTANCIANDO OBJETOS
LiquidCrystal_I2C lcd(endereco, colunas, linhas);
enum estado {
ABELHA_SAINDO,
ABELHA_ENTRANDO,
SEM_MOVIMENTO,
};
void setup() {
pinMode(sensorfora,INPUT);
pinMode(sensordentro,INPUT);
Serial.begin(9600);
iniciaVisor();
}
void loop() {
// Atualiza a leitura dos sensores
sinalFora = digitalRead(sensorfora);
sinalDentro = digitalRead(sensordentro);
switch (estado()) {
case SEM_MOVIMENTO:
Serial.println("sem movimento");
break;
case ABELHA_SAINDO:
Serial.println("abelhasSaindo");
if (sinalFora) { //&& !sinalDentro (vendo a possibilidade disso)
abelhasSaindo++;
Serial.println(abelhasSaindo);
lcd.setCursor(7, 1);
lcd.print(abelhasSaindo);
}
//delay(tempo);
break;
case ABELHA_ENTRANDO:
Serial.println("abelhasEntrando");
if (sinalDentro) { // && !sinalFora (vendo a possibilidade disso)
abelhasEntrando++;
Serial.println(abelhasEntrando);
lcd.setCursor(10, 0);
lcd.print(abelhasEntrando);
}
//delay(tempo);
break;
}
}
int estado() {
if (sinalFora) {
return ABELHA_ENTRANDO;
} else if (sinalDentro) {
return ABELHA_SAINDO;
} else {
return SEM_MOVIMENTO;
}
}
void iniciaVisor(){
lcd.init(); // INICIA A COMUNICAÇÃO COM O DISPLAY
lcd.backlight(); // LIGA A ILUMINAÇÃO DO DISPLAY
lcd.clear(); // LIMPA O DISPLAY
lcd.print("entrando: ");
lcd.setCursor(0, 1); // POSICIONA O CURSOR NA PRIMEIRA COLUNA DA LINHA 2
lcd.print("saindo: ");
}