ラズベリーパイPICOで温度・湿度・気圧を…⑥データを保存する
ラズベリーパイPICOで小さな温度・湿度・気圧の測定器を作りました。ラズベリーパイPICOで温度・湿度・気圧を…⑤ケース製作と収納→2021/3/30ブログプログラムを改変して得られたデータを測定器内に記録できるようにしました。データの取り込みをSUB化すればもっとすっきりしたものになると思いますが、とりあえず動けばいいや、という感じで作りました。(1)pico内の不揮発性メモリーにcsv形式"temp_humi_Pres.csv"で測定値を記録するようにプログラムを変えました。書き換え・追加部分は と 。 記録モードへの切り替えは、プログラム内の 部分で変更する①log = 0でOLED表示・記録なし、log = 1でOLED消灯・記録②date_time = "yy/mm/dd hh:mm:ss"に日時を入れておく (pico内にリアルタイムクロックがないので)③記録時間は秒単位でLOGt = 3600、間隔はLOGi = 30に入れておく (例)測定時間3600秒、間隔30秒④データは temp_humi_Pres.csvにappendされる⑤ファイルが削除されていても新たに作られる <改変したプログラムは以下です>############### SSD1306 OLED Display BMP280 I2C Tests with the Raspberry Pi Pico# modeified 2021/3/25 by cyn# modeified Data logging "temp_humi_Pres.csv" 2021/4/17 by cyn# original# https://github.com/raspberrypi/pico-micropython-examples/tree/master/i2c/1306oled###############from machine import Pin, I2Cfrom ssd1306 import SSD1306_I2Cimport framebuf,sys,time,utime,machinefrom bme280 import BME280pix_res_x = 128 # SSD1306 horizontal resolutionpix_res_y = 32 # SSD1306 vertical resolutioni2c_dev = I2C(0,scl=Pin(1),sda=Pin(0),freq=400000) # start I2C on I2C0 (GPIO 0/1)i2c_addr = [hex(ii) for ii in i2c_dev.scan()] # get I2C address in hex formati2c = I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)oled = SSD1306_I2C(pix_res_x, pix_res_y, i2c_dev) # oled controlleroled.fill(0)led = Pin(25, Pin.OUT)# ========================# For data logging# log=0 show OLED log=1 Logging onlylog = 0date_time = "yy/mm/dd hh:mm:ss"# Data logging time in secondsLOGt = 3600# Data logging interbal in secondsLOGi = 30# ========================i = 0bme = BME280(i2c = i2c)while log < 1:# Display Mode :OLED display on & LED off------------------ led.value(0) # No logging but show OLED t, p, h = bme.read_compensated_data() p = p // 256 pi = p // 100 pd = p - pi * 100 hi = h // 1024 hd = h * 100 // 1024 - hi * 100 #add some text oled.fill(0) oled.text("Humi: . %",0,20) oled.text("Temp: C",0,0) oled.text(str(t/100),48,0) oled.text("Press: hP",0,10) oled.text(str(pi),48,10) oled.text(str(hi),48,20) oled.text(str(hd),70,20) #oled show oled.show() utime.sleep(2) # wait 2sec# Logging Mode :OLED display off & LED on-----------else: # Opens a file for writing only and will create a new file tpfile=open("temp_humi_Pres.csv","a") tpfile.write(date_time + "\n") #LOGt(Logging time),LOGi(Logging interbal) in second tpfile.write("LOGtime:"+str(LOGt)+" LOGinterbal:"+str(LOGi)+" [sec]"+"\n") tpfile.write("No"+","+"temp[C]"+ "," +"humi[%]"+ "," +"press[hP]" + "\n") tpfile.flush() while i < (LOGt/LOGi): led.value(1) # Board led on in logging t, p, h = bme.read_compensated_data() p = p // 256 pi = p // 100 pd = p - pi * 100 hi = h // 1024 hd = h * 100 // 1024 - hi * 100 tpfile.write(str(i)+","+str(t/100)+","+str(hi)+"."+str(hd)+","+str(pi) + "\n") tpfile.flush() time.sleep(LOGi) i += 1 led.value(0) # Board led off<以上です>(2)エディターのTHONNYでpico内にできたファイル"temp_humi_Pres.csv"を開きます。内容は以下です。Excelで読み込み、グラフに加工します。内容は12800秒観測、間隔は1分です。うち100件をグラフ化しました。今日はこれまで。