Всем привет! Делаю свой проект часов на ESP32S2 от Espressif (досталась задарма, не кидайтесь камнями).
В общем проблема в том, что светодиоды горят тускловато(что, скорее всего, обусловлено хардвером).
Hardweare часть.
Управление светодиодами происходит за счет регистров 74hc595 и транзисторов 2n5551.
У меня 4 сегмента по 13 светодиодов для вывода чисел.
На 2 регистра поступает закодированная последовательность битов и светодиоды загораются в нужном порядке, но, поскольку, я использую только 2 регистра на 4 сегмента приходится ко всему прочему заюзать транзисторы. Транзисторы по сути своей работают в ключевом режиме, то есть в нужный момент открываются и замыкают цепь.
Более понятное объяснение: espшка послала биты -> регистр принял и послал на светодиоды нужную последовательность -> транзистор замкнул цепь -> следующий сегмент(повторить до полной готовности) и так все повторяется по кругу в бесконечном void loop().
Software часть.
Я управляю всем этим добром с помощью вот этой простой ф-ии.
Где
latchPin - пин так называемой "защелки" регистра.
dataPin - пин через который уходит последовательность битов.
clockPin - пин нужный для работы регистра (используется для синхронизации).
pin - пин на котором сидит база транзистора для конкретного сегмента.
number - закодированная последовательность битов.
В самом loopé это выглядит условно так.
Вот я и подошел к сути проблемы. Она состоит в задержке, в пресловутом delay(). Светодиодам нужно "успевать" загореться перед тем как погаснуть. Звучит странно, но вот в чем суть, транзистор открыт очень недолгое время и из-за этого режется ток протекающий через светодиоды ( КАК Я ЭТО ПОНИМАЮ ). Если убрать задержку совсем, то светодиоды практически погаснут. Есть ли способ как то это исправить программно? Может стоит вообще пересмотреть концепцию кода. Жду ваших ответов, спасибо!
В общем проблема в том, что светодиоды горят тускловато
Hardweare часть.
Управление светодиодами происходит за счет регистров 74hc595 и транзисторов 2n5551.
У меня 4 сегмента по 13 светодиодов для вывода чисел.
На 2 регистра поступает закодированная последовательность битов и светодиоды загораются в нужном порядке, но, поскольку, я использую только 2 регистра на 4 сегмента приходится ко всему прочему заюзать транзисторы. Транзисторы по сути своей работают в ключевом режиме, то есть в нужный момент открываются и замыкают цепь.
Более понятное объяснение: espшка послала биты -> регистр принял и послал на светодиоды нужную последовательность -> транзистор замкнул цепь -> следующий сегмент
Software часть.
Я управляю всем этим добром с помощью вот этой простой ф-ии.
C++:
void send_info_to_led(int pin,const byte *number)
{
digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW
shiftOut(dataPin, clockPin, LSBFIRST, number[0]);
shiftOut(dataPin, clockPin, LSBFIRST, number[1]); // передаем последовательно на dataPin
digitalWrite(latchPin, HIGH);
digitalWrite(pin,HIGH);
delay(1);
digitalWrite(pin,LOW);
}
latchPin - пин так называемой "защелки" регистра.
dataPin - пин через который уходит последовательность битов.
clockPin - пин нужный для работы регистра (используется для синхронизации).
pin - пин на котором сидит база транзистора для конкретного сегмента.
number - закодированная последовательность битов.
В самом loopé это выглядит условно так.
C++:
void loop()
{
send_info_to_led(40,numbers[0]);
send_info_to_led(39,numbers[1]);
send_info_to_led(38,numbers[2]);
send_info_to_led(21,numbers[3]);
}