/*
Projeto 50 - Sensor de efeito Hall BIPOLAR (Medição do período de rotação de um disco)
Mede o intervalo de tempo que o disco demora a executar N voltas e calcula o período.
Depois de se pressionar o botão, o Arduino inicia a contagem do tempo quando o íman passa junto do sensor.
Como o sensor é bipolar é necessário usar dois ímanes (um com o pólo norte a apontar para o sensor e o outro com o pólo sul).
Física na Lixa
https://fisicanalixa.blogspot.com/
https://sites.google.com/aelixa.pt/fisicaearduino
*/
#define PinSensor 7
#define PinBTN 8
#define PinLED 9
#define N 5 //Número de voltas
int estadoSensor;
int estadoSensorInicial;
int estadoBTN;
unsigned long tempoi;
unsigned long tempof;
float periodo; //Período em ms
void setup()
{
Serial.begin(9600);
pinMode(PinSensor, INPUT);
pinMode(PinBTN, INPUT_PULLUP);
pinMode(PinLED, OUTPUT);
Serial.println();
Serial.println("Pressione o botão iniciar");
}
void loop()
{
digitalWrite(PinLED, LOW);
estadoBTN = digitalRead(PinBTN);
while(estadoBTN == 1)
{
estadoBTN = digitalRead(PinBTN);
}
Serial.println("A medir...");
estadoSensorInicial = digitalRead(PinSensor);
estadoSensor = estadoSensorInicial;
while(estadoSensor == estadoSensorInicial)
{
estadoSensor = digitalRead(PinSensor);
}
tempoi = micros();
Serial.println("Início da contagem do tempo");
digitalWrite(PinLED, HIGH);
for(int i = 1; i <= N; i++)
{
digitalWrite(PinLED, LOW);
while(estadoSensor != estadoSensorInicial)
{
estadoSensor = digitalRead(PinSensor);
}
while(estadoSensor == estadoSensorInicial)
{
estadoSensor = digitalRead(PinSensor);
}
tempof = micros();
digitalWrite(PinLED, HIGH);
if(i == 1)
{
Serial.print(i);
Serial.println(" volta");
}
else
{
Serial.print(i);
Serial.println(" voltas");
}
}
periodo = (tempof - tempoi)/(N*1000.0);
Serial.print("Período = ");
Serial.print(periodo, 1);
Serial.println(" ms");
}
/*
Projeto 50 - Sensor de efeito Hall BIPOLAR com LCD (Medição do período de rotação de um disco)
Mede o intervalo de tempo que o disco demora a executar N voltas e calcula o período.
Depois de se pressionar o botão, o Arduino inicia a contagem do tempo quando o íman passa junto do sensor.
Como o sensor é bipolar é necessário usar dois ímanes (um com o pólo norte a apontar para o sensor e o outro com o pólo sul).
Física na Lixa
https://fisicanalixa.blogspot.com/
https://sites.google.com/aelixa.pt/fisicaearduino
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //0x27 ou 0x3F
#define PinSensor 7
#define PinBTN 8
#define PinLED 9
#define N 5 //Número de voltas
int estadoSensor;
int estadoSensorInicial;
int estadoBTN;
unsigned long tempoi;
unsigned long tempof;
float periodo; //Período em ms
void setup()
{
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pressione o");
lcd.setCursor(0,1);
lcd.print("botao iniciar");
pinMode(PinSensor, INPUT);
pinMode(PinBTN, INPUT_PULLUP);
pinMode(PinLED, OUTPUT);
}
void loop()
{
digitalWrite(PinLED, LOW);
estadoBTN = digitalRead(PinBTN);
while(estadoBTN == 1)
{
estadoBTN = digitalRead(PinBTN);
}
Serial.println("A medir...");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("A medir...");
estadoSensorInicial = digitalRead(PinSensor);
estadoSensor = estadoSensorInicial;
while(estadoSensor == estadoSensorInicial)
{
estadoSensor = digitalRead(PinSensor);
}
tempoi = micros();
digitalWrite(PinLED, HIGH);
for(int i = 1; i <= N; i++)
{
digitalWrite(PinLED, LOW);
while(estadoSensor != estadoSensorInicial)
{
estadoSensor = digitalRead(PinSensor);
}
while(estadoSensor == estadoSensorInicial)
{
estadoSensor = digitalRead(PinSensor);
}
tempof = micros();
digitalWrite(PinLED, HIGH);
if(i == 1)
{
Serial.print(i);
Serial.println(" volta");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(i);
lcd.print(" volta");
}
else
{
Serial.print(i);
Serial.println(" voltas");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(i);
lcd.print(" voltas");
}
}
periodo = (tempof - tempoi)/(N*1000.0);
Serial.print("Período = ");
Serial.print(periodo);
Serial.println(" ms");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Periodo");
lcd.setCursor(0,1);
lcd.print(periodo);
lcd.print(" ms");
}