1,000万円を超えたbitcoinを少しだけどもらえるURL
https://bitflyer.com/invitation?id=l50e5ljw&lang=ja-JP
ハピタスからポイントもらえるURL
ハピタス登録で1,000円分になるURL
RaspberryPi Pico W を2台GET
買った。電子工作は初なのでついでにケーブル類も。
1台1,200円(2023/04/30時点)。無線機能がなければ700円くらい?らしいが、それじゃ意味ない。
実はアキバに来たのは仕事で絡んだ人から「ディフューザーってIoT化できます?」って相談をもらったからだ。
左の黒い箱がディフューザー。こいつにRaspberryPi Picoを組み込んでIoT化できないかな?というのが今回の目論見。
Amazonで買うと5,480円もしてしまうシロモノのだが
サン○ーレアモノショップでGW特価の…
3,480円!安い!
製品名はTHANKO MODEL:C-LFH21W。
これでリモコン操作できて、見た目も結構キレイ。
動画で見るとこんな感じ。
https://data.thanko.jp/product/img-product/c-lfh21w.mp4
ちなみに上の写真の右側はハンディ扇風機。ガラガラで当たった。幸先良い。
この製品、要は加湿器なんだけどアロマとか入れて良い香りを出したい+それをIoT化してスマホで操作したりタイマーで目覚めるときにアロマの香りを漂わせたりしたいとのことなので、例えばこいつの中にラズパイPicoを組み込んでミストの発生や停止を操作できないか?を試したい。
ちなみに、Raspberry Pico Wを買うついでに、家にあるラズパイ4のファン付きケースも買った。
これから夏に向けて大活躍するだろう。
RaspberryPi Pico W のセットアップ
ここの動画わかりやすいな。
動画どおりに進めてみる。
MicroPythonをインストール
いよいよ繋いでみる。
こうやればいいらしい。
macOSだとDragDropでいけるようだが…
Windowsでも同じかな。やってみると…
同じだった。書き込まれた直後にアンマウントされる仕組みらしい。
VS Codeをダウンロード+インストールする。
インストール完了。
拡張機能のPico-Goを探す。Pico-Go-Wってのがあった。これだな。
インストール。
拡張機能がなぜかPicoを認識しない。
どうやらこのPico-W-Go拡張機能の画面からPicoのファームウェアをアップデートしないと認識できないようだ。
ファームウェアの最新バージョンは20230426版だった。古いの入れちゃってたのか。
もっかいこいつでPico Wに上書きする。
もっかいPicoの本体ボタン押しながらUSBでPCに繋いで、以下のINDEXファイルからファームウェアのDLをもっかいやってみる。
3度目の上書き…
でも認識しない…なぜ。
VS Codeが原因だった
何度やってもダメなのでVS Codeを捨てて Thonny なるソフトウェア開発環境で試したらアッサリPico を認識した。
ウィンドウ右下で接続先を選べる。こういう分かりやすさがVScodeには無い。
やっぱどうもマイクロソフト製品っていいことないな。
Lチカもバッチリ動く。
まずはLチカうまくいったのでよかった。あとはディフーザーのほうの仕組みを調べる。AROMA ON にしたら動作してほしいのだから
・リモコンの信号をPicoから出す(これはハードないからムズかろう)
・ディフューザー本体の基盤にPicoを繋いでONの指令を出す(基盤を調べないといけない)
おまけ
VS codeはWSLからも使える(拡張機能で)っぽい。これはあとで試す。
Pico と Pico W の違い。
ソース。まんまで動いた。
import time
import network
import socket
from machine import Pin
led = Pin("LED", machine.Pin.OUT)
ledState = 'LED State Unknown'
#自宅Wi-FiのSSIDとパスワードを入力
ssid = 'YOUR NETWORK SSID'
password = 'YOUR NETWORK PASSWORD'
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
html = """<!DOCTYPE html><html>
<head><meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:,">
<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}
.buttonGreen { background-color: #4CAF50; border: 2px solid #000000;; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; }
.buttonRed { background-color: #D11D53; border: 2px solid #000000;; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; }
text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
</style></head>
<body><center><h1>Raspberry Pi Pico W</h1></center><br><br>
<form><center>
<center> <button class="buttonGreen" name="led" value="on" type="submit">LED ON</button>
<br><br>
<center> <button class="buttonRed" name="led" value="off" type="submit">LED OFF</button>
</form>
<br><br>
<br><br>
<p>%s<p></body></html>
"""
# Wait for connect or fail
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
raise RuntimeError('network connection failed')
else:
print('Connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('listening on', addr)
# Listen for connections, serve client
while True:
try:
cl, addr = s.accept()
print('client connected from', addr)
request = cl.recv(1024)
print("request:")
print(request)
request = str(request)
led_on = request.find('led=on')
led_off = request.find('led=off')
print( 'led on = ' + str(led_on))
print( 'led off = ' + str(led_off))
if led_on == 8:
print("led on")
led.value(1)
if led_off == 8:
print("led off")
led.value(0)
ledState = "LED is OFF" if led.value() == 0 else "LED is ON" # a compact if-else statement
# Create and send response
stateis = ledState
response = html % stateis
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
except OSError as e:
cl.close()
print('connection closed')