사용자 도구

사이트 도구


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

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

다음 판
이전 판
라즈베리파이로_환경_측정 [2022/06/08 15:50] – 만듦 akpil라즈베리파이로_환경_측정 [2022/06/08 16:00] (현재) akpil
줄 1: 줄 1:
-====== 라즈베리파이로 온도/습도, 진동, 잡음 측정 및 기록 장치 만들기 ======+====== 라즈베리파이로 온도/습도, 진동, 잡음 측정 및 기록 장치 만들기 #01 ======
  
 라즈베리파이로 할 수 있는 일은 꽤 많다. 그 중에서 IoT 의 기본이라고 할 수 있는 간단한 환경변수들, 그러니까 온도/습도, 진동, 잡음을 측정하고 기록하여 언제든지 꺼내 볼 수 있도록 하는 것을 만들어 보자. 라즈베리파이로 할 수 있는 일은 꽤 많다. 그 중에서 IoT 의 기본이라고 할 수 있는 간단한 환경변수들, 그러니까 온도/습도, 진동, 잡음을 측정하고 기록하여 언제든지 꺼내 볼 수 있도록 하는 것을 만들어 보자.
줄 5: 줄 5:
 먼저 필요한 것은 라즈베리파이 3B 또는 3B+ 이다. 라즈베리파아 4 이상도 좋지만, 오버스펙이다. 먼저 필요한 것은 라즈베리파이 3B 또는 3B+ 이다. 라즈베리파아 4 이상도 좋지만, 오버스펙이다.
 그 다음으로 온도 및 습도 센서는 DHT22, 진동 센서는 SW-420, 소리감응 센서는 LM393 을 쓴다. 그 다음으로 온도 및 습도 센서는 DHT22, 진동 센서는 SW-420, 소리감응 센서는 LM393 을 쓴다.
 +
 +===== 센서 pin 번호 =====
 +
  
 각 센서는 라즈베리파이의 GPIO에 연결되며, 연결되는 pin 번호는 다음과 같다. 각 센서는 라즈베리파이의 GPIO에 연결되며, 연결되는 pin 번호는 다음과 같다.
줄 24: 줄 27:
   * GND (-) : 20   * GND (-) : 20
  
 +라즈베리파이에는 라즈베리비안이 설치되어 있고, 데이터베이스는 mariadb, 웹서버는 apache2 를 이용하기로 한다.
 +다른 DB 를 써도 되고, nginx 등의 다른 웹서버를 써도 상관없다. 그리고, 프로그래밍 언어는 파이썬 3.7 이상이면 된다. 
 +
 +===== DB 사용자 만들고 권한 부여하기 =====
 +
 +<code>
 +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
 +</code>
 +
 +===== DB 테이블 만들기 =====
 +<code>
 +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
 +</code>
 +
 +===== 센서에서 데이터를 읽어와서 DB 에 저장 ===== 
 +<code>
 +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()
 +</code>
 +
 +이렇게 하면 DB 에는, 날짜, CPU 온도, 온도, 습도, 진동, 잡음 데이터가 저장된다. 
 +
 +이걸 crontab 에 등록해서 5분에 한번마다 실행시키면 5분마다 센서에서 데이터를 측정해서 DB 에 저장한다.
 +
 +굳이 설명할 것도 없을 정도로 간단하다. 
 +
 +-------------
 +
 +2022.06.08 akpil
라즈베리파이로_환경_측정.1654671017.txt.gz · 마지막으로 수정됨: 2022/06/08 15:50 저자 akpil

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki