ラズパイいじり〜温湿度ロガー編⑥
今回は、前回までで作成した温湿度ロガーにLCDをつけてみます。
使用するのは2行表示のLCD 1602
LCD1602をそのまま使おうとすると16本のピンにそれぞれの配線が必要となります。ですが、I2Cアダプタというものを使うと配線は4本で済みます。
そこでアマゾンで購入しました。
使用方法は、osoyoo社のHP等を参考にしました。
これをこれまでの温湿度ロガーに接続します。
プログラムは、osoyoo社のi2clcda.pyからLCD1602、I2Cアダプタを使用するためのコードをコピーします。
また、日時、温湿度情報を表示するためのコードはdef関数化されたコンソールへの表示するコードへ追加します。
import RPi.GPIO as GPIO
import dht11
import datetime
import sys
import time
import os
import threading
import multiprocessing
import smbus
Led_pin = 25 #LED用GPIO
set_temp1 = 25 #LED点灯
set_temp2 = 20 #LED点滅
tempGpio = 18
fileName='/home/pi/TEMP_LOG/temptest_log.csv'
#initialize GPIO
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)
dhtStat=dht11.DHT11(pin=tempGpio)
GPIO.setup(Led_pin, GPIO.OUT)
# Define some device parameters
I2C_ADDR = 0x27 # I2C device address, if any error, change this address to 0x3f
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)
#stat=dhtStat.read()#温湿度情報を取得
def LED_cont():#温度状態によりLEDを点灯、点滅
stat1=dhtStat.read()#温湿度情報を取得
i = stat1.temperature
if i > set_temp1:
GPIO.output(Led_pin, GPIO.LOW)
GPIO.output(Led_pin, GPIO.HIGH)
elif i > set_temp2:
while True:
GPIO.output( Led_pin, GPIO.HIGH)
time.sleep(1)
GPIO.output( Led_pin, GPIO.LOW)
time.sleep(1)
else:
print("temperature is under",set_temp2,"C")
GPIO.output(Led_pin, GPIO.LOW)
def print_DISP():
stat2=dhtStat.read()#温湿度情報を取得
if stat2.is_valid():
print(stat2)
print("Last valid input: " + str(datetime.datetime.now()))
print("Temperature: %-3.1f C" % stat2.temperature)
print("Humidity: %-3.1f %%" % stat2.humidity)
temp = str(stat2.temperature) + "C " + str(stat2.humidity) + "%"
lcd_string(str(datetime.datetime.now()),LCD_LINE_1)
lcd_string(temp,LCD_LINE_2)
# time.sleep(5)
def mkcsv():#DHT11からデータを読み取りCSVに書き込み
stat3=dhtStat.read()#温湿度情報を取得
if stat3.is_valid():
now=str(datetime.datetime.now())[0:16]
data=[now,stat3.temperature,stat3.humidity]
# if stat.temperature==stat.humidity==0:
# continue
thData=open(fileName,'a')
thData.write(','.join(map(str,data))+'\n')
thData.close()
# time.sleep(10)
#ファイルがなければ作成する
if not os.path.exists(fileName):
thData=open(fileName,'w')
thData.write('date_time,temp,hdmt\n')
thData.close()
try:
while True:
t1 = threading.Thread(target=mkcsv)
t2 = threading.Thread(target=LED_cont)
t3 = threading.Thread(target=print_DISP)
# time.sleep(10)
t1.start()
time.sleep(1)
t2.start()
time.sleep(1)
t3.start()
time.sleep(8)
except KeyboardInterrupt:
print("Cleanup")
GPIO.cleanup()
LCDに現在の温湿度が表示されました。
これで温湿度ロガーの完成です。