Освой MicroPython играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

M5Stack: Базовые возможности на MicroPython

Экран
Фигуры и текст
Картинка
Светодиодная панель
Нажатия кнопок
Динамик
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)

Результат.

Basic components

Картинка

Можно загружать картинки в память или на карточку. По умолчанию уже есть одна картинка default.jpg. Выведем её на экран.


from m5stack import *
from m5ui import *
from uiflow import *

lcd.setBrightness(100)
setScreenColor(0x222222)

image = M5Img(110, 70, "res/default.jpg", True)
Image

Светодиодная панель

У 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)
RGB LED

Примеры на функциях низкого уровня.

Нажатия кнопок

Выводим текст при нажатии кнопок 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(). В первом параметре указываем ноту, во втором - его продолжительность. Небольшая таблица частот в английском формате нот для воспроизведения, как на пианино.

CDEFGAB
Low131147165175196220247
Middle262294330349392440494
High523587659698784880988

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)

IMU

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)

Power

Можем узнать уровень заряда, статус зарядки, заряжена ли полностью и установить в режим зарядки (закомментировано).


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)

Спецсимволы Unicode

Устройства M5Stack стали поддерживать Unicode и появилась возможность включать кириллицу. Но кроме кириллицы, мы можем также использовать различные спецсимволы - символ градуса и т.п. Выведем на экран некоторые символы, которые могут пригодиться.


from m5stack import *
from m5ui import *
from uiflow import *

setScreenColor(0x222222)

lcd.font(lcd.FONT_UNICODE)
lcd.text(0, 0, '✿ ☹ ☂ ⌇ ☎ ← → ↑ ↓ ✔ ★ ☆ ♺ ⚑ ⚐ ✉ ✄ ♦ ♣ ♠ ♥ ❤ ♡ ♪ ♩ ♫ ♬ ♯ ♀ ♂ ✖ « » § ¶ ※ ± × ~ ≈ ÷ ≠ π ¥ $ ¢ £ ß ° ‰ … ')
Реклама