Raspberry pi 4 で温湿度センサーを付けて、気温湿度に合わせてLEDを点灯させたいです。
Raspberry Pi 4にインストールしたOSはMac用のRaspbian です。
センサーはBME280、LEDはNeo Pixel 16連リングを使用、通信はi2cを使ってます。
python3で実行した際に以下のエラーメッセージが出ます。
temp, press, hum = readData() TypeError: cannot unpack non-iterable NoneType object
他の方よりご教示いただき、上のエラーメッセージより、readDataの内容を確認してみました。
内容は次の通りです。
def readData(): data = [] for i in range (0xF7, 0xF7+8): data.append(bus.read_byte_data(i2c_address,i)) pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) hum_raw = (data[6] << 8) | data[7] compensate_T(temp_raw) compensate_P(pres_raw) compensate_H(hum_raw)
上の内容をもとに関連するコードを探してみたところ、次のコードが見つかりました。
def compensate_P(adc_P): global t_fine pressure = 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 pressure = ((1048576 - adc_P) - (v2 / 4096)) * 3125 if pressure < 0x80000000: pressure = (pressure * 2.0) / v1 else: pressure = (pressure / v1) * 2 v1 = (digP[8] * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096 v2 = ((pressure / 4.0) * digP[7]) / 8192.0 pressure = pressure + ((v1 + v2 + digP[6]) / 16.0) print("pressure : %7.2f hPa" % (pressure/100)) 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 temperature = t_fine / 5120.0 print("temp : %-6.2f ℃" % (temperature)) 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)) * (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 print("hum : %6.2f %" % (var_h))
そのため、temp, press, humに与える数値?がどこに当たるのかがreadData()と言うコマンドでは足りないのかと考え、()内に"temp : %-6.2f ℃" %"など、print文で表示を指示している文を入れて実行し直すも、結果エラーのままです。
どなたか早急に教えてくださると助かります。
なお、今回のプログラミングで参考にしたコードが全部書いてあるサイトは以下です。
こちらのサイトの指示に従い、サンプルプログラムをコピーし(動作確認済)、そこにコードを追加し、最後にpython3で実行する流れです。
そのため、次にまとめましたコードの中に問題点があるのではないかと思いますが、どこに問題があるか分かりません。
具体的に追加したコードは大きく分けて次の2つのまとまったコードです。
import RPi.GPIO as GPIO interrupted = False GPIO.setwarnings(False) import time import board import neopixel pixel_pin = board.D18 num_pixels = 16 ORDER = neopixel.GRB pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER)
setup() get_calib_param() if __name__ == '__main__': try: temp, press, hum = readData() except KeyboardInterrupt: pass if temp: msg = "今の室温は、" + str(round(temp,1)) + "度、湿度は、" + str(round(hum,1)) + "パーセントです!" if temp > 25: msg += "暑くないですか?" pixels.fill((255, 0, 0)) elif temp < 15: msg += "寒いですね!" pixels.fill((0, 0, 255)) elif hum > 70: msg += "蒸し蒸ししますね" pixels.fill((255, 0, 0)) else: msg += "快適です!" pixels.fill((0, 255, 0)) pixels.show() print (msg) time.sleep(3) pixels.fill((0, 0, 0)) pixels.show()
回答1件
あなたの回答
tips
プレビュー