정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 릴레이 동작 오류
Yogurt | 2018-05-10
 

1. 프로젝트 사용한 보드 종류

  아두이노 UNO

 

 

2. 사용한 개발 프로그램명

  아두이노 IDE

 

 

3. 사용한 센서 모델명

  

Voice Recognition Module V3 / Adafruit Industries CC3000 WiFi Shield

 

 

 

4. 연결한 회로 설명 (또는 이미지)

 

작품은 cc3000 와이파이 모듈 (블링크앱 연동)과 음성인식 모듈 그리고 기존 스위치를 이용에 

LED를 상호연동 시킨 작품입니다. 

 

5. 소스코드 (주석 필수)

  (원하는 기능의 코드를 전부 작성해 드리긴 어렵습니다. 기초부터 차근차근 공부해보면서 코드를 만들어 보세요.)

 

기존 작품 소스

 

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  BLYNK 디버그 출력 초기화
////////////////////////////////////////////////////////////////////////////////////////////////////////
#define BLYNK_PRINT Serial

////////////////////////////////////////////////////////////////////////////////////////////////////////
// CC3000 핀 설정
////////////////////////////////////////////////////////////////////////////////////////////////////////
#define ADAFRUIT_CC3000_IRQ   3
#define ADAFRUIT_CC3000_VBAT  5
#define ADAFRUIT_CC3000_CS    10

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  음성 인식 모듈에서 넘어오는 데이터 
////////////////////////////////////////////////////////////////////////////////////////////////////////
#define living          (0)
#define main            (1) 
#define kitchen         (2)

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  핀설정
////////////////////////////////////////////////////////////////////////////////////////////////////////
#define led_living          9
#define led_main            8 
#define led_kitchen         7

#define sw_living           A0
#define sw_main             A1
#define sw_kitchen          A2

#define led_ready_wifi      A5

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  필요 라이브러리 추가
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include                       //CC3000 와이파이 모듈 연결을 위한 라이브러리
#include            //CC3000 와이파이 모듈 라이브러리
#include          //Blynk연결 라이브러리
#include           //음성인식 모듈 연결을 위한 라이브러리
#include "VoiceRecognitionV3.h"        //음성인식 모듈 라이브러리

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  음성인식 모듈 핀 초기화
////////////////////////////////////////////////////////////////////////////////////////////////////////
VR myVR(2,4);    // 2:RX 4:TX 로 연결

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  BLYNK 앱 토큰값 입력
////////////////////////////////////////////////////////////////////////////////////////////////////////
char auth[] = "611bea12f80249daad69b27155014cb9";   // 앱 토큰값 

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  와이파이 설정
////////////////////////////////////////////////////////////////////////////////////////////////////////
char ssid[] = "3048";                     // AP 이름
char pass[] = "1234512345";               // 패스워드
int wifi_sec = WLAN_SEC_WPA2;             // 보안방식

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  음성인식 모듈용 변수 선언
////////////////////////////////////////////////////////////////////////////////////////////////////////
uint8_t records[7]; // save record
uint8_t buf[64];

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  LED 상태 출력용 변수 선언
////////////////////////////////////////////////////////////////////////////////////////////////////////
bool living_status = 0;   // 거실 불의 상태
bool main_status = 0;     // 안방 불의 상태
bool kitchen_status = 0;  // 부엌 불의 상태

bool sw_state_living;     // 거실 스위치 상태 저장 변수
bool sw_state_main;       // 안방 스위치 상태 저장 변수
bool sw_state_kitchen;    // 부엌 스위치 상태 저장 변수

bool flag_state_living;   // 거실 스위치 연속 동작 방지 변수
bool flag_state_main;     // 안방 스위치 연속 동작 방지 변수
bool flag_state_kitchen;  // 부엌 스위치 연속 동작 방지 변수

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  BLYNK 앱 연동 변수
//  앱 버튼 설정이 PUSH 일때 함수가 두번 호출되기 때문에 카운트 하기 위한 변수 선언
////////////////////////////////////////////////////////////////////////////////////////////////////////
int val_v1 = 0;   // 거실용
int val_v2 = 0;   // 안방용
int val_v3 = 0;   // 부엌용

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  BLYNK 앱 거실 버튼 눌렀을때 동작 함수
////////////////////////////////////////////////////////////////////////////////////////////////////////
BLYNK_WRITE(V1)
{  
  val_v1++;                                     // 호출 횟수를 카운트
  if(val_v1>1){                                 // 1초과일때  
    living_status =! living_status;             // 거실불 상태를 반전함 (1이면 0으로 0이면 1로)
    digitalWrite(led_living, living_status);    // 반전된 상태로 거실불 출력
    val_v1 = 0;                                 // 카운터 초기화
  }  
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//  BLYNK 앱 안방 버튼 눌렀을때 동작 함수
////////////////////////////////////////////////////////////////////////////////////////////////////////
BLYNK_WRITE(V2)
{
  val_v2++;
  if(val_v2>1){
    main_status =! main_status;                 // 안방불 상태를 반전함 (1이면 0으로 0이면 1로)
    digitalWrite(led_main, main_status);   
    val_v2 = 0;
  }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  BLYNK 앱 부엌 버튼 눌렀을때 동작 함수
////////////////////////////////////////////////////////////////////////////////////////////////////////
BLYNK_WRITE(V3)
{
  val_v3++;
  if(val_v3>1){
    kitchen_status =! kitchen_status;             // 부엌불 상태를 반전함 (1이면 0으로 0이면 1로)
    digitalWrite(led_kitchen, kitchen_status);
    val_v3 = 0;
  }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  아두이노 초기화
////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
  
  // Debug console
  Serial.begin(9600);                           // 시리얼 통신 9600bps 로 초기화
  myVR.begin(9600);                             // 음성인식 모듈용 통신단 9600bps로 초기화
  pinMode(led_living,OUTPUT);                   // 거실 LED 출력설정   
  pinMode(led_main,OUTPUT);                     // 안방 LED 출력설정
  pinMode(led_kitchen,OUTPUT);                  // 부엌 LED 출력설정                
  pinMode(led_ready_wifi,OUTPUT);               // 와이파이 설정 완료 LED 출력설정

  pinMode(sw_living,INPUT_PULLUP);              // 거실용 스위치 풀업 입력 설정
  pinMode(sw_main,INPUT_PULLUP);                // 안방용 스위치 풀업 입력 설정
  pinMode(sw_kitchen,INPUT_PULLUP);             // 부엌용 스위치 풀업 입력 설정
  Blynk.begin(auth, ssid, pass, wifi_sec);     // Blynk 앱 동작 초기화

  if(myVR.load((uint8_t)living) >= 0){         // 거실 음성 로드 체크
    Serial.println("living loaded");
  }
  
  if(myVR.load((uint8_t)main) >= 0){            // 안방 음성 로드 체크
    Serial.println("main loaded");
  }

  if(myVR.load((uint8_t)kitchen) >= 0){         // 부엌 음성 로드 체크
    Serial.println("kitchen loaded");
  }

  digitalWrite(led_ready_wifi, HIGH);            // 모든 초기화 동작이 완료 되었으므로 READY LED를 켜서 알려줌
  
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
//  아두이노 실행
////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
  int ret;
  
  Blynk.run();                                             // 앱과 와이파이로 동작
    
  sw_state_living = digitalRead(sw_living);                 // 거실 스위치 값을 입력 받음.
  sw_state_main = digitalRead(sw_main);                     // 안방 스위치 값을 입력 받음.
  sw_state_kitchen = digitalRead(sw_kitchen);               // 부엌 스위치 값을 입력 받음.

  if(sw_state_living == LOW)                                // 거실 스위치가 눌렸을때 
  {
    if(flag_state_living == 0)                              // flag_state_living 이 0이라면
    {
      flag_state_living = 1;                                // flag_state_living을 1로 만들어 한번만 동작하게 만들고
      living_status =! living_status;                       // 거실불 상태를 반전함 (1이면 0으로 0이면 1로)
      digitalWrite(led_living, living_status);              // 반전된 상태로 거실불 출력
    }
  }
  else                                                      // 거실 스위치가 안눌렸을때
  {
    flag_state_living = 0;                                  // flag_state_living 을 0으로 초기화.
  }
//------------------------------------------------------------------
  if(sw_state_main == LOW)
  {
    if(flag_state_main == 0)
    {
      flag_state_main = 1;
      main_status =! main_status; 
      digitalWrite(led_main, main_status);     
    }
  }
  else
  {
    flag_state_main = 0;
  }
//------------------------------------------------------------------
  if(sw_state_kitchen == LOW)
  {
    if(flag_state_kitchen == 0)
    {
      flag_state_kitchen = 1;
      kitchen_status =! kitchen_status; 
      digitalWrite(led_kitchen, kitchen_status);     
    }
  }
  else
  {
    flag_state_kitchen = 0;
  }

  
  ret = myVR.recognize(buf, 50);                        // 음성인식 모듈에서 데이터를 받아서 임시 변수에 입력
  if(ret>0){                                             // 임시변수 값이 0 초과일때
    switch(buf[1]){                                      // buf[1]의 데이터를 조건으로 
      case living:                                       // buf[1]이 living값 0 이면. 즉 거실 이라는 명령이 음성으로 들어오면
        /** turn on LED */
        living_status =! living_status;                  // 거실불 상태를 반전함 (1이면 0으로 0이면 1로) 
        digitalWrite(led_living, living_status);         // 반전된 상태로 거실불 출력
        break;
      case main:
        /** turn off LED*/
        main_status =! main_status;
        digitalWrite(led_main, main_status);
        break;
      case kitchen:
      kitchen_status =! kitchen_status;
        digitalWrite(led_kitchen, kitchen_status);
      break;
      default:                                              // 조건에 맞는게 없으면
        Serial.println("Record function undefined");       // 메세지를 띄운다.
      break;
    }
  }
}

 

 

예제로 사용한 릴레이 소스

 

const int buttonPin = 9;
const int ledPin =  8;

int buttonState = 0;      // 입력 버튼값 변수

void setup() 
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  // 버튼 값 입력
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH) {
    // LED 전등켜기
    digitalWrite(ledPin, HIGH);
  } else {
    // LED 전등끄기
    digitalWrite(ledPin, LOW);
  }
}

 

6. 문제점 및 에러 내용

 

 

안녕하세요 릴레이 관련해서 질문했던 학생입니다.

 

 

릴레이 연결까지 해서 상용전구 3개를 동작하는 것 까지 확인했습니다.

 

그런데 문제가 하나 생겨서 질문 드립니다. 

 

어떤 조건 때문인지는 모르겠으나 상용전구 3개를 제어하다가 불규칙적으로 갑자기 모든 전구가 on되면서 이후로 제어 작동이 되지 않습니다. 혹시나 릴레이 문제인가해서 똑같은 제품의 다른 릴레이로 교체해봤는데도 마찬가지 입니다.

 

글로는 설명이 어려워 동영상을 첨부합니다.

 

현재 아두이노와 보드에는 토글 스위치 3개, 와이파이 연결 확인용 LED 1개, 그리고 상용전구 3개가 연결 되어 있습니다.

 

혹시나 아두이노나 와이파이 쉴드가 흔이 말하는 뻑나가서 그런건지 아니면 단순히 연결 상 문제가 있는 것인지 저항 문제인것인지 너무 많이 연결해서 그런 것인지 도저히 모르겠습니다.

 

 

상용전구는 이런식으로 연결해 놓은 상태입니다. 

 

이전글   |    지니어스키트 문의 2018-05-09
다음글   |    LCD IIC 모델 한글 출력 관련하여 문의드립니다.... 2018-05-10