사용자 도구

사이트 도구


라즈베리파이로_환경_측정

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

라즈베리파이로_환경_측정.txt · 마지막으로 수정됨: 2022/06/08 16:00 저자 akpil

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki