개발자/라즈베리파이4

라즈베리파이4 스마트홈 서버 프로그램 실습 15

지구빵집 2023. 5. 30. 09:39
반응형

 

 

이제 끝인가? 아니다. 더 남았다. 아 신난다. 이런 마인드로 간다. 모든 문제를 환영하고 모든 도전을 사랑한다. 

 

스마트홈 서버 프로그램은 말 그대로 웹서버, 데이터베이스 서버로 동작한다. 사용자 스마트 폰과 데이터를 주고받고, 제어 기능을 실행하는 Gateway로 동작하는 프로그램이다. 스마트 홈 주요 기능을 살펴보자

 

▪ 불꽃 센서로부터 화재 관련된 불꽃 감지 데이터 수집

▪ 가스 감지 센서로부터 LPG, LNG 가스 데이터 수집

▪ 소리센서로부터 실내 소리 유무 데이터 수집

▪ 조도 센서로부터 실내의 밝기 데이터 수집

▪ 온습도 센서로 실내의 온습도 데이터 수집

▪ 인체감지 센서로 실내의 사람 유무 데이터를 수집

▪ RFID를 이용하여 허가된 사용자의 출입을 통제

▪ 도억락의 개폐 제어

▪ 가스밸브의 개폐 제어

▪ 온수밸브의 개폐 제어

▪ 실내에 사람이 없을 경우 전등 온 오프 제어

▪ 야간에 실내의 무드등의 색을 제어

▪ 실내의 영상을 사용자의 스마트폰으로 전송  

 

 

라즈베리파이 스마트 홈 실습 과정 전체 포스팅 리스트 

 

라즈베리파이4 스마트홈 제품 특징 1

라즈베리파이4 스마트홈 불꽃 센서 코드 2

라즈베리파이4 스마트홈 가스센서 코드 3

라즈베리파이4 스마트홈 소리센서 코드 4

라즈베리파이4 스마트홈 조도센서 코드 5

라즈베리파이4 스마트홈 온도 습도센서 코드 6

라즈베리파이4 스마트홈 인체감지 모션센서 코드 7

라즈베리파이4 스마트홈 액츄에이터 디지털 도어록 실습 8

라즈베리파이4 스마트홈 가스타이머 실습 9

라즈베리파이4 스마트홈 전동볼밸브 실습 10

라즈베리파이4 스마트홈 RFID 실습 11

라즈베리파이4 스마트홈 RGB LED 실습 12

라즈베리파이4 스마트홈 카메라 실습 13

라즈베리파이4 스마트홈 조명 LED bar 실습 14

라즈베리파이4 스마트홈 서버 프로그램 실습 15

라즈베리파이4 스마트홈 안드로이드 앱 설명 16

 

 

스마트 홈 서버 서버 프로그램은 클라이언트로 사용되는 스마트폰 데이터를 받아 파싱 하여 사용자가 요청하는 데이터를 송신한다. 대기상태에서 사용자의 입력을 기다리게 된다. 사용자가 스마트 폰을 이용하여 현재 상태와 카메라 보기, 설정을 Setting 하는 기능을 통해 서버 프로그램은 해당 기능을 수행한다. 

 

 

 

스마트 홈 서버 소프트웨어 Data Flow Diagram

 

데이터베이스 구조 설계

 

일단 데이터 베이스에 대해 알아보자. 앞서 APM(Apache, PHP, MySQL)을 설치하였다. 그것을 바탕으로 데이터 베이스를 활용해 보자. 여기서 사용하는 데이터 베이스는 스마트 홈의 모든 센서데이터와 이벤트 기록을 주기적으로, 혹은 발생할 때마다 데이터 베이스에 저장한다. 한두 번 저장하거나 단시간의 센서 데이터는 의미가 없다고 보고 되도록이면 장기간의 데이터를 저장해야 한다. 데이터 베이스의 기초적인 부분들을 살펴보고 자세한 것은 Mysql 관련도서를 참조하자.

 

스마트 홈에서 데이터 베이스의 설계를 대략적으로 나타낸다. 데이터 베이스의 설계와 테이블 구성은 방대한 작업이므로 아래 실습에서 간단하게 실습하고, 실제 구현시에는 서버 코드를 참조하여 꼼꼼하게 구현한다.

 

DB Name : iothome

 

Table : thomesensorvalue 센서값 저장 테이블

1분마다 센서값 저장한다.

날짜 day / 불꽃센서 int / 가스센서 int/ 소리센서 int / 조도센서 int / 온도센서 float / 습도센서 float / 인체감지 int

 

Table : thomesensorcheck 센서 정상/불량 저장 테이블

센서 정상 불량 확인하여 저장 10분마다.

날짜 day / 불꽃센서 (정상/불량) / 가스센서 (정상/불량) / 소리센서 (정상/불량) / 조도센서 (정상/불량) / 온도센서 (정상/불량) / 습도센서 (정상/불량) / 인체감지 (정상/불량)

 

Table : thomeactuoperate 액츄에이터 동작상태(동작중/정지중)

(현재 이벤트 저장으로 사용 중)

액츄 동작시 데이터베이스 업데이트 하고, 동작 끝날 때 업데이트

날짜 day / 무드등(on, stop) / 도어록(open, close) / 가스밸브(on, stop) / 전등(on, stop) / 온수밸브(on, stop)

 

Table : thomeactucheck 액츄에이터가 정상/불량 저장 데이블

액츄에이터 정상 불량 기록 – 현재는 모두 정상

무드등 (normal, fail), 도어록 (normal, fail), 가스밸브 (normal, fail), 전등 (normal, fail), 온수밸브 (normal, fail)

Table : thomesetting 설정값 저장 테이블

Now(), 설정값이 있을 항목 설정  

 

스마트홈 서버 프로그램 구조

 

 

서버 프로그램은 다음 과정을 거쳐 output 폴더에 서버 실행파일을 만든다. server_smarthome 

 

pi@raspberrypi ~/iot_homeserver $ make clean 

 

pi@raspberrypi ~/iot_homeserver $ make 

 

pi@raspberrypi ~/iot_homeserver $ make install 

 

서버프로그램을 실행한다. $sudo ./server_smarthome 아래는 서버 프로그램을 실행시킨 화면이다. 서버는 온 습도, 조도 데이터를 수집하여 데이터 베이스에 저장하는 한편 클라이언트가 되는 스마트 폰에서 접속하기를 기다린다. 따라서 터미널 화면에서 서버를 수행시키면 다른 컴퓨터에서 putty를 실행시켜 동영상 스트리밍을 서비스하는 프로그램을 실행하는 방법으로 실습하여야 한다.  

 

아래는 실행 화면을 나타낸다.

 

 

pi@raspberrypi:~/iot_homeserver/output $ ./server_smarthome
CLOSE
validate database...
iot_send_query : query - CREATE TABLE IF NOT EXISTS thomesensorvalue (id INT AUTO_INCREMENT PRIMARY KEY, date DATE, time TIME, fire INT, gas INT, sound INT, light INT, temperature FLOAT, humid FLOAT, human INT)
iot_send_query : query - CREATE TABLE IF NOT EXISTS thomesensorcheck (id INT AUTO_INCREMENT PRIMARY KEY, date DATE, time TIME, fire INT, gas INT, sound INT, light INT, temperature INT, humid INT, human INT)
iot_send_query : query - CREATE TABLE IF NOT EXISTS thomeactuoperate (id INT AUTO_INCREMENT PRIMARY KEY, date DATE, time TIME, lantern INT, door INT, gas INT, light INT, water INT)
iot_send_query : query - CREATE TABLE IF NOT EXISTS thomeactucheck (id INT AUTO_INCREMENT PRIMARY KEY, date DATE, time TIME, lantern INT, door INT, gas INT, light INT, water INT)
done
starting server...
get fire sensor
get light sensor
Humidity = 47.20 % Temperature = 24.50 *C
Humidity = 47 Temperature = 24
Temperature = 24
Humidity = 47.20 % Temperature = 24.50 *C
Humidity = 47 Temperature = 24
Humidity = 47
SensorInterruptLoop : write to DB - INSERT INTO  thomesensorvalue values (null ,now(), now(), 0, 0, 0, 0, 0.000000, 0.000000, 0)
iot_insert_data_from_db : query - INSERT INTO  thomesensorvalue values (null ,now(), now(), 0, 0, 0, 0, 0.000000, 0.000000, 0)
SensorInterruptLoop : write to DB - INSERT into thomesensorcheck values (null, now(), now(), 1, 1, 1, 1, 1, 1, 1)
iot_insert_data_from_db : query - INSERT into thomesensorcheck values (null, now(), now(), 1, 1, 1, 1, 1, 1, 1)
SensorInterruptLoop : write to DB - INSERT into thomeactuoperate values (null, now(), now(), 0, 0, 0, 0, 0)
iot_insert_data_from_db : query - INSERT into thomeactuoperate values (null, now(), now(), 0, 0, 0, 0, 0)
SensorInterruptLoop : write to DB - INSERT into thomeactucheck values (null, now(), now(), 1, 1, 1, 1, 1)
iot_insert_data_from_db : query - INSERT into thomeactucheck values (null, now(), now(), 1, 1, 1, 1, 1)

 

 

계속 헤엄친다. 멈추면 물속으로 가라앉는다. 계속 헤엄친다. 

 

여기까지 고생하셨습니다.

 

 

반응형