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, и если значение кнопки равно логическому нулю, мы делаем какое-то действие.