====== 라즈베리파이로 온도/습도, 진동, 잡음 측정 및 기록 장치 만들기 #01 ====== 라즈베리파이로 할 수 있는 일은 꽤 많다. 그 중에서 IoT 의 기본이라고 할 수 있는 간단한 환경변수들, 그러니까 온도/습도, 진동, 잡음을 측정하고 기록하여 언제든지 꺼내 볼 수 있도록 하는 것을 만들어 보자. 먼저 필요한 것은 라즈베리파이 3B 또는 3B+ 이다. 라즈베리파아 4 이상도 좋지만, 오버스펙이다. 그 다음으로 온도 및 습도 센서는 DHT22, 진동 센서는 SW-420, 소리감응 센서는 LM393 을 쓴다. ===== 센서 pin 번호 ===== 각 센서는 라즈베리파이의 GPIO에 연결되며, 연결되는 pin 번호는 다음과 같다. DHT22 * VCC (+) : 2 * D.OUT : 7 * GND (-) : 9 SW-420 * VCC (+) : 1 * D.OUT : 16 * GND (-) : 14 LM393 * A.OUT : N/C * VCC (+) : 17 * D.OUT : 22 * GND (-) : 20 라즈베리파이에는 라즈베리비안이 설치되어 있고, 데이터베이스는 mariadb, 웹서버는 apache2 를 이용하기로 한다. 다른 DB 를 써도 되고, nginx 등의 다른 웹서버를 써도 상관없다. 그리고, 프로그래밍 언어는 파이썬 3.7 이상이면 된다. ===== DB 사용자 만들고 권한 부여하기 ===== sudo mysql -u root -p CREATE USER 'env'@'localhost' IDENTIFIED BY 'PASSWORD'; CREATE DATABASE env; GRANT ALL PRIVILEGES ON *.* TO 'env'@'localhost'; FLUSH PRIVILEGES; QUIT ===== DB 테이블 만들기 ===== mysql -u env -p USE env; CREATE TABLE Reading (id INT AUTO_INCREMENT NOT NULL, date DATETIME NOT NULL,temp1 DECIMAL(5,2) NOT NULL, temp2 DECIMAL(5,2) NOT NULL, humidity DECIMAL(5,2) NOT NULL, vibration DECIMAL(5,2) NOT NULL, noise DECIMAL(5,2) NOT NULL, PRIMARY KEY (id)); QUIT ===== 센서에서 데이터를 읽어와서 DB 에 저장 ===== import Adafruit_DHT, datetime, time, warnings, pymysql, sys, os, threading import RPi.GPIO as GPIO import pandas as pd dt = datetime.datetime.now().strftime('%Y-%m-%d %H:%M') GPIO.setmode(GPIO.BCM) GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) time.sleep(1) vibration = 0 noise = 0 pin = 4 sensor = Adafruit_DHT.env humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) def getCPUTemp(): CPUTemp = open("/sys/class/thermal/thermal_zone0/temp").readline() CPUTemp = float(CPUTemp) / 1000 return (CPUTemp) def vib(): m1 = 0 result = 0 v = 0 global vibration vibtarion = 0 while m1 < 600: m1 = m1 + 1 result = GPIO.input(23) if result == 1: v = v + 1 time.sleep(0.1) else: time.sleep(0.1) vibration = v return (vibration) def sound(): m2 = 0 soundpin = 25 GPIO.setup(soundpin,GPIO.IN) soundlevel = 0 n = 0 global noise noise = 0 while m2 < 600: m2 = m2 + 1 soundlevel = GPIO.input(soundpin) if soundlevel == 1: n = n + 1 time.sleep(0.1) else: time.sleep(0.1) noise = n return (noise) thread1 = threading.Thread(target=vib) thread2 = threading.Thread(target=sound) thread1.start() thread2.start() thread1.join() thread2.join() temp1 = str(getCPUTemp()) temp2 = str(temperature) hum = str(humidity) vibration = str(vibration) noise = str(noise) warnings.filterwarnings(action='ignore') db = pymysql.connect(host='localhost', user='env', password='PASSWORD', db='env', charset='utf8mb4') cur = db.cursor() cur.execute("INSERT INTO Reading(date, temp1, temp2, humidity, vibration, noise) VALUES ('" + dt + "'," + temp1 + "," + temp2 + "," + hum + "," + vibration + "," + noise+ ")") db.commit() cur.close() del cur db.close() 이렇게 하면 DB 에는, 날짜, CPU 온도, 온도, 습도, 진동, 잡음 데이터가 저장된다. 이걸 crontab 에 등록해서 5분에 한번마다 실행시키면 5분마다 센서에서 데이터를 측정해서 DB 에 저장한다. 굳이 설명할 것도 없을 정도로 간단하다. ------------- 2022.06.08 akpil