見出し画像

ラズパイいじり〜温湿度ロガー編⑥

今回は、前回までで作成した温湿度ロガーにLCDをつけてみます。
使用するのは2行表示のLCD 1602
LCD1602をそのまま使おうとすると16本のピンにそれぞれの配線が必要となります。ですが、I2Cアダプタというものを使うと配線は4本で済みます。
そこでアマゾンで購入しました。

使用方法は、osoyoo社のHP等を参考にしました。

これをこれまでの温湿度ロガーに接続します。

回路図(I2Cの先にLCD1602がつながります)

プログラムは、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に現在の温湿度が表示されました。
これで温湿度ロガーの完成です。

ラズベリーパイ、温湿度センサー、LED、LCDを組み合わせた温湿度ロガー


この記事が気に入ったらサポートをしてみませんか?