mirror of
https://github.com/esphome/esphome.git
synced 2024-12-02 11:44:13 +01:00
52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
#include "sm16716.h"
|
|
#include "esphome/core/log.h"
|
|
|
|
namespace esphome {
|
|
namespace sm16716 {
|
|
|
|
static const char *const TAG = "sm16716";
|
|
|
|
void SM16716::setup() {
|
|
ESP_LOGCONFIG(TAG, "Setting up SM16716OutputComponent...");
|
|
this->data_pin_->setup();
|
|
this->data_pin_->digital_write(false);
|
|
this->clock_pin_->setup();
|
|
this->clock_pin_->digital_write(false);
|
|
this->pwm_amounts_.resize(this->num_channels_, 0);
|
|
}
|
|
void SM16716::dump_config() {
|
|
ESP_LOGCONFIG(TAG, "SM16716:");
|
|
LOG_PIN(" Data Pin: ", this->data_pin_);
|
|
LOG_PIN(" Clock Pin: ", this->clock_pin_);
|
|
ESP_LOGCONFIG(TAG, " Total number of channels: %u", this->num_channels_);
|
|
ESP_LOGCONFIG(TAG, " Number of chips: %u", this->num_chips_);
|
|
}
|
|
void SM16716::loop() {
|
|
if (!this->update_)
|
|
return;
|
|
|
|
for (uint8_t i = 0; i < 50; i++) {
|
|
this->write_bit_(false);
|
|
}
|
|
|
|
// send 25 bits (1 start bit plus 24 data bits) for each chip
|
|
for (uint8_t index = 0; index < this->num_channels_; index++) {
|
|
// send a start bit initially and after every 3 channels
|
|
if (index % 3 == 0) {
|
|
this->write_bit_(true);
|
|
}
|
|
|
|
this->write_byte_(this->pwm_amounts_[index]);
|
|
}
|
|
|
|
// send a blank 25 bits to signal the end
|
|
this->write_bit_(false);
|
|
this->write_byte_(0);
|
|
this->write_byte_(0);
|
|
this->write_byte_(0);
|
|
|
|
this->update_ = false;
|
|
}
|
|
|
|
} // namespace sm16716
|
|
} // namespace esphome
|