テキストスクロール看板をAdafruit IO経由で操作する#15

CircuitPython

前回#14でのプログラムをAdafruit IO経由でIoT化していきます。

Adafruit IOとは

Adafruit IOは、Adafruit Industriesという企業が提供するインターネット・オブ・シングス(IoT)プラットフォームです。Adafruit IOを使用することで、インターネット経由でデータをCIRCUITPYに渡すことができます。

設定方法等はこちらで説明してありますので御覧ください。

feedとdashboardの作成

テキストデータを受け取るためのtextフィード、文字色を受け取るためのcolorフィード、背景色を受け取るためのbgcolorフィードを作成。ダッシュボードにはtextとcolor pickerを2つ用意します。

コード

#control my neopixel color and text via wifi
import board, time, neopixel
import os,ssl,socketpool,wifi
import adafruit_minimqtt.adafruit_minimqtt as MQTT
import neopixel
from adafruit_pixel_framebuf import PixelFramebuffer, VERTICAL

#setup neopixel
pixel_pin = board.GP28
pixel_width = 32
pixel_height = 8

pixels = neopixel.NeoPixel(
    pixel_pin,
    pixel_width * pixel_height,
    brightness=0.1,
    auto_write=False,
)

pixel_framebuf = PixelFramebuffer(
    pixels,
    32,
    8,
    orientation=VERTICAL,
    alternating= True,
    rotation=0
)

#get username and password from setting.toml
aio_username = os.getenv('aio_username')
aio_key = os.getenv('aio_key')

#setup the feed to listen
text_feed = aio_username + "/feeds/text"
color_feed = aio_username + "/feeds/color"
bgcolor_feed = aio_username + "/feeds/bgcolor"
text = "hello"
color = 0xaa0000
bgcolor = 0x000000

#setup functions to respond to MQTT

def connected(client, userdata, flags, rc):
    #connetted to broker at adafruit IO
    print("Connected to Adafruit IO")
    client.subscribe(text_feed)
    client.subscribe(color_feed)
    client.subscribe(bgcolor_feed)
def disconnected(client, userdata, rc):
    #discomnnected from the broker at adafruit IO
    print("disconnected from adafruit IO")

def message(client, topic, message):
    print(f"topic: {topic},message: {message}") 
    if topic == text_feed:
        global text
        text = message
        print(text)
    elif topic == color_feed:
        if message[0] == "#":
            message = message[1:]
            global color
            color = int(message,16)
            print(color)
    elif topic == bgcolor_feed:
        if message[0] == "#":
            message = message[1:]
            global bgcolor
            bgcolor = int(message,16)
            print(bgcolor)
    
#connect to WiFi
print(f"Connecting to WiFi")
wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD"))
print("connected!")
#create a socketpool
pool = socketpool.SocketPool(wifi.radio)

#set up a miniMQTT Client
mqtt_client = MQTT.MQTT(
    broker = os.getenv("BROKER"),
    port = os.getenv("PORT"),
    username = aio_username,
    password = aio_key,
    socket_pool = pool,
    ssl_context = ssl.create_default_context()
)
#setup the "callback"
mqtt_client.on_connect = connected
mqtt_client.on_disconnected = disconnected
mqtt_client.on_message = message

#connecting to the MQTT Broker
print("Connecting to IO")
mqtt_client.connect()
print("connected")

while True:
    mqtt_client.loop()
    for i in range(6 * len(text) + pixel_width):
        pixel_framebuf.fill(bgcolor)
        pixel_framebuf.text(text, pixel_width - i, 0, color)
        pixel_framebuf.display()

さてこれで完成かと思いきや、wifiの接続が切れたのでしょうか?一向に反応しないときがあります。チェックをしてもし必要なら再接続するプログラムが必要ですね。次回#16で完成させます。

タイトルとURLをコピーしました