mirror of
https://github.com/esphome/esphome.git
synced 2025-01-27 22:31:59 +01:00
28aedae8d7
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
116 lines
3.0 KiB
C++
116 lines
3.0 KiB
C++
#pragma once
|
|
|
|
#include "esphome/components/i2c/i2c.h"
|
|
#include "esphome/core/component.h"
|
|
|
|
namespace esphome {
|
|
namespace emc2101 {
|
|
|
|
/** Enum listing all DAC conversion rates for the EMC2101.
|
|
*
|
|
* Specific values of the enum constants are register values taken from the EMC2101 datasheet.
|
|
*/
|
|
enum Emc2101DACConversionRate {
|
|
EMC2101_DAC_1_EVERY_16_S,
|
|
EMC2101_DAC_1_EVERY_8_S,
|
|
EMC2101_DAC_1_EVERY_4_S,
|
|
EMC2101_DAC_1_EVERY_2_S,
|
|
EMC2101_DAC_1_EVERY_SECOND,
|
|
EMC2101_DAC_2_EVERY_SECOND,
|
|
EMC2101_DAC_4_EVERY_SECOND,
|
|
EMC2101_DAC_8_EVERY_SECOND,
|
|
EMC2101_DAC_16_EVERY_SECOND,
|
|
EMC2101_DAC_32_EVERY_SECOND,
|
|
};
|
|
|
|
/// This class includes support for the EMC2101 i2c fan controller.
|
|
/// The device has an output (PWM or DAC) and several sensors and this
|
|
/// class is for the EMC2101 configuration.
|
|
class Emc2101Component : public Component, public i2c::I2CDevice {
|
|
public:
|
|
/** Sets the mode of the output.
|
|
*
|
|
* @param dac_mode false for PWM output and true for DAC mode.
|
|
*/
|
|
void set_dac_mode(bool dac_mode) {
|
|
this->dac_mode_ = dac_mode;
|
|
this->max_output_value_ = 63;
|
|
}
|
|
|
|
/** Sets the PWM resolution.
|
|
*
|
|
* @param resolution the PWM resolution.
|
|
*/
|
|
void set_pwm_resolution(uint8_t resolution) {
|
|
this->pwm_resolution_ = resolution;
|
|
this->max_output_value_ = 2 * resolution;
|
|
}
|
|
|
|
/** Sets the PWM divider used to derive the PWM frequency.
|
|
*
|
|
* @param divider The PWM divider.
|
|
*/
|
|
void set_pwm_divider(uint8_t divider) { this->pwm_divider_ = divider; }
|
|
|
|
/** Sets the DAC conversion rate (how many conversions per second).
|
|
*
|
|
* @param conversion_rate The DAC conversion rate.
|
|
*/
|
|
void set_dac_conversion_rate(Emc2101DACConversionRate conversion_rate) {
|
|
this->dac_conversion_rate_ = conversion_rate;
|
|
}
|
|
|
|
/** Inverts the polarity of the Fan output.
|
|
*
|
|
* @param inverted Invert or not the Fan output.
|
|
*/
|
|
void set_inverted(bool inverted) { this->inverted_ = inverted; }
|
|
|
|
/** Sets the Fan output duty cycle
|
|
*
|
|
* @param value The duty cycle value, from 0.0f to 1.0f.
|
|
*/
|
|
void set_duty_cycle(float value);
|
|
|
|
/** Gets the Fan output duty cycle
|
|
*
|
|
* @return The duty cycle percentage from 0.0f to 1.0f.
|
|
*/
|
|
float get_duty_cycle();
|
|
|
|
/** Gets the internal temperature sensor reading.
|
|
*
|
|
* @return The temperature in degrees celsius.
|
|
*/
|
|
float get_internal_temperature();
|
|
|
|
/** Gets the external temperature sensor reading.
|
|
*
|
|
* @return The temperature in degrees celsius.
|
|
*/
|
|
float get_external_temperature();
|
|
|
|
/** Gets the tachometer speed sensor reading.
|
|
*
|
|
* @return The fan speed in RPMs.
|
|
*/
|
|
float get_speed();
|
|
|
|
/** Used by ESPHome framework. */
|
|
void setup() override;
|
|
/** Used by ESPHome framework. */
|
|
void dump_config() override;
|
|
/** Used by ESPHome framework. */
|
|
float get_setup_priority() const override;
|
|
|
|
bool dac_mode_{false};
|
|
bool inverted_{false};
|
|
uint8_t max_output_value_;
|
|
uint8_t pwm_resolution_;
|
|
uint8_t pwm_divider_;
|
|
Emc2101DACConversionRate dac_conversion_rate_;
|
|
};
|
|
|
|
} // namespace emc2101
|
|
} // namespace esphome
|