정보나눔

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

기존에 했던 작품에 릴레이 모듈을 연동 시키려고 하는데요!
Yogurt | 2018-04-25
 

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. 문제점 및 에러 내용

  (소스코드 문제일 경우 에러 내용도 같이 올려주세요.)

 

 

이번에 릴레이를 알게되어 기존 LED에 실제 전구를 적용 시켜보려고했습니다.

 

저는 단지 릴레이 모듈만 연결하면 될 줄 알았는데 소스가 따로 필요하더라구요

 

여차해서 릴레이 오픈 소스 (예제 소스)로 실제 전구를 스위치로 제어하는건 확인했습니다.

 

문제는 위의 소스와 릴레이 소스의 결합인데 어디를 어떻게 수정해야 정상적으로 작동할지 감이 안잡혀 모르겠습니다. 

 

어떻게 수정해야 할까요?

 

이전글   |    wifi 연결방법 문의 2018-04-24
다음글   |    무게센서관련해서 질문이 있습니다. 2018-04-25