MycilaJSY 13.0.0
Arduino / ESP32 library for the JSY1031, JSY-MK-163, JSY-MK-193, JSY-MK-194, JSY-MK-227, JSY-MK-229, JSY-MK-333 families single-phase and three-phase AC bidirectional meters from Shenzhen Jiansiyan Technologies Co, Ltd.
Loading...
Searching...
No Matches
MycilaDimmerThyristor.h
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright (C) 2023-2025 Mathieu Carbou
4 */
5#pragma once
6
7#include "MycilaDimmer.h"
8#include <driver/gptimer_types.h>
9
10namespace Mycila {
11 class ThyristorDimmer : public Dimmer {
12 public:
13 virtual ~ThyristorDimmer() { end(); }
14
18 void setPin(gpio_num_t pin) { _pin = pin; }
19
23 gpio_num_t getPin() const { return _pin; }
24
28 void setSemiPeriod(uint16_t semiPeriod) {
29 if (semiPeriod == 0) {
30 ESP_LOGE("MycilaDimmerThyristor", "setSemiPeriod: semiPeriod must be > 0");
31 }
32 assert(semiPeriod > 0);
33 _semiPeriod = semiPeriod;
34 }
35
39 uint16_t getSemiPeriod() const { return _semiPeriod; }
40
47 uint16_t getFiringDelay() const { return _delay > _semiPeriod ? _semiPeriod : _delay; }
48
54 float getPhaseAngle() const { return _delay >= _semiPeriod ? 180 : 180 * _delay / _semiPeriod; }
55
62 virtual void begin();
63
69 virtual void end();
70
71 virtual const char* type() const { return "thyristor"; }
72
83 static void onZeroCross(int16_t delayUntilZero, void* args);
84
85#ifdef MYCILA_JSON_SUPPORT
91 void toJson(const JsonObject& root) const override {
92 Dimmer::toJson(root);
93 root["dimmer_pin"] = _pin;
94 root["dimmer_semi_period"] = _semiPeriod;
95 root["dimmer_firing_delay"] = getFiringDelay();
96 root["dimmer_firing_angle"] = getPhaseAngle();
97 }
98#endif
99
100 protected:
101 virtual bool _apply() {
102 if (!_online || !_semiPeriod || _dutyCycleFire == 0) {
103 _delay = UINT16_MAX;
104 return _enabled;
105 }
106 if (_dutyCycleFire == 1) {
107 _delay = 0;
108 return _enabled;
109 }
110 _delay = (1.0f - _dutyCycleFire) * static_cast<float>(_semiPeriod);
111 return _enabled;
112 }
113
114 private:
115 gpio_num_t _pin = GPIO_NUM_NC;
116 uint16_t _delay = UINT16_MAX; // this is the next firing delay to apply
117
118 static bool _fireTimerISR(gptimer_handle_t timer, const gptimer_alarm_event_data_t* event, void* arg);
119 static void _registerDimmer(Mycila::ThyristorDimmer* dimmer);
120 static void _unregisterDimmer(Mycila::ThyristorDimmer* dimmer);
121 };
122} // namespace Mycila
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,...