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 {
14 class ThyristorDimmer : public Dimmer {
15 public:
16 virtual ~ThyristorDimmer() { end(); }
17
21 void setPin(gpio_num_t pin) { _pin = pin; }
22
26 gpio_num_t getPin() const { return _pin; }
27
34 uint16_t getFiringDelay() const { return _delay > _semiPeriod ? _semiPeriod : _delay; }
35
41 float getPhaseAngle() const { return _delay >= _semiPeriod ? 180 : 180 * _delay / _semiPeriod; }
42
49 bool begin() override;
50
56 void end() override;
57
58 const char* type() const override { return "thyristor"; }
59
60 bool calculateMetrics(Metrics& metrics, float gridVoltage, float loadResistance) const override {
61 return isEnabled() && _calculatePhaseControlMetrics(metrics, _dutyCycleFire, gridVoltage, loadResistance);
62 }
63
74 static void onZeroCross(int16_t delayUntilZero, void* args);
75
76#ifdef MYCILA_JSON_SUPPORT
82 void toJson(const JsonObject& root) const override {
83 Dimmer::toJson(root);
84 root["pin"] = _pin;
85 root["firing_delay"] = getFiringDelay();
86 root["firing_angle"] = getPhaseAngle();
87 }
88#endif
89
90 protected:
91 bool _apply() override {
92 if (!_online || !_semiPeriod || _dutyCycleFire == 0) {
93 _delay = UINT16_MAX;
94 return _enabled;
95 }
96 if (_dutyCycleFire == 1) {
97 _delay = 0;
98 return _enabled;
99 }
100 _delay = (1.0f - _dutyCycleFire) * static_cast<float>(_semiPeriod);
101 return _enabled;
102 }
103
104 bool _calculateHarmonics(float* array, size_t n) const override {
105 return _calculatePhaseControlHarmonics(_dutyCycleFire, array, n);
106 }
107
108 private:
109 gpio_num_t _pin = GPIO_NUM_NC;
110 uint16_t _delay = UINT16_MAX; // this is the next firing delay to apply
111
112 struct RegisteredDimmer {
113 ThyristorDimmer* dimmer = nullptr;
114 RegisteredDimmer* prev = nullptr;
115 RegisteredDimmer* next = nullptr;
116 uint16_t alarm_count = UINT16_MAX; // when to fire the dimmer
117 };
118
119 static struct RegisteredDimmer* dimmers;
120 static bool _fireTimerISR(gptimer_handle_t timer, const gptimer_alarm_event_data_t* event, void* arg);
121 static void _registerDimmer(Mycila::ThyristorDimmer* dimmer);
122 static void _unregisterDimmer(Mycila::ThyristorDimmer* dimmer);
123 };
124} // namespace Mycila
bool isEnabled() const
Check if the dimmer is enabled (if it was able to initialize correctly).
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.
float getPhaseAngle() const
Get the phase angle in degrees (°) of the dimmer in the range [0, 180] At 0% power,...
bool begin() override
Enable a dimmer on a specific GPIO pin.
uint16_t getFiringDelay() const
Get the firing delay in us of the dimmer in the range [0, semi-period] At 0% power,...
void end() override
Disable the dimmer.