A już skasowałem ten kod, ale coś wymyślimy.
Na początek zadeklarujemy zmienne jako volatile.
Kod:
volatile unsigned long currentTime = 0;
volatile unsigned long lastTime = 0;
volatile unsigned long periodTime = 0;
volatile uint_8t i = 0;
Myślę, że nie trzeba tu nic komentować.
Zdefiniujmy nazwę dla jakiegoś pinu z przerwaniem.
Definiujemy funkcję obsługi przerwania.
Z każdym narastającym impulsem inkrementowana jest zmienna i.
periodTime przechowuje czas między pierwszym a dziesiątym impulsem.
Kod:
ICACHE_RAM_ATTR void przerwanie() {
i++;
if (i==0) currentTime = millis;
if (i==10)
{
lastTime = millis;
periodTime = lastTime - currentTime;
i = 0;
}
}
Tak ze złośliwości nie napiszę co to za ustrojstwo ICACHE_RAM_ATTR, więc sobie poczytaj dla czego to makro jest niezbędne dla obsługi przerwań w ESP.
W setupie trzeba poustawiać wejścia i włączyć przerwanie od jakiegoś pinu.
Kod:
void setup() {
pinMode(jakis_pin, INPUTP);
attachInterrupt(digitalPinToInterrupt(jakis_pin), przerwanie, FALLING);
}
Po dziesięciu przerwaniach możemy już policzyć częstotliwość (jest to odwrotność czasu, jak by co).
Kod:
void loop() {
int frequency = 10000/periodTime;
}
Ogólnie mam wrażenie, że ten kod zadziała, ale pokusiłbym się na przeniesienie tego i++ chyba 8 linii w dół.