7#include "MycilaDimmer.h"
8#include <driver/gptimer_types.h>
21 void setPin(gpio_num_t pin) { _pin = pin; }
26 gpio_num_t
getPin()
const {
return _pin; }
32 if (semiPeriod == 0) {
33 ESP_LOGE(
"MycilaDimmerThyristor",
"setSemiPeriod: semiPeriod must be > 0");
35 assert(semiPeriod > 0);
36 _semiPeriod = semiPeriod;
50 uint16_t
getFiringDelay()
const {
return _delay > _semiPeriod ? _semiPeriod : _delay; }
57 float getPhaseAngle()
const {
return _delay >= _semiPeriod ? 180 : 180 * _delay / _semiPeriod; }
74 virtual const char* type()
const {
return "thyristor"; }
86 static void onZeroCross(int16_t delayUntilZero,
void* args);
88#ifdef MYCILA_JSON_SUPPORT
94 void toJson(
const JsonObject& root)
const override {
96 root[
"dimmer_pin"] = _pin;
97 root[
"dimmer_semi_period"] = _semiPeriod;
104 virtual bool _apply()
override {
105 if (!_online || !_semiPeriod || _dutyCycleFire == 0) {
109 if (_dutyCycleFire == 1) {
113 _delay = (1.0f - _dutyCycleFire) *
static_cast<float>(_semiPeriod);
117 virtual bool _calculateHarmonics(
float* array,
size_t n)
const override {
118 return _calculatePhaseControlHarmonics(_dutyCycleFire, array, n);
122 gpio_num_t _pin = GPIO_NUM_NC;
123 uint16_t _delay = UINT16_MAX;
125 static bool _fireTimerISR(gptimer_handle_t timer,
const gptimer_alarm_event_data_t* event,
void* arg);
126 static void _registerDimmer(Mycila::ThyristorDimmer* dimmer);
127 static void _unregisterDimmer(Mycila::ThyristorDimmer* dimmer);
Thyristor (TRIAC) based dimmer implementation for TRIAC and Random SSR dimmers.
gpio_num_t getPin() const
Get the GPIO pin used for the dimmer.
static void onZeroCross(int16_t delayUntilZero, void *args)
void setPin(gpio_num_t pin)
Set the GPIO pin to use for the dimmer.
uint16_t getSemiPeriod() const
Get the semi-period of the grid frequency in us.
void setSemiPeriod(uint16_t semiPeriod)
Set the semi-period of the grid frequency in us. It cannot be zero and it is required for proper dimm...
virtual void begin()
Enable a dimmer on a specific GPIO pin.
float getPhaseAngle() const
Get the phase angle in degrees (°) of the dimmer in the range [0, 180] At 0% power,...
virtual void end()
Disable the dimmer.
uint16_t getFiringDelay() const
Get the firing delay in us of the dimmer in the range [0, semi-period] At 0% power,...