清水@ロボット部 (日本Androidの会 秋葉原支部)です。
ロボット部 Googleグループ
https://groups.google.com/forum/?hl=ja#!forum/robot-android-group-japan-akb
WEMOS社 LOLIN32 ESP32 OLED ボード上の MicroPython で、 温度、湿度、気圧センサの値を、OLED(organic light-emitting diode)に表示してみました。
センサー
GAOHOUGY-BME280 温度、湿度、気圧センサ 1.8-5V
このセンサは小型で見た目が良い。測定精度が高いところも良いです。
温度:-40〜+ 85℃
湿度:0〜100%
圧力:300-1100hPa
温度:0.01℃
湿度:0.008%
圧力:0.18Pa
温度:+ 1℃
湿度:+ 3%
圧力:±1Pa
センサーテストプログラム (コンソール出力)
# BME280(Temperature,Humidity,Pressure) Sensor
# MicroPython on Lolin ESP32 OLED 128x64 16x6(0..50)
import machine, time
import bme280
i2cBME280 = machine.I2C(scl=machine.Pin(0), sda=machine.Pin(2))
bme = bme280.BME280(i2c=i2cBME280)
for i in range(3):
print(bme.values)
time.sleep(1)
('14.65C', '1010.97hPa', '35.86%')
('14.45C', '1011.02hPa', '37.08%')
('14.45C', '1010.95hPa', '36.91%')
プログラム(OLED出力)実行結果
右端にセンサーがあります。中央にあるディスプレイの表示は上から順に次の値を表示しています。
- 温度 ℃
- 湿度 %
- 気圧 hPa
- 時刻
- 日付
プログラム(OLED出力)
# BME280(Temperature,Humidity,Pressure) Sensor
# MicroPython on Lolin ESP32 OLED 128x64 16x6(0..50)
ssid = "777"; password = "7777777777"
ntp_host = "ntp.nict.jp"
# (datetime.date(2000, 1, 1) - datetime.date(1900, 1, 1)).days * 24 * 60 * 60
NTP_DELTA = 3155673600
import machine, time, ssd1306, bme280
import network, socket, struct
i2cBME280 = machine.I2C(scl=machine.Pin(0), sda=machine.Pin(2))
bme = bme280.BME280(i2c=i2cBME280)
i2cSSD1306 = machine.I2C(scl=machine.Pin(4), sda=machine.Pin(5))
oled = ssd1306.SSD1306_I2C(128, 64, i2cSSD1306)
oled.fill(0)
# '1234567890123456' 0_temperature,1_humidity,2_pressure,3_time,4_date
oled.text('BME280 on Python', 0, 50)
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False: pass
#oled.text(station.ifconfig()[0], 0, 0,1)
#oled.show()
NTP_QUERY = bytearray(48)
NTP_QUERY[0] = 0x1b
addr = socket.getaddrinfo(ntp_host, 123)[0][-1]
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
res = s.sendto(NTP_QUERY, addr)
msg = s.recv(48)
s.close()
val = struct.unpack("!I", msg[40:44])[0]
ntpSec = val - NTP_DELTA + (9*60*60)
deltaSec = ntpSec - time.time()
saveVal = [""] * 6
def f2(i): return '{:0>2}'.format(i)
def disp(pos, stringVal): # pos:0..5
global saveVal
oled.text(saveVal[pos], 0, pos * 10, 0)
saveVal[pos] = stringVal
oled.text(saveVal[pos], 0, pos * 10)
while True:
sensorStringTPH=bme.values
nowSec = time.time() + deltaSec
now = time.localtime(nowSec)
disp(0, sensorStringTPH[0])
disp(1, sensorStringTPH[2])
disp(2, sensorStringTPH[1])
disp(3, '%s:%s:%s' % (f2(now[3]),f2(now[4]),f2(now[5])))
disp(4, '%s/%s/%s' % (str(now[0]),f2(now[1]),f2(now[2])))
oled.show()
time.sleep(1)
参考
Driver for the Bosch BME280 for use with MicroPython on ESP8266 boards
https://github.com/catdog2/mpy_bme280_esp8266
LOLIN ESP32 OLED ボードの MicroPython で NTP時刻表示
https://qiita.com/tshimizu8/items/a7c189612a9ba0a5284b