====== 라즈베리파이로 온도/습도, 진동, 잡음 측정 및 기록 장치 만들기 #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