#include <TimerOne.h>
// 5,6,10&11
struct measureType {
byte pin;
unsigned long duration;
float frequency;
unsigned long timeout; // in microseconds
unsigned long lastMeasurement;
unsigned long interval;
int type;
void init(byte aPin, int aType, unsigned long anInterval, unsigned long aTimeout) {
pin = aPin;
pinMode(pin, INPUT);
type = aType;
timeout = aTimeout;
duration = 0;
frequency = 0.0;
interval = anInterval;
}
boolean valueMeasured() {
if (timeout > 0)
{
duration = pulseIn(pin, type, timeout);
}
else
{ // default timeout = 1 sec
duration = pulseIn(pin, type);
}
return (duration > 0);
}
void handle() {
if (millis() - lastMeasurement >= interval) {
lastMeasurement = millis();
Serial.print(pin);
Serial.print("\t");
if (valueMeasured()) {
Serial.println(duration);
} else {
Serial.println("no pulses");
}
}
}
};
measureType pin5;
measureType pin6;
constexpr byte outPin30Hz {12};
constexpr byte outPinPulse {3};
void setup() {
Serial.begin(115200);
pin5.init(5, LOW, 1000, 0);
pin6.init(6, HIGH, 1000, 0);
pinMode(outPin30Hz, OUTPUT);
Timer1.initialize(10000);
Timer1.attachInterrupt(createPulse);
}
void loop() {
pin5.handle();
pin6.handle();
//createHertz(30);
}
void createHertz(int Hertz) {
static unsigned long lastTime = 0;
static byte pulseValue = HIGH;
if (millis() - lastTime >= 1000UL / Hertz) {
lastTime = millis();
pulseValue = !pulseValue;
digitalWrite(outPin30Hz, pulseValue);
}
}
void createPulse() {
static byte pulseValue = HIGH;
pulseValue = !pulseValue;
digitalWrite(outPinPulse, pulseValue);
}