Освой MicroPython играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Экран
Фигуры и текст
Картинка
Светодиодная панель
Нажатия кнопок
Динамик
IMU
Power
Светофор
Спецсимволы Unicode
Изучаем базовые возможности, которые предоставляет нам M5Stack на MicroPython.
Программа должна начинаться с трёх строчек импорта.
from m5stack import *
from m5ui import *
from uiflow import *
Либо вы можете указывать конкретные классы (см. примеры).
За экран отвечает lcd. Импортируем только этот класс для примеров.
Цвет задаётся шестнадцатеричными значениями или некоторыми константами: BLACK, NAVY, DARKGREEN, DARKCYAN, MAROON, PURPLE, OLIVE, LIGHTGREY, DARKGREY, BLUE, GREEN, CYAN, RED, MAGENTA, YELLOW, WHITE, ORANGE, GREENYELLOW, PINK.
Выводим текст на экране.
from m5stack import lcd
lcd.print('hello world!')
Рисуем линии по диагонали и круг в центре экрана.
from m5stack import lcd
lcd.line(0, 0, 320, 240, 0xff0000)
lcd.line(320, 0, 0, 240, lcd.BLUE)
lcd.circle(160, 120, 50, lcd.MAGENTA, lcd.GREEN)
Полный список методов lcd.
Будем выводить фигуры: прямоугольник, круг и текст и заголовок при помощи готовых классов из m5ui и uiflow.
from m5stack import *
from m5ui import *
from uiflow import *
setScreenColor(0xf50633)
title = M5Title(title="Title", x=3 , fgcolor=0xFFFFFF, bgcolor=0x0000FF)
rectangle = M5Rect(10, 30, 150, 100, 0x2bc766, 0xffffff)
circle = M5Circle(260, 85, 50, 0xe54f96, 0x2b1ecc)
label = M5TextBox(10, 150, "developer.alexanderklimov.ru", lcd.FONT_DejaVu18,0xf4e8e8, rotate=0)
Результат.
Можно загружать картинки в память или на карточку. По умолчанию уже есть одна картинка default.jpg. Выведем её на экран.
from m5stack import *
from m5ui import *
from uiflow import *
lcd.setBrightness(100)
setScreenColor(0x222222)
image = M5Img(110, 70, "res/default.jpg", True)
У M5Stack Fire есть светодиодная панель из 10 светодиодов. Мы можем задать яркость всей панели через setBrightness() от 0 до 100, а также установить нужный цвет по отдельности через setColor() или задать группу (левую или правую) через setColorFrom() или сразу установить цвет у всех светодиодов через setColorAll().
Для удобства вывел на экран подписанные прямоугольники, чтобы видеть порядок светодиодов в ленте.
from m5stack import *
from m5ui import *
from uiflow import *
setScreenColor(0x63715f)
rectangle1 = M5Rect(270, 10, 40, 40, 0xFFFFFF, 0xFFFFFF)
rectangle2 = M5Rect(270, 55, 40, 40, 0xFFFFFF, 0xFFFFFF)
rectangle3 = M5Rect(270, 100, 40, 40, 0xFFFFFF, 0xFFFFFF)
rectangle4 = M5Rect(270, 145, 40, 40, 0xFFFFFF, 0xFFFFFF)
rectangle5 = M5Rect(270, 190, 40, 40, 0xFFFFFF, 0xFFFFFF)
rectangle6 = M5Rect(10, 10, 40, 40, 0xFFFFFF, 0xFFFFFF)
rectangle7 = M5Rect(10, 55, 40, 40, 0xFFFFFF, 0xFFFFFF)
rectangle8 = M5Rect(10, 100, 40, 40, 0xFFFFFF, 0xFFFFFF)
rectangle9 = M5Rect(10, 145, 40, 40, 0xFFFFFF, 0xFFFFFF)
rectangle10 = M5Rect(10, 190, 40, 40, 0xFFFFFF, 0xFFFFFF)
label1 = M5TextBox(285, 20, "1", lcd.FONT_DejaVu18,0x242acd, rotate=0)
label2 = M5TextBox(285, 65, "2", lcd.FONT_DejaVu18,0x242acd, rotate=0)
label3 = M5TextBox(285, 110, "3", lcd.FONT_DejaVu18,0x242acd, rotate=0)
label4 = M5TextBox(285, 155, "4", lcd.FONT_DejaVu18,0x242acd, rotate=0)
label5 = M5TextBox(285, 200, "5", lcd.FONT_DejaVu18,0x242acd, rotate=0)
label6 = M5TextBox(25, 200, "6", lcd.FONT_DejaVu18,0x242acd, rotate=0)
label7 = M5TextBox(25, 155, "7", lcd.FONT_DejaVu18,0x242acd, rotate=0)
label8 = M5TextBox(25, 110, "8", lcd.FONT_DejaVu18,0x242acd, rotate=0)
label9 = M5TextBox(25, 65, "9", lcd.FONT_DejaVu18,0x242acd, rotate=0)
label10 = M5TextBox(18, 20, "10", lcd.FONT_DejaVu18,0x242acd, rotate=0)
# Управляем светодиодной лентой
rgb.setBrightness(10)
rgb.setColorFrom(6 , 10 ,0xff0000)
rgb.setColor(1, 0xcc33cc)
rgb.setColor(2, 0x33ff33)
rgb.setColor(3, 0x33ffff)
rgb.setColor(4, 0xffff66)
rgb.setColor(5, 0x000099)
rgb.setColor(6, 0xff99ff)
# rgb.setColorAll(0xff0000)
Примеры на функциях низкого уровня.
Выводим текст при нажатии кнопок A и B.
from m5stack import *
from m5ui import *
from uiflow import *
setScreenColor(0x222222)
label0 = M5TextBox(71, 85, "", lcd.FONT_Default,0xFFFFFF, rotate=0)
def buttonA_wasPressed():
# global params
label0.setText('Hello M5')
pass
btnA.wasPressed(buttonA_wasPressed)
def buttonB_wasPressed():
# global params
label0.setText('Good Bye')
pass
btnB.wasPressed(buttonB_wasPressed)
Другая организация кода. Кому как нравится.
from m5stack import *
from m5ui import *
from uiflow import *
setScreenColor(0x222222)
label0 = M5TextBox(71, 85, "", lcd.FONT_Default,0xFFFFFF, rotate=0)
def buttonA_wasPressed():
label0.setText('Hello M5')
def buttonB_wasPressed():
label0.setText('Good Bye')
btnA.wasPressed(buttonA_wasPressed)
btnB.wasPressed(buttonB_wasPressed)
Воспроизводим звуки. Одинокий звук пищалки с заданной частотой и продолжительностью можно вызвать через speaker.tone().
speaker.tone(1800, 200)
Также можно воспроизводить ноты через speaker.sing(). В первом параметре указываем ноту, во втором - его продолжительность. Небольшая таблица частот в английском формате нот для воспроизведения, как на пианино.
C | D | E | F | G | A | B | |
---|---|---|---|---|---|---|---|
Low | 131 | 147 | 165 | 175 | 196 | 220 | 247 |
Middle | 262 | 294 | 330 | 349 | 392 | 440 | 494 |
High | 523 | 587 | 659 | 698 | 784 | 880 | 988 |
from m5stack import *
speaker.sing(131, 1)
speaker.sing(165, 1)
speaker.sing(196, 1)
speaker.sing(220, 1/8)
speaker.sing(247, 1/4)
speaker.sing(448, 4)
В мелодиях часто ноты повторяются, поэтому используйте циклы.
Уровень громкости динамика можно установить через setVolume().
speaker.setVolume(1)
M5Stack содержит несколько датчиков IMU (inertial measurement unit).
Акселерометр и гироскоп.
from m5stack import *
from m5ui import *
from uiflow import *
import imu
setScreenColor(0x222222)
imu0 = imu.IMU()
labelX = M5TextBox(17, 23, "Gyro X", lcd.FONT_Default,0xFFFFFF, rotate=0)
labelY = M5TextBox(20, 62, "Gyro Y", lcd.FONT_Default,0xFFFFFF, rotate=0)
labelAccX = M5TextBox(17, 106, "Gyro Z", lcd.FONT_Default,0xFFFFFF, rotate=0)
while True:
wait(1)
labelX.setText(str(imu0.gyro[0]))
labelY.setText(str(imu0.gyro[1]))
labelAccX.setText(str(imu0.gyro[2]))
wait_ms(2)
Второй похожий пример с использованием других сенсоров.
from m5stack import *
from m5ui import *
from uiflow import *
import imu
setScreenColor(0x222222)
imu = imu.IMU()
rectangle0 = M5Rect(5, 29, 310, 205, 0x222222, 0xffffff)
label0 = M5TextBox(14, 60, "GyX: ", lcd.FONT_DejaVu24,0xFFFFFF, rotate=0)
gx_label = M5TextBox(89, 59, "???", lcd.FONT_DejaVu24,0xFFFFFF, rotate=0)
title0 = M5Title(title="MPU6050", x=3 , fgcolor=0xFFFFFF, bgcolor=0x0000FF)
label2 = M5TextBox(13, 119, "GyY:", lcd.FONT_DejaVu24,0xFFFFFF, rotate=0)
label3 = M5TextBox(13, 180, "GyZ:", lcd.FONT_DejaVu24,0xFFFFFF, rotate=0)
gy_label = M5TextBox(89, 120, "???", lcd.FONT_DejaVu24,0xFFFFFF, rotate=0)
gz_label = M5TextBox(89, 180, "???", lcd.FONT_DejaVu24,0xFFFFFF, rotate=0)
while True:
gx_label.setText(str(str((imu.ypr[1]))))
gy_label.setText(str(str((imu.ypr[2]))))
gz_label.setText(str(str((imu.gyro[2]))))
wait_ms(2)
Можем узнать уровень заряда, статус зарядки, заряжена ли полностью и установить в режим зарядки (закомментировано).
from m5stack import *
from m5ui import *
from uiflow import *
setScreenColor(0x111111)
chargingLabel = M5TextBox(10, 20, "isCharging", lcd.FONT_Default,0xFFFFFF, rotate=0)
fullCharginLabel = M5TextBox(10, 50, "fullChargin", lcd.FONT_Default,0xFFFFFF, rotate=0)
levelBatteryLabel = M5TextBox(10, 80, "Battery Level", lcd.FONT_Default,0xFFFFFF, rotate=0)
chargingLabel.setText("isCharging: " + str(power.isCharging()))
fullCharginLabel.setText("isChargeFull: " + str(power.isChargeFull()))
levelBatteryLabel.setText("Battery level: " + str(power.getBatteryLevel()))
#power.setCharge(True)
Рисуем три круга, при нажатии одной из трёх кнопок включаем тот или иной цвет, выключая остальные.
from m5stack import *
from m5ui import *
from uiflow import *
setScreenColor(0x222222)
label = M5TextBox(5, 5, "Светофор", lcd.FONT_UNICODE,0xFFFFFF, rotate=0)
redCircle = M5Circle(160, 59, 30, 0xeec9c9, 0x171616)
yellowCircle = M5Circle(160, 120, 30, 0xeae7c4, 0x171616)
greenCircle = M5Circle(160, 180, 30, 0xcaeccb, 0x171616)
def buttonA_wasPressed():
redCircle.setBgColor(0xff0000)
yellowCircle.setBgColor(0x171616)
greenCircle.setBgColor(0x171616)
pass
btnA.wasPressed(buttonA_wasPressed)
def buttonB_wasPressed():
redCircle.setBgColor(0x171616)
yellowCircle.setBgColor(0xffff00)
greenCircle.setBgColor(0x171616)
pass
btnB.wasPressed(buttonB_wasPressed)
def buttonC_wasPressed():
redCircle.setBgColor(0x171616)
yellowCircle.setBgColor(0x171616)
greenCircle.setBgColor(0x00ff00)
pass
btnC.wasPressed(buttonC_wasPressed)
Устройства M5Stack стали поддерживать Unicode и появилась возможность включать кириллицу. Но кроме кириллицы, мы можем также использовать различные спецсимволы - символ градуса и т.п. Выведем на экран некоторые символы, которые могут пригодиться.
from m5stack import *
from m5ui import *
from uiflow import *
setScreenColor(0x222222)
lcd.font(lcd.FONT_UNICODE)
lcd.text(0, 0, '✿ ☹ ☂ ⌇ ☎ ← → ↑ ↓ ✔ ★ ☆ ♺ ⚑ ⚐ ✉ ✄ ♦ ♣ ♠ ♥ ❤ ♡ ♪ ♩ ♫ ♬ ♯ ♀ ♂ ✖ « » § ¶ ※ ± × ~ ≈ ÷ ≠ π ¥ $ ¢ £ ß ° ‰ … ')