이 프로젝트 정보
참고:이 튜토리얼은 오래되었을 수 있습니다. 여기 최신 버전의 경우
소개:Arduino IoT 클라우드
아두이노 IoT 클라우드는 누구나 손쉽게 IoT 커넥티드 객체를 구축할 수 있는 플랫폼입니다. Alexa를 사용하여 TV를 제어하기 위해 공식 Arduino Alexa Skill도 사용할 것입니다.
Arduino IoT Cloud를 처음 사용하는 경우 먼저 개요를 제공하고 지원되는 보드 중 하나인 IoT Cloud Things엠> 및 속성 승선하세요.
파트 1:TV 세트를 제어하는 방법
모든 종류의 텔레비전을 제어하는 가장 쉬운 방법은 마치 우리가 원격 적외선 컨트롤러인 것처럼 행동하는 것입니다. 그렇게 하려면 경청해야 합니다. 리모컨이 보낼 신호에 대해 데이터를 캡처하고 Arduino 보드로 모방합니다. 회로가 조립되면 이 스케치를 보드에 업로드합니다. 원격 버튼 누름에 의해 생성된 IR 신호 버스트를 부호 없는 정수 배열로 변환합니다. 리모컨이 Arduino IR 수신기를 가리키도록 합시다. 다음 버튼을 구축하고 누릅니다.
<울> 전원/대기
<울> 1에서 9까지의 채널
<울> 볼륨 업
<울> 볼륨 낮추기
<울> 음소거
<울> 채널 올리기
<울> 채널 다운
직렬 모니터를 통해 오는 값을 볼 수 있습니다. , rawData
로 보고됨 . 지금은 텍스트 파일에 기록하고 각 목록에 고유한 배열 이름(chan1
, chan2
등등). 다음 값은 참고용이며 삼성 TV 리모컨에서 생성됩니다.
CHANNEL 1 unsigned int chan1[67] ={4450,4500, 550,1700, 500,1700, 550,1700, 550,550, 50,50,50,50,50,600,500,600,0550, 1700, 500,600, 500,600, 550,550, 550,600, 500,600, 550,550, 550,600, 500,1700, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,600, 500,1700, 550,1700, 550 ,1700, 500,1700, 550,1700, 500};CHANNEL 2unsigned int chan2[67] ={4500,4500, 550,1700,50,50,500,1700,550,1700,550,500,1700,5505 1700, 550,1700, 500,1700, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,600, 550,1700, 500,600, 550,550, 550,600, 500,600, 550,550, 550,650, 450,1700, 550,600, 500 ,1700, 550,1700, 500,1700, 550,1700, 550,1700, 500};CHANNEL 3unsigned int chan3[67] ,50,0,50,0,50,0,500,500,4500,500,1700,0500,1700,0550,500 , 550,600, 500,600, 550,550, 550,1700, 500,1700, 550,1700, 550,550, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,600, 550,550, 550,550, 550,600, 550,550, 550 ,1700, 500 ,600, 550,550, 550,1700, 550,1650, 550,1700, 550,1700, 500,1700, 600};CHANNEL 4unsigned int chan4[67] ={4050,504 1700, 550,600, 500,600, 550,550, 600,550, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 550,600, 500,600, 550,550, 550,600, 500,600, 550,550, 550,600, 500,1700, 550,600, 500,600, 550,550은 , 550,600, 500,1700, 550,1700, 550,1700, 500,600, 550,1700, 500,1700, 550,1700, 550,1700, 500}; 채널 INT chan5 [67] ={4500,4500, 500,1700, 550,1700, 550,1700, 550,550, 550,550, 550,550, 600,550, 550,550, 550,1700, 550,1650, 550,1700, 550,550, 550,600을 5unsigned , 500,600, 550,550, 550,600, 500,1700, 550,600, 500,600, 550,1700, 500,600, 550,550, 550,600, 550,550, 550,550, 550,1700, 550,1700, 500,600, 550,1700, 500,1700, 550,1700는 , 550,1700, 500}; 채널 INT chan6 [67] ={4500,4500, 550,1650, 550,1700, 550,1700, 500,600, 550,550, 550,600, 500,600, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 600,550을 6unsigned , 500,600, 550,550, 600,550, 550,550, 550,1700, 500,600, 550,1700, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,600, 550,1700, 500,600, 550,1650, 600,1650, 550,1700는 , 550,1650, 600}; 채널 INT chan7 [67] ={4500,4500, 550,1700, 500,1700, 550,1750, 500,550, 550,600, 500,650, 500,550, 550,550, 550,1750, 500,1700, 500,1700, 550,650, 450,650을 7unsigned , 500,550, 550,600, 500,650, 500,550, 550,600, 500,1700, 550,1750, 500,600, 500,550, 550,600, 500,650, 500,1750, 450,1700, 550,600, 500,650, 500,1700, 500,1700, 550,1750는 , 500,1700, 500}; 채널 INT chan8 [67] ={4450,4550, 500,1700, 550,1700, 550,1650, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 550,600을 8unsigned , 500,600, 550,550, 550,600, 500,1700, 550,600, 500,1700, 550,1700, 500,600, 550,550, 550,650, 450,600, 550,550, 550,1700, 550,550, 550,600, 500,1700, 550,1700, 550,1700는 , 500,1700, 550}; 채널 INT chan9 [67] ={4450,4500, 550,1700, 550,1700, 500,1700, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,1700, 500,600, 550,550을 9unsigned , 550,600, 500,600, 550,550, 550,600, 500,1700, 550,1700, 550,1700, 500,600, 550,550, 550,550, 550,600, 500,1700, 550,600, 500,600, 550,550, 550,1700, 550,1700, 500,1700는 , 550,1700, 550}; VOLUME는 INT volUp [67] ={4500,4500, 550,1700, 500,1750, 500,1700, 550,600, 500,600, 500,600, 550,550, 550,600, 500,1700, 550,1700, 550,1700, 500,650, 450,600을 UPunsigned , 550,600, 500,650, 450,650, 500,1700, 500,1750, 500,1750, 500,550, 550,600, 500,650, 500,550, 550,600, 500,650, 500,600, 500,600, 500,1700, 550,1750, 450,1750, 500,1700는 , 550,1700, 500}; VOLUME는 INT volDown [67] ={4450,4550, 500,1700, 550,1700, 550,1650, 550,600, 550,550, 550,600, 500,600, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 550,600을 DOWNunsigned , 500,600, 550,550, 550,600, 500,1700, 550,1700, 550,600, 500,1700, 550,600, 500,600, 500,600, 550,550, 550,600, 500,650, 500,1700, 500,650, 500,1700, 500,1750, 500,1700는 , 550,1700, 500}; CHANNEL UPunsigned는 chanUp [67] ={4500,4450, 550,1700, 550,1650, 550,1700, 550,550, 550,600, 550,550, 550,550, 600,550, 550,1650, 550,1700, 550,1650, 600,550, 550,550에서 INT , 550,600, 500,600, 550,550, 550,550, 550,1700, 550,550, 600,550, 550,1650, 550,600, 550,550, 550,550, 550,1700, 550,550, 550,1700, 550,1700, 550,550, 550,1650, 600,1650는 , 550,1700, 550}; CHANNEL DOWNunsigned는 chanDown [67] ={4500,4450, 600,1650, 550,1700, 550,1650, 550,600, 550,550, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 550,600에서 INT , 550,550, 550,550, 550,550, 600,550, 550,550, 550,600, 500,600, 550,1650, 600,550, 550,550, 550,550, 600,1650, 550,1700, 500,1700, 600,1650, 550,550, 600,1650, 550,1700는 , 500,1700, 550};
2부:Arduino IoT 클라우드
기본 Arduino IoT Cloud 에서 페이지, 우리는 새로운 사물을 만들 것입니다 의미 있는 이름을 지정합니다. TVRemoteController라고 부르겠습니다. . 그런 다음 사용할 보드를 선택합니다. 이 튜토리얼에서는 Arduino Nano 33 IoT를 사용했지만, 호환되는 다른 보드가 있는 경우에도 괜찮습니다. 핀아웃과 IR 라이브러리의 동작이 변경될 수 있다는 점을 염두에 두십시오. 이 시점에서 보드가 표시되지 않으면 시작하기를 건너뛰었을 수 있습니다. 위에서 언급한 절차가 있는 경우 해당 절차를 다시 수행하십시오.
완료되면 하나의 속성을 추가합니다. 우리의 사물에 , 그것은 우리의 TV 세트를 나타냅니다. 스마트 홈 아래 카테고리에서 "TV"를 속성 유형으로 선택하고 "읽기 및 쓰기"로 설정하고 "업데이트"에서 "값이 변경될 때"를 선택합니다.
다음은 속성입니다. 이 시점에서 사물의 보기는 다음과 같아야 합니다.
3부:Arduino 웹 편집기
"EDIT SKETCH" 버튼을 클릭하면 Web Editor로 이동하여 IoT Cloud에서 자동으로 생성된 Sketch에 사용자 지정 코드를 추가할 수 있습니다.
가장 먼저 포함해야 할 것은 Ken Shirriff의 IR Remote 라이브러리입니다.
#include
그런 다음 채널에 대해 하나의 2차원 배열을 설정하고 필요한 명령에 대해 6개의 배열을 설정해야 합니다. 기억하신다면 1부에서 이제 배열을 채우는 데 사용할 일부 IR 데이터를 캡처했습니다.
const unsigned int chan[9][67] ={ {chan1}, {chan2}, {chan3}, {chan4}, {chan5}, {chan6}, {chan7}, {chan8}, {chan9}}; const unsigned int volUp[67] ={...}; const unsigned int volDown[67] ={...}; const unsigned int chanUp[67] ={...}; const unsigned int chanDown[67] ={...};const unsigned int onoff[67] ={...};const unsigned int mute[67] ={...};
그런 다음 IR 라이브러리와 필요한 주파수를 설정하겠습니다(이런 종류의 응용 프로그램의 경우 항상 38KHz임).
IRsend irsend; const int 주파수 =38;
IR 명령을 보내고 내장 LED를 깜박이는 기능도 필요합니다(이 단계에서는 주로 디버깅 목적). 사용되는 지연 값은 TV 제조사와 모델에 따라 다르므로 예상대로 작동하지 않는 경우(잘못된 명령 또는 수신된 명령 없음) 자유롭게 조정할 수 있습니다.
void sendIR(const unsigned int buf[]) { digitalWrite(LED_BUILTIN, HIGH); irsend.sendRaw(buf, 67, 빈도); 지연(300); digitalWrite(LED_BUILTIN, LOW);}
마지막 단계는 생성된 콜백 onTvChange()
를 완료하는 것입니다. TV 속성이 Alexa 명령으로 변경될 때 IR 명령을 보내기 위해 일부 사용자 지정 코드를 사용합니다. 예를 들어 볼륨을 높이면 가상으로 볼륨 업 버튼을 눌러야 합니다. 채널이 7로 설정되어 있으면 채널 7 버튼에 대한 시퀀스를 보내야 하는 식입니다.
void onTvChange() { Serial.println("=================="); Serial.println("스위치:"+String(tv.getSwitch())); Serial.println("볼륨:"+String(tv.getVolume())); Serial.println("채널:"+String(tv.getChannel())); Serial.println("음소거:"+String(tv.getMute())); Serial.println("=================="); if (첫 번째){ prevSwitch =tv.getSwitch(); prevVolume =tv.getVolume(); prevChannel =tv.getChannel(); prevMute =tv.getMute(); 첫 번째 =거짓; 반품; } // 볼륨 변경 if (tv.getVolume()> prevVolume) { tv.setMute(false); prevMute =거짓; for (int k =prevVolume + 1; k<=tv.getVolume(); k++) { sendIR(volUp); Serial.println("요청한 볼륨:"+String(tv.getVolume())+" 설정:"+String(k)); } 이전 볼륨 =tv.getVolume(); } else if (tv.getVolume() =tv.getVolume(); k--) { sendIR(volDown); Serial.println("볼륨 변경됨:"+String(tv.getVolume())+" 설정:"+String(k)); } 이전 볼륨 =tv.getVolume(); } // 음소거 변경 if (tv.getMute() !=prevMute &&tv.getMute()) { prevMute =tv.getMute(); sendIR(음소거); Serial.println("음소거 변경됨:"+String(tv.getMute())); } else if (tv.getMute() !=prevMute &&!tv.getMute()) { prevMute =tv.getMute(); sendIR(음소거); Serial.println("음소거 변경됨:"+String(tv.getMute())); } // 채널 변경 if (tv.getChannel() !=prevChannel) { int newChannel =tv.getChannel(); if (newChannel> 0 &&newChannel <10) { sendIR(chan[newChannel-1]); } else if (newChannel> 9) { if (newChannel> prevChannel) { for (int ch =prevChannel; ch newChannel; ch--) { sendIR(chanDown); Serial.println("채널 요청:"+String(newChannel)+" 설정:"+String(ch)); } } } prevChannel =newChannel; Serial.println("채널 변경:"+String(tv.getChannel())); } // On/Off 변경 if (tv.getSwitch() !=prevSwitch) { prevSwitch =tv.getSwitch(); if (tv.getSwitch()) { sendIR(chan[6]); } else { sendIR(온오프); } Serial.println("스위치 변경:"+String(tv.getSwitch())); }코드>
4부:아마존 알렉사
이제 Amazon Alexa 앱이 필요합니다. Apple App Store 또는 Google Play Store에서 다운로드할 수 있습니다. 설치가 완료되면 기존 계정으로 로그인하거나 새 계정을 만드십시오.
Arduino Alexa Skill을 설치하고 TV에 액세스하고 제어하도록 구성하는 데 필요한 단계를 살펴보겠습니다. 필요한 모든 단계를 보려면 아래 이미지 순서를 따르십시오.
그림> 그림> 그림> 그림> 그림> 그림> 그림> 그림> 그림> 그림>
끝났습니다. 이제 TV에서 다음과 같이 음성으로 제어할 시간입니다.
<울> "Alexa, TV 볼륨을 높여줘."
<울> "Alexa, TV 음소거" 또는 "Alexa, TV 음소거 해제"
<울> "Alexa, TV의 다음 채널"
Alexa 및 IoT Cloud와 함께 즐거운 시간 보내세요. 질문이 있거나 이 프로젝트를 구축하는 경우 아래 의견에 알려주십시오.
감사합니다.
Arduino 팀
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드"> 코드
아두이노
섹션> 회로도