元ネタ
Raspberry Pi Pico W | Create a Simple HTTP Server
元ネタページでは2つのボタンでLEDのON/OFFをやっています。
同じことをやってもしようがないので、こんなことをやってみます。
すっぴんのPico W でいじれるものといえばLEDと内部温度センサーくらいしかありませんので、これらを触ってみます。
●LED点灯・消灯 : トグルでLEDの点灯/消灯
●温度センサー値取得 : クリックして内臓温度センサーの値を取得
●結果や状態を下部に表示します。
コード
開発環境は以下を参照
Pi PicoにMicroPythonをセットアップして実行してみる(メモ)
htmlコードには記述を追加して日本語化しています。
起動の一連の流れ
開始でLED点灯
Wi-Fi に接続
接続完了でLED消灯(開始から完了まで数秒くらいですが、いつまでたっても消灯しない場合はネット接続に失敗しています、再度Pico W を抜き差ししてください)
サーバー起動してアクセス待ち
【main.py】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
import time import network import socket import machine # LED led = machine.Pin("LED", machine.Pin.OUT) ledState = 'LED State Unknown' # Aボタンの状態変数 val_A = 0 temp = "" # 内部温度取得関数 sensor_temp = machine.ADC(4) conversion_factor = 3.3 / (65535) def readtemperature(): reading = sensor_temp.read_u16() * conversion_factor # The temperature sensor measures the Vbe voltage of a biased bipolar diode, connected to the fifth ADC channel # Typically, Vbe = 0.706V at 27 degrees C, with a slope of -1.721mV (0.001721) per degree. temperature = 27 - (reading - 0.706)/0.001721 return str(temperature) #--------------------------------------------- # 起動開始でLED点灯 led.value(1) # 自宅Wi-FiのSSIDとパスワード設定 ssid = '<SSID>' password = 'パスワード' # ネットワーク接続 wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(ssid, password) # HTML html = """<!DOCTYPE html><html lang="ja"> <head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="data:,"> <style>html { font-family: sans-serif; display: inline-block; margin: 0px auto; text-align: center;} .buttonA { background-color: #ffffff; border: 2px solid #000000;; color: black; padding: 15px 64px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; } .buttonB { background-color: #ffffff; border: 2px solid #000000;; color: black; padding: 15px 64px; 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>Pi Pico W OPs</h1></center><br><br> <form><center> <center> <button class="buttonA" name="job" value="A" type="submit">LED 点灯・消灯</button> <br><br> <center> <button class="buttonB" name="job" value="B" type="submit">温度センサー値取得</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] ) # 起動が完了したらLED消灯 led.value(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('job=A') temp_on = request.find('job=B') print( 'LED = ' + str(led_on)) print( 'TEMP = ' + str(temp_on)) if led_on == 8: if val_A == 0: led.value(1) val_A = 1 else: led.value(0) val_A = 0 print("led on") if temp_on == 8: print("temp on") temp = readtemperature() #led.value(0) ledState = "LED OFF:" if led.value() == 0 else "LED ON:" # a compact if-else statement # Create and send response stateis = ledState + ":" + temp + "℃" 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') |
ブラウザーで接続するIPアドレスについて
開発環境のThonny に表示されるログ確認、あるいはNetEnum などでネットワーク内のアドレスを検索して新規に出てきたアドレスで確認
Leave a Reply