🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Raspberry Pi

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

Q&A

解決済

1回答

898閲覧

1-wireディジタル温度センサ用プログラムDS18B20a.pyがLCDに表示できません

yama286

総合スコア34

Raspberry Pi

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

0グッド

0クリップ

投稿2019/09/24 07:20

編集2019/09/24 11:10

1-wireディジタル温度センサとLCD(2行表示)を使用して、センサの測定値をLCDに表示したいと思っています。
色々webを調べて下記のように挑戦しました。
1.1-wireディジタル温度センサDS18B20の単独動作確認 ⇒ ターミナルに測定値を表示することに成功しました
2.12LCD Display文字表示の単独動作確認       ⇒ Thonny Python IDE環境でLCDに2行文字表示に成功しました
しかし、1の測定値をLCDに表示するプログラムDS18B20a.pyを実行するとエラーとなります。

word貼り付けできないため、そのまま画像以外を貼り付けます。
DS18B20a.pyがLCDに表示できません

2019.9.23
yama286です
9/20頃まで温湿度気圧センサーBME280を使用してラズパイで測定しようとした時に、
Yuki23様、mt08様には大変お世話になりました。ありがとうございました。
その後、下記組み合わせでLCDに表示しようとしています。
センサー:DS18B20(1-Wireディジタル温度センサ)
LCD:12 LCD Display(16*2) 秋月電子SC1602BSLBと思われます
以上はRaspberry Pi Beginner Kitで購入したものです

1. 不具合内容
後述のサンプルプログラムDS18B20a.pyをターミナルで動作させると、ターミナルには測定結果が出ますが、標準開発環境Thonny Python IDEではエラーになります。
参考資料 
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (16) 
ディジタル温度センサ1 1-Wire DS18B20
https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot161.html

2. DS18B20単独動作確認
連続温度測定は下記リスト(webより入手)で確認済みです。

#/usr/bin/ruby from datetime import datetime from time import sleep import re def main(): while 1: filename='/sys/bus/w1/devices/28-0417044d41ff/w1_slave' time=datetime.now().strftime("%Y%m%d%H:%M:%S") f=open(filename) lines=f.readlines() for line in lines: tempstr=re.search(r"(t=)([0-9]+)",line) if tempstr: temp=float(tempstr.group(2))/1000 print(time+','+str(temp)) f.close() sleep(5) return #if __name__=='__main__': main() ```**実行結果**   時刻と温度がパソコン画面に表示されます。この結果は正常です。 **3.LCD:12 LCD Display単独動作確認** 動作は下記リスト(webより入手)で確認済みです。 ```ここに言語を入力 import smbus import time # Define some device parameters I2C_ADDR = 0x27 # I2C device address, if any error, change this address to 0x27 LCD_WIDTH = 16 # Maximum characters per line # Define some device constants LCD_CHR = 1 # Mode - Sending data LCD_CMD = 0 # Mode - Sending command LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line LCD_BACKLIGHT = 0x08 # On #LCD_BACKLIGHT = 0x00 # Off ENABLE = 0b00000100 # Enable bit # Timing constants E_PULSE = 0.0005 E_DELAY = 0.0005 #Open I2C interface #bus = smbus.SMBus(0) # Rev 1 Pi uses 0 bus = smbus.SMBus(1) # Rev 2 Pi uses 1 def lcd_init(): # Initialise display lcd_byte(0x33,LCD_CMD) # 110011 Initialise lcd_byte(0x32,LCD_CMD) # 110010 Initialise lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size lcd_byte(0x01,LCD_CMD) # 000001 Clear display time.sleep(E_DELAY) def lcd_byte(bits, mode): # Send byte to data pins # bits = the data # mode = 1 for data # 0 for command bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT # High bits bus.write_byte(I2C_ADDR, bits_high) lcd_toggle_enable(bits_high) # Low bits bus.write_byte(I2C_ADDR, bits_low) lcd_toggle_enable(bits_low) def lcd_toggle_enable(bits): # Toggle enable time.sleep(E_DELAY) bus.write_byte(I2C_ADDR, (bits | ENABLE)) time.sleep(E_PULSE) bus.write_byte(I2C_ADDR,(bits & ~ENABLE)) time.sleep(E_DELAY) def lcd_string(message,line): # Send string to display message = message.ljust(LCD_WIDTH," ") lcd_byte(line, LCD_CMD) for i in range(LCD_WIDTH): lcd_byte(ord(message[i]),LCD_CHR) def main(): # Main program block # Initialise display lcd_init() while True: # Send some test lcd_string("Created by <",LCD_LINE_1) lcd_string("Osoyoo.com <",LCD_LINE_2) time.sleep(3) # Send some more text lcd_string("> Tutorial Url:",LCD_LINE_1) lcd_string("> http://osoyoo.com",LCD_LINE_2) time.sleep(3) if __name__ == '__main__': try: main() except KeyboardInterrupt: pass finally: lcd_byte(0x01, LCD_CMD)

実行結果
LCDに“Created by <”  と   "> Tutorial Url:"
"Osoyoo.com <"       "> http://osoyoo.com"
が交互に表示されます。
これも正常表示です。

4. DS18B20の測定データをLCD:12 LCD Displayに表示させたい
1)参考資料 https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot161.html
この資料は1-wire温度センサ出力をLCD表示器AQM0802に表示することが書かれています。
但し私が使用している表示器はI2C通信可能な12LCD Displayです。
2)接続
DS18B20:VDD ⇒3.3V、GND⇒GND、GPIO4⇒GPO4
LCD:VCC⇒5V、GND⇒GND、SDA⇒SDA1、SCL⇒SCL1
この接続でターミナルで sudo 12cdetect –y 1 と入力すると、画面には“27”と出て
正しく認識されています。(DS18B20は1-wireのためアドレスは出ません)
3)プログラム作成  1)参考資料urlのプログラム参照ください
この資料の“プログラム”にある47ステップをコーディングしました。
但し、行番8は下記のように修正しました。
addr = 0x3e  ⇒ 0x27
そのほかは同一です。
4)プログラムDS18B20a.py実行結果
a.ターミナル
イメージ説明

$ python DS18B20a.py ⤾
実行毎に測定温度が
33.75度
32.125度
と出ている。但しLCDには出ない。

イメージ説明

5.依頼事項
1)ターミナルでは動作しているのに、LCDでは表示できないのはなぜですか?
2)行番39の回避方法はどうしたらよいですか?
3)行番49には何もコーディングしていませんが、回避方法はどうしたらよいですか?

以上よろしくお願いいたします。

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

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

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

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

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

y_waiwai

2019/09/24 07:39

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください また、エラー・メッセージも、そのままの形で提示しましょう
yama286

2019/09/24 11:19

y_waiwai 様                             yama286です 早速のご返事ありがとうございます。 コードを含む質問のやり方も教えていただきありがとうございます。 これで質問の内容がわかるでしょうか? 要は1-wire温度センサDS18B20の測定値を、I2Cインタフェースの12LCD表示器(16×2行)にリアルタイムで表示したいのです。  以上よろしくお願いいたします。
guest

回答1

0

ベストアンサー

subprocess.check_output

デフォルトで、この関数はデータをエンコードされたバイトとして返します。出力されたデータの実際のエンコードは起動されているコマンドに依存するため、テキストへのデコードは通常アプリケーションレベルで扱う必要があります。

投稿2019/09/24 12:20

ozwk

総合スコア13551

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

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

yama286

2019/09/25 04:45

ozwk 様                      yama286です ご返事ありがとうございます。python初心者のため、ご回答を基にプログラム修正する能力がありません。  このプログラムのもとになるサンプルプログラムは下記urlに出ています。 https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot161.html  このプログラムの構成とわたくしの構成の違いは下記です。 ラズパイ:Raspberry pi Zero ⇒ Raspberry pi3 ModelB LCD :AQM0802  ⇒ 12 LCD Display(16×2)    温度センサ:1-Wire DS18B20 共通使用 Q1.ラズパイ、LCDの違いが、エラーの原因なのでしょうか? Q2.今回のプログラムではどこをどのように修正すればよいのでしょうか? 甚だ虫の良い質問ですが、初心者のためよろしくお願いいたします。
yama286

2019/09/26 01:56

ozwk 様                      yama286です その後、少し状況が変化したので報告いたします。 バイト形式が要求されているというご指摘をもとに次のように一部変更しました。 tfiles.find("YES",30,60) != -1 ⇒ tfiles.find(b’YES',30,60) != -1 tfiles.find("t=",50,80) ⇒ tfiles.find(b’t=',50,80) 結果はターミナルは前と同一ですが、Thonny Python IDEでは、エラー発生無くなりましたたが、下記の ようになり、LCDには何も出ません。  28-0417044d41ff b't=26250\n' 26.25 但し¥は実際は”/”と反対の向きの記号です。 どうも上記urlのプログラムの行番41以降が実行されていないようです。 Q1.どうやったら先に進むのでしょうか? よろしくお願いいたします。
yama286

2019/09/27 04:58

改善に関するご指摘ありがとうございました。解決には至りませんが、とりあえず終了させてください。 自分なりにいろいろやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問