Compare commits
3 commits
05ca4de74c
...
1ac9bb4ca9
Author | SHA1 | Date | |
---|---|---|---|
|
1ac9bb4ca9 | ||
|
358f54e776 | ||
|
ceb8270435 |
3 changed files with 107 additions and 104 deletions
|
@ -11,100 +11,101 @@ static const char *const TAG = "spi_74hc595_display";
|
||||||
static const uint8_t SPI_74HC595_DISPLAY_UNKNOWN_CHAR = 0b11111111;
|
static const uint8_t SPI_74HC595_DISPLAY_UNKNOWN_CHAR = 0b11111111;
|
||||||
|
|
||||||
const uint8_t SPI_74HC595_DISPLAY_ASCII_TO_RAW[95] PROGMEM = {
|
const uint8_t SPI_74HC595_DISPLAY_ASCII_TO_RAW[95] PROGMEM = {
|
||||||
|
//.GFEDCBA
|
||||||
0b00000000, // ' ', ord 0x20
|
0b00000000, // ' ', ord 0x20
|
||||||
0b10110000, // '!', ord 0x21
|
0b10000110, // '!', ord 0x21
|
||||||
0b00100010, // '"', ord 0x22
|
0b00100010, // '"', ord 0x22
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // '#', ord 0x23
|
0b00110110, // '#', ord 0x23
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // '$', ord 0x24
|
0b00101101, // '$', ord 0x24
|
||||||
0b01001001, // '%', ord 0x25
|
0b01001001, // '%', ord 0x25
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // '&', ord 0x26
|
0b00011011, // '&', ord 0x26
|
||||||
0b00000010, // ''', ord 0x27
|
0b00100000, // ''', ord 0x27
|
||||||
0b01001110, // '(', ord 0x28
|
0b00111001, // '(', ord 0x28
|
||||||
0b01111000, // ')', ord 0x29
|
0b00001111, // ')', ord 0x29
|
||||||
0b01000000, // '*', ord 0x2A
|
0b00000001, // '*', ord 0x2A
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // '+', ord 0x2B
|
0b00010000, // '+', ord 0x2B
|
||||||
0b00010000, // ',', ord 0x2C
|
0b00000100, // ',', ord 0x2C
|
||||||
0b00000001, // '-', ord 0x2D
|
0b01000000, // '-', ord 0x2D
|
||||||
0b10000000, // '.', ord 0x2E
|
0b10000000, // '.', ord 0x2E
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // '/', ord 0x2F
|
0b01010010, // '/', ord 0x2F
|
||||||
0b01111110, // '0', ord 0x30
|
0b00111111, // '0', ord 0x30
|
||||||
0b00110000, // '1', ord 0x31
|
0b00000110, // '1', ord 0x31
|
||||||
0b01101101, // '2', ord 0x32
|
0b01011011, // '2', ord 0x32
|
||||||
0b01111001, // '3', ord 0x33
|
0b01001111, // '3', ord 0x33
|
||||||
0b00110011, // '4', ord 0x34
|
0b01100110, // '4', ord 0x34
|
||||||
0b01011011, // '5', ord 0x35
|
0b01101101, // '5', ord 0x35
|
||||||
0b01011111, // '6', ord 0x36
|
0b01111101, // '6', ord 0x36
|
||||||
0b01110000, // '7', ord 0x37
|
0b00000111, // '7', ord 0x37
|
||||||
0b01111111, // '8', ord 0x38
|
0b01111111, // '8', ord 0x38
|
||||||
0b01111011, // '9', ord 0x39
|
0b01101111, // '9', ord 0x39
|
||||||
0b01001000, // ':', ord 0x3A
|
0b00001001, // ':', ord 0x3A
|
||||||
0b01011000, // ';', ord 0x3B
|
0b00001101, // ';', ord 0x3B
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // '<', ord 0x3C
|
0b00011000, // '<', ord 0x3C
|
||||||
0b00001001, // '=', ord 0x3D
|
0b01001000, // '=', ord 0x3D
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // '>', ord 0x3E
|
0b00001100, // '>', ord 0x3E
|
||||||
0b01100101, // '?', ord 0x3F
|
0b01010011, // '?', ord 0x3F
|
||||||
0b01101111, // '@', ord 0x40
|
0b01111011, // '@', ord 0x40
|
||||||
0b01110111, // 'A', ord 0x41
|
0b01110111, // 'A', ord 0x41
|
||||||
0b00011111, // 'B', ord 0x42
|
0b01111100, // 'B', ord 0x42
|
||||||
0b01001110, // 'C', ord 0x43
|
0b00111001, // 'C', ord 0x43
|
||||||
0b00111101, // 'D', ord 0x44
|
0b01011110, // 'D', ord 0x44
|
||||||
0b01001111, // 'E', ord 0x45
|
0b01111001, // 'E', ord 0x45
|
||||||
0b01000111, // 'F', ord 0x46
|
0b01110001, // 'F', ord 0x46
|
||||||
0b01011110, // 'G', ord 0x47
|
0b00111101, // 'G', ord 0x47
|
||||||
0b00110111, // 'H', ord 0x48
|
0b01110110, // 'H', ord 0x48
|
||||||
0b00110000, // 'I', ord 0x49
|
0b00000110, // 'I', ord 0x49
|
||||||
0b00111100, // 'J', ord 0x4A
|
0b00011110, // 'J', ord 0x4A
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'K', ord 0x4B
|
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'K', ord 0x4B
|
||||||
0b00001110, // 'L', ord 0x4C
|
0b00111000, // 'L', ord 0x4C
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'M', ord 0x4D
|
0b00110111, // 'M', ord 0x4D
|
||||||
0b00010101, // 'N', ord 0x4E
|
0b01010100, // 'N', ord 0x4E
|
||||||
0b01111110, // 'O', ord 0x4F
|
0b00111111, // 'O', ord 0x4F
|
||||||
0b01100111, // 'P', ord 0x50
|
0b01110011, // 'P', ord 0x50
|
||||||
0b11111110, // 'Q', ord 0x51
|
0b10111111, // 'Q', ord 0x51
|
||||||
0b00000101, // 'R', ord 0x52
|
0b01010000, // 'R', ord 0x52
|
||||||
0b01011011, // 'S', ord 0x53
|
0b01101101, // 'S', ord 0x53
|
||||||
0b00000111, // 'T', ord 0x54
|
0b01110000, // 'T', ord 0x54
|
||||||
0b00111110, // 'U', ord 0x55
|
0b00111110, // 'U', ord 0x55
|
||||||
0b00111110, // 'V', ord 0x56
|
0b00111110, // 'V', ord 0x56
|
||||||
0b00111111, // 'W', ord 0x57
|
0b01111110, // 'W', ord 0x57
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'X', ord 0x58
|
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'X', ord 0x58
|
||||||
0b00100111, // 'Y', ord 0x59
|
0b01110010, // 'Y', ord 0x59
|
||||||
0b01101101, // 'Z', ord 0x5A
|
0b01011011, // 'Z', ord 0x5A
|
||||||
0b01001110, // '[', ord 0x5B
|
0b00111001, // '[', ord 0x5B
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // '\', ord 0x5C
|
0b01100100, // '\', ord 0x5C
|
||||||
0b01111000, // ']', ord 0x5D
|
0b00001111, // ']', ord 0x5D
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // '^', ord 0x5E
|
0b00100011, // '^', ord 0x5E
|
||||||
0b00001000, // '_', ord 0x5F
|
0b00001000, // '_', ord 0x5F
|
||||||
0b00100000, // '`', ord 0x60
|
0b00000010, // '`', ord 0x60
|
||||||
0b01110111, // 'a', ord 0x61
|
0b01110111, // 'a', ord 0x61
|
||||||
0b00011111, // 'b', ord 0x62
|
0b01111100, // 'b', ord 0x62
|
||||||
0b00001101, // 'c', ord 0x63
|
0b01011000, // 'c', ord 0x63
|
||||||
0b00111101, // 'd', ord 0x64
|
0b01011110, // 'd', ord 0x64
|
||||||
0b01001111, // 'e', ord 0x65
|
0b01111001, // 'e', ord 0x65
|
||||||
0b01000111, // 'f', ord 0x66
|
0b01110001, // 'f', ord 0x66
|
||||||
0b01011110, // 'g', ord 0x67
|
0b00111101, // 'g', ord 0x67
|
||||||
0b00010111, // 'h', ord 0x68
|
0b01110100, // 'h', ord 0x68
|
||||||
0b00010000, // 'i', ord 0x69
|
0b00000100, // 'i', ord 0x69
|
||||||
0b00111100, // 'j', ord 0x6A
|
0b00011110, // 'j', ord 0x6A
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'k', ord 0x6B
|
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'k', ord 0x6B
|
||||||
0b00001110, // 'l', ord 0x6C
|
0b00111000, // 'l', ord 0x6C
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'm', ord 0x6D
|
0b00110111, // 'm', ord 0x6D
|
||||||
0b00010101, // 'n', ord 0x6E
|
0b01010100, // 'n', ord 0x6E
|
||||||
0b00011101, // 'o', ord 0x6F
|
0b01011100, // 'o', ord 0x6F
|
||||||
0b01100111, // 'p', ord 0x70
|
0b01110011, // 'p', ord 0x70
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'q', ord 0x71
|
0b01100111, // 'q', ord 0x71
|
||||||
0b00000101, // 'r', ord 0x72
|
0b01010000, // 'r', ord 0x72
|
||||||
0b01011011, // 's', ord 0x73
|
0b01101101, // 's', ord 0x73
|
||||||
0b00000111, // 't', ord 0x74
|
0b01110000, // 't', ord 0x74
|
||||||
0b00011100, // 'u', ord 0x75
|
0b00011100, // 'u', ord 0x75
|
||||||
0b00011100, // 'v', ord 0x76
|
0b00011100, // 'v', ord 0x76
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'w', ord 0x77
|
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'w', ord 0x77
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'x', ord 0x78
|
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'x', ord 0x78
|
||||||
0b00100111, // 'y', ord 0x79
|
0b01110010, // 'y', ord 0x79
|
||||||
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'z', ord 0x7A
|
SPI_74HC595_DISPLAY_UNKNOWN_CHAR, // 'z', ord 0x7A
|
||||||
0b00110001, // '{', ord 0x7B
|
0b01000110, // '{', ord 0x7B
|
||||||
0b00000110, // '|', ord 0x7C
|
0b00110000, // '|', ord 0x7C
|
||||||
0b00000111, // '}', ord 0x7D
|
0b01110000, // '}', ord 0x7D
|
||||||
0b01100011, // '~', ord 0x7E (degree symbol)
|
0b01100011, // '~', ord 0x7E (degree symbol)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -126,18 +127,20 @@ void SPI_74HC595_DISPLAYComponent::dump_config() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPI_74HC595_DISPLAYComponent::display() {
|
void SPI_74HC595_DISPLAYComponent::display() {
|
||||||
|
uint32_t delay = static_cast<uint64_t>(this->get_update_interval())*1000 / 9;
|
||||||
for (uint8_t i = 0; i < 8; i++) {
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
this->enable();
|
this->enable();
|
||||||
for (uint8_t j = 0; j < this->num_chips_; j++) {
|
for (uint8_t j = 0; j < this->num_chips_; j++) {
|
||||||
if (reverse_) {
|
if (reverse_) {
|
||||||
this->send_byte_(1U << i, buffer_[(num_chips_ - j - 1) * 8 + i]);
|
this->send_byte_(~(1U << i), buffer_[(num_chips_ - j - 1) * 8 + i]);
|
||||||
} else {
|
} else {
|
||||||
this->send_byte_(1U << i, buffer_[j * 8 + i]);
|
this->send_byte_(~(1U << i), buffer_[j * 8 + i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this->disable();
|
this->disable();
|
||||||
// todo: add delay here for duty cycle adjustment?
|
delay_microseconds_safe(delay);
|
||||||
}
|
}
|
||||||
|
delay_microseconds_safe(delay);
|
||||||
// zero out everything to have a somewhat uniform duty cycle for all digits
|
// zero out everything to have a somewhat uniform duty cycle for all digits
|
||||||
this->enable();
|
this->enable();
|
||||||
for (uint8_t j = 0; j < this->num_chips_; j++) {
|
for (uint8_t j = 0; j < this->num_chips_; j++) {
|
||||||
|
@ -147,7 +150,7 @@ void SPI_74HC595_DISPLAYComponent::display() {
|
||||||
this->send_byte_(0, 0);
|
this->send_byte_(0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// todo: add delay here for duty cycle adjustment?
|
delay_microseconds_safe(delay);
|
||||||
this->disable();
|
this->disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ using spi_74hc595_display_writer_t = std::function<void(SPI_74HC595_DISPLAYCompo
|
||||||
|
|
||||||
class SPI_74HC595_DISPLAYComponent : public PollingComponent,
|
class SPI_74HC595_DISPLAYComponent : public PollingComponent,
|
||||||
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW,
|
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW,
|
||||||
spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_1MHZ> {
|
spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_10MHZ> {
|
||||||
public:
|
public:
|
||||||
void set_writer(spi_74hc595_display_writer_t &&writer);
|
void set_writer(spi_74hc595_display_writer_t &&writer);
|
||||||
|
|
||||||
|
|
|
@ -68,9 +68,9 @@ sensor:
|
||||||
display:
|
display:
|
||||||
- platform: spi_74hc595_display
|
- platform: spi_74hc595_display
|
||||||
cs_pin: GPIO5
|
cs_pin: GPIO5
|
||||||
data_rate: 5MHz
|
data_rate: 10MHz
|
||||||
num_chips: 3
|
num_chips: 3
|
||||||
update_interval: 40ms
|
update_interval: 16ms
|
||||||
lambda: |-
|
lambda: |-
|
||||||
static uint32_t clock_frames=0;
|
static uint32_t clock_frames=0;
|
||||||
static uint32_t old_clock=0;
|
static uint32_t old_clock=0;
|
||||||
|
@ -82,7 +82,7 @@ display:
|
||||||
clock_frames++;
|
clock_frames++;
|
||||||
}
|
}
|
||||||
|
|
||||||
it.printf(0, ".*-_'`,0");
|
it.printf(0, ".*`,_+'-");
|
||||||
/*it.strftime(0, "%H%M%s", id(sntp_time).now());*/
|
/*it.strftime(0, "%H%M%s", id(sntp_time).now());*/
|
||||||
/*it.printf(6, "%2d", clock_frames);*/
|
/*it.printf(6, "%2d", clock_frames);*/
|
||||||
|
|
||||||
|
@ -99,10 +99,10 @@ display:
|
||||||
|
|
||||||
# the first display should display a test string to figure out the digit and segment map:
|
# the first display should display a test string to figure out the digit and segment map:
|
||||||
# digit 0: >.< character (dot segment on)
|
# digit 0: >.< character (dot segment on)
|
||||||
# digit 1: >*< character (upper segment on)
|
# digit 1: >*< character (A upper segment on)
|
||||||
# digit 2: >-< character (middle segment on)
|
# digit 2: >`< character (B upper right segment on)
|
||||||
# digit 3: >_< character (lower segment on)
|
# digit 3: >,< character (C lower right segment on)
|
||||||
# digit 4: >'< character (upper left segment on)
|
# digit 4: >_< character (D lower segment on)
|
||||||
# digit 5: >`< character (upper right segment on)
|
# digit 5: >+< character (E lower left segment on)
|
||||||
# digit 6: >,< character (lower right segment on)
|
# digit 6: >'< character (F upper left segment on)
|
||||||
# digit 7: >9< character (all on, except lower left segment)
|
# digit 7: >-< character (G middle segment on)
|
||||||
|
|
Loading…
Reference in a new issue