/* lixeira automatizada utilizando sensor ultrasonico e um servo
ao se aproximar a lixeira abre sozinha, ao se afastar ela se fecha,
mostando o angulo de abertura no LCD
Lucas Milani 631M1
*/
// inclusão de bibliotecas
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
Servo abaLixo;
#define servoPin 6
#define pinoTrigger 2 // Pino usado para disparar os pulsos do sensor
#define pinoEcho 3 // pino usado para ler a saida do sensor
LiquidCrystal_I2C lcd(0x27, 16, 2); // Criando um LCD de 16x2 no endereço I2C 0x27 PCF8574T
long tempoAtualSensor = 0;
long tempoAnteriorSensor = 0;
long intervaloSensor = 60;
int distancia; //variavel para leitura de distancia
int graus; //variavel para controle de abertura da tampa da lixeira
float tempoEcho = 0;
const float VelocidadeSom_mpors = 340; // em metros por segundo
const float VelocidadeSom_mporus = 0.000340; // em metros por microsegundo
void setup() {
pinMode(pinoTrigger, OUTPUT);
digitalWrite(pinoTrigger, LOW);
pinMode(pinoEcho, INPUT);
abaLixo.attach(servoPin);
abaLixo.write(0); // Inicia servomotor na posição zero
lcd.init(); // Inicializando o LCD
lcd.backlight(); // Ligando o BackLight do LCD
}
void loop () {
leituraSensor();
}
void leituraSensor() {
tempoAtualSensor = millis();
if (tempoAtualSensor - tempoAnteriorSensor > intervaloSensor) {
tempoAnteriorSensor = tempoAtualSensor;
disparaPulsoUltrassonico();
tempoEcho = pulseIn(pinoEcho, HIGH);
distancia = calculaDistancia(tempoEcho) * 100; //le o sensor de ultrassom
if (distancia < 200) {
graus = map(distancia, 10, 200, 90, 0); // mapeia a abertura da tampa da lixeira
abaLixo.write(graus);
lcd.setCursor(0, 0); // posiciona o cursor
lcd.print("Lixeira Abera Em"); // escreve;
lcd.setCursor(3, 1); // posiciona o cursor
lcd.print(graus); // escreve;
lcd.print(" GRAUS"); // escreve;
}
else {
abaLixo.write(0);
lcd.setCursor(0, 0); // posiciona o cursor
lcd.print(" Lixeira Fechada "); // escreve;
lcd.setCursor(0, 1); // posiciona o cursor
lcd.print(" "); // escreve;
}
}
}
void disparaPulsoUltrassonico() {
// Para fazer o HC-SR04 enviar um pulso ultrassonico, nos temos
// que enviar para o pino de trigger um sinal de nivel alto
// com pelo menos 10us de duraçao
digitalWrite(pinoTrigger, HIGH);
delayMicroseconds(10);
digitalWrite(pinoTrigger, LOW);
}
// Função para calcular a distancia em metros
float calculaDistancia (float tempo_us) {
return ((tempo_us * VelocidadeSom_mporus) / 2);
}