![]() |
| Relógio DIMEP Tagus 500 dias |
![]() |
| Relógio DIMEP 500 dias com o qual executamos o projeto |
Minha primeira dúvida neste projeto, era sobre a confiabilidade do arduino para medir um intervalo de tempo em milisegundos. Escrevi um pequeno sketch que apenas contabilizava o tempo de um delay(1000) e imprimia o resultado na tela. Este método pode ser questionado pois tanto para gerar o delay quanto para fazer a medição estou utilizando a mesma função millis(), ou seja, o resultado deveria ser sempre o mesmo, certo? Eu também pensei que sim... Este teste pode ser feito apenas com a placa do arduino, sem utilizar nenhum componente ligado a ela. Abaixo o código utilizado para medir o tempo.
unsigned long inicio,fim,duracao;
void setup()
{
Serial.begin(9600);
}
void loop()
{
inicio=millis();
delay(1000);
fim=millis();
duracao=fim-inicio;
Serial.println(duracao);
}
O resultado para 30 segundos foi:
6 amostras com 999 ms
8 amostras com 1001 ms
16 amostras com 1000 ms
Média de 1000,066 ms
O projeto foi realizado utilizando:
- 1 Arduino Mega 2560 Rev 3.
- 1 resistor de um megaohm (1MΩ).
- 1 sensor piezoelétrico
![]() |
| Esquema de fiação no fritzing |
Ao analisar os dados gerados pelo sensor (ver figura abaixo), o eixo X representa uma amostra a cada 2 ms, e o eixo Y a pressão sobre o sensor, observei que a contabilização do tempo deveria ser apenas entre os primeiros toques no sensor, e os seguintes já deveriam ser considerados como intervalo do pêndulo. Ao pressionar o sensor entre os dedos, você facilmente faz ele chegar até 1024, ou seja, o valor 15 apresentado no gráfico, é um toque muito leve.
Código para medição do intervalo:
const int kSensor = A1; //pino em que esta conectado o sensor
const int threshold = 500; //limite para desconsiderar os valores, apos o primeiro toque
int sensorReading = 0;
int count = 0;
unsigned long start, finished, elapsed, avg, total;
void setup()
{
Serial.begin(9600);
total=0;
}
void loop()
{
sensorReading = analogRead(kSensor);
start = millis();
elapsed=start-finished;
if ((sensorReading != 0) and (elapsed >threshold))
{
count = count + 1;
start = millis();
elapsed=start-finished;
total = total + elapsed;
avg = total / count;
finished = millis();
Serial.print("Ultimo: ");
Serial.print(elapsed);
Serial.print(" Media: ");
Serial.print(avg);
Serial.print(" Ticks: ");
Serial.print(count);
Serial.println();
}
}
Resultado:De média 996 que era anteriormente consegui mudar para 999 ms.
Reconheço que a melhor maneira seria utilizar algum sensor com o qual não houvesse toque, para evitar interferência do sistema de medição.
Como sugestão para um projeto futuro , fica a sugestão para utilizar um LDR e um feixe de luz, pois não haveria influência no pêndulo.
O projeto não é pioneiro, encontrei um já executado aqui.
Para não perder a oportunidade de um trocadilho na conclusão, relógio que atrasa não adianta pra nada!






...e relógio que adianta, também não adianta pra nada !
ResponderExcluir