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

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

ただいまの
回答率

87.92%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,004

score 24

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には何もコーディングしていませんが、回避方法はどうしたらよいですか?

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/09/24 16:39

    このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください

    また、エラー・メッセージも、そのままの形で提示しましょう

    キャンセル

  • yama286

    2019/09/24 20:19

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

    キャンセル

回答 1

checkベストアンサー

0

subprocess.check_output

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/25 13: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.今回のプログラムではどこをどのように修正すればよいのでしょうか?
    甚だ虫の良い質問ですが、初心者のためよろしくお願いいたします。

    キャンセル

  • 2019/09/26 10: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.どうやったら先に進むのでしょうか?
    よろしくお願いいたします。

    キャンセル

  • 2019/09/27 13:58

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

    キャンセル

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

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る