산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

WiFi IR 블래스터

구성품 및 소모품

Espressif ESP8266 ESP-01
대신 표준 ESP8266 또는 NodeMCU 개발 키트를 사용하여 이 작업을 수행할 수 있습니다.
× 1
Arduino Nano R3
× 1
범용 트랜지스터 NPN
× 1
Adafruit IR LED
× 1

필요한 도구 및 기계

납땜 인두(일반)

앱 및 온라인 서비스

Arduino IDE
NodeMCU 펌웨어

이 프로젝트 정보

앞으로 두 걸음...

주요 전화 제조업체가 내장형 IR 블래스터에서 멀어지고 있는 것 같아서 현재 IoT 인프라와 통합되지 않는 "멍청한" 장치를 미래에 대비할 방법을 찾고 있습니다. 메쉬 네트워크로 연결된 스마트 홈이 있는데 TV를 켜려면 물리적인 리모컨을 찾아야 합니까? 더 나은 방법이 있어야 합니다.

나는 최근에 집에서 독립형 에어컨을 제어하는 ​​IR 블래스터를 만들었으며 또 다른 이전 프로젝트는 Android 연결 웹 앱과 연결된 HVAC 통풍구였습니다. 본질적으로 내가 해야 할 일은 이 두 가지를 웹 연결 IR 블래스터와 웹 앱 프런트엔드로 결합하여 내 전화기의 버튼을 누르고 IR 신호를 내 미디어 센터로 보낼 수 있도록 하는 것입니다. 이들은 모든 방에 배포할 수 있고 단일 인터페이스에서 어디에서나 제어할 수 있으므로 이를 위한 응용 프로그램은 매우 광범위합니다.

신속한 프로토타이핑

사용하지 않는 하드웨어를 가져와서 WiFi에 연결하고 HTTP 연결을 수락하고 IR 신호를 보내는 데 필요한 모든 것을 배선했습니다.

이것은 ESP8266에 할당된 IP의 특정 URL을 요청할 수 있고 Arduino가 IR LED에 "전원" 신호를 출력하도록 할 수 있다는 점에서 잘 작동했습니다. 웹 애플리케이션을 호스팅할 위치를 찾고 URL을 IR 블래스터로 보낸 다음 해당 요청을 특정 IR 코드로 구문 분석해야 했습니다. 이것은 ESP8266에서 AT 명령을 사용하여 수행하는 것이 매우 지루하고 요청을 보내는 것과 LED가 깜박이는 사이에 1-2초 지연을 일으키는 원인이 있었습니다.

노드MCU

나는 NodeMCU ESP8266 개발 보드로 진행했습니다. 온보드 전원 조절, USB-직렬 인터페이스, 이 작은 패키지에 많은 I/O 핀이 있기 때문입니다(브레드보드 친화적이기도 함). IR 코드 전송에 적응할 수 있었던 GET 요청을 수락하는 ESP8266 WebServer 라이브러리가 이미 있고 일반 IRremote 라이브러리가 즉시 작동하는 것으로 나타났습니다.

NodeMCU의 ESP8266은 웹 앱 자체를 호스팅할 만큼 강력하지 않으므로 활용도가 낮은 C.H.I.P에서 실행하겠습니다. 이미 내 홈 네트워크에서 실행 중인 9달러짜리 컴퓨터입니다. 또 다른 한계는 ESP8266이 3.3v 보드라는 점입니다. 그래서 I/O 핀에서 직접 구동되는 IR LED는 매우 어둡고 신호를 보내는 기기 바로 옆에 있어야 했습니다. 대신 I/O 핀을 사용하여 npn 트랜지스터를 구동하여 5v 공급 전압을 켜고 끕니다.

휴식...이시

몇 가지 조사를 한 후 Arduino용 REST API를 구현하여 adafruit에서 LED를 제어하는 ​​데 유용한 자습서를 찾았습니다. 나는 그들의 JavaScript 및 PHP 파일을 사용하여 cURL 요청을 제출하고 이미 Apache를 실행하고 있지만 클라우드에서 쉽게 호스팅될 수 있는 CHIP에 로드했습니다. 리모컨용 기본 HTML 페이지를 생성한 후 Android 폰에서 네이티브 웹앱으로 실행할 수 있도록 manifest.json 및 아이콘 파일을 추가했습니다.

Arduino 측에서는 GET 요청을 수락하고 URL을 구문 분석하고 200 OK를 보낸 다음 연결을 끊도록 웹 서버를 줄였습니다. URL을 기반으로 Arduino는 누른 버튼에 매핑된 IR 코드를 보냅니다.

유니버설 몬스터

모든 것이 지연 없이 완벽하게 작동합니다. 내가 사용하고 있는 IR LED의 각도가 매우 좁기 때문에 올바르게 가리키도록 주의해야 합니다. 일부 산업용 벨크로를 사용하면 보이지 않는 선반 아래에 장착할 수 있으며 반대쪽 끝에 있는 IR 수신기를 가리키도록 합니다. 미세 조정할 수 있도록 LED 리드에 두꺼운 게이지 와이어를 추가했습니다.

IR LED용 저항을 사용하면 거의 사용할 수 없게 되었기 때문에 트랜지스터는 조정되지 않은 5v로 전원을 공급합니다. 이렇게 하면 IR을 벽에서 튕겨내고 방 전체에 블래스터를 장착할 수 있지만 확실히 수명에 영향을 미칩니다. 나는 그것들이 매우 드물게 사용되고 IR 신호가 매우 짧은 펄스(대부분의 희미한 PWM 신호보다 낮은 듀티 사이클)이기 때문에 한동안 LED를 교체할 필요가 없기를 바랍니다. 버전 2용으로 광각 및 더 높은 출력의 IR LED를 주문했으므로 이 LED가 결국 죽으면 인라인 저항과 함께 교체하겠습니다.

3개월 업데이트 및 향후 기능

나는 이것을 매일 사용하고 완벽하게 작동했습니다. 우리 가족 방에 두 번째 장치를 추가하여 창문 AC 장치와 다른 TV를 제어하기까지 했습니다.

향후 계획:

<울>
  • 웹 UI를 클라우드 서비스로 마이그레이션
  • <울>
  • 음성 명령을 위해 Amazon Echo와 통합(완료)
  • <울>
  • 다음 하드웨어에는 DHT22 온도 센서도 포함되며 저는 천장 선풍기에 RF를 전송하는 방법을 연구 중입니다.
  • <울>
  • 기존 리모컨에서 IR 블래스터 명령을 "가르칠" 수 있도록 학습 기능을 위한 IR 수신기 추가
  • <울>
  • 내 홈 자동화/보안과 통합하여 사용하지 않을 때 가전제품을 끕니다.
  • 이 작은 연결된 IR 블래스터는 내 스마트 홈과 기존 가전 제품 사이의 격차를 천천히 채우고 있습니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • ESP8266 Arduino 스케치용 WiFi IR 블래스터
  • 스크립트.js
  • index.html
  • curl.php
  • 매니페스트.json
  • ESP8266 Arduino 스케치용 WiFi IR 블래스터C/C++
    ESP8266 와이파이 라이브러리와 IRremote.h가 필요합니다. 또한 리모컨이 라이브러리에서 지원되는 경우 Raw IR 코드를 사용하지 않도록 선택해야 합니다. 비표준 IR 코드를 사용하여 구축한 에어컨 컨트롤러에서 이 스케치를 적용했습니다.
    /* * Buddy Crotty의 WiFi IR Blaster * ESP8266 모듈 또는 개발 보드를 사용하여 HTTP GET 요청을 수신한 다음 * IR 코드를 보냅니다. 이러한 요청에 따라 연결된 IR LED에 연결합니다. * 이것은 어떤 버튼을 눌렀는지에 따라 * cURL 요청을 보내는 프런트 엔드 역할을 하는 다른 웹 서버에서 가장 잘 작동합니다. * cURL 형식:http://ESP8266/IRcode */#include #include #include const char* ssid ="AP_SSID";const char* 암호 ="AP_Pass ";MDNSResponder mdns;int khz =38; // NEC 및 SamsungIRsend 모두에 대한 38kHz 캐리어 주파수 irsend(4); //IR led가 GPIO4에 연결됨(NodeMCU의 핀 D2) // "TV 전원"에 대한 RAW IR 신호 삽입 unsigned int irTVpwr[] ={4650,4250, 700,1550, 650,1550, 700,1550, 650,450 , 650,500, 600,500, 600,500, 600,550, 550,1700, 550,1650, 600,1650, 550,550, 600,500, 600,550, 550,550, 600,500, 600,550, 550,1650, 600,550, 550,550, 600,500, 600,550, 550,550, 600,500, 600 ,1650, 600,500, 600,1650, 550,1700, 550,1650, 600,1650, 550,1650, 600,1650, 600}; // SAMSUNG E0E040BF // "TV 소스"에 대한 RAW IR 신호 삽입 unsigned int irTVsrc[] ={4600,4300, 700,1550, 650,1550, 650,1600, 650,450, 6 ,0, 650,450, 650,0550,5 1650 550,1650, 600,1650, 550,550, 600,500, 600,550, 550,550, 550,550, 600,1650, 550,550, 550,550, 600,500, 600,500, 600,550, 550,550, 600,500, 600,550, 550,1650, 550,1700, 550 1650, 600,1600, 600,1650, 600,1600, 600,1650, 550}; // SAMSUNG E0E0807F // "TV Mute"에 대한 RAW IR 신호 삽입 unsigned int irTVmute[] ={4650,4250, 700,1550, 650,1550, 600,1550, 700,1550, 700,1550, 650,450, 650,500, 1650 600,1600, 600,1650, 550,550, 600,500, 600,550, 550,550, 600,500, 600,1650, 550,1650, 600,1650, 550,1650, 600,550, 550,550, 550,550, 600,500, 600,550, 550,550, 550,550, 600,500, 600,1650, 550,1650, 600,1650, 550,1650, 600}; // SAMSUNG E0E0F00F // "TV Volume Down"에 대한 RAW IR 신호 삽입 unsigned int irTVvdn[] ={4650,4250, 700,1550, 650,1550, 5 ,5 ,0 ,5 ,5 ,0,450,650,400, 650,400 1650, 550,1650, 550,1650, 600,550, 550,550, 550,550, 600,500, 600,500, 600,1650, 600,1600, 600,500, 600,1650, 550,550, 600,500, 600,500, 600,550, 550,550, 600,500, 600,1650는 , 550,550, 550,1650, 600,1650, 550,1650, 600,1650, 550}; // SAMSUNG E0E0D02F // "TV Volume Up"을 위한 RAW IR 신호 삽입 unsigned int irTVvup[] ={4600,4300, 650,1600, 650,1550, 5 ,5 ,5 ,5 ,5,0,5,0,600,500,600,550, 1700, 550,1650, 600,1650, 550,550, 600,500, 600,550, 550,550, 600,500, 600,1650, 600,1650, 550,1650, 600,550, 550,550, 600,500, 600,550, 550,550, 600,500, 600,550, 550,550, 600 ,1600, 600,1650, 600,1650, 550,1650, 600,1650, 600}; // SAMSUNG E0E0E01F // "TV Channel Up"에 대한 RAW IR 신호 삽입 unsigned int irTVchup[] ={4650,4250, 700,1550, 650,1600, 650,1600, 650,1550, 650,500, 600,500, 1650, 550,1650, 600,1650, 600,500, 600,500, 600,550, 550,550, 600,550, 550,550, 550,1650, 600,550, 600,500, 600,1650, 550,550, 600,500, 600,550, 550,1650, 600,550, 550,1650는 , 600,1650, 600,500, 600,1650, 600,1600, 600,1650, 600}; // SAMSUNG E0E048B7 // "TV Channel Down"에 대한 RAW IR 신호 삽입 unsigned int irTVchdn[] ={4600,4350, 650,1550, 650,1600,5,5,0,5,5,0,1600,600,500,600,500 1650, 600,1650, 550,1700, 550,550, 550,550, 600,500, 600,550, 550,550, 600,500, 600,550, 550,550, 550,550, 600,1650, 600,500, 600,500, 600,550, 550,1650, 600,1650, 600,1650는 , 550,1650, 600,550, 550,1650, 600,1650, 600,1650, 550}; // SAMSUNG E0E008F7 // "수신기 전원"에 대한 RAW IR 신호 삽입 unsigned int irRECpwr[] ={9050,4350, 650,500, 600,1600, 600,1600, 600,500, 650,500, 600,60005, 550,550, 600,500, 600,1600, 650,1600, 600,500, 600,1650, 600,1600, 600,500, 600,1650, 600,1600, 600,550, 600,1600, 600,500, 600,550, 600,1600, 600,1600, 650,500, 600,500, 600,1600, 650,500, 600,1600, 600,1650, 600,500, 600,500, 600}; // NEC 4B36D32C // "수신기 전원 켜기"에 대한 RAW IR 신호 삽입 unsigned int irRECpwrON[] ={9000,4400, 600,550, 600,1600, 6 ,6 ,1600, 600,500, 600,550, 600,1000 , 600,1600, 600,500, 650,1600, 600,1600, 600,500, 650,1600, 600,1600, 600,500, 600,550, 600,500, 600,1600, 600,550, 600,500, 600,500, 650,500, 600,500, 600,1600, 650 ,1600, 600,500, 600,1600, 650,1600, 600,1600, 600,1600, 600,1600, 650}; // 0 NEC 4BB620DF // "수신기 전원 끄기"에 대한 RAW IR 신호 삽입 unsigned int irRECpwrOFF[] ={9000,4400, 600,550, 550,1650, 600,550, 600,550, 550,550, 600,5050,5 , 600,550, 550,550, 550,1650, 600,1650, 600,550, 550,1650, 600,1650, 550,550, 600,1650, 550,1650, 600,1650, 600,500, 600,550, 550,550, 600,1650, 550,550, 600,500은 , 600,550, 550,550, 550,1700, 550,1650, 600,1650, 550,550, 600,1650, 550}; // 0 NEC 4B36E21D // "수신기 음소거"에 대한 RAW IR 신호 삽입 unsigned int irRECmute[] ={9000,4400, 650,450, 650,1600, 6 ,1 600, 600,500, 600,500, 650,1600 600,1600, 650,500, 600,1600, 650,1600, 600,500, 600,1600, 650,1600, 600,500, 600,1650, 600,500, 600,1600, 650,500, 600,500, 600,500, 600,500, 650,500, 600,500, 600, 1600, 650,500, 600,1600, 600,1600, 650,1600, 600,1650, 600,1600, 600}; // 0 NEC 4BB6A05F // "Receiver Volume Down"에 대한 RAW IR 신호 삽입 unsigned int irRECvdn[] ={9150,4250, 750,350, 6 ,0 ,1550, 700,400, 700,450, 650,70060 , 600,1650, 600,500, 600,1650, 600,1600, 600,550, 600,1600, 600,1650, 600,500, 600,1650, 600,1600, 650,500, 600,500, 600,500, 650,500, 600,500, 600,500, 600,550, 600,500은 , 600,1650, 600,1600, 600,1650, 600,1650, 600,1600, 600,1650, 600}; // 0 NEC 4BB6C03F // "Receiver Volume Up"에 대한 RAW IR 신호 삽입 unsigned int irRECvup[] ={9050,4400, 650,500, 600,1600, 600,1600, 600,550, 600,500, 600,60050, , 600,1600, 600,550, 600,1600, 600,1600, 650,500, 600,1600, 650,1600, 600,500, 600,550, 600,1600, 600,550, 600,500, 600,550, 600,500, 600,550, 600,500, 600,1600, 650,500은 , 600,1600, 600,1650, 600,1600, 600,1650, 600,1600, 600,1600, 600}; // NEC 4BB640BF // "수신기 소스 CBL/SAT"에 대한 RAW IR 신호 삽입 unsigned int irRECsrc[] ={8950,4450, 600,500, 600,1650, 6 ,1650, 600,500, 600,500, 600,1005 1650, 600,1600, 600,550, 600,1600, 600,1650, 600,500, 600,1600, 600,1650, 600,500, 600,500, 600,1650, 600,1600, 600,1650, 600,500, 600,500, 600,500, 650,500은 , 600,1600, 600,500, 600,550, 600,500, 600,1600, 600,1650, 600,1600, 600,1650, 600}; // NEC 4BB6708F// 서버의 인스턴스 만들기// 수신할 포트를 인수로 지정WiFiServer server(80);void setup() { Serial.begin(115200); 지연(10); irsend.begin(); // WiFi 네트워크에 연결 Serial.println(); 직렬.println(); Serial.print("연결 중 "); Serial.println(ssid); WiFi.begin(ssid, 비밀번호); 동안 (WiFi.status() !=WL_CONNECTED) { 지연(500); Serial.print("."); } 직렬.println(""); Serial.println("와이파이 연결됨"); // 서버 시작 server.begin(); Serial.println("HTTP 서버가 시작되었습니다"); // IP 주소를 출력합니다. Serial.print("IP 주소:"); Serial.println(WiFi.localIP()); if (mdns.begin("IRBlasterLR", WiFi.localIP())) { Serial.println("MDNS 응답자 시작됨"); } 직렬.println(); Serial.println();}void loop() { // 클라이언트가 WiFiClient에 연결되었는지 확인합니다. client =server.available(); if (! 클라이언트) { 반환; } // 클라이언트가 데이터를 보낼 때까지 기다립니다. Serial.println("new client"); while(!client.available()){ 지연(1); } // 요청의 첫 번째 줄을 읽습니다. String req =client.readStringUntil('\r'); Serial.println(요구); 클라이언트.플러시(); // 요청 일치 if (req.indexOf("/irTVpwr") !=-1){ irsend.sendRaw(irTVpwr, sizeof(irTVpwr) / sizeof(irTVpwr[0]), khz); Serial.println("IRreq irTVpwr이 전송되었습니다."); } else if (req.indexOf("/irTVsrc") !=-1){ irsend.sendRaw(irTVsrc, sizeof(irTVsrc) / sizeof(irTVsrc[0]), khz); Serial.println("IRreq irTVsrc가 전송되었습니다."); } else if (req.indexOf("/irTVmute") !=-1){ irsend.sendRaw(irTVmute, sizeof(irTVmute) / sizeof(irTVmute[0]), khz); Serial.println("IRreq irTVmute가 전송되었습니다."); } else if (req.indexOf("/irTVvdn") !=-1){ irsend.sendRaw(irTVvdn, sizeof(irTVvdn) / sizeof(irTVvdn[0]), khz); Serial.println("IRreq irTVvdn이 전송되었습니다."); } else if (req.indexOf("/irTVvup") !=-1){ irsend.sendRaw(irTVvup, sizeof(irTVvup) / sizeof(irTVvup[0]), khz); Serial.println("IRreq irTVvup이 전송되었습니다."); } else if (req.indexOf("/irTVchup") !=-1){ irsend.sendRaw(irTVchup, sizeof(irTVchup) / sizeof(irTVchup[0]), khz); Serial.println("IRreq irTVchup이 전송되었습니다."); } else if (req.indexOf("/irTVchdn") !=-1){ irsend.sendRaw(irTVchdn, sizeof(irTVchdn) / sizeof(irTVchdn[0]), khz); Serial.println("IRreq irTVchdn이 전송되었습니다."); } else if (req.indexOf("/irALLpwr") !=-1){ irsend.sendRaw(irRECpwrON, sizeof(irRECpwrON) / sizeof(irRECpwrON[0]), khz); irsend.sendRaw(irTVpwr, sizeof(irTVpwr) / sizeof(irTVpwr[0]), khz); 지연(2000); irsend.sendRaw(irRECsrc, sizeof(irRECsrc) / sizeof(irRECsrc[0]), khz); Serial.println("IRreq irALLpwr이 전송되었습니다."); } else if (req.indexOf("/irRECpwr") !=-1){ irsend.sendRaw(irRECpwr, sizeof(irRECpwr) / sizeof(irRECpwr[0]), khz); Serial.println("IRreq irRECpwr이 전송되었습니다."); } else if (req.indexOf("/irRECpwrON") !=-1){ irsend.sendRaw(irRECpwrON, sizeof(irRECpwrON) / sizeof(irRECpwrON[0]), khz); Serial.println("IRreq irRECpwrON이 전송되었습니다."); } else if (req.indexOf("/irRECpwrOFF") !=-1){ irsend.sendRaw(irRECpwrOFF, sizeof(irRECpwrOFF) / sizeof(irRECpwrOFF[0]), khz); Serial.println("IRreq irRECpwrOFF가 전송되었습니다."); } else if (req.indexOf("/irRECmute") !=-1){ irsend.sendRaw(irRECmute, sizeof(irRECmute) / sizeof(irRECmute[0]), khz); Serial.println("IRreq irRECmute가 전송되었습니다."); } else if (req.indexOf("/irRECvdn") !=-1){ irsend.sendRaw(irRECvdn, sizeof(irRECvdn) / sizeof(irRECvdn[0]), khz); Serial.println("IRreq irRECvdn이 전송되었습니다."); } else if (req.indexOf("/irRECvup") !=-1){ irsend.sendRaw(irRECvup, sizeof(irRECvup) / sizeof(irRECvup[0]), khz); Serial.println("IRreq irRECvup이 전송되었습니다."); } else { Serial.println("잘못된 요청"); client.stop(); 반품; } 클라이언트.플러시(); // 클라이언트에 응답을 보냅니다. //client.print(s); client.print("HTTP/1.1 200 OK\r\n"); 지연(1); Serial.println("클라이언트 연결 끊김"); 직렬.println(); // 클라이언트는 실제로 연결이 끊어집니다. // 함수가 반환되고 '클라이언트' 객체가 소멸될 때}
    script.js자바스크립트
    javascript for webapp(jquery 필요)
    // IR 명령을 보내는 기능function buttonClick(clicked_id){ if (clicked_id =="irTVpwr"){ $.get( "curl.php", { room:"192.168.1.62" , 버튼:"irTVpwr"} ); } if (clicked_id =="irTVsrc"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irTVsrc"} ); } if (clicked_id =="irTVmute"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irTVmute"} ); } if (clicked_id =="irTVvdn"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irTVvdn"} ); } if (clicked_id =="irTVvup"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irTVvup"} ); } if (clicked_id =="irTVchup"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irTVchup"} ); } if (clicked_id =="irTVchdn"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irTVchdn"} ); } if (clicked_id =="irRECpwr"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irRECpwr"} ); } if (clicked_id =="irALLpwr"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irALLpwr"} ); } if (clicked_id =="irRECpwrON"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irRECpwrON"} ); } if (clicked_id =="irRECpwrOFF"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irRECpwrOFF"} ); } if (clicked_id =="irRECmute"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irRECmute"} ); } if (clicked_id =="irRECvdn"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irRECvdn"} ); } if (clicked_id =="irRECvup"){ $.get( "curl.php", { 방:"192.168.1.62", 버튼:"irRECvup"} ); } }
    index.htmlHTML
    버튼을 표시하는 기본 html.
     



    TV



    <버튼 class="btn" type="button" id="irTVsrc" onClick="buttonClick(this.id)">소스

    <버튼 class="btn" type="button" id="irTVvdn" onClick="buttonClick(this.id)">볼 -      


    수신기





    curl.phpPHP
    ESP8266에 GET 요청을 보내는 PHP 스크립트
    manifest.jsonJSON
    이렇게 하면 웹페이지가 Android에서 기본 웹앱으로 실행될 수 있습니다.
    { "name":"WiFi Remote", "icons":[ { "src":"remote_icon_36.png", "size":"36x36" , "유형":"이미지/png", "밀도":0.75 }, { "src":"remote_icon_48.png", "크기":"48x48", "유형":"이미지/png", "밀도" :1.0 }, { "src":"remote_icon_128.png", "크기":"128x128", "유형":"이미지/png", "밀도":1.0 }, { "src":"remote_icon_192.png" , "크기":"192x192", "유형":"이미지/png", "밀도":1.0}], "범위":"/remote/", "start_url":"/remote/index.html", "디스플레이":"전체 화면", "방향":"세로"}

    회로도

    실제로는 아무 것도 없으며 5v 공급 전압에서 저항 없이 직렬로 2개의 IR LED를 구동하기 위해 전원과 NPN 트랜지스터에 연결된 단일 핀만 있습니다. 추가 LED를 실행하거나 3.3v 소스에서 더 적은 전압 강하가 필요한 경우 NPN을 사용할 수 있습니다. 여러 PNP 트랜지스터를 전환하는 트랜지스터(LED당 하나씩). 이 구성을 사용하면 소스 전압이 전류를 공급할 수 있는 만큼 LED를 사용할 수 있습니다.

    제조공정

    1. WiFi RTLS의 단점
    2. 새로운 무선 기술 2015
    3. 3달러 WiFi 장치에 보안 내장 웹 서버를 설치하는 방법
    4. NodeMCU와 Raspberry Pi 3 B+ 간의 MQTT 통신
    5. Android 스마트폰으로 제어되는 RASPBERRY PI WIFI 로봇
    6. 라즈베리 파이를 사용하는 Wi-Fi 제어 로봇
    7. WiFi 통화란 무엇입니까? 작동 원리는 무엇입니까?
    8. IOT - ESP8266, Arduino 및 초음파 센서를 사용하는 스마트 항아리
    9. WiFi 로그인 페이지를 사용하는 스마트 도어록 by Arduino &ESP8266
    10. 비드 블라스트 란 무엇입니까? 비드 블라스팅 가이드