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

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

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

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

Python

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

Q&A

3回答

1091閲覧

1-wireで温度データ取得が突然できなくなった。

kamenogotoku

総合スコア16

Raspberry Pi

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

Python

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

1グッド

0クリップ

投稿2020/09/16 06:50

DS18B20温度センサーを多数つなぎ、Pythonでデータを取得していましたが、突然できなくなりました。エラーメッセージは、
Traceback (most recent call last):
File "***.py", line *, in <module>
device_folder = glob.glob(base_dir + '28
')[n]
IndexError: list index out of range

です。
対処法をご教授お願いします。
(数日前まではうまくいっていたのに不思議です)

言語
Python

コード
import os
import glob
import time
import datetime
import subprocess
import ambient

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

while True:
dt_now = datetime.datetime.now()
print dt_now

for n in range(5): base_dir = '/sys/bus/w1/devices/' device_folder = glob.glob(base_dir + '28*')[n] device_file = device_folder + '/w1_slave' def read_temp_raw(): catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out,err = catdata.communicate() out_decode = out.decode('utf-8') lines = out_decode.split('\n') return lines def read_temp(): lines = read_temp_raw() while lines[0].strip()[-3:] != 'YES': time.sleep(0.2) lines = read_temp_raw() equals_pos = lines[1].find('t=') if equals_pos != -1: temp_string = lines[1][equals_pos+2:] temp_c = float(temp_string) / 1000.0 #temp_f = temp_c * 9.0 / 5.0 + 32.0 return temp_c temp = read_temp() code = 'temp{} = {}'.format(n, temp) exec(code) #print(temp0, temp1, temp2, temp3, temp4) print('temp0=', temp0) print('temp1=', temp1) print('temp2=', temp2) print('temp3=', temp3) print('temp4=', temp4)```
megeru👍を押しています

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

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

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

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

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

guest

回答3

0

私も同じようなエラーが出たためその時の解決方法を書きます。
def read_tempのlinesが通常2行読みこまれるのですが、たまに、読み込まれないときがあります。(理由は分かりませんでした。)そのため、linesが2行読み込んだことを確認するため、下のようにすればいいと思います。

#Python def read_temp(): lines = read_temp_raw() lines_length = len(lines)#linesの行数を確認しています。 if lines_length == 2:#2行あった場合 while lines[0].strip()[-3:] != 'YES': sleep(0.2) lines = read_temp_raw() equals_pos = lines[1].find('t=') if equals_pos != -1: temp_string = lines[1][equals_pos + 2:] temp_c = float(temp_string) / 1000.0 return temp_c else:#そうでなければ pass#なにもしない

投稿2021/02/09 12:37

megeru

総合スコア4

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

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

0

私も同じようなエラーが出たためその解決方法を書きます。
def read_tempのlinesが通常2行読みこまれるのですが、たまに、読み込まれないときがあります。(理由は分かりませんでした。)そのため、linesが2行読み込んだことを確認するため、下のようにすればいいと思います。

#Python def read_temp(): lines = read_temp_raw() lines_length = len(lines)#linesの行数を確認しています。 if lines_length == 2:#2行あった場合 while lines[0].strip()[-3:] != 'YES': sleep(0.2) lines = read_temp_raw() equals_pos = lines[1].find('t=') if equals_pos != -1: temp_string = lines[1][equals_pos + 2:] temp_c = float(temp_string) / 1000.0 return temp_c else:#そうでなければ pass#なにもしない

投稿2021/02/09 12:35

megeru

総合スコア4

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

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

kamenogotoku

2021/02/10 03:36

貴重なアドバイスありがとうございます。 外付けプルアップ抵抗からの電流が少なかったりでも起こる、などいろいろいろ回路さわっています。ですが、ラズパイでのコネクタ接続部でてんぷら(やや緩い結線)でも起こりますが、見ている目の前である日突然データとらなくなることもありました。同じP板で複数の温度センサーでデータとってますが、トラブル後一本一本データとってみるととれない温度センサーを発見することはできるものの、その温度センサをはずしてデータとってみると正常でした。 今は正常に動いているので、貴アドバイスの効果を確かめるため、ふたつのラズパイからデータ取得して片方だけ、変更してやってみますね。結果出ましたらまたお知らせします。
kamenogotoku

2021/02/10 03:37

ちなみに、megeruさんのところでは、その後エラーは出ていないでしょうか・・・?
megeru

2021/02/10 11:36

一晩放置状態でも出ませんでした データの更新中に読み込まれるとエラーが出ると思っていますが、あっているかは分かりません
guest

0

IndexError: list index out of range

配列あるいはリストの要素数を超えてアクセスしようとしたときに出るエラーです
とりあえず、
glob.glob(base_dir + '28*')
の結果を見て、要素数がどんだけあるのか調べてみては?

投稿2020/09/16 06:54

y_waiwai

総合スコア88042

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

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

kamenogotoku

2020/09/17 00:29

貴重なアドバイスありがとうございます。 Pythonの基本がわかってないので、まだ解決していませんが、貴アドバイスにも沿って順繰りに分析してみます。ちょっと前までは正常に動いていたのに、なぜ突然このようなことがおこるのかキツネに包まれています。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問