Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

WiFi IR Blaster

Componenten en benodigdheden

Espressief ESP8266 ESP-01
U kunt dit in plaats daarvan doen met een standaard ESP8266 of de NodeMCU-ontwikkelkit
× 1
Arduino Nano R3
× 1
Transistor-NPN voor algemeen gebruik
× 1
Adafruit IR-leds
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)

Apps en online services

Arduino IDE
NodeMCU-firmware

Over dit project

Twee stappen vooruit...

Het lijkt erop dat de grote telefoonfabrikanten afstand nemen van ingebouwde IR-blasters, dus ik ben op zoek naar een manier om mijn "domme" apparaten die momenteel niet integreren met mijn IoT-infrastructuur, toekomstbestendig te maken. Ik heb een smart home met mesh-netwerk, maar ik moet een fysieke afstandsbediening vinden om mijn tv aan te zetten? Er moet een betere manier zijn.

Ik heb onlangs een IR-blaster gebouwd die stand-alone airconditioners in mijn huis bestuurt en een ander eerder project was een aangesloten HVAC-ventilatie met een met Android verbonden webapp. In wezen hoef ik deze twee dingen alleen maar te combineren in een web-verbonden IR-blaster met een webapp-frontend, zodat ik op knoppen op mijn telefoon kan drukken en IR-signalen naar mijn mediacenters kan sturen. Deze kunnen in elke ruimte worden ingezet en overal worden bediend vanuit één enkele interface, dus de toepassingen hiervoor zijn enorm breed.

Snel prototypen

Ik pakte wat ongebruikte hardware en bekabelde alles wat ik nodig had om verbinding te maken met mijn wifi, HTTP-verbindingen te accepteren en IR-signalen te verzenden.

Dit werkte prima omdat ik een specifieke URL kon aanvragen op het IP-adres dat aan de ESP8266 was toegewezen en de Arduino een "Power" -signaal naar de IR-LED kon laten sturen. Ik moest alleen weten waar ik de webapp moest hosten, die de URL's naar de IR-blaster moesten sturen en die verzoeken vervolgens in specifieke IR-codes moesten laten parseren. Dit was erg vervelend om te doen met behulp van AT-commando's met de ESP8266, en er was iets dat een vertraging van 1-2 seconden veroorzaakte tussen het verzenden van het verzoek en het knipperen van de LED.

NodeMCU

Ik ging door met het NodeMCU ESP8266-ontwikkelbord omdat het stroomregeling aan boord heeft, een USB-naar-seriële interface en veel I/O-pinnen in dit kleine pakket (het is ook breadboard-vriendelijk). Het blijkt dat er al een ESP8266 WebServer-bibliotheek is die GET-verzoeken accepteert die ik heb kunnen aanpassen voor het verzenden van IR-codes en de reguliere IRremote-bibliotheek werkt direct uit de doos.

De ESP8266 op de NodeMCU is niet krachtig genoeg om de webapp zelf te hosten, dus ik zal hem op een onderbenutte C.H.I.P. computer van $ 9 die al op mijn thuisnetwerk is aangesloten. Een andere beperking is dat de ESP8266 is dat het een 3.3v-kaart is, dus de IR-LED's die rechtstreeks vanaf een I/O-pin worden aangestuurd, waren erg zwak en moesten vlak naast het apparaat staan ​​waarnaar het een signaal stuurde. Ik heb in plaats daarvan de I/O-pin gebruikt om een ​​npn-transistor aan te sturen om de 5v-voedingsspanning aan/uit te schakelen.

RUST...achtig

Na wat onderzoek te hebben gedaan, vond ik een geweldige tutorial voor het implementeren van een REST API voor Arduino om LED's op adafruit te besturen. Ik gebruikte hun JavaScript- en PHP-bestanden om de cURL-verzoeken in te dienen en laadde die op de CHIP die al apache draait, maar net zo gemakkelijk in de cloud kan worden gehost. Nadat ik een eenvoudige HTML-pagina voor de afstandsbediening had gemaakt, heb ik de manifest.json- en pictogrambestanden toegevoegd, zodat deze als een native webapp op een Android-telefoon kan worden uitgevoerd.

Aan de Arduino-kant heb ik de webserver ingekort om gewoon een GET-verzoek te accepteren, de URL te ontleden, een 200 OK te verzenden en vervolgens de verbinding te verbreken. Op basis van de URL zou de Arduino de IR-code verzenden die was toegewezen aan de ingedrukte knop.

Universele remonster

Alles werkt feilloos zonder vertraging. Ik ontdekte dat de IR-LED's die ik gebruik een zeer kleine hoek hebben, dus ik moet oppassen dat ze correct zijn gericht. Met wat industrieel klittenband kan ik het onder een plank monteren, uit het zicht, en ervoor zorgen dat het gericht blijft op de IR-ontvangers aan de andere kant. Ik heb wat dikke draad aan de LED-draden toegevoegd, zodat ze nauwkeurig kunnen worden afgesteld.

Het hebben van weerstanden voor de IR-LED's zorgde ervoor dat ze bijna onbruikbaar waren, dus de transistor voedt ze met een niet-gereguleerde 5v. Hierdoor kan ik IR van muren weerkaatsen en de blaster door de kamer monteren, maar dit zal zeker een effect hebben op de levensduur. Ik hoop dat, aangezien ze zeer zelden worden gebruikt en de IR-signalen superkorte pulsen zijn (lagere inschakelduur dan de meeste zwakke PWM-signalen), ik de LED's voorlopig niet hoef te vervangen. Ik heb ervoor gezorgd dat ik een aantal IR-LED's met een grote hoek en een hogere output voor versie 2 heb besteld, dus als deze uiteindelijk dood gaan, zal ik ze samen met een inline-weerstand vervangen.

Update van 3 maanden en toekomstige functies

Ik gebruik dit elke dag en het heeft vlekkeloos gewerkt. Ik heb zelfs een tweede apparaat in onze familiekamer toegevoegd om onze raam-AC-unit en een andere tv te bedienen.

Plannen voor de toekomst:

  • De web-UI migreren naar een cloudservice
  • Integreren met Amazon Echo voor spraakopdrachten (Gereed)
  • De volgende hardware-iteratie zal ook een DHT22-temperatuursensor hebben en ik onderzoek manieren om RF te verzenden voor mijn plafondventilatoren
  • Voeg een IR-ontvanger toe voor een leerfunctie zodat u de IR-blastercommando's van bestaande afstandsbedieningen kunt "leren"
  • Integreer met mijn domotica/beveiliging om apparaten uit te schakelen wanneer ze niet in gebruik zijn

Deze kleine aangesloten IR-blaster vult langzaam de kloof tussen mijn slimme huis en oudere apparaten.

Code

  • WiFi IR Blaster voor ESP8266 Arduino Sketch
  • script.js
  • index.html
  • curl.php
  • manifest.json
WiFi IR Blaster voor ESP8266 Arduino SketchC/C++
Je hebt de ESP8266 wifi-bibliotheek en IRremote.h nodig. U moet er ook voor kiezen om de Raw IR-codes niet te gebruiken als uw afstandsbediening wordt ondersteund in de bibliotheek. Ik heb deze schets aangepast van een airconditionercontroller die ik heb gebouwd en die niet-standaard IR-codes gebruikte.
/* * WiFi IR Blaster van Buddy Crotty * Gebruik een ESP8266-module of ontwikkelbord om HTTP GET-verzoek te ontvangen * en verzend vervolgens IR-codes op een aangesloten IR-LED op basis van die verzoeken. * Dit werkt het beste met een andere webserver die fungeert als front-end die * cURL-verzoeken verzendt op basis van welke knoppen worden ingedrukt. * cURL-indeling:http://ESP8266/IRcode */#include #include #include const char* ssid ="AP_SSID";const char* wachtwoord ="AP_Pass ";MDNSResponder mdns;int khz =38; // 38 kHz draaggolffrequentie voor zowel NEC als SamsungIRsend irsend(4); // een IR-led is verbonden met GPIO4 (pin D2 op NodeMCU) // Voeg RAW IR-signaal in voor "TV Power" 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 // Voeg RAW IR-signaal in voor "TV-bron" unsigned int irTVsrc [] ={4600.4300, 700.1550, 650.1550, 650.1600, 650.450, 650.450, 600.550, 550.550, 600.500, 600, 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 // Voeg RAW IR-signaal in voor "TV Mute" unsigned int irTVmute [] ={4650,4250, 700,1550, 650,1550, 700,1550, 650,450, 650,500, 600,500, 600,500, 600,500, 600, 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 // Voeg RAW IR-signaal in voor "TV Volume Down" unsigned int irTVvdn [] ={4650,4250, 700,1550, 650,1550, 700,1550, 650,450, 650,450, 650,450, 600,550, 550,550, 600 ,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 // Voeg RAW IR-signaal in voor "TV Volume Up" unsigned int irTVvup [] ={4600.4300, 650.1600, 650.1550, 650.1600, 600.500, 600.550, 600.500, 600.550, 550.550, 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 // Voeg RAW IR-signaal in voor "TV Channel Up" unsigned int irTVchup [] ={4650,4250, 700,1550, 650.1600, 650.150, 650.500, 600.500, 600.500, 650.500, 600.500, 600 ,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 // Voeg RAW IR-signaal in voor "TV Channel Down" unsigned int irTVchdn [] ={4600.4350, 650.1550, 650.1600, 650.1600, 600.500, 600.500, 600.550, 550.550, 600.550, 550 ,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 // Voeg RAW IR-signaal in voor "Receiver Power" unsigned int irRECpwr[] ={9050,4350, 650,500, 600.1600, 600,500, 650,500, 600.1600, 600.550, 600.1600, 600.1650, 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 // Voeg RAW IR-signaal in voor "Receiver Power On" unsigned int irRECpwrON[] ={9000,4400, 600,550, 600.1600, 600,500, 600.550, 600.1600, 600.500, 600.1600, 650.1600 , 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}; // NEC 4BB620DF // Voeg RAW IR-signaal in voor "Receiver Power Off" unsigned int irRECpwrOFF[] ={9000,4400, 600,550, 550,1650, 600,550, 550,550, 600,1650, 550,550, 600,1650, 550,1650 , 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}; // NEC 4B36E21D // Voeg RAW IR-signaal in voor "Receiver Mute" unsigned int irRECmute [] ={9000,4400, 650,450, 650.1600, 600,500, 600,500, 650.1600, 600,500, 600,1650, 600.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}; // NEC 4BB6A05F // Voeg RAW IR-signaal in voor "Receiver Volume Down" unsigned int irRECvdn [] ={9150,4250, 750,350, 700,1550, 700,400, 700,450, 650.1550, 700,450, 600.1600, 650.1600 , 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}; // NEC 4BB6C03F // Voeg RAW IR-signaal in voor "Receiver Volume Up" unsigned int irRECvup [] ={9050,4400, 650,500, 600.1600, 600.550, 600.500, 600.1650, 600.500, 600.1600, 650.1600 , 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 // Voeg RAW IR-signaal in voor "Receiver Source CBL/SAT" unsigned int irRECsrc[] ={8950,4450, 600,500, 600,1650, 600,500, 600,500, 600,1650, 600,500, 600.1600, 600 ,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// Maak een instantie van de server// specificeer de poort om naar te luisteren als een argumentWiFiServer server(80);void setup() { Serial.begin(115200); vertraging(10); irsend.begin(); // Maak verbinding met wifi-netwerk Serial.println(); Serieel.println(); Serial.print("Verbinding maken met "); Serieel.println(ssid); WiFi.begin(ssid, wachtwoord); while (WiFi.status() !=WL_CONNECTED) { delay(500); Serieel.print("."); } Serieel.println(""); Serial.println("WiFi Verbonden"); // Start de server server.begin(); Serial.println ("HTTP-server gestart"); // Druk het IP-adres af Serial.print ("IP-adres:"); Serial.println(WiFi.localIP()); if (mdns.begin("IRBlasterLR", WiFi.localIP())) { Serial.println("MDNS-responder gestart"); } Serieel.println(); Serial.println();}void loop() { // Controleer of een client verbinding heeft gemaakt WiFiClient client =server.available(); if (!client) { return; } // Wacht tot de client gegevens verzendt Serial.println ("nieuwe client"); while(!client.available()){ vertraging(1); } // Lees de eerste regel van het verzoek String req =client.readStringUntil('\r'); Serial.println(req); cliënt.flush(); // Match het verzoek if (req.indexOf("/irTVpwr") !=-1){ irsend.sendRaw(irTVpwr, sizeof(irTVpwr) / sizeof(irTVpwr[0]), khz); Serial.println ("IRreq irTVpwr verzonden"); } else if (req.indexOf("/irTVsrc") !=-1){ irsend.sendRaw(irTVsrc, sizeof(irTVsrc) / sizeof(irTVsrc[0]), khz); Serial.println ("IRreq irTVsrc verzonden"); } else if (req.indexOf("/irTVmute") !=-1){ irsend.sendRaw(irTVmute, sizeof(irTVmute) / sizeof(irTVmute[0]), khz); Serial.println ("IRreq irTVmute verzonden"); } else if (req.indexOf("/irTVvdn") !=-1){ irsend.sendRaw(irTVvdn, sizeof(irTVvdn) / sizeof(irTVvdn[0]), khz); Serial.println ("IRreq irTVvdn verzonden"); } else if (req.indexOf("/irTVvup") !=-1){ irsend.sendRaw(irTVvup, sizeof(irTVvup) / sizeof(irTVvup[0]), khz); Serial.println ("IRreq irTVvup verzonden"); } else if (req.indexOf("/irTVchup") !=-1){ irsend.sendRaw(irTVchup, sizeof(irTVchup) / sizeof(irTVchup[0]), khz); Serial.println ("IRreq irTVchup verzonden"); } else if (req.indexOf("/irTVchdn") !=-1){ irsend.sendRaw(irTVchdn, sizeof(irTVchdn) / sizeof(irTVchdn[0]), khz); Serial.println ("IRreq irTVchdn verzonden"); } else if (req.indexOf("/irALLpwr") !=-1){ irsend.sendRaw(irRECpwrON, sizeof(irRECpwrON) / sizeof(irRECpwrON[0]), khz); irsend.sendRaw(irTVpwr, sizeof(irTVpwr) / sizeof(irTVpwr[0]), khz); vertraging (2000); irsend.sendRaw(irRECsrc, sizeof(irRECsrc) / sizeof(irRECsrc[0]), khz); Serial.println ("IRreq irALLpwr verzonden"); } else if (req.indexOf("/irRECpwr") !=-1){ irsend.sendRaw(irRECpwr, sizeof(irRECpwr) / sizeof(irRECpwr[0]), khz); Serial.println ("IRreq irRECpwr verzonden"); } else if (req.indexOf("/irRECpwrON") !=-1){ irsend.sendRaw(irRECpwrON, sizeof(irRECpwrON) / sizeof(irRECpwrON[0]), khz); Serial.println("IRreq irRECpwrON verzonden"); } else if (req.indexOf("/irRECpwrOFF") !=-1){ irsend.sendRaw(irRECpwrOFF, sizeof(irRECpwrOFF) / sizeof(irRECpwrOFF[0]), khz); Serial.println ("IRreq irRECpwrOFF verzonden"); } else if (req.indexOf("/irRECmute") !=-1){ irsend.sendRaw(irRECmute, sizeof(irRECmute) / sizeof(irRECmute[0]), khz); Serial.println ("IRreq irRECmute verzonden"); } else if (req.indexOf("/irRECvdn") !=-1){ irsend.sendRaw(irRECvdn, sizeof(irRECvdn) / sizeof(irRECvdn[0]), khz); Serial.println ("IRreq irRECvdn verzonden"); } else if (req.indexOf("/irRECvup") !=-1){ irsend.sendRaw(irRECvup, sizeof(irRECvup) / sizeof(irRECvup[0]), khz); Serial.println ("IRreq irRECvup verzonden"); } else { Serial.println("ongeldige aanvraag"); klant.stop(); opbrengst; } cliënt.flush(); // Stuur het antwoord naar de klant //client.print(s); client.print("HTTP/1.1 200 OK\r\n"); vertraging(1); Serial.println("Klant losgekoppeld"); Serieel.println(); // De verbinding met de client wordt daadwerkelijk verbroken // wanneer de functie terugkeert en het 'client'-object wordt vernietigd}
script.jsJavaScript
javascript voor webapp (vereist jQuery)
// Functie om IR-opdrachten te verzendenfunction buttonClick(clicked_id){ if (clicked_id =="irTVpwr"){ $.get( "curl.php", { room:"192.168.1.62" , knop:"irTVpwr"} ); } if (clicked_id =="irTVsrc"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVsrc"} ); } if (clicked_id =="irTVmute"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVmute"} ); } if (clicked_id =="irTVvdn"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVvdn"} ); } if (clicked_id =="irTVvup"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVvup"} ); } if (clicked_id =="irTVchup"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVchup"} ); } if (clicked_id =="irTVchdn"){ $.get( "curl.php", { room:"192.168.1.62", button:"irTVchdn"} ); } if (clicked_id =="irRECpwr"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECpwr"} ); } if (clicked_id =="irALLpwr"){ $.get( "curl.php", { room:"192.168.1.62", button:"irALLpwr"} ); } if (clicked_id =="irRECpwrON"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECpwrON"} ); } if (clicked_id =="irRECpwrOFF"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECpwrOFF"} ); } if (clicked_id =="irRECmute"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECmute"} ); } if (clicked_id =="irRECvdn"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECvdn"} ); } if (clicked_id =="irRECvup"){ $.get( "curl.php", { room:"192.168.1.62", button:"irRECvup"} ); } }
index.htmlHTML
Basis html om knoppen weer te geven.
 



TV





     


Ontvanger





curl.phpPHP
php-script om GET-verzoeken te verzenden naar ESP8266
manifest.jsonJSON
Hierdoor kan de webpagina worden uitgevoerd als een native webapp in Android.
{ "name":"WiFi Remote", "icons":[ { "src":"remote_icon_36.png", "sizes":"36x36" , "type":"image/png", "density":0.75 }, { "src":"remote_icon_48.png", "sizes":"48x48", "type":"image/png", "density" :1.0 }, { "src":"remote_icon_128.png", "sizes":"128x128", "type":"image/png", "density":1.0 }, { "src":"remote_icon_192.png" , "sizes":"192x192", "type":"image/png", "density":1.0 } ], "scope":"/remote/", "start_url":"/remote/index.html", "display":"fullscreen", "orientation":"portrait"}

Schema's

Niets echt aan, alleen stroom en een enkele pin aangesloten op een NPN-transistor om twee IR-LED's in serie (zonder weerstanden) van de 5V-voedingsspanning te sturen. Als u extra LED's wilt gebruiken of minder spanningsverlies van een 3,3 V-bron nodig hebt, kunt u een NPN gebruiken transistor om meerdere PNP-transistoren te schakelen (één per LED). Met deze configuratie kunt u zoveel LED's gebruiken als uw bronspanning stroom kan leveren.

Productieproces

  1. De tekortkomingen van wifi RTLS
  2. Nieuwe draadloze technologie 2015
  3. Hoe installeer je een beveiligde ingebouwde webserver op een wifi-apparaat van $ 3
  4. MQTT-communicatie tussen NodeMCU en Raspberry Pi 3 B+
  5. RASPBERRY PI WIFI ROBOT GECONTROLEERD VANAF ANDROID SMART PHONE
  6. Wifi-gestuurde robot met Raspberry Pi
  7. Wat is bellen via wifi? Hoe werkt het?
  8. IOT - Smart Jar met ESP8266, Arduino en ultrasone sensor
  9. WebServerBlink met Arduino Uno WiFi
  10. Slim deurslot met WiFi-aanmeldingspagina door Arduino &ESP8266
  11. Wat is een Bead Blast? Een gids voor parelstralen