Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
1.6 kB
2
Indexable
Never

void ICACHE_RAM_ATTR isr(); 

class TimerUs {
  public:
    bool ready() {
      if (state && micros() - tmr >= prd) {
        tmr = micros();
        return true;
      }
      return false;
    }
    void stop() {
      state = false;
    }
    void restart() {
      tmr = micros();
      state = true;
    }
    void setPeriod(uint32_t period) {
      restart();
      prd = period;
      if (prd == 0) prd++;
    }

  private:
    bool state = 0;
    uint32_t tmr = 0, prd = 0;
};
TimerUs timer;

#define D_PIN 16
#define ZERO_CROSS 5

#include <GyverDimmer.h>
Dimmer<D_PIN> dim;   // указать пин диммера
//Dimmer<D_PIN> dim(60);  // можно указать 60 Гц (умолч 50)

void setup() {

  USE_SERIAL.begin(9600);
  USE_SERIAL.println("LOAD?");
  // завести прерывание на детектор нуля
  attachInterrupt(ZERO_CROSS, isr, RISING);  // D2 == 0

  USE_SERIAL.println("LOAD1");
}
void isr() {
  // вызывать в прерывании детектора нуля
  // если tickZero() - true - нужно перезапустить таймер с периодом getPeriod()
  if (dim.tickZero()) timer.setPeriod(dim.getPeriod());
  else timer.restart();
  // иначе перезапустить со старым
}

void loop() {
  USE_SERIAL.println("LOAD2");
  // в "прерывании" таймера
  if (timer.ready()) {
    dim.tickTimer();    // вызвать tickTimer()
    timer.stop();       // остановить таймер
  }
  dim.write(analogRead(A0) / 4);  // принимает 0-255

  USE_SERIAL.println("LOAD3");
}