Подключаем семисегметные индикаторы используя сдвиговые регистры SN74HC595 к микроконтроллеру ESP8266 с помощью языка microPython.

В данном уроке мы с Вами подключим сдвиговый регистр SN74HC595 к микроконтроллеру ESP8266 с помощью языка microPython используя SPI:

Назначение выводов:

   Vcc – Питание
   Q0 – Q7  – Параллельные выходы
   DS – Вход для последовательных данных
   OE – Вход для переключения состояния выходов из высокоомного в рабочее состояние
   STCP – защелкивание выходов
   SHCP – Вход для тактовых импульсов
   MR – Сброс значений регистра
   Q7S – Выход для последовательного соединения регистров
   GND – Земля
Для работы с данным регистром выводы подключим следующим образом:
   Q0-Q7 подключим светодиоды
   VCC, GND – питание +5V
   DS – передача данных
   OE – на GND
   STCP – защелкивание регистра
   SHCP – синхронизация
   MR  – +5V

Но, для начала рассмотрим  сам SPI, microPython потдерживает как программный так и аппаратный SPI. Отличаются они только скоростью работы (программный — максимум 10МГц, аппаратный — максимум 80МГц) и выводами (программный можно реализовать на всех доступных ножках, аппаратный  GPIO12 (MISO), GPIO13 (MOSI) и GPIO14 (SCK)).

Теперь рассмотрим настройки SPI и работу с ним:

Инициализация для программного SPI:

from machine import Pin, SPI
spi = SPI(1, baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4))

Инициализация для аппаратного SPI:

from machine import Pin, SPI
spi = SPI(1, baudrate=800000, polarity=0, phase=0)

Как уже видно  -1 указывает, что мы используем программный SPI, 1 указывает, что у нас аппаратный SPI.

polarity — указывает уровень сигнала, когда SPI не работает. 

phase  — выборка данных:  0 —  выборка данных происходит по переднему фронту тактового сигнала, а 1 — по заднему.

Все остальное одинаково как для аппаратного так и программного SPI:

spi.init(baudrate=100000)  задать скорость коммуникации в бодах;

 spi.read(10) — читает 10 байт на MISO-линии;

spi.read(10, 0xff) -читает 10 байт и передает на MOSI-линию значение «0xff»;

buf = bytearray(40) создаем буфер для обмена данных для SPI;

 spi.readinto(buf)  —  сохраняет считанные данные в заданный буфер(в данном случае его размер будет 40 байт);

spi.readinto(buf, 0xff) сохраняет считанные данные в заданный буфер и передает на MOSI-линию значение «0xff»;

spi.write(b‘12345’) записывает 5 байт на MOSI-линию;

spi.write_readinto(b‘1234’, buf)  — записывает на MOSI-линию  и читает из MISO-линии в буфер;

spi.write_readinto(buf, buf)  — записывает данные буфера в MOSI-линию и сохраняет данные из MISO в буфер.

Для большой пользы в написании кода, мы с Вами подключим через сдвиговый регистр 74HC595 три семисегментных индикатора.  У меня семисегментные индикаторы с обратным включением, если у Вас семисегментные индикаторы с прямым включении, Вам нужно будет поменять 1 на 0 в данных которые отправляем на сдвиговый регистр.

Схема подключения:

 

Так как семисегментные индикаторы имеют разные распиновки, я буду в программе использовать свои коды для отображения цифр, Вы сами уже под свой семисегметный индикатор составите свои коды, опираясь на картинку ниже:

Программный код:

from machine import Pin, SPI
import time

hspi = SPI(1, baudrate=5000000, polarity=0, phase=0)
led4 = Pin(4, Pin.OUT)
buf = bytearray(3)
k1 = 0
k2 = 0
k3 = 0
k = 0

def int(n):
   if n == 0:
       t = 0x11 #0
   if n == 1:
       t = 0x7d #1
   if n == 2:
       t = 0x89 #2
   if n == 3:
       t = 0x29 #3
   if n == 4:
       t = 0x65 #4
   if n == 5:
       t = 0x23 #5
if n == 6:
   t = 0x03 #6
if n == 7:
   t = 0x79 #7
   if n == 8:
    t = 0x01 #8
  if n == 9:
    t = 0x21 #9
  return t

def seg(n1, n2, n3):
    buf[0] = int(k3)
    buf[1] = int(k2)
    buf[2] = int(k1)
    hspi.write(buf)
   led4.on()
   led4.off()

while True:
    k=k+1
    if k == 1000:
      k=0
    k1 = k//100
    k2 = (k - k1*100)//10
    k3 = k - k1*100 - k2*10
    seg(k1, k2, k3)
    time.sleep(0.5)