BASIC4MCU | 질문게시판 | 답변 : 아두이노 타이머 인터럽트
페이지 정보
작성자 master 작성일2023-05-30 20:02 조회734회 댓글8건본문
#include <MsTimer2.h>
//
#include <Adafruit_NeoPixel.h>
#define PIXEL_PIN 9
#define PIXEL_PINN 8
#define PIXEL_COUNT 32
Adafruit_NeoPixel pixels(PIXEL_COUNT,PIXEL_PIN,NEO_GRB+NEO_KHZ800);
Adafruit_NeoPixel pixelss(PIXEL_COUNT,PIXEL_PINN,NEO_GRB+NEO_KHZ800);
//
#include <LedControl.h>
LedControl lc=LedControl(50,51,53,8);
//
#include <pm2008_i2c.h>
PM2008_I2C pm2008_i2c;
//
#define PIR_PIN 2
#define LIGHT_PIN A0
#define LIGHT_THRESHOLD 700
//
int gas=A1,flame=3,buzzer=13;
//
byte sad[8][8]={
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000},
{B00100000,B00100000,B00100000,B00100000,B00010000,B00001000,B00000100,B00000000},
{B00000000,B00000100,B00001000,B00010000,B00100000,B00010000,B00001000,B00000100},
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000},
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000},
{B00000000,B00000100,B00001000,B00010000,B00100000,B00100000,B00100000,B00100000},
{B00000100,B00001000,B00010000,B00100000,B00010000,B00001000,B00000100,B00000000},
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}
}
byte miso[8][8]={
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000},
{B00000100,B00000100,B00000100,B00000100,B00001000,B00010000,B00100000,B00000000},
{B00000000,B00000100,B00001000,B00010000,B00100000,B00010000,B00001000,B00000100},
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000},
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000},
{B00000000,B00100000,B00010000,B00001000,B00000100,B00000100,B00000100,B00000100},
{B00000100,B00001000,B00010000,B00100000,B00010000,B00001000,B00000100,B00000000},
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}
}
byte fire1[8][8]={
{B00000000,B11110000,B00000000,B01000000,B11000000,B11110000,B11000000,B01000000},
{B00000000,B00011111,B00000000,B00000111,B00001000,B00001000,B00001000,B00000111},
{B10000000,B11110000,B00000000,B10010000,B01010000,B01110000,B01010000,B10010000},
{B00000000,B00001111,B00000000,B00000101,B00001110,B00001110,B00001110,B00000101},
{B00000000,B11000000,B00000000,B10111000,B01101000,B01101000,B01111000,B10000000},
{B00000000,B00000111,B00000001,B00000101,B00001110,B00001110,B00001110,B00000101},
{B11110000,B00000000,B11110000,B00100000,B01000000,B10000000,B01000000,B00100000},
{B00001111,B00000001,B00001111,B00000000,B00000100,B00000111,B00000100,B00000100}
}
byte fire2[8][8]={
{B00000000,B11110000,B00000000,B11101000,B10101000,B10101000,B10111000,B00000000},
{B00000001,B00001111,B00000000,B00001111,B00000101,B00000101,B00001111,B00000000},
{B10000000,B11110000,B00000000,B10010000,B01010000,B01110000,B01010000,B10010000},
{B00000000,B00001111,B00000000,B00000101,B00001110,B00001110,B00001110,B00000101},
{B11100000,B00000000,B11100000,B01100000,B10010000,B10010000,B01100000,B00000000},
{B00001111,B00000001,B00001111,B00000010,B00000100,B00001000,B00000100,B00000010},
{B11110000,B00000000,B11110000,B00100000,B01000000,B10000000,B01000000,B00100000},
{B00001111,B00000001,B00001111,B00000000,B00000100,B00000111,B00000100,B00000100}
}
//
int num,state=0,matrix_mode=0,neo_mode=0,ret,lightVal,gas1,cnt1=0,cnt2=0;
//
void matrix1(){ for(int a=0;a<8;a++) for(int b=0;b<8;b++)lc.setRow(a,b,sad[a][b]); delay(500); } // 슬픔
void matrix2(){ for(int a=0;a<8;a++) for(int b=0;b<8;b++)lc.setRow(a,b,miso[a][b]); delay(500); } // 미소
void matrix3(){ for(int a=0;a<8;a++) for(int b=0;b<8;b++)lc.setRow(a,b,fire1[a][b]); delay(500); } //화재 위험
void matrix4(){ for(int a=0;a<8;a++) for(int b=0;b<8;b++)lc.setRow(a,b,fire2[a][b]); delay(500); } //화재발생
//
void disp_neo(int v){
for(int i=0;i<PIXEL_COUNT;i++){
pixels.setPixelColor(i,pixels.Color(v,v,v));
pixelss.setPixelColor(i,pixelss.Color(v,v,v));
}
pixels.show(); pixelss.show();
}
//----------------------------------------------
void setup(){
pixels.begin(); pixelss.begin();
pinMode(PIR_PIN,INPUT); pinMode(buzzer,OUTPUT); pinMode(flame,INPUT);
Serial.begin(9600);
#ifdef PM2008N
delay(10000); // wait for PM2008N to be changed to I2C mode
#endif
pm2008_i2c.begin(); pm2008_i2c.command(); delay(1000);
for(num=0;num<8;num++){
lc.shutdown(num,false); // 0~7번까지 매트릭스 절전모드 해제
lc.setIntensity(num,8); // 매트릭스의 밝기 선언 8,0~15의 수
lc.clearDisplay(num); // 매트릭스 led를 초기화
}
}
//----------------------------------------------
//void loop(){
noTone(buzzer);
//-----------------------------------
gas1=analogRead(gas);
state=digitalRead(flame); // 불꽃 감지센서
//
if(cnt1==0){
if(state==0){
if(matrix_mode!=4){ matrix_mode=4; Serial.print("__on"); tone(buzzer,1000,100); matrix4(); cnt1=10; }
}
else{
if(gas1>100){
if(matrix_mode!=3){ matrix_mode=3; Serial.print("__on"); tone(buzzer,1000,100); matrix3(); cnt1=10; }
}
else{
ret=pm2008_i2c.read(); Serial.print("Number of 0.3 um : "); Serial.println(pm2008_i2c.number_of_0p3_um); // 미세먼지 센서
if(pm2008_i2c.number_of_0p3_um>1300){
if(matrix_mode!=1){ matrix_mode=1; matrix1(); cnt1=10; }
}
else{
if(matrix_mode!=2){ matrix_mode=2; matrix2(); cnt1=10; }
}
// for(num=0;num<8;num++)lc.clearDisplay(num); Serial.print("OFF"); noTone(buzzer); // 8개의 매트릭스led 초기화
}
}
}
else cnt1--;
//-----------------------------------
lightVal=analogRead(LIGHT_PIN);
int pirVal=digitalRead(PIR_PIN);
//
if(lightVal>LIGHT_THRESHOLD){ // 밝을 떄
if(neo_mode!=0){ neo_mode=0; disp_neo(0); } // 끄기
}
else{ // 어두울 때
if(pirVal){
if(neo_mode!=2){ neo_mode=2; disp_neo(255); } // 네오픽셀을 흰색으로 켜기
else{
if(neo_mode!=1){ neo_mode=1; disp_neo( 10); } // 네오픽셀을 약간 밝게 켜기
}
}
//-----------------------------------
if(++cnt2>9){ cnt2=0;
Serial.print("gas : "); Serial.println(analogRead(gas)); // 가스센서
Serial.print("Light : "); Serial.println(lightVal);
}
//-----------------------------------
delay(100);
}
댓글 8
조회수 734미ㅏㄴㅇ님의 댓글
미ㅏㄴㅇ 작성일
선생님 감사합니다 무리 없이 작동하는 것 같습니다
근데 질문 몇 가지가 있습니다
인체 감지 센서로 인해 led가 최대한 밝게 켜지는 것과
도트 매트릭스가 불꽃 감지나 가스 감지를 해서 켜지는 글자
이 두가지를 3초나 또는 5초 유지하게 하는 방법은 또 delay를 사용하면 되나요?
그럼 또 딜레이끼리 엉켜서 이상하게 될 것 같아서 질문 남깁니다!
master님의 댓글
master
matrix3(); cnt1=10; }
3초로 바꾸려면 30으로 변경하고
5초로 바꾸려면 50으로 변경하세요
네오픽셀도 비슷하게 제어하고 싶다면 변수추가해서 동일한 방법으로 제어하면 됩니다.
미ㅏㄴㅇ님의 댓글
미ㅏㄴㅇ
감사합니다!
근데 헉시 loop문 주석 처리 해놓으셨는데 일부러 하신 건가요??
그리고 led의 밝기가 바뀔 때 깜빡이는 현상이 있는데 이건 코드 문제인건가요?
master님의 댓글
master
주석 제거하세요
깜박임 현상은 모르겠습니다.
미ㅏㄴㅇ님의 댓글
미ㅏㄴㅇ
아 넵 그럼 선생님 죄송하지만 cnt1은 위에서 말씀주셨듯 시간 제어인 거 같고 cnt2도 시간 제어하는 코드 맞나요??
master님의 댓글
master
cnt2는 10이므로 1초이고요(0~9)
시리얼모니터에 가스측정값과 빛 측정값을 1초에 1번씩만 출력하기 위한 변수입니다.
미ㅏㄴㅇ님의 댓글
미ㅏㄴㅇ 작성일
감사합니다
근데 혹시 matrix3 또는 4가 on이 되면 led도 같이 변하는데 이건 혹시 코드 문제인가요?
master님의 댓글
master
lightVal=analogRead(LIGHT_PIN);
int pirVal=digitalRead(PIR_PIN);
led는 이 값들의 영향을 받을 뿐 매트릭스와 무관하지 않나요?