극한의 아두이노 DIY생활 - 화재 경보기4

in kr-dev 커뮤니티4 years ago (edited)

안녕하세요! Jimae입니다.

하드웨어 회로도를 그리는대 프로그램이 불안전해서 자꾸 먹통이 되내요.

image.png

이렇게 그리고 있었는대 -.- 여기서 더 추가하거나 옮기기만 하면 프로그램이 꺼져버립니다.

다른 프로그램을 찾아야 할것같아요.

운영체제 호환 보다는 뭔가 다른문제가 있는것 같아요.

그래서!! 우선 하드웨어도 있어야 하지만 아니 꼭그려줘야 하는대...

순서를 바꿔서 소프트웨어를 먼저 보여드리겠습니다.

#include <MsTimer2.h>

#define START 1       
#define STOP 0

//////////////////////////////////////////////////////////////////////////////////////////////////////////
// 각 센서와 LED의 고유 핀번호
#define ONE_ROOM_REDLED A0
#define ONE_ROOM_YELLOWLED A1
#define ONE_ROOM_GREENLED A2
#define TWO_ROOM_REDLED A3
#define TWO_ROOM_YELLOWLED A4
#define TWO_ROOM_GREENLED A5
#define THREE_ROOM_REDLED 13
#define THREE_ROOM_YELLOWLED 12
#define THREE_ROOM_GREENLED 11

#define ONE_ROOM_HUMANDETECTION 2
#define TWO_ROOM_HUMANDETECTION 3
#define THREE_ROOM_HUMANDETECTION 4

#define ONE_ROOM_FIREDETECTION 5
#define TWO_ROOM_FIREDETECTION 6
#define THREE_ROOM_FIREDETECTION 7
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// 각 방번호 및 색깔 코드
#define ONE_ROOM 0
#define TWO_ROOM 1
#define THREE_ROOM 2

#define REDCOLOR 0
#define YELLOWCOLOR 1
#define GREENCOLOR 2
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// 방 LED 배열
unsigned char roomLed[3][3] = {
                                {ONE_ROOM_REDLED, ONE_ROOM_YELLOWLED, ONE_ROOM_GREENLED},
                                {TWO_ROOM_REDLED, TWO_ROOM_YELLOWLED, TWO_ROOM_GREENLED},
                                {THREE_ROOM_REDLED, THREE_ROOM_YELLOWLED, THREE_ROOM_GREENLED}
                              };
// 방 신체감지 센서 배열                              
unsigned char humanDetection[3] = {ONE_ROOM_HUMANDETECTION, TWO_ROOM_HUMANDETECTION, THREE_ROOM_HUMANDETECTION};
// 방 화제감지 센서 배열
unsigned char fireDetection[3] = {ONE_ROOM_FIREDETECTION, TWO_ROOM_FIREDETECTION, THREE_ROOM_FIREDETECTION};

// 방 시간 플래그 배열
unsigned char timeRoomFlag[3] = {STOP, STOP, STOP};
// 방 시간 (초단위)
unsigned int roomSecond[3] = {0,};

// 인체감지 센서, 화제감지 센서 각각 따로 루틴으로 돌리기 위해서 만듬
long HumanNowTime = 0;
long HumanPreviousTime = HumanNowTime;
long fireNowTime = 0;
long firePreviousTime = fireNowTime;

void setup() {
  // put your setup code here, to run once:

  LEDInit();    // LED 초기화

  SensorInit();   // 인체감지 센서, 화제감지 센서 초기화

  TimeCountInit();    // 시간 초기화
  
  MsTimer2::set(1000, TimeCount); // TimeCount함수를 1초마다 호출한다
  MsTimer2::start();

  Serial.begin (9600);    // 디버깅용 시리얼

  // 인체감지 센서, 화제감지 센서 각각 따로 루틴으로 돌리기 위해서 초기화
  HumanNowTime = millis();    
  HumanPreviousTime = HumanNowTime;
  
  fireNowTime = millis();
  firePreviousTime = fireNowTime;
}

void loop() {
  // put your main code here, to run repeatedly:
  
  HumanDetection();     // 인체감지 센서 관련된 기능들 이함수로 돌린다.
  
  FireDetection();      // 화제감지 센서 관련된 기능들 이함수로 돌린다.
}

void HumanDetection(void)   // 인체감지 센서 관련된 기능
{
  unsigned char num;

  HumanNowTime = millis();
  
  if(HumanNowTime - HumanPreviousTime > 250)    // 250ms 단위로 실행
  {
    for(num = 0; num < 3; num++)
    {
      if(HumanSensorRead(num))    // 사람 감지됨
      {
        TimeRoomInit(num);        // 방 타이머 초기화
        PeopleLEDoff(num);        // 사람 감지 되어서 LED 끔

//        Serial.print(num);
//        Serial.println(" off ");
      }
      else                        // 사람 감지안됨
      {
        TimeCountStart(num);      // 방 타이머 카운트 시작

        if(TimeDataRead(num) > 15)     // 15초 이상 감지 안될때
        {
          NoPeopleLEDon(num);     // 15초이상 사람감지 안되서 LED 킴

//         Serial.print(num);
//         Serial.println(" on ");
        }
      }
    }
    
    HumanPreviousTime = HumanNowTime;
  }
}

void NoPeopleLEDon(unsigned char roomNumber)    // 사람 감지 안되었을때 LED 키는함수
{
  unsigned char numBuffer = roomNumber;
  unsigned char num;

  for(num = 0; num < 2; num++)
  {
    numBuffer++;
    if(numBuffer >= 3) numBuffer = 0;
    LEDon(numBuffer, num);    
  }
}

void PeopleLEDoff(unsigned char roomNumber)      // 사람 감지 되었을때 LED 끄는함수
{
  unsigned char numBuffer = roomNumber;
  unsigned char num;

  for(num = 0; num < 2; num++)
  {
    numBuffer++;
    if(numBuffer >= 3) numBuffer = 0;
    LEDoff(numBuffer, num);   
  }
}

void FireDetection(void)    // 화제감지 센서 관련된 기능
{
  unsigned char num;
  
  fireNowTime = millis();
  
  if(fireNowTime - firePreviousTime > 500)    // 500ms 단위로 실행
  {
    for(num = 0; num < 3; num++)
    {
      if(FireSensorRead(num))     // 불 감지됨
      {
        LEDon(num, GREENCOLOR);   // 불 감지 되었을때 초록색 LED 킴
      }
      else                        // 불 감지안됨
      {
        LEDoff(num, GREENCOLOR);    // 불 감지 안되었을때 초록색 LED 끔
      }
    }
    
    firePreviousTime = fireNowTime;
  }
}

void LEDInit(void)    // 모든 LED 초기화
{
  unsigned char num1, num2;

  for(num1 = 0; num1 < 3; num1++)
  {
    for(num2 = 0; num2 < 3; num2++)
    {
      pinMode(roomLed[num1][num2], OUTPUT);
      digitalWrite(roomLed[num1][num2], LOW); 
    }
  }
}


void LEDon(unsigned char roomNumber, unsigned char colorCode)   // LED 키는 함수
{
  digitalWrite(roomLed[roomNumber][colorCode], HIGH); 
}

void LEDoff(unsigned char roomNumber, unsigned char colorCode)   // LED 끄는 함수
{
  digitalWrite(roomLed[roomNumber][colorCode], LOW); 
}

void SensorInit(void)   // 센서 초기화
{
  unsigned char num;
  
  for(num = 0; num < 3; num++)
  {
     pinMode(humanDetection[num], INPUT);
     pinMode(fireDetection[num], INPUT);
  }
}

bool HumanSensorRead(unsigned char roomNumber)    // 인체감지 센서 감지 되었는지 안되었는지 판단
{
  if(digitalRead(humanDetection[roomNumber]) == HIGH) return true;
  else return false;
}


bool FireSensorRead(unsigned char roomNumber)   // 화제감지 센서 감지 되었는지 안되었는지 판단
{
  if(digitalRead(fireDetection[roomNumber]) == LOW) return true;
  else return false;
}

void TimeCountInit(void)    // 시간 초기화
{ 
  unsigned char num;

  for(num = 0; num < 3; num++)
  {
    TimeRoomInit(num);
  }
}

void TimeRoomInit(unsigned char roomNumber)   // 방의 시간 초기화
{
  roomSecond[roomNumber] = 0;
  timeRoomFlag[roomNumber] = STOP;
}

void TimeCountStart(unsigned char roomNumber)   // 방의 시간 카운터 시작
{
  timeRoomFlag[roomNumber] = START;
}

bool TimeCountState(unsigned char roomNumber)   // 방의 시간 상태 확인하는 함수
{
  if(timeRoomFlag[roomNumber] == START) return true;
  else return false;
}

unsigned int TimeDataRead(unsigned char roomNumber)   // 방의 카운터된 시간 읽는 함수
{
  return roomSecond[roomNumber];
}

void TimeCount(void)    // 1초당 실행되는 인터럽트 함수
{ 
  unsigned char num;

  for(num = 0; num < 3; num++)
  {
     if(!TimeCountState(num))   // 방의 시간 상태가 STOP 일때 실행
     {
       TimeRoomInit(num);   // 방의 시간 초기화
//       Serial.print(num);
//       Serial.print(" = ");
//       Serial.println(roomSecond[num]);
       continue;
     }
     roomSecond[num]++;    // 1초 카운터
//     Serial.print(num);
//     Serial.print(" = ");
//     Serial.println(roomSecond[num]);
  }
}

하드 웨어 부분의 문제는 좀 천천히 찾아 보도록 하겠습니다.

현재 하드웨어적인 힌트를 소프트웨어에서 찾을수가 있는대

#define ONE_ROOM_REDLED A0
#define ONE_ROOM_YELLOWLED A1
#define ONE_ROOM_GREENLED A2
#define TWO_ROOM_REDLED A3
#define TWO_ROOM_YELLOWLED A4
#define TWO_ROOM_GREENLED A5
#define THREE_ROOM_REDLED 13
#define THREE_ROOM_YELLOWLED 12
#define THREE_ROOM_GREENLED 11

#define ONE_ROOM_HUMANDETECTION 2
#define TWO_ROOM_HUMANDETECTION 3
#define THREE_ROOM_HUMANDETECTION 4

#define ONE_ROOM_FIREDETECTION 5
#define TWO_ROOM_FIREDETECTION 6
#define THREE_ROOM_FIREDETECTION 7

각 핀을 이런식으로 연결했다는 것입니다.

하하 생각보다 프로그램이 기내요.

각핀을 저런식으로 연결하였기 때문에 막상따져보면 아두이노의 우노 스팩의 Pin을 거의다 쓰고있는 상태입니다.

그래서 회로도를 그리는대 애를 먹고 있어요 ㅠㅠ

프레지를 유료로 사야하나 고민중입니다.

우선 다른 프로그램을 찾아서 회로도를 그려서 나중에 올려드리겠습니다.

오늘은 우선 여기까지!! 다들 좋은 하루 되세요.

극한의 아두이노 DIY생활 - 화재 경보기1
극한의 아두이노 DIY생활 - 화재 경보기2
극한의 아두이노 DIY생활 - 화재 경보기3

Sort:  
 4 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.075
BTC 63426.05
ETH 1663.52
USDT 1.00
SBD 0.43