//===========================
//https://alexgyver.ru/arduino-algorithms/#:~:text=Макрос%20таймера%20на%20миллис
#define EVERY_MS(name, x) \
static uint32_t name;\
bool flag = millis() - name >= (x);\
if (flag) name += (x);\
if (flag)
//===========================
class Anemometer {
public:
/***************Settings*****************/
void setPin(byte pin) {
pinMode(pin, INPUT_PULLUP);
_pin = pin;
}
byte getPin() {
return _pin;
}
void setName(String name) {
_name = name;
}
String getName() {
return _name;
}
void attachUpdate(void (*f)(String name, String val)) {
_onUpdFunc = f;
}
/*************End Settings***************/
/****************Values******************/
int getSpeed() {
return _speed;
}
/**************End Values****************/
/****************Tick********************/
void tick() {
static bool v = false;
bool st = digitalRead(_pin);
if(v && !st) _count++;
v = st;
EVERY_MS(s, 1000) {
_speed = _count;// / 1.5;// / 10.0 * 2.4 / 3.6; // Количество импульсов/10 секунд и переводим км/ч в м/с
_count = 0;
_onUpdFunc(String(_name + ".wind_speed"), String(_speed));
}
}
/**************END Tick******************/
private:
String _name = "anemometer";
byte _pin = 0;
void (*_onUpdFunc)(String name, String val) = [](String name, String val){};
int _count = 0;
int _speed = 0;
};
Anemometer test;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
test.setPin(2);
test.attachUpdate([](String n, String v) {
Serial.print(n);
Serial.print(" ");
Serial.println(v);
});
}
void loop() {
// put your main code here, to run repeatedly:
test.tick();
delay(10); // this speeds up the simulation
}