BASIC4MCU | 질문게시판 | 아두이노 타이머 인터럽트
페이지 정보
작성자 미ㅏㄴㅇ 작성일2023-05-30 17:00 조회381회 댓글0건본문
며칠전에 millis로 질문하였던 사람입니다
죄송하지만 알려주신 링크로 millis 부분으로 코딩을 어느정도 성공을 하여
대학생이라 교수님께 피드백을 받으러 갔더니 millis말고 타이머 인터럽트로 하라고 하였습니다
그래서 또 죄송스럽게 질문을 남깁니다
타이머 인터럽트를 사용하여
조도 센서와 인체 감지 센서를 활용해 네오픽셀 (led)가 켜고 꺼지는 부분과
불꽃 감지 센서와 가스 감지 센서에 의한 도트 매트릭스의 표출이
동시에 이루어지지 않아서 인터럽트를 사용하라고 하는데 혹시 도움을 좀 받을 수 있을까요
도트 매트릭스에는 불꽃 센서와 가스 센서가 아무것도 인식을 하지 않을 땐 미세먼지 농도에 따라 슬픈 이모티콘과 웃는 이모티콘이 나타나는 코드 입니다
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=22691
#include <Adafruit_NeoPixel.h>
#include <LedControl.h>
#include <pm2008_i2c.h>
#define PIXEL_PIN 9
#define PIXEL_PINN 8
#define PIXEL_COUNT 32
#define PIR_PIN 2
#define LIGHT_PIN A0
#define LIGHT_THRESHOLD 700
PM2008_I2C pm2008_i2c;
LedControl lc = LedControl(50, 51, 53, 8);
int num;
int buzzer = 13;
int flame = 3;
int state = 0;
int gas = A1;
Adafruit_NeoPixel pixels(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixelss(PIXEL_COUNT, PIXEL_PINN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin();
pixelss.begin();
pinMode(PIR_PIN, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(flame, INPUT);
Serial.begin(9600);
#ifdef PM2008N
// wait for PM2008N to be changed to I2C mode
delay(10000);
#endif
pm2008_i2c.begin();
pm2008_i2c.command();
delay(1000);
Serial.begin(9600);
for (num = 0; num < 8; num++) // 매트릭스 0번부터 7번까지 세팅
{
lc.shutdown(num, false); // 0~7번까지 매트릭스 절전모드 해제
lc.setIntensity(num, 8); // 매트릭스의 밝기 선언 8, 0~15의 수
lc.clearDisplay(num); // 매트릭스 led를 초기화
}
}
// matrix 함수 선언 슬픔
void matrix(){
byte a[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; // '매트릭스'의 1번
byte b[8]={B00000100,B00001000,B00010000,B00100000,B00010000,B00001000,B00000100,B00000000}; // '매트릭스'의 2번
byte c[8]={B00000000,B00000100,B00001000,B00010000,B00100000,B00100000,B00100000,B00100000}; // '매트릭스'의 3번
byte d[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; // '매트릭스'의 4번
byte e[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; // '매트릭스'의 5번
byte f[8]={B00000000,B00000100,B00001000,B00010000,B00100000,B00010000,B00001000,B00000100}; // '매트릭스'의 6번
byte g[8]={B00100000,B00100000,B00100000,B00100000,B00010000,B00001000,B00000100,B00000000}; // '매트릭스'의 7번
byte h[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; // '매트릭스'의 8번
// lc.setRow 함수는 행(Row)기준으로 도트매트릭스를 제어 lc.setRow(matrix_number,Row,value)
for(int j=0;j<8;j++){
lc.setRow(0,j,h[j]); lc.setRow(1,j,g[j]); lc.setRow(2,j,f[j]); lc.setRow(3,j,e[j]);
lc.setRow(4,j,d[j]); lc.setRow(5,j,c[j]); lc.setRow(6,j,b[j]); lc.setRow(7,j,a[j]);
}
delay(500);
}
void matrixx() { // 미소
{
// '화'의 윗부분 이진수로 배열 선언
// '이모티콘'의 1번
byte i[8] = {B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000};
// '이모티콘'의 2번
byte k[8] = {B00000100,B00001000,B00010000,B00100000,B00010000,B00001000,B00000100,B00000000};
// '이모티콘'의 3번
byte l[8] = {B00000000,B00100000,B00010000,B00001000,B00000100,B00000100,B00000100,B00000100};
// '이모티콘'의 4번
byte m[8] = {B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000};
// '이모티콘'의 5번
byte n[8] = {B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000};
//'이모티콘'의 6번
byte o[8] = {B00000000,B00000100,B00001000,B00010000,B00100000,B00010000,B00001000,B00000100};
// '이모티콘'의 7번
byte p[8] = {B00000100,B00000100,B00000100,B00000100,B00001000,B00010000,B00100000,B00000000};
// '이모티콘'의 8번
byte q[8] = {B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000};
// lc.setRow 함수는 행(Row) 기준으로 도트매트릭스를 제어 lc.setRow(matrix_number,Row,value)
for (int j = 0; j < 8; j++)
{
lc.setRow(0, j, q[j]); // 0번째 매트릭스에서 '빈공간'출력
lc.setRow(1, j, p[j]); // 1번째 매트릭스에서 '이모티콘'출력
lc.setRow(2, j, o[j]); // 2번째 매트릭스에서 '이모티콘'출력
lc.setRow(3, j, n[j]); // 3번째 매트릭스에서 '빈공간'출력
lc.setRow(4, j, m[j]); // 4번째 매트릭스에서 '빈공간'출력
lc.setRow(5, j, l[j]); // 5번째 매트릭스에서 '이모티콘'출력
lc.setRow(6, j, k[j]); // 6번째 매트릭스에서 '이모티콘'출력
lc.setRow(7, j, i[j]); // 7번째 매트릭스에서 '빈공간'출력
}
delay(500);
}
}
void matrixxx() //화재 위험
{
// '재'의 윗부분 이진수로 배열 선언
byte aa[8] = {B00001111,B00000001,B00001111,B00000000,B00000100,B00000111,B00000100,B00000100};
// 한글 '재'의 밑부분 이진수로 배열 선언
byte bb[8] = {B11110000,B00000000,B11110000,B00100000,B01000000,B10000000,B01000000,B00100000};
// 한글 '험'의 윗 이진수로 배열 선언
byte cc[8] = {B00000000,B00000111,B00000001,B00000101,B00001110,B00001110,B00001110,B00000101};
// '험'의 밑부분 이진수로 배열 선언
byte dd[8] = {B00000000,B11000000,B00000000,B10111000,B01101000,B01101000,B01111000,B10000000};
// 한글 '화'의 위부분 이진수로 배열 선언
byte ee[8] = {B00000000,B00001111,B00000000,B00000101,B00001110,B00001110,B00001110,B00000101};
// 한글 '화'의 밑부분 이진수로 배열 선언
byte ff[8] = {B10000000,B11110000,B00000000,B10010000,B01010000,B01110000,B01010000,B10010000};
// 한글 '위'의 윗부분 이진수로 배열 선언
byte gg[8] = {B00000000,B00011111,B00000000,B00000111,B00001000,B00001000,B00001000,B00000111};
// '위'의 밑부분 이진수로 배열 선언
byte hh[8] = {B00000000,B11110000,B00000000,B01000000,B11000000,B11110000,B11000000,B01000000};
// lc.setRow 함수는 행(Row) 기준으로 도트매트릭스를 제어 lc.setRow(matrix_number,Row,value)
for (int j = 0; j < 8; j++)
{
lc.setRow(0, j, hh[j]); // 0번째 매트릭스에서 '험'아래출력
lc.setRow(1, j, gg[j]); // 1번째 매트릭스에서 '위'아래출력
lc.setRow(2, j, ff[j]); // 2번째 매트릭스에서 '재'아래출력
lc.setRow(3, j, ee[j]); // 3번째 매트릭스에서 '화'아래출력
lc.setRow(4, j, dd[j]); // 4번째 매트릭스에서 '험'위출력
lc.setRow(5, j, cc[j]); // 5번째 매트릭스에서 '위'위출력
lc.setRow(6, j, bb[j]); // 6번째 매트릭스에서 '재'위출력
lc.setRow(7, j, aa[j]); // 7번째 매트릭스에서 '화'위 출력
}
delay(500);
}
void matrixxxx() //화재발생
{
// '재'의 윗부분 이진수로 배열 선언
byte aa[8] = {B00001111,B00000001,B00001111,B00000000,B00000100,B00000111,B00000100,B00000100};
// 한글 '재'의 밑부분 이진수로 배열 선언
byte bb[8] = {B11110000,B00000000,B11110000,B00100000,B01000000,B10000000,B01000000,B00100000};
// 한글 '발'의 윗 이진수로 배열 선언
byte cc[8] = {B00001111,B00000001,B00001111,B00000010,B00000100,B00001000,B00000100,B00000010};
// '발'의 밑부분 이진수로 배열 선언
byte dd[8] = {B11100000,B00000000,B11100000,B01100000,B10010000,B10010000,B01100000,B00000000};
// '화'의 윗부분
byte ee[8] = {B00000000,B00001111,B00000000,B00000101,B00001110,B00001110,B00001110,B00000101};
// 한글 '화'의 밑부분 이진수로 배열 선언
byte ff[8] = {B10000000,B11110000,B00000000,B10010000,B01010000,B01110000,B01010000,B10010000};
// 한글 '발'의 윗부분 이진수로 배열 선언
byte gg[8] = {B00000001,B00001111,B00000000,B00001111,B00000101,B00000101,B00001111,B00000000};
// '발'의 밑부분 이진수로 배열 선언
byte hh[8] = {B00000000,B11110000,B00000000,B11101000,B10101000,B10101000,B10111000,B00000000};
// lc.setRow 함수는 행(Row) 기준으로 도트매트릭스를 제어 lc.setRow(matrix_number,Row,value)
for (int j = 0; j < 8; j++)
{
lc.setRow(0, j, hh[j]); // 0번째 매트릭스에서 '험'아래출력
lc.setRow(1, j, gg[j]); // 1번째 매트릭스에서 '위'아래출력
lc.setRow(2, j, ff[j]); // 2번째 매트릭스에서 '재'아래출력
lc.setRow(3, j, ee[j]); // 3번째 매트릭스에서 '화'아래출력
lc.setRow(4, j, dd[j]); // 4번째 매트릭스에서 '험'위출력
lc.setRow(5, j, cc[j]); // 5번째 매트릭스에서 '위'위출력
lc.setRow(6, j, bb[j]); // 6번째 매트릭스에서 '재'위출력
lc.setRow(7, j, aa[j]); // 7번째 매트릭스에서 '화'위 출력
}
delay(500);
}
void loop() {
int pirVal = digitalRead(PIR_PIN);
int lightVal = analogRead(LIGHT_PIN);
int gas1 = analogRead(gas);
state = digitalRead(flame);
Serial.print("gas : ");
Serial.println(analogRead(gas));
Serial.print("Light : ");
Serial.println(analogRead(A0));
noTone(buzzer);
uint8_t 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) {
matrix();
}
else {
matrixx();
}
//가스센서 + 불꽃 감지센서
if (state == 0) {
Serial.print("__on");
tone(buzzer, 1000, 100);
matrixxxx();
delay(10000);
}
else if (gas1 > 100) {
Serial.print("__on");
tone(buzzer, 1000, 100);
matrixxx();
delay(10000);
}
else {
for (num = 0; num < 8; num++) // 8개의 매트릭스led 초기화
{
lc.clearDisplay(num);
}
Serial.print("OFF");
noTone(buzzer);
}
// 밑에서 부터 NEOPIXEL 9번핀
if (lightVal > LIGHT_THRESHOLD) { // 밝을 떄
for (int i = 0; i < PIXEL_COUNT; i++) {
pixels.setPixelColor(i, pixels.Color(0, 0, 0)); // 네오픽셀을 끄기
pixelss.setPixelColor(i, pixelss.Color(0, 0, 0)); // 네오픽셀을 끄기
}
pixels.show();
pixelss.show();
}
else { // 어두울 때
if ( lightVal < LIGHT_THRESHOLD ) {
for (int i = 0; i < PIXEL_COUNT; i++) {
pixels.setPixelColor(i, pixels.Color(10, 10, 10)); // 네오픽셀을 약간 밝게 켜기
pixelss.setPixelColor(i, pixelss.Color(10, 10, 10)); // 네오픽셀을 약간 밝게 켜기
}
pixelss.show();
pixels.show();
}
if (lightVal < LIGHT_THRESHOLD && pirVal == HIGH) {
for (int i = 0; i < PIXEL_COUNT; i++) {
pixels.setPixelColor(i, pixels.Color(255, 255, 255)); // 네오픽셀을 흰색으로 켜기
pixelss.setPixelColor(i, pixelss.Color(255, 255, 255)); // 네오픽셀을 흰색으로 켜기
}
pixels.show();
pixelss.show();
}
delay(2000);
}
}
댓글 0
조회수 381등록된 댓글이 없습니다.