VS Codeの使い勝手とMicroPythonどうなのよ。
ってことでPicoに足付けます。※ピンヘッダの向きは意図的です。
はんだ付け、もっとリハビリしないとダメですね。
撮影の都合上、Picoはブレッドボード上に載せてるだけです。
SDA:GP8 / SCL:GP9 / 3V3 / GND
MicroPythonでのI2C読み込みはBYTES型式で戻るので、前回の投稿からアクセス周り修正。
VS Codeだとソースに全角文字入ってた場合、実行時場所の分からないエラー出るので注意です。
Traceback (most recent call last): File "<stdin>", line 1 SyntaxError: invalid syntax
タイミングがシビアになるのかな?BME280の初期化後、読込エラーが発生。
初期データ書き込み後にウェイト入れました。
コード内「ProtSensorData」使ってません。
from machine import I2C,Pin import time i2c_numb = 0 i2c_addr = 0x76 sda = Pin(8) scl = Pin(9) freq = 100000 # 100kHz i2c = I2C(i2c_numb,sda=sda,scl=scl,freq=freq) dev = i2c.scan() if dev: for i in dev: print(hex(i)) digT = [] digP = [] digH = [] t_fine = 0.0 #-------------------------------------------------------------------------------- def readRegB(addr): dt = i2c.readfrom_mem(i2c_addr,addr,1) return dt[0] #-------------------------------------------------------------------------------- def readRegC(addr): ch = readRegB(addr) if(ch & 0x80): wd = (-ch ^ 0xFF)+1 return ch #-------------------------------------------------------------------------------- def readRegW(addr): dt = i2c.readfrom_mem(i2c_addr,addr,2) return dt[0] + (dt[1] << 8) #-------------------------------------------------------------------------------- def readRegS(addr): wd = readRegW(addr) if(wd & 0x8000): wd = (-wd ^ 0xFFFF)+1 return wd #-------------------------------------------------------------------------------- def writeReg(addr,data): i2c.writeto_mem(i2c_addr,addr,data) #-------------------------------------------------------------------------------- # setup # ctrl_hum : osrs_h[2-0] # ctrl_meas : osrs_t[7-5] osrs_p[4-2] mode[1-0] # config : t_sb[7-5] filter[4-2] spi3w_en[0] #-------------------------------------------------------------------------------- def setup(): writeReg(0xF2,b'\x02') # ---- |- 010 writeReg(0xF4,b'\x4B') # 010 0|10 11 writeReg(0xF5,b'\xA0') # 101 0|00 - 0 time.sleep(0.1) #-------------------------------------------------------------------------------- # get_calib_param #-------------------------------------------------------------------------------- def get_calib_param(): # T1 ~ T3 digT.append(readRegW(0x88)) digT.append(readRegS(0x8A)) digT.append(readRegS(0x8C)) # P1 ~ P9 digP.append(readRegW(0x8E)) for i in range(0x90,0xA0,2): digP.append(readRegS(i)) # H1 ~ H6 digH.append(readRegB(0xA1)) digH.append(readRegS(0xE1)) digH.append(readRegB(0xE3)) e4 = readRegB(0xE4) e5 = readRegB(0xE5) e6 = readRegB(0xE6) digH.append((e4 << 4) | (e5 & 0x0F)) digH.append((e5 >> 4) | (e6 << 4)) digH.append(readRegC(0xE7)) #-------------------------------------------------------------------------------- def ProtSensorData(): print('Sensor data') offset = 0 buf = i2c.readfrom_mem(i2c_addr,0x88,0xe8-0x88) for i in buf: if offset % 8 == 0: print('\n' + hex(0x88 + offset), end=': ') print('{0:02X} '.format(i), end='') offset = offset + 1 #-------------------------------------------------------------------------------- def compensate_T(adc_T): global t_fine v1 = (adc_T / 16384.0 - digT[0] / 1024.0) * digT[1] v2 = (adc_T / 131072.0 - digT[0] / 8192.0) * (adc_T / 131072.0 - digT[0] / 8192.0) * digT[2] t_fine = v1 + v2 t = t_fine / 5120.0 return t #-------------------------------------------------------------------------------- def compensate_P(adc_P): global t_fine p = 0.0 v1 = (t_fine / 2.0) - 64000.0 v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * digP[5] v2 = v2 + ((v1 * digP[4]) * 2.0) v2 = (v2 / 4.0) + (digP[3] * 65536.0) v1 = (((digP[2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8) + ((digP[1] * v1) / 2.0)) / 262144 v1 = ((32768 + v1) * digP[0]) / 32768 if v1 == 0: return 0 p = ((1048576 - adc_P) - (v2 / 4096)) * 3125 if p < 0x80000000: p = (p * 2.0) / v1 else: p = (p / v1) * 2 v1 = (digP[8] * (((p / 8.0) * (p / 8.0)) / 8192.0)) / 4096 v2 = ((p / 4.0) * digP[7]) / 8192.0 p = p + ((v1 + v2 + digP[6]) / 16.0) return p / 100 #-------------------------------------------------------------------------------- def compensate_H(adc_H): global t_fine var_h = t_fine - 76800.0 if var_h != 0: var_h = (adc_H - (digH[3] * 64.0 + digH[4]/16384.0 * var_h)) var_h *= (digH[1] / 65536.0 * (1.0 + digH[5] / 67108864.0 * var_h * (1.0 + digH[2] / 67108864.0 * var_h))) else: return 0 var_h = var_h * (1.0 - digH[0] * var_h / 524288.0) if var_h > 100.0: var_h = 100.0 elif var_h < 0.0: var_h = 0.0 return var_h #-------------------------------------------------------------------------------- def readData(): dat = i2c.readfrom_mem(i2c_addr,0xF7,8) p_raw = (dat[0] << 12) | (dat[1] << 4) | (dat[2] >> 4) t_raw = (dat[3] << 12) | (dat[4] << 4) | (dat[5] >> 4) h_raw = (dat[6] << 8) | dat[7] t = compensate_T(t_raw) p = compensate_P(p_raw) h = compensate_H(h_raw) d = 0.81 * t + 0.01 * h * (0.99 * t - 14.3) + 46.3 return [t,p,h,d] #-------------------------------------------------------------------------------- setup() get_calib_param() if __name__ == '__main__': if readRegB(0xD0) == 0x60: print("BME280") else: print("BMP280") dat = readData() print("T:%3.2f C" % dat[0]) print("P:%5.1f hPa" % dat[1]) print("H:%3.2f %%" % dat[2]) print("D:%3.2f" % dat[3]) #-------------------------------------------------------------------------------- #EOF
実行結果はこんな感じです。
(I2C addr,CHIP型番,温度,気圧,湿度,不快指数)
Runしてもレスポンス悪いタイミングが多々ありました。なんだろう。。
Picoに対応した各モジュールのライブラリ量、またはC/C++に走るか。
悩ましいところですね。
コメント