Skip to content

File MycilaDimmerPWM.h

File List > src > MycilaDimmerPWM.h

Go to the documentation of this file

// SPDX-License-Identifier: MIT
/*
 * Copyright (C) Mathieu Carbou
 */
#pragma once

#include "MycilaDimmerPhaseControl.h"

#define MYCILA_DIMMER_PWM_RESOLUTION 12   // 12 bits resolution => 0-4095 watts
#define MYCILA_DIMMER_PWM_FREQUENCY  1000 // 1 kHz

namespace Mycila {
  class PWMDimmer : public PhaseControlDimmer {
    public:
      virtual ~PWMDimmer() { end(); }

      void setPin(gpio_num_t pin) { _pin = pin; }

      gpio_num_t getPin() const { return _pin; }

      void setFrequency(uint32_t frequency) { this->_frequency = frequency; }

      uint32_t getFrequency() const { return _frequency; }

      void setResolution(uint8_t resolution) { this->_resolution = resolution; }

      uint8_t getResolution() const { return _resolution; }

      bool begin() override;

      void end() override;

      const char* type() const override { return "pwm"; }

#ifdef MYCILA_JSON_SUPPORT
      void toJson(const JsonObject& root) const override {
        PhaseControlDimmer::toJson(root);
        root["pin"] = static_cast<int>(_pin);
        root["frequency"] = _frequency;
        root["resolution"] = _resolution;
      }
#endif

    protected:
      bool _apply() override {
        if (!isOnline()) {
          return ledcWrite(_pin, 0);
        }
        uint32_t duty = getDutyCycleFire() * ((1 << _resolution) - 1);
        return ledcWrite(_pin, duty);
      }

    private:
      gpio_num_t _pin = GPIO_NUM_NC;
      uint32_t _frequency = MYCILA_DIMMER_PWM_FREQUENCY;
      uint8_t _resolution = MYCILA_DIMMER_PWM_RESOLUTION;
  };
} // namespace Mycila