IoT 개발 시작하기: ESP8266 Arduino 자습서
게시 됨: 2022-03-11이 ESP8266 Arduino 자습서의 목적은 IoT 공간에서 접근성과 사용 용이성으로 인해 제조업체 커뮤니티(및 일반 개발자) 사이에서 매우 인기 있는 칩에서 Arduino를 사용한 임베디드 프로그래밍에 익숙해지는 것입니다. 이 튜토리얼은 또한 Alexa가 가정에서 우리의 입찰을 하도록 하기 위해 비공식 "해킹"을 사용하여 Alexa로 더러워집니다(이 기술은 프로덕션에서 사용하기 위한 것이 아니라 가정에서 시연용으로만 사용됨). 집에서 시도하되 직장에서는 시도하지 마십시오.
이 기술의 장점은 집에서 Alexa가 전기로 실행되는 거의 모든 것을 자동화하도록 이 기술을 사용할 수 있다는 것입니다. 추가 보너스로 우리는 Arduino를 사용한 임베디드 프로그래밍에 대한 통찰력을 얻었습니다. 이 기술은 요즘 주류 프로그래머들 사이에서는 그리 흔하지 않을 수 있습니다. 마지막으로 DIY 애호가들 사이에서 인기 있는 ESP8266 칩으로 작업합니다. 이 프로젝트에 필요한 내장형 Wi-Fi 칩과 함께 모든 종류의 작업을 실행할 수 있는 놀라운 작은 칩입니다. Alexa 장치와 칩이 서로 직접 통신할 수 있게 해주는 것입니다.
Alexa 프로그래밍에 대한 약간의 배경 지식: Alexa "기술" 프로그래밍 모델은 다음과 같이 작동합니다.
- 당신은 당신의 알렉사와 이야기합니다.
- Alexa는 음성을 Amazon의 클라우드로 다시 라우팅합니다.
- 음성 명령은 Alexa "skill"(Amazon의 클라우드에서 실행되는 프로그램)으로 라우팅됩니다.
Alexa "기술"이 명령 처리를 인수합니다. 일반적으로 응답이 Alexa 장치로 다시 전송되어 응답으로 사용자에게 무언가를 말하도록 합니다. Alexa IoT의 경우 명령이 Amazon 클라우드의 "디바이스 섀도우"로 라우팅되어 결국 집에 있는 다른 디바이스로 응답이 전송됩니다. 우리는 해킹으로 이 모든 것을 우회하고 있습니다. 우리는 Alexa 장치가 우리 집 안의 ESP8266 칩과 직접 통신하도록 하고, 클라우드와 그 반대로 아무 것도 보내지 않고 싶습니다. 우리는 Alexa가 우리 집 Wi-Fi 네트워크 내부에서만 ESP8266에 요청을 직접 보내기를 원합니다.
우리의 해킹은 사실 비밀이 아닙니다. 우리는 ESP8266이 위에서 설명한 모든 Amazon 클라우드 통신을 우회하여 Alexa 장치와 직접 통신할 수 있도록 하는 Amazon과의 특별 라이선스가 있는 장치인 Wemo Belkin을 "에뮬레이트"하도록 만들 것입니다.
Wemo인 척하는 ESP8266은 Alexa에서 직접 명령을 수신할 수 있는 특권을 누립니다.
ESP8266 Arduino 자습서의 기본 계획
- Alexa 장치용 ESP8266에서 호환 장치에 대한 로컬 Wi-Fi 네트워크의 프로브를 전송하고 "I'm a Wemo"라고 말하여 이러한 프로브에 응답합니다.
- Alexa 장치에서 신뢰하면 해당 장치에서 추가 명령을 수신합니다. IR 송신기를 통해 IR 코드를 전송하고 TV를 켜고 끄는 방식으로 처리합니다.
하드웨어 요구 사항
이 튜토리얼을 완료하려면 몇 가지 항목을 직접 가져와야 하며 모두 쉽게 얻을 수 있습니다.
- 모든 Alexa 장치. Alexa Dot으로 이 튜토리얼을 개발했습니다. 튜토리얼이 Echo 시뮬레이터에서 작동합니까? 그것은 수도! (그러나 나는 그것을 테스트하지 않았다). 모험심(또는 검소한) 느낌이 든다면 시도해 보십시오. Alexa 장치는 용돈이 필요하지만 Echosim의 사용은 무료입니다.
- ESP8266 칩. 이 글을 쓰는 시점에서 비용은 몇 달러에 불과합니다. Ebay 또는 온라인으로 잘 갖춰진 하드웨어 상점에서 구입할 수 있습니다.
- IR(적외선) 다이오드. 이것을 ESP8266 칩에 연결해야 하며 이것은 스스로 해야 합니다. 이 프로젝트의 경우 전송 기능만 필요합니다. 우리는 IR 수신에 대해 신경 쓰지 않습니다. 이 튜토리얼이 작동하려면 다이오드를 GND에 연결하고 0을 출력해야 합니다. (다른 방법으로 하면 괜찮지만 그에 따라 튜토리얼 코드도 수정해야 합니다. 이 링크가 도움이 될 것입니다. ESP8266, 핀 0에 사용된 번호 체계로 인해 "D3"로 표시될 수 있습니다.
- 한 쪽은 USB(개발자 컴퓨터에 연결)이고 다른 쪽은 ESP8266 칩에 맞는 직렬 어댑터입니다.
- 사용자 이름과 암호를 알고 있는 로컬 Wi-Fi 네트워크입니다.
Arduino 소프트웨어 도구
- 아두이노 IDE. Windows를 포함한 모든 주요 OS용 버전이 있습니다. 이 튜토리얼은 Ubuntu 버전에서 개발되었지만 Windows에서도 Arduino를 설치하여 사용했는데 문제는 없었습니다.
- Arduino용 ESP8266 개발 라이브러리.
- 드라이버. 다행히 어댑터용 드라이버는 플러그 앤 플레이 방식이어야 하므로 추가 드라이버가 필요하지 않습니다.
모든 설정
- 아두이노 IDE를 설치합니다.
- 보드 관리자를 사용하여 ESP8266 라이브러리를 설치합니다.
보드 관리자를 사용하여 ESP8266 라이브러리를 설치하려면:
- Arduino IDE에서 파일 -> 환경 설정 을 엽니다.
- "추가 보드 관리자 URL"에 이 URL을 입력하십시오. http://arduino.esp8266.com/stable/package_esp8266com_index.json
- 확인을 클릭하십시오
보드 관리자로 이동합니다( 도구 -> 보드: [현재 보드] -> 보드 관리자 ).
- "필터" 텍스트 상자에 "ESP8266"을 입력합니다.
- 추가 보드 관리자가 추가되었으므로 이제 "esp8266"에 대한 항목이 표시되어야 합니다. 그것을 선택하고 "설치"를 클릭하십시오.
- 잠시만 기다리십시오. 모든 것을 다운로드하려면 시간이 걸립니다.
- Arduino IDE를 다시 시작하십시오.
- 도구 -> 보드 열기: 그리고 이번에는 "Generic ESP8266 Module"까지 아래로 스크롤하여 선택합니다.
타사 라이브러리 추가
Arduino는 프로젝트에 외부 라이브러리를 추가하는 다양한 방법 또는 "스케치"를 제공합니다. 가능한 한 간단하게 유지하기 위해 이 자습서에서는 가장 빠르게 설명할 것입니다. 즉, 단순히 폴더를 복사하는 것입니다. 튜토리얼이 작동하려면 정확히 2개의 외부 라이브러리(IRemoteESP8266 및 https://github.com/me-no-dev/ESPAsyncTCP)를 추가해야 합니다.
- GitHub의 튜토리얼 코드에서 "libraries" 디렉토리를 찾으세요.
- Arduino의 루트 설치 디렉터리(예: C:\Program Files\Arduino)에서 "libraries" 하위 디렉터리를 찾습니다.
- 튜토리얼의 "libraries" 디렉토리에서 Arduino의 "libraries" 디렉토리로 IRemoteESP8266 디렉토리를 복사합니다.
- 튜토리얼의 "libraries" 디렉토리에서 Arduino의 "libraries" 디렉토리로 ESPAsyncTCP 디렉토리를 복사합니다.
- Arduino IDE를 다시 시작하십시오.
이제 IR 전송 및 비동기 TCP용 라이브러리가 프로젝트에 포함됩니다.
설정
아래 이미지는 나와 내 하드웨어에 적합하지만 사용자마다 다를 수 있는 일반적인 설정을 보여줍니다. 아래 설정을 시도할 수 있지만 특정 칩 및 어댑터에 따라 설정을 조정해야 할 수도 있습니다. 예를 들어 내 것이 nodemcu이므로 재설정 방법을 "ck"(기본값)에서 "nodemcu"로 변경해야 했습니다. 또한 "디버그 포트"를 "직렬"로 설정하여 직렬 디버거를 사용할 수 있습니다. 내 설정은 매우 일반적인 설정이므로 내 설정을 기본으로 사용할 수 있습니다. 컴파일 및 플래시 프로세스가 작동하도록 하기 위해 그것들을 엉망으로 만들어야 한다고 해도 놀라지 말라는 것입니다.
ESP8266 Hello World로 설정을 증명하십시오
Arduino 프로젝트는 .ino 파일로 시작합니다. .ino 파일은 설정과 루프라는 두 가지 진입점을 정의합니다. "hello world"의 경우 코드가 작동하는지 확인하기 위해 ESP8266에서 약간의 조명을 켤 것입니다.
//SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 #define LED_PIN 2 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); pinMode(LED_PIN, OUTPUT); } /*---------------------------------------*/ //Runs constantly void loop() { digitalWrite(LED_PIN, LOW); delay(1000); digitalWrite(LED_PIN, HIGH); delay(1000); }
코드 컴파일 및 플래시
지금까지 설정이 정확하다면 컴파일과 플래시는 쉬운 단계입니다. 깜박이지 않고 컴파일하려면 Arduino 메뉴에서 스케치 -> 확인/컴파일 로 이동하십시오.
코드를 칩에 플래시하고 컴파일하려면 Arduino 메뉴에서 스케치 -> 업로드 를 선택합니다.
플래시가 성공하면 진행률 표시가 0%에서 100%로 이동하는 것을 볼 수 있으며 이 시간 동안 칩의 LED가 실제로 깜박이거나 깜박일 가능성이 높습니다.
직렬 디버깅이 작동하는지 테스트하려면:
- 먼저 디버그 포트가 직렬로 설정되어 있는지 확인하십시오( 도구 -> 디버그 포트 ).
- 코드가 칩으로 플래싱을 완료한 후 도구 -> 직렬 모니터 를 선택합니다.
성공적인 시작 후 직렬 디버거의 출력:
훌륭합니다. 작동합니다. 다음으로 IR 출력을 확인하려고 합니다. IR 송신기를 통해 신호를 보내고 신호가 통과하는지 확인하겠습니다.
우리는 우리를 돕기 위해 기존 Arduino IR 라이브러리를 사용할 것입니다. Arduino의 가장 큰 장점 중 하나는 라이브러리와 모듈을 쉽게 넣고 빼는 것입니다. C++ 프레임워크에 대해 매우 상쾌합니다!
Git repo의 README 파일에 있는 지침에 따라 Arduino에 설치하십시오.
이 코드는 IR 송신기를 반복적으로 깜박입니다. IR은 사람의 눈에는 보이지 않지만 테스트를 위한 전문가 팁이 있습니다. 이 코드를 실행하고 (디버거를 통해) 칩에서 실행 중인지 확인한 다음 모바일 장치의 카메라를 엽니다. 카메라를 통해 IR 다이오드 전구를 직접 보십시오. 작동하는 경우 전구가 눈에 띄게 켜지고 꺼지는 것을 볼 수 있습니다. 작동하는 모든 리모컨(예: 표준 TV 리모컨)으로도 이 작업을 시도할 수 있습니다. 다음 코드는 IR 전구가 0.5초마다 깜박이기 시작하도록 합니다. 실제로 LG 켜기/끄기 명령을 보내므로 실제로 LG TV가 근처에 있으면 껐다가 켤 수 있습니다.
#include <IRremoteESP8266.h> // IR Library IRsend* irSend; // infrared sender //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize the IR irSend = new IRsend(IR_PIN, true); irSend->begin(); } /*---------------------------------------*/ //Runs constantly void loop() { irSend->sendNEC(0x20DF10EF, 32, 3); delay(1000); }
ESP8266 튜토리얼 시작하기
지금까지 모든 것이 작동했다면 기본 장비와 설정이 작동하는 것으로 만족할 수 있으며 튜토리얼의 고기를 시작할 준비가 된 것 같습니다.
와이파이에 연결
먼저 로컬 Wi-Fi에 연결해야 합니다. 아래 코드는 Wi-Fi에 연결을 시도하고 연결 성공을 보고합니다(직렬 디버거를 통해). 코드 샘플에서 myWifiSsid 값을 Wi-Fi 네트워크의 사용자 이름으로 바꾸는 것을 잊지 말고 myWifiPassword 값을 올바른 암호로 바꾸십시오.
#include "debug.h" // Serial debugger printing #include "WifiConnection.h" // Wifi connection // this file is part of my tutorial code #include <IRremoteESP8266.h> // IR library WifiConnection* wifi; // wifi connection IRsend* irSend; // infrared sender //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******"; //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize wifi connection wifi = new WifiConnection(myWifiSsid, myWifiPassword); wifi->begin(); //connect to wifi if (wifi->connect()) { debugPrint("Wifi Connected"); } } /*---------------------------------------*/ //Runs constantly void loop() { }
Wemo 서버 실행
연결? 좋은. 이제 프로젝트의 핵심인 Wemo 서버로 이동합니다.

내 Wemo Emulator가 이 튜토리얼의 소스 파일에 포함되어 있습니다. 이제 Google을 검색하여 더 간단한 Wemo 에뮬레이터를 찾을 수 있습니다. 적은 코드로 작성되고 이해하기 쉬운 것을 찾을 수 있습니다. 부디 자유롭게 검토하고, 실험하고, 직접 작성하는 등의 작업을 수행하십시오. 이것이 이 튜토리얼을 나만의 것으로 만드는 데 필요한 모든 부분입니다.
내 뒤에 있는 추론은 ESPAsyncTCP를 사용한다는 것입니다. 이게 왜 좋은거야? 글쎄요, 이 방법을 사용하여 ESP8266에서 실행할 수 있는 서버(또는 장치)가 너무 많아서 Alexa가 누락된 장치(찾지 못함)를 시작하고 명령이 삭제되고 성능이 저하되기 시작하기 전에 이 방법을 사용합니다. 느려집니다. ESPAsyncTCP 라이브러리를 사용하면 이 숫자가 최대화됩니다.
그것 없이, 나는 약 10-12개의 장치에서 기어들어오는 신뢰성이 없다는 것을 발견했습니다. 그것으로, 나는 그 숫자가 약 16이라는 것을 발견했습니다. 이 튜토리얼을 확장하고 칩이 할 수 있는 일의 한계를 탐구하고 싶다면, 제 버전을 사용하는 것이 좋습니다. 이해를 돕기 위해 더 간단한 버전을 보려면 Google에서 "wemo emulator Arduino"를 검색하십시오. 많은 예를 찾아야 합니다.
이제 ESPAsyncTCP 라이브러리를 설치해야 합니다. IR 라이브러리를 설치한 것처럼 설치하십시오. Git 페이지로 이동하여 지침을 따르십시오.
이 라이브러리는 내 esp8266 arduino 예제 코드에도 포함되어 있습니다. 다음은 Wi-Fi 연결을 열고 Alexa 검색 요청을 수신 대기하고 "I am Wemo" 응답을 반환하여 처리하는 코드입니다.
#include "debug.h" // Serial debugger printing #include "WifiConnection.h" // Wifi connection #include "Wemulator.h" // Our Wemo emulator #include <IRremoteESP8266.h> // IR library WifiConnection* wifi; // wifi connection Wemulator* wemulator; // wemo emulator IRsend* irSend; // infrared sender //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******"; //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize wifi connection wifi = new WifiConnection(myWifiSsid, myWifiPassword); wifi->begin(); //initialize the IR irSend = new IRsend(IR_PIN, false); irSend->begin(); //initialize wemo emulator wemulator = new Wemulator(); //connect to wifi if (wifi->connect()) { wemulator->begin(); //start the wemo emulator (it runs as a series of webservers) wemulator->addDevice("tv", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("television", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("my tv", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("my television", new WemoCallbackHandler(&commandReceived)); } } /*---------------------------------------*/ //Runs constantly void loop() { //let the wemulator listen for voice commands if (wifi->isConnected) { wemulator->listen(); } }
사전 테스트
Alexa로 실행하여 지금까지 가지고 있는 것(wifi 및 에뮬레이터)을 테스트하십시오. 이 자습서에서는 Alexa 장치가 가정에 설정 및 설치되어 있다고 가정합니다.
테스트 발견:
Alexa에게 "Alexa, 장치를 검색해 보세요." 라고 말합니다.
그러면 Alexa가 로컬 Wi-Fi 네트워크에서 UDP 요청을 브로드캐스트하여 Wemos 및 기타 호환 가능한 장치를 검색합니다. 이 요청은 wemulator->listen();
loop() 함수에서. 그러면 Wemulator의 handleUDPPacket(*)
메서드로 라우팅됩니다. nextUDPResponse()
메소드에서 응답이 전송됩니다. 해당 응답의 내용을 확인하세요.
const char UDP_TEMPLATE[] PROGMEM = "HTTP/1.1 200 OK\r\n" "CACHE-CONTROL: max-age=86400\r\n" "DATE: Sun, 20 Nov 2016 00:00:00 GMT\r\n" "EXT:\r\n" "LOCATION: http://%s:%d/setup.xml\r\n" "OPT: \"http://schemas.upnp.org/upnp/1/0/\"; ns=01\r\n" "01-NLS: %s\r\n" "SERVER: Unspecified, UPnP/1.0, Unspecified\r\n" "ST: urn:Belkin:device:**\r\n" "USN: uuid:Socket-1_0-%s::urn:Belkin:device:**\r\n\r\n";
이것은 Alexa에게 "저는 Wemo(Belkin)입니다. 어떻게 도와드릴까요?"라고 알려주는 코드입니다. Alexa는 이 응답을 받으면 향후 스마트 홈 명령이 이 장치로 라우팅될 수 있음을 알고 기억합니다.
이 시점에서 직렬 디버거의 출력은 아래 이미지와 같아야 합니다. 검색이 완료되면 Alexa는 네트워크에서 "[N]개의 장치를 검색했습니다"라고 구두로 알려줍니다.
setup()
함수에서 다음 스니펫을 확인하세요.
new WemoCallbackHandler(&commandReceived)
이것은 Alexa에서 명령을 캡처할 콜백입니다. 본문은 WemoCallbackHandler.h(WemoCallbackHandler::handleCallback)에 정의되어 있습니다. Alexa에서 명령을 캡처하면 원하는 작업을 수행할 수 있습니다. 그 이전 행에서 다음 코드 행과 함께 사용할 수 있는 가능한 명령을 설정했습니다.
wemulator->addDevice("tv"); wemulator->addDevice("television"); wemulator->addDevice("my tv"); wemulator->addDevice("my television");
따라서 이들은 4개의 개별 "서버" 또는 우리가 칩에서 실행 중인 리스너입니다. 이렇게 하면 Alexa에 다음 명령을 말할 수 있는 기능이 설정됩니다.
Alexa, TV Alexa 켜기, TV Alexa 끄기, TV Alexa 켜기, TV Alexa 끄기, TV Alexa 켜기, TV Alexa 끄기, TV Alexa 켜기, TV 끄기
그리고 이것이 우리가 그것을 테스트하는 방법입니다. 우리는 이러한 명령 중 하나가 우리 코드를 깨우고 우리가 원하는 것을 할 수 있는 해당 콜백을 입력해야 한다고 예상합니다.
IR 명령 추가
이제 명령을 받았으므로 TV를 켜고 끄는 방식으로 처리할 차례입니다. 따라서 Wi-Fi, wemo 에뮬레이터 및 IR이 모두 합쳐집니다. 내 TV는 LG이기 때문에 적절한 켜기/끄기 순서를 찾아 IR 라이브러리의 sendNEC 기능을 통해 보냈습니다(LG는 NEC 프로토콜 사용). IR 인코딩/디코딩은 그 자체로 별도의 주제이며, 여기서 메시지는 신호의 변조로 인코딩됩니다. 그것은 매우 정확한 타이밍, 표시 및 공백의 사양입니다. 각 제조업체는 명령에 대해 고유한 프로토콜을 사용하는 경향이 있으며 타이밍이 다릅니다. 매우 흥미롭고 해당 IR 라이브러리의 소스 코드를 조사하거나 인터넷 검색 등을 통해 더 깊이 파고들 수 있습니다. 그러나 우리의 편의를 위해 IR 라이브러리에서 모든 세부 사항을 처리합니다.
TV가 LG가 아닌가요? 올바른 코드를 구글링하세요. 다음은 Sony TV에 대한 명령입니다(주의: 테스트되지 않음).
irSend.sendSony(0xa90, 12);
직접 해보고 싶다면 IR 수신기를 설정하고 리모컨(또는 모든 IR 송신기)을 가리키고 전송 중인 코드를 디코딩할 수 있습니다. 그것은 다른 튜토리얼이지만.
엔드 투 엔드 테스트
- Alexa를 소리가 들리는 곳에 두십시오.
- IR 다이오드가 연결된 ESP8266을 TV의 원격 제어 범위 내에 놓으십시오.
- "Alexa, 장치 검색"이라고 말합니다. 성공을 보고할 때까지 기다립니다(최소한 하나의 장치를 검색해야 함).
- "Alexa, 내 TV 켜줘" 또는 "Alexa, 내 TV 꺼줘"라고 말하세요.
Alexa는 명령을 이해하고(특정 기술에 대한 지시가 아닌 smarthome 명령으로) 이를 처리할 로컬 장치를 검색하고 명령을 장치(ESP8266)로 보내야 합니다. 당신의 장치는 그것을 수신하고 TV에 원격 제어 명령을 보내야 합니다. 휴대폰 카메라를 통해 다이오드를 확인하여 다이오드가 방출되고 있는지 확인할 수 있습니다.
TV를 끄는 IR 코드는 TV를 켜는 코드와 같기 때문에 '켜기' 또는 '끄기' 명령을 내렸는지 여부는 중요하지 않습니다. 동일한 코드이며 상태를 토글합니다. TV가 꺼져 있으면 켜져야 하고 켜져 있으면 꺼져야 합니다.
문제 해결
Wi-Fi에 연결되어 있습니까?
올바른 변수 값에 올바른 사용자 이름/비밀번호를 입력했습니까?
//SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******";
Wi-Fi에 연결할 때 오류 메시지가 표시되거나 직렬 디버그 포트를 통해 오류가 발생합니까?
Wi-Fi가 켜져 있고 다른 일반적인 방법을 통해 연결할 수 있습니까?
Alexa가 귀하의 장치를 검색하고 있습니까?
Alexa는 "Alexa, 장치 검색"이라고 말하면 장치 검색 요청을 보냅니다.
Alexa는 올바르게 구성 및 설정되어야 하며 ESP8266과 동일한 Wi-Fi 네트워크에 연결되어 있어야 합니다.
Fauxmo.h에서 찾아보세요. Fauxmo::handle() 함수를 참조하십시오. 이것은 ESP8266이 호출을 들은 후 실행될 첫 번째 코드입니다. 디버그 메시지를 입력하여 뒤에 코드가 있는지 확인하십시오.
if (len > 0) {
실행 중입니다. 그렇지 않은 경우 명령이 수신되지 않습니다. 그렇다면 명령이 수신되고 있지만 올바르게 처리되지 않은 것으로 보입니다. 거기에서 코드를 따라 문제가 무엇인지 알아내십시오.
네트워크에 검색 가능한 다른 장치가 많이 있습니까? 너무 많으면 검색이 더 느리게 실행되거나 때로는 실패할 수도 있습니다.
장치가 명령을 수신하고 있습니까?
"Alexa, TV 켜기" 명령을 실행하면 WemoCallbackHandler::handleCallback handler
(WemoCallbackHandler.h 파일에 있음)에 실행이 입력되어야 합니다. 아직 수행하지 않은 경우 디버그 메시지를 출력하여 명령을 실행할 때 실행되고 있는지 확인하십시오. 또한 명령을 실행하기 전에 "Alexa, 장치 검색"이라고 말하여 Alexa가 장치에 대해 알고 있는지 확인하십시오. 이 단계에서는 장치 검색이 성공했다고 가정합니다.
IR 다이오드가 방출됩니까?
앞에서 설명한 것처럼 장치가 발광해야 한다고 생각되면 휴대폰 카메라로 장치를 가리키고 카메라를 통해 다이오드를 바라보십시오. 실제 생활에서는 아무것도 볼 수 없지만 카메라를 통해 조명이 켜지고 깜박이는 일반 조명으로 나타나야 합니다. 이것을 본다면 그것은… 무언가를 내뿜고 있는 것입니다.
IR 신호가 반전되어 있습니까?
IR 다이오드는 신호가 본질적으로 반전되는 방식으로 배선될 수 있습니다. 저는 전자공학이나 배선 전문가가 아니기 때문에 제 설명을 참고해 주십시오. 그러나 다이오드를 잘못 배선하면 IR 라이트가 기본적으로 켜져 있지만 IRSend 라이브러리가 켜려고 할 때 꺼집니다. 그것에. 이 경우, setup()
코드가 실행된 후, 그러나 다른 일이 발생하기 전에 기본적으로 IR 조명이 켜져 있어야 합니다(카메라를 통해 볼 수 있음). loop()
내부의 모든 코드를 주석 처리하면 계속 켜져 있는 것을 볼 수 있습니다.
이 문제를 해결하는 방법을 더 명확하게 보려면 튜토리얼 코드의 라이브러리/IRemoteESP8266/src 폴더로 이동하십시오. 생성자를 참조하십시오.
IRsend::IRsend(uint16_t IRsendPin, bool inverted) : IRpin(IRsendPin), periodOffset(PERIOD_OFFSET) { if (inverted) { outputOn = LOW; outputOff = HIGH; } else { outputOn = HIGH; outputOff = LOW; } }
"거꾸로" 논증과 그것을 처리하는 논리가 우리가 말하는 것입니다. 배선이 반전된 경우 가장 쉬운 솔루션은 이를 허용하도록 코드를 약간 변경하는 것입니다(배선을 다시 지정하는 것보다… 하지만 원하는 경우 그렇게 할 수 있음). AlexaTvRemote.ino에서 다음 줄을 변경하십시오.
//initialize the IR irSend = new IRsend(IR_PIN, false);
에게
//initialize the IR irSend = new IRsend(IR_PIN, true);
올바른 리모콘 코드와 명령이 있습니까?
다른 모든 것은 잘 되는 것 같지만 TV가 명령을 따르지 않는다면 IR 코드에 문제가 있을 가능성이 큽니다. 해당 IR 라이브러리 인터페이스(예: sendLG
, sendPanasonic
, sendSharp
등)에서 다른 함수 호출을 시도하거나 사용 중인 것이 하드웨어와 일치하는지 확인하십시오. 귀하의 TV 하드웨어가 해당 라이브러리에서 지원되지 않을 가능성은 거의 없지만 기술적으로 가능하다고 생각합니다.
보내는 코드가 하드웨어에 맞는지 확인하십시오. 올바른 것을 찾으려면 Google에서 검색을 수행해야 할 수도 있습니다. 다른 모든 방법이 실패하면 전원 버튼을 눌렀을 때 작동 중인 리모컨에서 방출되는 코드를 감지할 수 있는 옵션이 항상 있습니다. 그러나 이는 다른 자습서이며 다른 하드웨어가 필요합니다.
마무리
바라건대 모든 것이 당신을 위해 일했습니다. 그렇다면(그리고 아닐지라도), 이것은 한 번에 여러 주제에 대해 이빨을 자르는 좋은 방법이었습니다.
- 알렉사
- 임베디드 프로그래밍
- ESP8266 칩
- 아두이노 IDE
물론 음성 명령으로 TV를 켜고 끌 수 있는 약간의 편리함도 있습니다.
왜 해킹?
이것이 왜 Alexa용 기본 API의 일부가 아닌 해킹입니까? 첫 Alexa 기술을 개발하는 방법을 배운 후 정말 알고 싶었던 것은 "Alexa에서 네트워크의 다른 장치로 직접 명령을 보낼 수 있는 방법은 무엇입니까?"였습니다. Amazon이 "기술" 또는 "스마트 홈" 패러다임(모든 것이 AWS로 전송되어야 하는 아무것도 하기 전에), 그러나 그들은 단지 하지 않았습니다.
더 멀리 가져 가십시오
채널 변경 및 볼륨 제어와 같이 TV를 보다 완벽하게 제어하려면 일련의 원격 제어 명령을 사용해 보십시오. 하나의 ESP8266에서 얼마나 많은 다른 명령을 들을 수 있는지 확인하여 칩의 한계를 테스트하십시오(힌트: 매우 영리한 프로그래밍 없이는 숫자가 거의 두 자릿수를 깰 수 있음). 하드웨어에 능숙하다면 ESP8266 칩에 직접 배선하여 IR을 통하지 않고 다른 장치를 제어해 보십시오. 조명 등. wemo의 재발견!
- 완전한 기능의 Arduino 기상 관측소를 만든 방법
- ESP32 오디오 샘플링 작업