#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // display LCD 16x2 I2C
const int trigPin = 10; // fio castanho
const int echoPin = 11; // fio azul
void setup() {
pinMode(12, INPUT_PULLUP); // fim de curso "preto", recuo
pinMode(13, INPUT_PULLUP); // fim de curso "cinzento", avanço
pinMode(2, OUTPUT); // leds vermelhos avançam cilindro
pinMode(3, OUTPUT); // leds verdes recuam cilindro
pinMode(8, INPUT_PULLUP); /* entrada com resistencia pullup, para botao de pressão de inicio
do programa, a outra extrimade do botao liga ao GND */
pinMode(7, INPUT_PULLUP); /* entrada com resistencia pullup, para botao de pressão de inicio
do programa ultrasons, a outra extrimade do botao liga ao GND */
pinMode(19, OUTPUT); /* saida que indica distancia menor
100cm */
Serial.begin(38400);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.init();
lcd.clear();
imprime( "Introduza a Lata!" );
}
void loop() {
cilindro(); // chama a função cilindro que esmaga as latas
DetetaObjectos(trigPin, echoPin); /* chama a funçao que deteta distancia de objectos
por ultrasons */
}
void cilindro_old()
{
bool inicio=1;
inicio=digitalRead(8); // le estado do botao de inicio
if (inicio<1) // inicio é a variavel do estado do botao inicio
{
// avança cilindro durante 20 Segundos;
digitalWrite(2, HIGH); // activa a saida dos leds vermelhos
delay(20000); // 20 segundos
digitalWrite(2, LOW); // desactiva a saida dos leds vermelhos
// espera 5 segundos antes de recuar
delay(5000); // 5 segundos
//recua cilindro durante 20 Segundos;
digitalWrite(3, HIGH); // activa a saida dos leds verdes
delay(20000); // 20 segundos
digitalWrite(3, LOW); // desactiva a saida dos leds verdes
}
}
void cilindro()
{
bool inicio=1;
inicio=digitalRead(8); // le estado do botao de inicio
bool fim_avanco=1; // le estado do fim do avanço
bool fim_recuo=1; // le estado do fim do recuo
// int time= millis();
if (inicio<1) // inicio é a variavel do estado do botao inicio
{
// avança cilindro durante 20 Segundos;
imprime(" em avanco..");
for (int i = 0; i <= 199; i++) {
fim_avanco=digitalRead(13);
if (fim_avanco<1) { i=200; imprime("alerta fim de avanco"); }
else{ digitalWrite(2, HIGH); // avança cilindro (liga a saida dos leds vermelhos)
delay(100); // 20 segundos
}
}
digitalWrite(2, LOW); // desactiva a saida dos leds vermelhos
// espera 2 segundos antes de recuar
delay(2000); // 2 segundos
//recua cilindro durante 20 Segundos;
imprime(" em recuo..");
for (int R = 0; R <= 199; R++) {
fim_recuo=digitalRead(12);
if (fim_recuo<1) { R=200; imprime("alerta fim de recuo"); }
else{ digitalWrite(3, HIGH); //recua cilindro (liga a saida dos leds verdes)
//Serial.print(" em recuo..");
delay(100); // 20 segundos
}
}
digitalWrite(3, LOW); // desactiva a saida dos leds verdes
}
/*delay(3000);
lcd.clear(); */
}
void DetetaObjectos(int trigPin, int echoPin)
{
bool ini=1;
ini=digitalRead(7); // le estado do botao de inicio amarelo
if (ini<1) // inicio é a variavel do estado do botao inicio
{
long duracao, distancia;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duracao= pulseIn(echoPin, HIGH);
distancia= (duracao / 2) / 29.1;
Serial.print("Distancia em cm: ");
Serial.println(distancia);
delay(100);
if (distancia <=100) { digitalWrite(19,HIGH); }
}
}
void imprime( String ab )
{
// String a= " teste" ;
lcd.init();
lcd.clear();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(ab);
}