Цифровая электроника для начинающих (Елисеев) - страница 60


value = 0


while True:

# Clear screen


draw.rectangle((0,0,width,height), outline=0, fill=0)


draw.text((x, top), "Hello world", font=font, fill=255)


draw.text((x, top+8), "Value "+ str(value), font=font, fill=255)


disp.image(image)


disp.display()


time.sleep(0.5)


Разберем код подробнее. Директивы import подключают необходимые библиотеки. Затем мы создаем в памяти объект disp класса Adafruit_SSD1306.SSD1306_128_64 (либо 128_32, если мы имеем такой дисплей). i2c_address - это адрес дисплея. Функция ImageFont.load_default, как нетрудно догадаться из названия, загружает в память шрифт. Затем, с помощью функции Image.new мы создаем в памяти монохромное изображение-буфер, в которое будем рисовать данные. Подготовленное изображение выводится с помощью метода disp.image(), метод disp.display() обновляет картинку на экране. Такая технология называется “двойной буфер” (double buffer), изображение сначала формируется в памяти, и только затем обновляется, это позволяет избежать мерцания.


Самостоятельная работа: изучить код примера examples/stats.py, в нем можно найти полезные функции, например для получения IP-адреса устройства. Исходный текст stats.pyможно найти на github.

4.7. Подключаем кнопки

Раз уж мы подключили дисплей, остался последний шаг для создания автономного устройства на базе Raspberry Pi - добавить поддержку кнопок. Тем более, что для тех кто читал главу 3.2 про порты ввода-вывода на ESP32, все будет просто - принцип остается тот же.


Напомним общую идею, которая обсуждалась еще в первой части про Arduino - специальный резистор “подтягивает” напряжение до шины питания, а кнопка при необходимости замыкает его на землю:


На Raspberry Pi все то же самое, только резистор уже встроенный, и ставить его отдельно не надо. Ну и напряжение не 5В, а 3.3В, но для пользователя это ни на что не влияет. В итоге, схема получается проще некуда: просто подключаем кнопку, которая соединяет вывод с “землей”:



А вот код, в отличие от Arduino, будет немного отличаться.

Точнее говоря, есть два способа.


Способ-1. Код в стиле Arduino.


import RPi.GPIO as GPIO


import time


btn_pin = 24 # Button to GPIO24



# Setup

GPIO.setmode(GPIO.BCM)


GPIO.setup(btn_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)


try:

# Loop


while True:


button_state = GPIO.input(btn_pin)


if button_state == False:


print 'Button Pressed...'


time.sleep(0.2)


except:


GPIO.cleanup()


Как можно видеть, здесь состояние кнопок читается в бесконечном цикле while True, и если значение кнопки равно логическому нулю, мы делаем какое-то действие.