İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-23 15:13
Logitech uyumlu bir uzaktan kumandam var ve bir ahududu pi'de Ev asistanını çalıştırıyorum.
Uzaktan kumandamdan chromecast'i duraklatmak istedim, ancak bunu hdmi üzerinden desteklemeyen eski bir televizyonum var. Benim fikrim o zaman sinyallerini yakalamak ve duraklatmak için bir NodeMcu kullanmaktı.
Çalışmasını sağlayamıyorsanız veya sorularınız varsa lütfen aşağıya yorum yapın
Adım 1: Ekipman
Gerekli ekipman:
Nodemcu (https://www.ebay.com/sch/i.html?_from=R40&_trksid=…
Ir alıcısı (eski gibi:
dupont teller
Mikro usb kablosu (power nodemcu)
Logitech Harmony -hub kullanıyorum
Benim yaklaşımım için hass.io Kurulu ve Nodered ile bir Ahududu pi'ye ihtiyacınız var. Burada ev asistanı şeyler ayarlamaya gitmeyeceğim. Ev yardımcısı dışında bir şey kullanıyorsanız, malzemeleri kendiniz uyarlamanız gerekir.
Nodemcu'yu Arduino IDE'de kullanabilmeniz gerekiyor, çünkü buna burada girmeyeceğim
2. Adım: Uzak Sinyal
Bunu yapma şeklim, kullanmadığım bir kumandadan gelen bir sinyali harmoni kumandasına kopyalamaktı.
Birinci katımdaki ekipmanımı etkilemediği için panasonic tv modeli TXL32C3E için bir uzaktan kumanda kullandım. Bu, üst katta sahip olduğum bir televizyon.
Harmoni kullanmıyorsanız bunu atlayabilirsiniz.
Bu yüzden sinyali bulmak için bu taslağı kullandım:
/* * IRremoteESP8266: IRrecvDumpV2 - IRrecv ile IR kodlarının dökümü * RECV_PIN girişine bir IR dedektörü/demodülatörü bağlanmalıdır. * * Telif Hakkı 2009 Ken Shirriff, https://arcfn.com * Telif Hakkı 2017 David Conran * * Örnek devre şeması: * https://arcfn.com * * Değişiklikler: * Sürüm 0.3 Kasım 2017 * - Klima Desteği bazı protokoller için kod çözme. * Sürüm 0.2 Nisan 2017 * - Daha hızlı yakalamaya başlayabilmemiz için verilerin bir kopyasından kodunu çözün, böylece * yanlış yakalama olasılığını azaltın. * Ken Shirriff'in IrsendDemo Sürümü 0.1 Temmuz 2009, */
#ifndef BİRİM_TEST
#include #endif #include #include #include #if DECODE_AC #include #include #include #include #include #endif // DECODE_AC
// ==================== AYARLANABİLİR PARAMETRELERİN başlangıcı ====================
// GPIO pin 14'e bir IR dedektörü/demodülatör bağlanır // ör. NodeMCU kartındaki D5. #define RECV_PIN 14
// Seri bağlantı baud hızı.
// yani, bu baud hızında PC'ye durum mesajı gönderilecektir. // Mesajları kaçıracağınız ve // başka sorunlara neden olacağından 9600 gibi yavaş hızlardan kaçınmaya çalışın. 115200 (veya daha hızlı) önerilir. // NOT: Seri Monitörünüzü aynı hıza ayarladığınızdan emin olun. #define BAUD_RATE 115200
// Bu program özel amaçlı bir yakalama/kod çözücü olduğundan, daha büyük bir
// Normal tampondan daha fazla, böylece Klima uzaktan kumanda kodlarını işleyebiliriz. #define CAPTURE_BUFFER_SIZE 1024
// ZAMAN AŞIMI, No. düşünmeden önce mili-saniye artık veri yok
// mesaj sonlandırıldı. // Bu parametre ilginç bir değiş tokuştur. Zaman aşımı ne kadar uzun olursa, yakalayabileceği // karmaşık bir mesaj olur. Örneğin. Bazı cihaz protokolleri, Klima uzaktan kumandaları gibi hızlı bir şekilde arka arkaya // birden fazla mesaj paketi gönderir. // Klima protokolleri genellikle // paketler arasında önemli bir boşluğa (20-40+ms) sahiptir. // Büyük bir zaman aşımı değerinin dezavantajı, çok daha az karmaşık protokollerin olmasıdır // uzaktan kumandanın düğmesi basılı tutulduğunda birden fazla mesaj gönderir. // Aralarındaki boşluk da genellikle 20+ms civarındadır. Bu, tek bir // yakalamada 2-3+ mesajı yakaladığından, ham verilerin gerekenden 2-3+ // kat daha büyük olmasına neden olabilir. Düşük bir zaman aşımı değeri ayarlamak bunu çözebilir. // Bu nedenle, kullanım özel durumunuz için en iyi TIMEOUT değerini seçmek // oldukça nüanslıdır. İyi şanslar ve mutlu avlar. // NOT: MAX_TIMEOUT_MS'yi aşmayın. Tipik olarak 130ms. #if DECODE_AC #define TIMEOUT 50U // Bazı A/C ünitelerinin protokollerinde ~40ms boşluk var. // Örneğin. Kelvinator // Bu kadar büyük bir değer bazı protokollerin tekrarlarını yutabilir #else // DECODE_AC #define TIMEOUT 15U // Birçok tekrarı yutmazken çoğu mesaja uyar. #endif // DECODE_AC // Alternatifler: // #define TIMEOUT 90U // XMP-1 ve bazı klima // birimleri gibi büyük boşlukları olan mesajlara uyar, ancak rawData çıktısında tekrarlanan mesajları yanlışlıkla yutabilir //. // #define TIMEOUT MAX_TIMEOUT_MS // Bu, şu anda izin verilen // maksimum değerimize ayarlayacaktır. Bu kadar yüksek değerler problemlidir // çünkü bu kabaca tipik bir sınırdır // çoğu mesajın tekrarlandığı yerdir. // Örneğin. Bir mesajın kodunu çözmeyi durduracak ve // onu tam olarak // bir sonraki mesajın iletileceği zamanda // seriye göndermeye başlayacak ve onu kaçırabilir.
// Gerçekten önemsediğimiz en küçük boyutlu "UNKNOWN" mesaj paketlerini ayarlayın.
// Bu değer, IR arka planının yanlış pozitif algılama oranını azaltmaya yardımcı olur // gerçek mesajlar olarak gürültü. Arka plan IR gürültüsünün algılanma şansı // TIMEOUT değerinin uzunluğu ile artar. (Yukarıya bakın) // Bu mesajı çok büyük ayarlamanın dezavantajı, bu kütüphanenin henüz kodunu çözmediği protokoller için bazı geçerli // kısa mesajları kaçırabilmenizdir. // // Hiçbir şeyin mesaj göndermemesi gerektiğinde // çok sayıda rastgele kısa UNKNOWN mesajı alırsanız daha yükseğe ayarlayın. // Kurulumunuzun çalıştığından eminseniz, ancak cihazınızdan gelen mesajları görmüyorsa // daha düşük ayarlayın. (ör. Diğer IR uzaktan kumandalar çalışır.) // NOT: BİLİNMEYEN algılamayı etkin bir şekilde kapatmak için bu değeri çok yükseğe ayarlayın. #define MIN_UNKNOWN_SIZE 12 // ==================== AYARLANABİLİR PARAMETRELER sonu ====================
// Daha eksiksiz yakalama kapsamı için arabelleği kaydetme özelliğini açın.
IRrecv irrecv(RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, true);
decode_results sonuçları; // Sonuçların saklanacağı bir yer
// Yapabiliyorsak, bir A/C mesajının insan tarafından okunabilir durumunu görüntüleyin.
void dumpACInfo(decode_results *results) { Dize açıklaması = ""; #if DECODE_DAIKIN if (sonuçlar->decode_type == DAIKIN) { IRDaikinESP ac(0); ac.setRaw(sonuçlar->durum); açıklama = ac.toString(); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (sonuçlar->decode_type == FUJITSU_AC) { IRFujitsuAC ac(0); ac.setRaw(sonuçlar->durum, sonuçlar->bitler / 8); açıklama = ac.toString(); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (sonuçlar->decode_type == KELVINATOR) { IRKelvinatorAC ac(0); ac.setRaw(sonuçlar->durum); açıklama = ac.toString(); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (sonuçlar->decode_type == TOSHIBA_AC) { IRToshibaAC ac(0); ac.setRaw(sonuçlar->durum); açıklama = ac.toString(); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (sonuçlar->decode_type == MIDEA) { IRMideaAC ac(0); ac.setRaw(sonuçlar->değer); // Midea durum yerine değeri kullanır. açıklama = ac.toString(); } #endif // DECODE_MIDEA // Mesajın insan tarafından okunabilir bir açıklaması varsa, onu görüntüleyin. if (açıklama != "") Serial.println("Mesg Açıklama: " + açıklama); }
// Kod bölümü başlangıçta yalnızca bir kez çalıştırılır.
geçersiz kurulum() { Serial.begin(BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); gecikme(500); // Seri bağlantının kurulması için biraz bekleyin.
#if DECODE_HASH
// Minimum açık veya kapalı darbeli mesajları yoksay. irrecv.setUnknownThreshold(MIN_UNKNOWN_SIZE); #endif // DECODE_HASH irrecv.enableIRIn(); // Alıcıyı başlat }
// Kodun yinelenen bölümü
// void loop() { // IR kodunun alınıp alınmadığını kontrol edin. if (irrecv.decode(&results)) { // Kaba bir zaman damgası görüntüleyin. uint32_t şimdi = millis(); Serial.printf("Zaman Damgası: %06u.%03u\n", şimdi / 1000, şimdi % 1000); if (results.overflow) Serial.printf("UYARI: IR kodu arabellek için çok büyük (>= %d). " "Bu sonuç çözülene kadar bu sonuca güvenilmemelidir." "CAPTURE_BUFFER_SIZE öğesini düzenleyin ve artırın.\n ", CAPTURE_BUFFER_SIZE); // Bulduğumuz şeyin temel çıktısını göster. Serial.print(resultToHumanReadableBasic(&results)); dumpACInfo(&sonuçlar); // Varsa, ekstra A/C bilgilerini görüntüleyin. teslim olmak(); // Metin çıktısının yazdırılması biraz zaman alabileceğinden WDT'yi besleyin.
// İletinin yakalandığı kitaplık sürümünü görüntüleyin.
Serial.print("Kütüphane: v"); Serial.println(_IRREMOTEESP8266_VERSION_); Seri.println();
// Sonucun RAW zamanlama bilgisi çıktısı.
Serial.println(resultToTimingInfo(&results)); teslim olmak(); // WDT'yi besle (tekrar)
// Sonuçları kaynak kod olarak çıktıla
Serial.println(resultToSourceCode(&results)); Seri.println(""); // Girdiler arasında boş satır verim(); // WDT'yi besleyin (tekrar) } }
Bu taslak yüklendiğinde ve seri monitör açıkken çalıştırıldığında, düğmeye basma kodunu verecektir (resme bakın)
Daha sonra kullanmak üzere kullanmak istediğiniz kodları yazın. Kullanmak istediğim düğmeler için ne aldığımı not etmek için excel kullandım (resme bakın)
Netflix etkinliğimdeki düğmeleri panasonic uzaktan kumandadan duraklatma sinyali göndermek için düzenledim.. (resme bakın)
Adım 3: Nodered'e Gönderilecek Kodu Yazma
#ifndef UNIT_TEST#include #endif #include
#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek
const char* ssid = ""; // SSID'yi buraya girinconst char* password = ""; //Şifreyi buraya girin const char *host = ""; //IP adresi #define USE_SERIAL Seri ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv geri dönüş(RECV_PIN); decode_results sonuçları; geçersiz kurulum() { irrecv.enableIRIn(); // Alıcıyı başlat USE_SERIAL.begin(115200); // USE_SERIAL.setDebugOutput(true); USE_SERIAL.println(); USE_SERIAL.println(); USE_SERIAL.println();
for(uint8_t t = 4; t > 0; t--) {
USE_SERIAL.printf("[KURULUM] BEKLEYİN %d…\n", t); USE_SERIAL.flush(); gecikme(1000); } WiFi.mode(WIFI_STA); WiFiMulti.addAP(ssid, şifre); } void loop() { if (irrecv.decode(&sonuçlar)) {
// Aldığınız sinyal için bu sinyal değerini değiştirin
if (results.value == 0x40040D00606D){ USE_SERIAL.println("duraklama sinyali alındı"); wifisend(duraklatma); gecikme(1000);
} if (results.value == 0x400401007273){
USE_SERIAL.println("önceki");
wifisend("önceki"); gecikme(1000); } if (results.value == 0x40040100F2F3){ USE_SERIAL.println("sonraki"); wifisend("sonraki"); gecikme(1000); }
irrecv.özgeçmiş(); // Bir sonraki değeri al } delay(100); } void wifisend(Dize verisi){ if((WiFiMulti.run() == WL_CONNECTED)) { HTTPClient http; USE_SERIAL.print("[HTTP] başla…\n"); // traged sunucuyu ve url'yi yapılandırın http.begin("https://[user]:[pass]@[ip]:[port]/chromecastpause?data=" + data); USE_SERIAL.print("[HTTP] GET…\n"); // bağlantıyı başlat ve HTTP başlığını gönder int httpCode = http. GET(); // httpCode hata durumunda negatif olur if(httpCode > 0) { // HTTP başlığı gönderildi ve Sunucu yanıtı başlığı işlendi USE_SERIAL.printf("[HTTP] GET… code: %d\n", // dosya sunucuda bulundu
if(httpCode == HTTP_CODE_OK) { Dize yükü = http.getString(); USE_SERIAL.println(yük); } } else { USE_SERIAL.printf("[HTTP] GET… başarısız oldu, hata: %s\n", http.errorToString(httpCode).c_str()); } http.end(); gecikme(100); } }
Bu benim nodemcu'mda kullandığım kod. Bu kütüphanelerin kurulu olması gerekir.
Seri monitör kullanarak test edebilir ve kodu eklediğiniz kumanda butonlarına basarak yanıtı görebilirsiniz..
Çizgide:
http.begin("https://[kullanıcı]:[geçiş]@[ip]:[port]/chromecastpause?data=" + veri);
[kullanıcı]'yı kullanıcınıza ve benzeri şekilde değiştirmeniz gerekir. parantez OLMADAN. parantezler, değiştirilecek cadı alanlarını göstermek için var.
Bu satır, akışımızı düğümlü olarak ayarlayana kadar da çalışmayacaktır.
Adım 4: Nodered'de Akış Oluşturma
Başlangıçta belirtildiği gibi, hass.io'yu nodred ile kullanıyorum. Farklı bir kurulum çalıştırırsanız, bunu farklı yapmanız gerekecektir! Bir düğmeye basıldığında hata ayıklama penceresinde görüntülendiğini resimde görebilirsiniz…
Önceki adımda data='dan farklı bir şey seçmiş olsaydım, değişiklik yükü düğümü muhtemelen atlanmış olabilirdi. Kullandığım anahtar düğümü sadece duraklatmaktan çok daha büyük ama bu sadece radyo istasyonları vb. için chromecast kullanmak üzere daha fazla ir sinyali ekleyebilmem için.
Sadece duraklatmak için diğer resimdeki akışı kullanabilirsiniz.
[{"id":"e6440c30.4a35a", "type":"http in", "z":"869ceb74.0275c8", "name":"", "url":"chromecastpause", "method": "get", "upload":false, "swaggerDoc":"", "x":133, "y":98, "wires":
Kullanıcı şifresini ve url'yi bundan kaldırdım, bu yüzden onu düzenlemeniz gerekebilir.
duraklatmaktan daha fazlasına tepki vermek istiyorsanız bir anahtar düğümü ekleyin (örneğin resme bakın)
Duraklatma kullanımı için ev yardımcısı düğümünde:
ad: oynat duraklat chromecastdomain: media_playerService: media_play_pausedata: { "entity_id": "media_player.[chromecast'iniz burada]" }
sonraki parça için sadece o düğümü kopyalayın ve hizmeti şuraya düzenleyin: media_next_track ve ad: sonraki chromecast
Adım 5: İsteğe Bağlı Alexa Chromecast'i Duraklatın
Chromecast'i duraklatmak için isteğe bağlı alexa komutu ekleyin:
Burada seçenekler var.. chromecast'i duraklatan duraklatma chromecast adlı bir alexa nnode yapabilirsiniz, veya mevcut armoni etkinliğini kontrol eden ve buna bağlı olarak duraklatılan bir duraklama tv yapabilirsiniz.
Bunu daha sonra buraya ekleyeceğim..
Önerilen:
Bir TV'yi Kontrol Etme ve Raspberry Pi'yi Aynı Uzaktan Kumandayla Bağlama: 4 Adım
Bir TV ve Bağlı Raspberry Pi'yi Aynı Uzaktan Kumanda ile Kontrol Etme: Bir Raspberry Pi'yi Kızılötesi uzaktan kumanda ile kontrol etmek için LIRC kullanabiliyorduk. Bu, LIRC'nin çalışmasını sağlamak çok daha zor hale geldiğinde Kernel 4.19.X'e kadar çalışıyordu. Bu projede TV'ye bağlı bir Raspberry Pi 3 B+ var ve biz
Herhangi Bir Uzaktan Kumandalı Arabayı Bluetooth Uygulaması Kontrollü Uzaktan Kumandalı Arabaya Dönüştürme: 9 Adım
Herhangi Bir R/C Arabayı Bluetooth App Control R/C Arabasına Dönüştürme: Bu proje, sıradan bir uzaktan kumandalı arabayı Wombatics SAM01 robotik kartı, Blynk App ve MIT App Inventor ile bir Bluetooth (BLE) kontrol arabasına dönüştürme adımlarını gösterir. LED farlar ve LED farlar gibi birçok özelliğe sahip birçok düşük maliyetli RC araba
IRduino: Arduino Uzaktan Kumanda - Kayıp Bir Uzaktan Kumandayı Taklit Etme: 6 Adım
IRduino: Arduino Uzaktan Kumanda - Kayıp Bir Uzaktan Kumandayı Taklit Edin: TV veya DVD oynatıcınızın uzaktan kumandasını kaybettiyseniz, cihazın üzerindeki düğmeleri yürümek, bulmak ve kullanmak zorunda olmanın ne kadar sinir bozucu olduğunu bilirsiniz. Bazen bu düğmeler, uzaktan kumandayla aynı işlevi bile sunmaz.
Dört Kanallı RC Oyuncak Uzaktan Kumandaya Dönüştürülen Sıradan Uzaktan Kumanda Kiti: 4 Adım
Dört Kanallı RC Oyuncak Uzaktan Kumandaya Dönüştürülen Sıradan Uzaktan Kumanda Kiti: 如何将通用遥控器套件转换为玩具模型中使用的四通道遥控器。遥控器套件非常便宜。它采用2262和2272芯片和433个模块构建。改造方法非常简单。只需准备一些瓦楞纸板,然后按照视频教程完成这个电子项目并为您服务。玩具车船提供远程无线控制。
Uzaktan Kumandayla Her Şey Ucuza!: 8 Adım
Uzaktan Kumandalı Her Şey… Ucuza!: Kullanılmış uzaktan kumandalı (RC) arabaları (tekneler, hava taşıtları, uçaklar ve dörtlü helikopterler de!) elde etmek genellikle kolaydır. Tamamen ücretsiz değilse, en azından bir tane ucuza alabilirsiniz. Kendinize bir RC araba ve kontrolörü bulun. Pek çok çocukta en az bir toz toplama vardır