자작 정수기용 컨트롤러 4, IR 수신기 및 OLED 적용

2015. 9. 19. 21:58

Project/Water Purifier

자작 정수기용 컨트롤러4, 메뉴 생성(1)




  이번에는 이전 글에서 설명한 OLED 디스플레이 모듈과 IR 리모트컨트롤을 적용하여 설정 메뉴를 만들어보겠습니다. 둘 다 적용하기 위해서 브레드보드를 사용하지 않고 DFRobot 사에서 만든 입출력 쉴드(I/O Expansion Shield V7.1)를 사용했습니다. 실제 메뉴 생성은 다음 글에서 설명하고 여기서는 두 모듈을 동시에 적용하는 것까지 보여드립니다.






  DFRobot사의 아두이노(Arduino)용 쉴드, I/O Expansion Shield for Arduino V7 입니다. 인텔(Intel)의 에디슨(Edison)보드에서도 잘 작동하며, DFRobot 사의 에디슨 보드용 스타터킷에도 포함되어 있습니다.




  보드 모습입니다. 각 입출력 핀쪽에 신호선, 전원선, GND를 모두 적용해 놓았기 때문에, 센서 등을 연결할 때 3핀 헤더를 통해 손쉽게 연결할 수 있습니다. 가운데에는 지그비(ZigBee) 등을 위한 헤더소켓, 그 위쪽에 동 사에서 판매하는 SPI통신을 통한 블루투스 모듈과 SD카드 모듈을 위한 소켓이 있어서 유연한 확장성을 제공합니다.




  오른쪽 끝쪽에 녹색 터미널 단자 2개가 있습니다. 위쪽 단자를 통해 외부 전원을 보드에 입력할 수 있고, 아래쪽 단자는 서보 모터를 전원 입력 단자입니다. 자세한 기능 설명은 제품 페이지를 참고 하시고, 다음 기회에 자세히 다루겠습니다.




  역시, 브랜드 제품이라 깔끔합니다. 이 회사는 제품들은 블랙으로 꽤 깔끔한 인상을 주네요!






  아두이노 보드에 장착한 모습입니다. 여기서 사용한 보드는 역시 DFRobot 사에서 판매하는 WiDO라는 보드인데, 이번 프로젝트에 사용할 보드입니다. 테스트시에만 아두이노 우노 보드를 사용합니다. 다음에 설명할게요!











  Arduino Uno 보드에 OLED 모듈과 IR 수신기를 쉴드를 통해 장착했습니다. 제가 처음에 잘못 이해해서 3.3V는 연결하지 않아도 되는데, 계속 연결한 모습이 보이네요!





  장착 후, 각 모듈을 테스트 하기 위해 다시 예전 예제들을 불러왔습니다.





  원래 소스코드를 약간 수정했습니다. IRinput() 함수를 만들어서 IR 수신값을 처리하도록 했고, 함수 내에서는 Switch 문을 통하여 각 키값을 구별하여 시리얼모니터로 출력하는 간단한 예제입니다.


#include <IRremote.h>


int RECV_PIN = 11;


IRrecv irrecv(RECV_PIN);


decode_results results;


void setup()

{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    IRinput(); // 함수 추가
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

void IRinput()  // 입력 키값 처리를 위한 함수
{
  switch(results.value)
  {
    case 0xFF629D:
      Serial.println("Up");
      break;
    case 0xFFA857:
      Serial.println("Down");
      break;
    case 0xFF22DD:
      Serial.println("Left");
      break;
    case 0xFFC23D:
      Serial.println("Right");
      break;
    case 0xFF02FD:
      Serial.println("OK");
      break;
    case 0xFF6897:
      Serial.println("1");
      break;
    case 0xFF9867:
      Serial.println("2");
      break;
    case 0xFFB04F:
      Serial.println("3");
      break;
    case 0xFF30CF:
      Serial.println("4");
      break;
    case 0xFF18E7:
      Serial.println("5");
      break;
    case 0xFF7A85:
      Serial.println("6");
      break;
    case 0xFF10EF:
      Serial.println("7");
      break;
    case 0xFF38C7:
      Serial.println("8");
      break;
    case 0xFF5AA5:
      Serial.println("9");
      break;
    case 0xFF42BD:
      Serial.println("*");
      break;
    case 0xFF4AB5:
      Serial.println("0");
      break;
    case 0xFF52AD:
      Serial.println("#");
      break;
  }
}




  테스트 예제 결과입니다. 잘 작동하네요! 다음은 이 출력을 시리얼모니터가 아닌 OLED로 출력하기 위해 소스를 다시 고쳤습니다.



#define sclk 13

#define mosi 11

#define cs   10

#define rst  9

#define dc   8



// Color definitions

#define BLACK           0x0000

#define BLUE            0x001F

#define RED             0xF800

#define GREEN           0x07E0

#define CYAN            0x07FF

#define MAGENTA         0xF81F

#define YELLOW          0xFFE0  

#define WHITE           0xFFFF



#include <Adafruit_GFX.h>

#include <Adafruit_SSD1331.h>

#include <SPI.h>

#include <IRremote.h>


Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst);


int RECV_PIN = 12;


IRrecv irrecv(RECV_PIN);


decode_results results;


void setup(void) {
  Serial.begin(9600);
  
  display.begin();
  display.fillScreen(BLACK);
  
  irrecv.enableIRIn(); // Start the receiver

  delay(1000);
}

void loop() {

  display.setTextColor(BLUE);
  display.setTextSize(2);

  if (irrecv.decode(&results)) {
    IRinput();
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

void IRinput()
{
  switch(results.value)
  {
    case 0xFF629D:
      display.print("Up");
      break;
    case 0xFFA857:
      display.print("Down");
      break;
    case 0xFF22DD:
      display.print("Left");
      break;
    case 0xFFC23D:
      display.print("Right");
      break;
    case 0xFF02FD:
      display.print("OK");
      break;
    case 0xFF6897:
      display.print("1");
      break;
    case 0xFF9867:
      display.print("2");
      break;
    case 0xFFB04F:
      display.print("3");
      break;
    case 0xFF30CF:
      display.print("4");
      break;
    case 0xFF18E7:
      display.print("5");
      break;
    case 0xFF7A85:
      display.print("6");
      break;
    case 0xFF10EF:
      display.print("7");
      break;
    case 0xFF38C7:
      display.print("8");
      break;
    case 0xFF5AA5:
      display.print("9");
      break;
    case 0xFF42BD:
      display.print("*");
      break;
    case 0xFF4AB5:
      display.print("0");
      break;
    case 0xFF52AD:
      display.print("#");
      break;
  }
}


  결과는 아래 사진과 동영상을 확인하세요!! ^^





이상입니다.


Comments