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には何もコーディングしていませんが、回避方法はどうしたらよいですか?
以上よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー