Skip to content

Instantly share code, notes, and snippets.

@ikaruga777
Last active March 18, 2019 18:12
Show Gist options
  • Save ikaruga777/040c91bea48f357a9c9ab2b32d0d18ba to your computer and use it in GitHub Desktop.
Save ikaruga777/040c91bea48f357a9c9ab2b32d0d18ba to your computer and use it in GitHub Desktop.
m5stack

これが原稿です。

この章ではmicropythonでWifiスキャナーを作ります。周りの2.4GHz帯のWifiリストを出しつつ、電波強度を音の高さで表すことができます。

micropythonのファームウェアを焼く

ampy, screenでデバッグする

wifi.scanの結果を出力する

network.scan()で取れる値は ssid,bssid,channel,RSSI,auth_method,hiddenの6要素がtupleで入ってます。

音を出す

Timer already use

表示処理とスキャン処理をスレッドに切り分ける

from m5stack import *
import network
import time
import _thread
class WifiList:
def __init__(self, fontHeight):
self.access_points = []
self.cursor = 0
self.fontHeight = fontHeight
def scan(self, wifi):
self.access_points = wifi.scan()
if self.cursor >= len(self.access_points):
self.cursor = len(self.access_points)
def move_cursor(self):
color = lcd.WHITE
if hasattr(self, 'target') and wifi_list.target is not None and self.target[0] == self.access_points[self.cursor][0]:
color = lcd.RED
lcd.text(0, self.cursor * self.fontHeight, self._access_point_format(self.access_points[self.cursor]), color)
self.cursor = self.cursor + 1
if self.cursor >= len(self.access_points):
self.cursor = 0
lcd.text(0, self.cursor * self.fontHeight, self._access_point_format(self.access_points[self.cursor]), lcd.YELLOW)
def subscribe(self):
self.target = self.access_points[self.cursor]
return self.target
def cancel(self):
self.target = None
def show_list(self):
lcd.setCursor(0, 0)
lcd.clear(0xEEEEEE)
for index, sta in enumerate(self.access_points):
color = lcd.WHITE
if hasattr(self, 'target') and wifi_list.target is not None and self.target[0] == sta[0]:
color = lcd.RED
elif self.cursor == index:
color = lcd.YELLOW
lcd.text(lcd.LASTX,lcd.LASTY, self._access_point_format(sta), color)
def _access_point_format(self, sta):
return "{0}: {1}:{2}-{3}\r\n".format(sta[0].decode('UTF-8'), sta[3],sta[4],sta[5])
def on_wasAPressed():
wifi_list.move_cursor()
def on_wasBPressed():
wifi_list.subscribe()
def scan_wifi():
while True:
wifi_list.scan(wifi)
wifi_list.show_list()
time.sleep_ms(30)
buttonA.wasPressed(on_wasAPressed)
buttonB.wasPressed(on_wasBPressed)
lcd.setCursor(0, 0)
lcd.setColor(lcd.BLACK)
lcd.clear(lcd.BLACK)
fw, fh = lcd.fontSize()
speaker.volume(1)
lcd.text(0,0,'initialize wifi..')
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi_list = WifiList(fh)
wifi_list.scan(wifi)
wifi_list.show_list()
def main():
while True:
if hasattr(wifi_list, 'target') and wifi_list.target is not None:
target_access_point = wifi_list.target
if buttonC.isPressed():
wifi_list.cancel()
rssi = list(filter(lambda s: s[0] == target_access_point[0], wifi_list.access_points))[0][3]
if rssi in range(0,-30,-1):
freq = 6600
elif rssi in range(-30,-40,-1):
freq = 5500
elif rssi in range(-40,-50,-1):
freq = 4400
elif rssi in range(-50,-67,-1):
freq = 3300
elif rssi in range(-68,-70,-1):
freq = 2200
elif rssi in range (-71,-80,-1):
freq = 1100
elif rssi in range (-81,-90,-1):
freq = 800
else:
freq = 100
# speaker.tone(freq,20)
time.sleep_ms(100)
main_id = _thread.start_new_thread('main', main,())
_thread.start_new_thread('scan_wifi', scan_wifi, ())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment