이전 포스팅에서 사물인터넷 스마트홈 시스템에 대해 살펴보았다. 이전 장에서는 스마트홈 센서를 검토해 보자. 길어지면 다음 포스팅으로 넘기지만 연결도와 테스트 소스코드(C언어)를 살펴보면서 진행하기로 한다.
라즈베리파이 스마트 홈 실습 과정 전체 포스팅 리스트
라즈베리파이4 스마트홈 액츄에이터 디지털 도어록 실습 8
우선 아래 스마트홈 센서 구성 이미지를 보자. 좌측부터 불꽃 센서, 가스 센서, 소리 센서, 조도 센서, 온도 습도 센서, 인체감지 센서가 보일 것이다. 그럼 순서대로 하나씩 테스트를 해보자.
모든 센서에 공통인 사항을 불꽃 센서 설명에서 설명한다. SSH 접속을 위해 Putty 프로그램이나 mobaXterm을 설치하여 사용한다. 요즘 mobaXtrem을 많이 사용한다.
불꽃 센서 Flame Sensor
불꽃 감지 센서는 적외선 LED를 통해 불꽃에서 감지되는 적외선 파장을 감지하여 이를 아날로그 혹은 디지털 신호로 변환하는 센서다. 불꽃의 파장(주파수) 760nm ~ 1100nm 대역을 감지하는 센서로 소방활동 로봇 제작 및 화재 진압에 중요한 화재경보기 제작에 활용이 가능하며 불꽃센서의 동작 환경은 25~85도(섭씨)에서 작동하며 불꽃을 감지하는 거리에 따라 아날로그 값이나 불꽃의 존재 유무를 알려주는 디지털 값을 출력한다.
주의: 라이터, 부탄가스, 가스레인지 등으로 시험 시 화재나 신체상의 위험을 주의해야 한다. 부탁이다.
불꽃 센서 사양
동작전압 | 3.3V to 5V |
감지 범위 | 20cm (4.8V) ~ 100cm (1V) |
감지 대역(파장) | 760nm ~ 1100nm |
응답 시간 : | 15usec |
인터페이스 : | 아날로그/디지탈 |
크기 : | 22x30mm |
센서 컬리브레이션
다른 센서와 마찬가지로 불꽃 센서도 보정을 거친 후 사용한다. 방법은 전원을 연결하면 센서모듈 중앙의 두 개의 LED 중 한 개 전원 LED에 불이 들어온다. 이때 다른 LED 도 켜져 있다면 항상 신호가 들어오는 것이므로 가변저항을 돌려 약간만 시계, 반 시계 방향으로 돌려도 신호 출력 LED 가 꺼지는 상태까지 보정해 주면 된다. 다른 센서도 마찬가지인데 어느 정도에서 컬리브레이션을 마치면 되는가? ON 상태를 알리는 LED가 꺼졌다 들어왔다 하는 지점에서 꺼지는 상태로 두면 된다.
스마트 홈 폴더로 가기 위해 아래 명령어를 사용한다.
pi@raspberrypi:~ $ cd smarthome/
pi@raspberrypi:~/smarthome $
불꽃 센서를 테스트 소스 코드 파일 home-flame.c
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>
#define HOMEFLAME 23 //gpio13
volatile unsigned char homeflamedetect = 0;
// myInterrupt: called every time an event occurs
void homeflameInterrupt(void) {
homeflamedetect = 0x01;
}
int main(void) {
// sets up the wiringPi library
if (wiringPiSetup () < 0) {
fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno));
return 1;
}
// set Pin 17/0 generate an interrupt on high-to-low transitions
// and attach myInterrupt() to the interrupt
if ( wiringPiISR (HOMEFLAME, INT_EDGE_FALLING, &homeflameInterrupt) < 0 ) {
fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno));
return 1;
}
// display counter value every second.
while ( 1 ) {
delay( 200 ); // wait 1 second
if(homeflamedetect == 0x01)
{
printf("home flame detected...\n");
homeflamedetect = 0;
}
else
printf("not flame\n");
}
return 0;
}
위와 같이 입력하였다면 컴파일 명령은 다음과 같다. 라즈제리파이 GPIO 라이브러리는 wiringPi 라이브러리를 사용하므로 컴파일할 때 인클루드 한다.
$gcc -o home-flame home-flame.c -lwiringPi
실행은 $./home-flame
아래 컴파일과 실행 명령어 실행 코드를 참고한다.
pi@raspberrypi:~/smarthome $ gcc -o home-flame home-flame.c -lwiringPi
pi@raspberrypi:~/smarthome $ ./home-flame
not flame
not flame
not flame
home flame detected...
home flame detected... not flame
home flame detected... not flame
not flame
not flame
not flame
not flame
not flame
위 코드에도 일부는 들어 있지만 불꽃 센서와 가스 센서를 인터럽트를 사용하는 코드는 아래를 참고한다.
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>
// Use GPIO Pin 7, which is Pin 11 for wiringPi library
#define HOMEFLAME 23 //gpio13
#define HOMEGAS 24 //gpio19
// the event counter
volatile int eventCounter = 0;
volatile unsigned char homeflamedetect = 0;
volatile unsigned char homegasdetect = 0;
// -------------------------------------------------------------------------
// myInterrupt: called every time an event occurs
void homeflameInterrupt(void) {
eventCounter++;
homeflamedetect = 0x01;
}
void homegasInterrupt(void) {
eventCounter++;
homegasdetect = 0x01;
}
// -------------------------------------------------------------------------
// main
int main(void) {
// sets up the wiringPi library
if (wiringPiSetup () < 0) {
fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno));
return 1;
}
// set Pin 17/0 generate an interrupt on high-to-low transitions
// and attach myInterrupt() to the interrupt
if ( wiringPiISR (HOMEFLAME, INT_EDGE_FALLING, &homeflameInterrupt) < 0 ) {
fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno));
return 1;
}
if ( wiringPiISR (HOMEGAS, INT_EDGE_FALLING, &homegasInterrupt) < 0 ) {
fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno));
return 1;
}
// display counter value every second.
while ( 1 ) {
//printf( "%d\n", eventCounter );
//eventCounter = 0;
//delay( 1000 ); // wait 1 second
if(homeflamedetect == 0x01)
{
printf("home flame detected...\n");
homeflamedetect = 0;
}
if(homegasdetect == 0x01)
{
printf("gas detected...\n");
homegasdetect = 0;
}
}
return 0;
}
이상 끝. 이렇게 하나씩 해야 할까 보다. SSyang!
'개발자 > 라즈베리파이4' 카테고리의 다른 글
스마트홈 서버 프로그램 데이터 베이스 에러 해결 (1) | 2023.05.12 |
---|---|
라즈베리파이4 스마트홈 조도센서 코드 5 (0) | 2023.05.12 |
라즈베리파이4 스마트홈 소리센서 코드 4 (0) | 2023.05.11 |
라즈베리파이4 스마트홈 가스센서 코드 3 (4) | 2023.05.10 |
라즈베리파이4 스마트홈 제품 특징 1 (1) | 2023.05.09 |
Raspberry Pi 4 기구 도면 (0) | 2023.04.07 |
RTOS 소개 1 - 실시간 운영 체제(RTOS)란? (1) | 2023.03.30 |
Raspberry Pi 베스트 프로젝트 Top 10 (0) | 2023.03.24 |
더욱 좋은 정보를 제공하겠습니다.~ ^^