// https://forum.arduino.cc/t/measuring-pulse-period/994640
// board: arduino nano every
// registers emulation: none
#include <util/atomic.h>
#include <SPI.h>
//#include <Adafruit_GFX.h>
//#include <Adafruit_PCD8544.h>
// magic number
// a: 945 inch hundredths per pulse
// b: 3600000000 microseconds in an hour
// c: 6336000 inch hundredths in a mile
const float magic_number_vd = 0.000149148; // a / c
const uint32_t magic_number_vs = 536931; // a * b / c
// vehicle speed sensor
#define VSS_PIN 2
volatile uint32_t vss_time_prev_volatile = 0;
volatile uint32_t vss_period_volatile = 0;
volatile uint32_t vss_count_volatile = 0;
/* display
#define DISPLAY_DC_PIN 5 // data/command select
#define DISPLAY_CS_PIN 4 // chip select
#define DISPLAY_RST_PIN 3 // reset
Adafruit_PCD8544 display = Adafruit_PCD8544(DISPLAY_DC_PIN, DISPLAY_CS_PIN, DISPLAY_RST_PIN);
*/
// update interval
const uint32_t update_interval = 1000000UL; // microseconds
uint32_t update_time = -1;
void setup()
{
// vss initialization
pinMode(VSS_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(VSS_PIN), vss_isr, RISING);
# define toneOut 8
pinMode(toneOut, OUTPUT);
/* display initialization
display.begin();
display.clearDisplay();
display.setContrast(75);
display.setRotation(0);
*/
delay(200); // life too short!
Serial.begin(9600); Serial.println("bike thin just no LCD\n");
Serial.println(magic_number_vd, 10);
Serial.println(magic_number_vs);
// artificial periodic pulse input
tone(8, 50);
}
void loop()
{
uint32_t time_us = micros();
if (time_us - update_time >= update_interval)
{
update_time += update_interval;
}
else
{
return;
}
uint32_t vss_time_prev;
uint32_t vss_period;
uint32_t vss_count;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
vss_time_prev = vss_time_prev_volatile;
vss_period = vss_period_volatile;
vss_count = vss_count_volatile;
}
Serial.print(" prev: : "); Serial.print(vss_time_prev);
Serial.print(" period: "); Serial.print(vss_period);
Serial.print(" count: "); Serial.print(vss_count);
// vehicle distance
float vehicle_distance = vss_count * magic_number_vd;
Serial.print(" distance "); Serial.print(vehicle_distance);
// vehicle speed
uint8_t vehicle_speed = 0;
if (time_us - vss_time_prev < magic_number_vs) {
vehicle_speed = magic_number_vs / vss_period;
Serial.print(" calculcated speed ");
Serial.println(vehicle_speed);
}
else Serial.println(" -- ");
/*
// vehicle distance
float vehicle_distance = vss_count * magic_number_vd;
display.setTextSize(2);
display.setCursor(0,24);
if (vehicle_distance < 10) display.print("000");
if (vehicle_distance < 100) display.print("00");
if (vehicle_distance < 1000) display.print("0");
display.print(vehicle_distance, 2);
// vehicle speed
uint8_t vehicle_speed = 0;
if (time_us - vss_time_prev < magic_number_vs)
{
vehicle_speed = magic_number_vs / vss_period;
}
display.setTextSize(3);
display.setCursor(0,0);
if (vehicle_speed == 0 || vehicle_speed > 99)
{
display.print("--");
}
else
{
if (vehicle_speed < 10) display.print("0");
display.print(vehicle_speed);
}
// write to display
display.display();
*/
}
void vss_isr()
{
uint32_t time_us = micros();
vss_period_volatile = time_us - vss_time_prev_volatile;
vss_time_prev_volatile = time_us;
vss_count_volatile++;
}