INHOUDSOPGAWE:
2025 Outeur: John Day | [email protected]. Laas verander: 2025-01-23 12:53
Ek het 'n Logitech -harmonie -afstandsbediening en bestuur Tuisassistent op 'n framboospi.
Ek wou chromecast van my afstandsbediening af laat wag, maar ek het 'n ou TV wat dit nie via hdmi ondersteun nie. My idee was toe om 'n NodeMcu te gebruik om die IR -sein te vang en te onderbreek.
Lewer hieronder kommentaar as u dit nie kan laat werk nie
Stap 1: Uitrusting
Toerusting benodig:
Nodemcu (https://www.ebay.com/sch/i.html?_from=R40&_trksid=…
Die ontvanger (soos hierdie:
dupont drade
Mikro usb -kabel (kragknoppie)
Ek gebruik Logitech Harmony -hub
Vir my benadering, het u 'n framboos -pi nodig met hass.io geïnstalleer en genereer. As u iets anders as tuisassistent gebruik, moet u dinge self aanpas.
U moet Nodemcu op Arduino IDE kan gebruik, aangesien ek hier nie hierop ingaan nie
Stap 2: Sein op afstand
Die manier waarop ek dit gedoen het, was om 'n sein van 'n afstandbeheer wat ek nie gebruik nie na die harmonie -afstandsbediening te kopieer.
Ek gebruik 'n afstandsbediening vir panasonic tv -model TXL32C3E, aangesien dit nie my toerusting op my eerste verdieping belemmer nie. Dit is 'n TV wat ek bo het.
As u nie harmonie gebruik nie, kan u dit oorslaan.
Om die sein te vind, gebruik ek hierdie skets:
/ * * IRremoteESP8266: IRrecvDumpV2 - stort besonderhede van IR -kodes met IRrecv * 'n IR -detektor/demodulator moet aan die ingang RECV_PIN gekoppel word. * * Kopiereg 2009 Ken Shirriff, https://arcfn.com * Kopiereg 2017 David Conran * * Voorbeeld kringdiagram: * https://arcfn.com * * Wysigings: * Weergawe 0.3 November, 2017 * - Ondersteuning vir lugversorging dekodering vir 'n paar protokolle. * Weergawe 0.2 April, 2017 * - Dekodeer uit 'n afskrif van die data, sodat ons vinniger kan begin vaslê en sodoende die waarskynlikheid van wangedrag verminder. * Gebaseer op Ken Shirriff se IrsendDemo weergawe 0.1 Julie 2009, */
#ifndef UNIT_TEST
#include #endif #include #include #include #if DECODE_AC #include #include #include #include #include #endif // DECODE_AC
// ===================== begin van TUNEABLE PARAMETERS ======================
// 'n IR -detektor/demodulator is gekoppel aan GPIO -pen 14 // bv. D5 op 'n NodeMCU -bord. #definieer RECV_PIN 14
// Die seriële verbindings baud -tempo.
// d.w.s. Statusboodskap sal teen hierdie baud -tempo na die rekenaar gestuur word. // Probeer om stadige snelhede soos 9600 te vermy, aangesien u boodskappe sal misloop en/ of ander probleme kan veroorsaak. 115200 (of vinniger) word aanbeveel. // OPMERKING: Maak seker dat u u seriële monitor op dieselfde snelheid ingestel het. #definieer BAUD_RATE 115200
// Aangesien hierdie program 'n spesiale doelopname/dekodeerder is, laat ons 'n groter gebruik
// as normale buffer sodat ons afstandkodes van die lugversorger kan hanteer. #definieer CAPTURE_BUFFER_SIZE 1024
// TIMEOUT is die Nr. van milli-sekondes nie-meer-data voordat ons na a kyk
// boodskap geëindig. // Hierdie parameter is 'n interessante afweging. Hoe langer die time -out, hoe meer // kompleks 'n boodskap dit kan opneem. bv. Sommige apparaatprotokolle stuur // veelvuldige boodskappakkies vinnig, soos afstandbeheer van lugversorger. // Air Coniditioner-protokolle het dikwels 'n aansienlike gaping (20-40+ms) tussen // pakkies. // Die nadeel van 'n groot time -out -waarde is baie minder ingewikkelde protokolle // stuur verskeie boodskappe wanneer die knoppie van die afstandsbediening ingedruk word. Die gaping tussen // hulle is dikwels ook ongeveer 20+ms. Dit kan daartoe lei dat die rou data 2-3+ // keer groter is as wat nodig is, aangesien dit 2-3+ boodskappe in 'n enkele // opname vasgelê het. As u 'n lae tydsduurwaarde stel, kan dit opgelos word. // Die keuse van die beste TIMEOUT -waarde vir u spesifieke geval is // redelik genuanseerd. Sterkte en gelukkige jag. // LET WEL: Moenie MAX_TIMEOUT_MS oorskry nie. Gewoonlik 130 ms. #if DECODE_AC #defineer TIMEOUT 50U // Sommige lugversorgingseenhede het gapings in hul protokolle van ~ 40ms. // bv. Kelvinator // 'n Waarde wat so groot is, kan herhalings van sommige protokolle insluk #else // DECODE_AC #define TIMEOUT 15U // Pas by die meeste boodskappe, terwyl baie herhalings nie ingesluk word nie. #endif // DECODE_AC // Alternatiewe: // #define TIMEOUT 90U // Pas boodskappe met groot gapings soos XMP-1 en sommige aircon // eenhede, maar kan per ongeluk herhaalde boodskappe sluk // in die rawData -uitset. // #define TIMEOUT MAX_TIMEOUT_MS // Dit stel dit op ons tans toegelate // maksimum. Waardes wat so hoog is, is problematies // omdat dit ongeveer die tipiese grens is // waar die meeste boodskappe herhaal word. // bv. Dit sal ophou om 'n boodskap te dekodeer en // dit na seriële te stuur op presies // op die tydstip waarop die volgende boodskap waarskynlik // oorgedra sal word, en dit kan misloop.
// Stel die kleinste "onbekende" boodskappakkies in wat ons eintlik omgee.
// Hierdie waarde help om die vals-positiewe opsporingstempo van IR-agtergrond // geraas as werklike boodskappe te verminder. Die kans dat agtergrond -IR -geraas opgespoor kan word // namate 'n boodskap toeneem met die lengte van die TIMEOUT -waarde. (Sien hierbo) // // Stel hoër as u baie kort, onbekende boodskappe kry wanneer niks 'n boodskap moet stuur nie. // Stel laer as u seker is dat u opstelling werk, maar dit sien nie boodskappe // van u toestel nie. (bv. Ander IR -afstandsbedienings werk.) // OPMERKING: Stel hierdie waarde baie hoog om onbekende opsporing effektief uit te skakel. #define MIN_UNKNOWN_SIZE 12 // ===================== einde van TUNEABLE PARAMETERS ======================
// Gebruik die stoorbuffer -funksie vir meer volledige opname -dekking.
IRrecv irrecv (RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, waar);
resultate van dekode_resultate; // Iewers om die resultate te stoor
// Wys die menslike leesbare toestand van 'n lugversorgingsboodskap as ons kan.
void dumpACInfo (decode_results *results) {String description = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (resultate-> toestand); beskrywing = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (resultate-> toestand, resultate-> bits / 8); beskrywing = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (resultate-> toestand); beskrywing = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (resultate-> toestand); beskrywing = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (result-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (resultate-> waarde); // Midea gebruik waarde in plaas van staat. beskrywing = ac.toString (); } #endif // DECODE_MIDEA // As ons 'n mens-leesbare beskrywing van die boodskap kry, vertoon dit. if (beskrywing! = "") Serial.println ("Mesg Desc.:" + beskrywing); }
// Die gedeelte van die kode word slegs een keer tydens die aanvang uitgevoer.
ongeldige opstelling () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); vertraging (500); // Wag 'n rukkie totdat die reeksverbinding tot stand kom.
#as DECODE_HASH
// Ignoreer boodskappe met minder as minimum aan- of afslagpulse. irrecv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn (); // Begin die ontvanger}
// Die herhalende gedeelte van die kode
// void loop () {// Kontroleer of die IR -kode ontvang is. if (irrecv.decode (& resultate)) {// Wys 'n ruwe tydstempel. uint32_t nou = millis (); Serial.printf ("Tydstempel: %06u. %03u / n", nou / 1000, nou %1000); if (results.overflow) Serial.printf ("WAARSKUWING: IR -kode is te groot vir buffer (> = %d)." "Hierdie resultaat moet nie vertrou word totdat dit opgelos is nie." "Wysig en verhoog CAPTURE_BUFFER_SIZE. / n ", CAPTURE_BUFFER_SIZE); // Gee die basiese uitset van wat ons gevind het. Serial.print (resultToHumanReadableBasic (& resultate)); dumpACInfo (& resultate); // Wys enige ekstra lugversorgingsinligting as ons dit het. opbrengs (); // Voer die WDT in, aangesien die teksuitset 'n rukkie kan neem om te druk.
// Vertoon die biblioteekweergawe waarmee die boodskap vasgelê is.
Serial.print ("Biblioteek: v"); Serial.println (_IRREMOTEESP8266_VERSION_); Serial.println ();
// Gee inligting oor die resultaat van RAW -tydsberekening.
Serial.println (resultToTimingInfo (& resultate)); opbrengs (); // Voer die WDT (weer)
// Stel die resultate as bronkode in
Serial.println (resultToSourceCode (& resultate)); Serial.println (""); // Leë lyn tussen inskrywings opbrengs (); // Voer die WDT (weer)}}
As hierdie skets opgelaai word en met 'n seriële monitor oopgemaak word, word die kode vir die druk op die knoppie uitgevoer (sien prent)
Skryf die kodes neer wat u later wil gebruik. Ek het Excel gebruik om aan te teken wat ek gekry het vir knoppies wat ek wou gebruik (sien prentjie)
Ek het die knoppies in my Netflix -aktiwiteit gewysig om 'n pouse -sein vanaf panasonic -afstandsbediening te stuur.. (sien prent)
Stap 3: Skryf die kode vir stuur na Nodered
#ifndef UNIT_TEST #sluit #endif #include in
#insluit
#insluit
#insluit
#insluit
#insluit
const char* ssid = ""; // Voer SSID in by herkenning* wagwoord = ""; // Tik wagwoord hier const char *host = ""; // Ip addresse #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv irrecv (RECV_PIN); resultate van dekode_resultate; ongeldige opstelling () {irrecv.enableIRIn (); // Begin die ontvanger USE_SERIAL.begin (115200); // USE_SERIAL.setDebugOutput (waar); USE_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();
vir (uint8_t t = 4; t> 0; t--) {
USE_SERIAL.printf ("[SETUP] WAIT %d… / n", t); USE_SERIAL.flush (); vertraging (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, wagwoord); } nietige lus () {if (irrecv.decode (& resultate)) {
// Verander hierdie seinwaarde vir die een wat u gekry het
if (results.value == 0x40040D00606D) {USE_SERIAL.println ("pouse sein ontvang"); wifisend (pouse); vertraging (1000);
} as (results.value == 0x400401007273) {
USE_SERIAL.println ("vorige");
wifisend ("prev"); vertraging (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("volgende"); wifisend ("volgende"); vertraging (1000); }
irrecv.resume (); // Ontvang die volgende waarde} vertraging (100); } void wifisend (String data) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] begin … / n"); // konfigureer bediener en URL http.begin ("https:// [gebruiker]: [pas]@[ip]: [poort]/chromecastpause? data =" + data); USE_SERIAL.print ("[HTTP] KRY … / n"); // begin verbinding en stuur HTTP -kop int httpCode = http. GET (); // httpCode sal foutief wees as (httpCode> 0) {// HTTP -kop gestuur is en bedienerreaksie -kop hanteer is USE_SERIAL.printf ("[HTTP] GET … code: %d / n", // lêer gevind op bediener
as (httpCode == HTTP_CODE_OK) {String payload = http.getString (); USE_SERIAL.println (loonvrag); }} anders {USE_SERIAL.printf ("[HTTP] KRY … misluk, fout: %s / n", http.errorToString (httpCode).c_str ()); } http.end (); vertraging (100); }}
Dit is die kode wat ek op my nodemcu gebruik het. U moet die biblioteke installeer.
U kan toets met behulp van 'n seriële monitor en op afstandknoppies druk wat u in die kode bygevoeg het om die antwoord te sien.
In die reël:
http.begin ("https:// [gebruiker]: [slaag]@[ip]: [poort]/chromecastpause? data =" + data);
U moet [gebruiker] na u gebruiker verander, ensovoorts. SONDER hakies. hakies is daar om te wys dat heksvelde moet verander.
Die lyn sal ook nie werk voordat ons ons vloei in nodered opstel nie.
Stap 4: Skep 'n stroom in Nodered
Soos in die begin genoem, gebruik ek hass.io met nodered. As u 'n ander opstelling gebruik, moet u dit anders maak! U kan op die prent sien dat as u op 'n knoppie druk, dit in die ontfoutingsvenster verskyn …
Die veranderingsvragknooppunt kon waarskynlik oorgeslaan gewees het as ek iets anders as die data gekies het = in die vorige stap. Die skakelknooppunt wat ek gebruik, is baie groter as om net te breek, maar dit is net sodat ek meer IR -seine kan byvoeg om Chromecast vir radiostasies ens te gebruik.
As u net 'n pouse wil speel, kan u die stroom in die ander prentjie gebruik.
[{"id": "e6440c30.4a35a", "type": "http in", "z": "869ceb74.0275c8", "name": "", "url": "chromecastpause", "method": "kry", "oplaai": vals, "swaggerDoc": "", "x": 133, "y": 98, "drade":
Ek het die naam userpass en url hiervan verwyder, sodat u dit miskien moet wysig.
Voeg 'n skakelknooppunt by as u wil reageer op meer as net pouse (sien prentjie byvoorbeeld)
In die huisassistentknoop vir pouse gebruik:
naam: play pause chromecastdomain: media_player Service: media_play_pausedata: {"entity_id": "media_player. [your chromecast here]"}
Vir die volgende snit, kopieer die node en wysig die diens na: media_next_track en noem die volgende chromecast
Stap 5: Opsionele Alexa -pouse Chromecast
Opsioneel voeg alexa -opdrag by om chromecast te onderbreek:
Daar is opsies hier.. U kan 'n alexa -node maak wat Chromecast onderbreek word wat Chromecast onderbreek, of u kan 'n pouse -tv maak wat die huidige harmonie -aktiwiteit kontroleer, en afhangende daarvan.
Ek sal dit later hier byvoeg..
Aanbeveel:
555 Timer om sein uit te gee om Atmega328 te onderbreek: 7 stappe
555 Timer om sein uit te gee om Atmega328 te onderbreek: Die hoofdoel van hierdie kring is om energie te bespaar. Ek gaan dus nie oor arduino praat nie, want die bord self het onnodige krag vir die finale produk. Dit is wonderlik vir ontwikkeling. Maar dit is nie baie goed vir finale projekte wat aan die gang is nie
ESP8266 - Tuinbesproeiing met timer en afstandbeheer via internet / ESP8266: 7 stappe (met foto's)
ESP8266 - Tuinbesproeiing met timer en afstandsbediening via internet / ESP8266: ESP8266 - Besproeiing met afstandbeheer en met tydsberekening vir groentetuine, blomtuine en grasperke. Dit maak gebruik van die ESP-8266-kring en 'n hidrouliese / elektriese klep vir besproeiingstoevoer.Voordele: Lae koste (~ US $ 30,00) vinnige toegangsopdragte
Onderbreek laboratorium (aan die gang): 3 stappe
Interrupts Lab (Work in Progress): Die doel van hierdie laboratorium is om 'n Arduino -program te gebruik met behulp van Interrupts. Hierdie laboratorium werk nie korrek nie, as gevolg van koderingsprobleme.- Wat u benodig:- 1 Arduino Uno- 1 broodbord- 1 drukknop- 3 LED's- 220 Ohm weerstanden Jumperdrade
AVR -mikrobeheerder. LED's flitser met timer. Timers onderbreek. Timer CTC -modus: 6 stappe
AVR -mikrobeheerder. LED's flitser met timer. Timers onderbreek. Timer CTC Mode: Hallo almal! Timers is 'n belangrike konsep op die gebied van elektronika. Elke elektroniese komponent werk op 'n tydsbasis. Hierdie tydsbasis help om al die werk gesinchroniseer te hou. Al die mikrobeheerders werk teen 'n voorafbepaalde klokfrekwensie, die
VSA Arduino Onderbreek LED -helderheid: 6 stappe
USA Arduino Interrupt LED -helderheid: In hierdie projek skep ons 'n rooi, wit en blou LED -skerm met 'n potensiometer en 'n drukknop. Dit klink maklik, maar ons sal ook onderbrekings hiervoor gebruik. Dus as die drukknop ingedruk word, stel die waarde van die potensiometer in