質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3078閲覧

Raspberry Pi 4でエラー発生(TypeError)

uuu1010

総合スコア7

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/11 10:28

編集2020/10/11 12:40

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takutakuya

2020/10/11 10:43

やはり肝は「readData()」でしょう。 確認お願いします。
takutakuya

2020/10/11 10:52

あと、質問に記載していただいたコード以外にも関連したものがあれば、それも追加すると解決しやすくなると思います。 readData() を定義したコードがどこかにあるのではないかと推測しています。
uuu1010

2020/10/11 12:41

ありがとうございます。 内容確認し、自分なりに試したことについても記載しました。 定義したコードについても追加しました。
takutakuya

2020/10/11 12:53

def readData()の中にreturnはないですか? print(readData())は確認しましたか?
uuu1010

2020/10/11 16:21

ありがとうございます。 確認したもののうまく把握できていなかったところ、下記のTakutakuya様のご指摘の通りやってみましたら解決しました! もっと皆さんのようにすぐ対処できるように実践を繰り返して練習していきます! ありがとうございます!
guest

回答1

0

ベストアンサー

下記は質問の中にあるWebサイトの別ページです。

第39回「ラズベリーパイで温度・湿度・気圧をまとめて取得!AE-BME280でIC2通信」

この中で「bme280_custom.py」というファイルの中にあるdef readData()の中身を書き換えています。おそらく、同じ変更をすれば、今出ているエラーは解消されるんじゃないかと思います。

試してみてください。

投稿2020/10/11 12:58

takutakuya

総合スコア979

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uuu1010

2020/10/11 16:20

何度もアドバイスいただき恐縮です。 ご指摘の通り直しましたら解決しました! もっと皆さんのように上手くなれるよう練習します!
takutakuya

2020/10/11 16:40

良かったです! 私もこれ真似してやってみようと思いました。 TwitterとかSlackに定期的に温度を通知したり、Googleスプレッドシートに記録したり、やってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問