/*
Projeto 54 - Medição do valor da aceleração gravítica com um sensor piezoelétrico e um eletroíman (LCD)
Física na Lixa
https://fisicanalixa.blogspot.com/
https://sites.google.com/aelixa.pt/fisicaearduino
NOTA:
1º - Pressionar o botão - liga-se o eletroíman (coloca-se a bola no eletroíman).
2º - Pressionar novamente o botão - desliga-se o eletroíman e começa a contagem do tempo.
3º - A bola atinge a base - para a contagem do tempo e o LCD indica o tempo de queda da bola.
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //ou 0x3F
#define PinBTN 7
#define PinEletro 6
#define PinPiezo 0
int piezo;
int limite; //Valor a partir do qual o sensor piezoelétrico considera que a bola o atingiu.
bool estadoBTN;
unsigned long tempoi; //Tempo inicial
unsigned long tempof; //Tempo final
float duracao; //Tempo de queda em microssegundos
float duracaoms; //Tempo de queda em milissegundos
void setup()
{
Serial.begin(9600);
pinMode(PinBTN, INPUT_PULLUP);
pinMode(PinEletro, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pronto para");
lcd.setCursor(0,1);
lcd.print("iniciar!...");
Serial.println();
Serial.println("Pronto para a primeira medição!");
delay(2000);
lcd.clear();
}
void loop()
{
piezo = analogRead(PinPiezo);
limite = piezo + 20; //Faz a leitura do sensor piezoelétrico e adiciona 20
estadoBTN = digitalRead(PinBTN);
lcd.setCursor(0,1);
lcd.print("Pressione botao");
Serial.println("Pressione o botão para ligar o eletroíman.");
while(estadoBTN == 1) //Botão não pressionado (eletroíman desligado)
{
estadoBTN = digitalRead(PinBTN);
digitalWrite(PinEletro, LOW);
}
digitalWrite(PinEletro, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Coloque a bola e");
lcd.setCursor(0,1);
lcd.print("pressione botao");
Serial.println("O eletroíman está ligado.");
Serial.println("Coloque a bola e pressione novamente o botão.");
delay(500);
estadoBTN = digitalRead(PinBTN);
while(estadoBTN == 1) //Enquanto não se pressiona o botão o eletroíman permanece ligado
{
estadoBTN = digitalRead(PinBTN);
}
digitalWrite(PinEletro, LOW);
tempoi = micros();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bola em queda...");
Serial.println("Bola em queda...");
while(piezo < limite)
{
piezo = analogRead(PinPiezo);
}
tempof = micros();
duracao = (tempof-tempoi);
duracaoms = duracao/1000.0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("t=");
lcd.print(duracaoms, 1);
lcd.print(" ms");
Serial.print("t = ");
Serial.print(duracaoms, 1);
Serial.println(" ms");
Serial.println("----------------");
delay(3000);
Serial.println("Pronto para uma nova medição!...");
}