前回#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で完成させます。