개발자/라즈베리파이4

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

지구빵집 2023. 5. 12. 09:16
반응형

 

 

이번 포스팅에서 테스트할 조도센서는 모델 6495 조도센서이다. 조도센서의 출력은 두 가지를 이용할 수 있는데 일정 밝기 이상에서 하이가 출력되는 디지털 출력과 빛의 양에 따라 값이 아날로그로 변환되어 출력하는 아날로그 출력을 동시에 가지고 있다. 여기에서는 아날로그 출력을 확인해 보도록 한다.

 

 

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

 

라즈베리파이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

 

 

아날로그 출력값은 8 채널 12bit 아날로그 디지털 컨버터인 MCP3208을 이용하여 디지털 값을 출력하여 보기로 한다. 

 

 

조도센서 모듈 핀 맵

 

조도센서의 사양과 전기적 특성

 

특징 전기적 특성
1. 모델명 : AM2302 
2. 감도 조절 (파란색 가변저항 조정)밝기와 주변 빛의 세기를 감지
3. 출력 : 아날로그 전압 출력, 디지털 스위치 출력 (0, 1)
4. 온도 측정 범위 : -40~80 
5. 습도 측정 오차 : ±2%RH 
6. 온도 측정 오차 : ±0.5
7. 저전력소모 
8. 부가회로가 불필요
- 작동 전압 : 3.3V ~ 5V DC
- 출력 : 아날로그 전압 출력, 디지털 스위치 출력 (0, 1)
- lm393
- 측정 조건 VDD = 5V , T = 25
- Pin Connection
Pin 1 – 아날로그 출력
Pin 2 – 디지털 출력
Pin 3 - GND)
Pin 4 - 전원 VCC 3.5~5.5V DC

 

 

아날로그 디지털 컨버터 DAC 3208 설명  

 

MCP3208 은 8-Channel 12-Bit A/D Converter이다. 즉, 센서의 출력값인 아날로그 값을 12비트의 디지털값으로 변환하는 ADC 칩이다. 예를 들어 0v ~ 3.3v의 센서 출력값을 0 ~ 4095 (12bit)의 디지털값으로 변환해 주는 기능을 해준다.

 

라즈베리파이는 범용적인 목적으로 입/출력을 담당하는 GPIO (General Purpose Input / Output)를 가지고 있으며, SPI 통신, I2C 통신, UART 통신을 가지고 있지만, 아쉽게도 ADC 기능이 없어서 센서를 활용하지 못하는 단점이 있다. 그래서, ADC 칩인 MCP3208을 이용하여 외부 ADC 기능을 가지도록 하자. 이를 위해서는 라즈베리파이와 MCP3208간에 SPI 통신을 이용하여 ADC 데이터를 받아와야 한다.

 

MCP3208은 아래와 같은 핀 구조를 가지고 있다. 이를 라즈베리파이의 SPI 인터페이스를 위해서 아래의 회로도와 같이 연결해줘야 한다. MCP3208 은 총 8개의 ADC 포트(CH0~CH7)를 가지고 있는데 이번 강좌에서는 CH0에 가변저항을 달아 돌려가면서 ADC 값을 변경해 보며 테스트를 해보도록 하겠다. 자신이 이용하고자 하는 센서를 CH0 ~ CH7에 연결하여 사용하여도 무방하다.

 

 

MCP3208 핀 맵

 

MCP3208 핀 설명

 

스마트 홈에 연결된 실제 회로도(SPI 인터페이스) 

 

 

MCP3208 회로 연결도

 

조도센서의 연결

 

 

조도센서 연결

 

 

센서 캘리브레이션 (Calibration, 보정) 다른 센서와 마찬가지로 조도 센서도 보정을 거친 후 사용해야 한다. 방법은 전원을 연결하면 센서모듈 중앙의 두 개의 LED 중 한 개 전원 LED에 불이 들어온다. 이때 다른 LED 도 켜져 있다면 항상 신호가 들어오는 것이므로 가변저항을 돌려 약간만 시계, 반시계 방향으로 돌려도 신호 출력 LED 가 꺼지는 상태까지 보정해 주면 된다.

 

SPI 아날로그 신호 출력 테스트는 C언어로 작성해 보고자 한다. 매우 간단하니 천천히 따라해 보자. 우선, 위와 같은 회로를 구성한 후 전원을 넣고, 라즈베리파이를 구동하자. 아래의 순서대로 소스코드를 작성하도록 하자. (home-light.c)  

 

#include <stdio.h> 
#include <string.h> 
#include <errno.h>
 
#include <wiringPi.h> 
#include <wiringPiSPI.h> 

#define CS_MCP3208 8 //GPIO 8

#define SPI_CHANNEL 0 
#define SPI_SPEED 1000000 //1Mhz

// spi communication with Rpi and get sensor data 

int read_mcp3208_adc(unsigned char adcChannel) 
{
	unsigned char buff[3];
	int adcValue = 0;
	
	buff[0] = 0x06 | ((adcChannel & 0x07) >> 2);
	buff[1] = ((adcChannel & 0x07) << 6);
	buff[2] = 0x00;
	
	digitalWrite(CS_MCP3208, 0);
	wiringPiSPIDataRW(SPI_CHANNEL, buff, 3);
	
	buff[1] = 0x0f & buff[1];
	adcValue = (buff[1] << 8 ) | buff[2];
	
	digitalWrite(CS_MCP3208, 1);
	
	return adcValue;
}

int main(void) {

	unsigned char adcChannel_light = 3;

	int adcValue_light = 0;

	printf("start");
	
	if(wiringPiSetupGpio() == -1)
	{
		fprintf(stdout, "Unable to start wiringPi :%s\n", strerror(errno));
		return 1;
	}
	
	if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1)
	{
		fprintf(stdout, "wiringPiSPISetup Failed :%s\n", strerror(errno));
		return 1;
	}
	
	pinMode(CS_MCP3208, OUTPUT);
	//pinMode(CS_1_MCP3208, OUTPUT);
	
	//digitalWrite(CS_1_MCP3208, 1);
	
	while(1)
	{
		adcValue_light = read_mcp3208_adc(adcChannel_light);
		
		printf("light = %u\n", adcValue_light);
		
		delay(100);
	}
	return 0;
}

 

컴파일 명령

 

$gcc –o home-light  home-light.c -lwiringPi

 

실행 명령

 

$sudo ./home-light

 

아래는 밝을 때의 센서값을 보여주고, 그 아래에 어두울때의 센서값을 보여준다. 디지털 출력의 센서는 가변저항을 조절하여 기준값을 만들고 기준점에 해당되는 High(1) 값, 해당되지 않으면 Low(0)을 출력하므로 하루 종일 시시각각 변하는 빛의 양을 정확히 알기가 어렵다. 따라서 응용분야가 어디인지에 따라 아날로그 출력값과 디지털 출력값의 사용을 결정해야 한다.  

 

 

조도센서 실행화면 &ndash; 어두울 때

 

조도센서 실행화면 &ndash; 밝을 때

 

 

 

반응형