try this on the CYD
// ESP32 - simple running average - measure pulse frequency using rising edge interrupts
// average = (Current_reading + average) / 2
// updated for Arduino ESP32 core 3.0 see
// https://docs.espressif.com/projects/arduino-esp32/en/latest/api/timer.html
// CYD TFT setup
#include <Arduino.h>
#include <TFT_eSPI.h>
TFT_eSPI tft;
#define risePin 22 //16
// note using hw_timer_t or micros() give similar values
hw_timer_t *Timer1_Cfg = NULL; // timer object
// pulse timing data
volatile uint64_t riseTime, period;
volatile uint64_t averageFreq = 0, frequency;
// rising edge interrupt calculate period uSec
void IRAM_ATTR rising() {
uint64_t rise = timerReadMicros(Timer1_Cfg);
period = rise - riseTime;
riseTime = rise;
frequency = 100000000ul / period;
if (averageFreq == 0) averageFreq = frequency; // initialize
else
averageFreq = (frequency + averageFreq) / 2; // running average
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("\n\nESP32 frequency running average - measure pin %d pulse information \n", risePin);
//Timer1_Cfg = timerBegin(0, 80, true); // API 2.x setup timer for 1uSec
if ((Timer1_Cfg = timerBegin(10000000)) == NULL) // API 3.0 setup timer for 1uSec
Serial.println("timerBegin Failed!!");
Serial.print("timerBegin() OK frequenmcy ");
Serial.println(timerGetFrequency(Timer1_Cfg));
// setup interrput routines - connect signal to following pins
attachInterrupt(digitalPinToGPIONumber(risePin), rising, RISING); // detect rising edge on pin 16
Serial.println("displaying results");
// setup CYD TFT display
Serial.println("\ninitialise TFT");
// Initializing tft_espi
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextSize(3);
}
void loop() {
static char text[40] = { 0 };
static unsigned long int timer = millis();
// if .1 seconds have elapsed since last reading print results
if (millis() - timer > 100) {
timer += 100;
if (text[0] != 0) { // erase old text ?
tft.setCursor(0, 0, 2);
tft.setTextColor(TFT_BLACK, TFT_BLACK);
tft.println(text);
}
// display frequency to serial
static int i;
Serial.printf("%d %.1f %.1f\n", i++, frequency / 100.0, averageFreq / 100.0);
// display frequency to TFT
sprintf(text, "\n\n freq %.1fHz ", averageFreq / 100.0);
tft.setCursor(0, 0, 2);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.println(text);
}
}
displays frequency on CYD every 100mSec
