Mục lục:

Tạm dừng Chromcast bằng điều khiển từ xa: 5 bước
Tạm dừng Chromcast bằng điều khiển từ xa: 5 bước

Video: Tạm dừng Chromcast bằng điều khiển từ xa: 5 bước

Video: Tạm dừng Chromcast bằng điều khiển từ xa: 5 bước
Video: Hướng dẫn cài đặt và sử dụng chi tiết Google Chromecast 4K 2024, Tháng mười một
Anonim
Image
Image
Thiết bị
Thiết bị

Tôi có một điều khiển từ xa hòa âm của Logitech và chạy trợ lý Home trên một chiếc mâm xôi pi.

Tôi muốn có thể tạm dừng chromecast từ điều khiển từ xa của mình, nhưng tôi có một chiếc TV cũ không hỗ trợ điều này thông qua hdmi. Ý tưởng của tôi sau đó là sử dụng NodeMcu để bắt tín hiệu ir và tạm dừng.

Nếu bạn không thể làm cho nó hoạt động hoặc có thắc mắc, vui lòng bình luận bên dưới

Bước 1: Trang bị

Thiết bị
Thiết bị
Thiết bị
Thiết bị

Trang thiết bị cần thiết:

Nodemcu (https://www.ebay.com/sch/i.html?_from=R40&_trksid=…

Người nhận Ir (ví dụ:

dây dupont

Cáp micro usb (nút nguồn)

Tôi sử dụng Logitech Harmony -hub

Đối với cách tiếp cận của tôi, Bạn cần một Raspberry pi với hass.io Installed and Nodered, tôi sẽ không đi vào thiết lập nội dung homeassistant ở đây. Nếu bạn sử dụng thứ gì đó không phải là homeassistant, bạn cần tự điều chỉnh nội dung.

Bạn cần có thể sử dụng Nodemcu trên Arduino IDE vì tôi sẽ không đi sâu vào đó ở đây

Bước 2: Tín hiệu từ xa

Tín hiệu từ xa
Tín hiệu từ xa
Tín hiệu từ xa
Tín hiệu từ xa
Tín hiệu từ xa
Tín hiệu từ xa
Tín hiệu từ xa
Tín hiệu từ xa

Cách tôi đã làm là sao chép tín hiệu từ một điều khiển từ xa tôi không sử dụng vào điều khiển từ xa hòa âm.

Tôi đã sử dụng một điều khiển từ xa cho TV panasonic model TXL32C3E vì điều đó không ảnh hưởng đến thiết bị của tôi ở tầng đầu tiên của tôi. Đó là một chiếc TV tôi có trên lầu.

Nếu bạn không sử dụng hòa âm, bạn có thể bỏ qua điều này.

Vì vậy, để tìm tín hiệu, tôi đã sử dụng đường dẫn này:

/ * * IRremoteESP8266: IRrecvDumpV2 - kết xuất chi tiết của mã IR với IRrecv * Một bộ tách sóng / giải điều chế IR phải được kết nối với đầu vào RECV_PIN. * * Bản quyền 2009 Ken Shirriff, https://arcfn.com * Bản quyền 2017 David Conran * * Sơ đồ mạch ví dụ: * https://arcfn.com * * Thay đổi: * Phiên bản ngày 0,3 tháng 11 năm 2017 * - Hỗ trợ A / C giải mã cho một số protcol. * Phiên bản 0.2 tháng 4 năm 2017 * - Giải mã từ bản sao dữ liệu để chúng tôi có thể bắt đầu chụp nhanh hơn, do đó * giảm khả năng lấy nhầm. * Dựa trên phiên bản IrsendDemo của Ken Shirriff 0.1 tháng 7 năm 2009, * /

#ifndef UNIT_TEST

#include #endif #include #include #include #if DECODE_AC #include #include #include #include #include #endif // DECODE_AC

// ==================== bắt đầu của THAM SỐ BẢNG ====================

// Bộ tách sóng / giải điều chế IR được kết nối với chân GPIO 14 // v.d. D5 trên bảng NodeMCU. #define RECV_PIN 14

// Tốc độ truyền của kết nối nối tiếp.

// tức là thông báo trạng thái sẽ được gửi đến PC ở tốc độ truyền này. // Cố gắng tránh tốc độ chậm như 9600, vì bạn sẽ bỏ lỡ thư và // gây ra các vấn đề khác. 115200 (hoặc nhanh hơn) được khuyến nghị. // LƯU Ý: Đảm bảo rằng bạn đặt Serial Monitor của mình ở cùng một tốc độ. #define BAUD_RATE 115200

// Vì chương trình này là một trình thu / giải mã mục đích đặc biệt, chúng ta hãy sử dụng

// so với bộ đệm bình thường để chúng ta có thể xử lý mã điều hòa từ xa. #define CAPTURE_BUFFER_SIZE 1024

// TIMEOUT là Nr. trong số mili-giây của không-nhiều-dữ liệu trước khi chúng tôi xem xét một

// thông báo đã kết thúc. // Tham số này là một sự đánh đổi thú vị. Thời gian chờ càng dài, nó có thể nắm bắt một thông điệp // phức tạp hơn. ví dụ. Một số giao thức thiết bị sẽ gửi // nhiều gói tin nhắn liên tiếp nhanh chóng, chẳng hạn như điều hòa từ xa. // Các giao thức Air Coniditioner thường có khoảng cách đáng kể (20-40 + ms) giữa // các gói tin. // Nhược điểm của giá trị thời gian chờ lớn là nhiều giao thức kém phức tạp hơn // gửi nhiều thông báo khi nhấn giữ nút của điều khiển từ xa. Khoảng cách giữa // chúng cũng thường vào khoảng 20 + ms. Điều này có thể dẫn đến dữ liệu thô lớn hơn 2-3 lần + // lần so với mức cần thiết vì nó đã ghi lại 2-3 + thông báo trong một lần chụp // duy nhất. Đặt giá trị thời gian chờ thấp có thể giải quyết vấn đề này. // Vì vậy, việc chọn giá trị TIMEOUT tốt nhất cho trường hợp sử dụng cụ thể của bạn // khá rõ ràng. Chúc may mắn và hạnh phúc săn bắn. // LƯU Ý: Không vượt quá MAX_TIMEOUT_MS. Thông thường là 130ms. #if DECODE_AC #define TIMEOUT 50U // Một số đơn vị A / C có khoảng trống trong giao thức của chúng là ~ 40ms. // ví dụ. Kelvinator // Một giá trị lớn này có thể nuốt các lần lặp lại của một số giao thức #else // DECODE_AC #define TIMEOUT 15U // Phù hợp với hầu hết các thông báo, trong khi không nuốt nhiều lần lặp lại. #endif // DECODE_AC // Giải pháp thay thế: // #define TIMEOUT 90U // Phù hợp với các thư có khoảng trống lớn như XMP-1 và một số đơn vị aircon //, nhưng có thể vô tình nuốt các thư lặp lại // trong đầu ra rawData . // #define TIMEOUT MAX_TIMEOUT_MS // Điều này sẽ đặt nó thành // tối đa hiện được phép của chúng tôi. Giá trị cao này là có vấn đề // vì nó gần như là ranh giới điển hình // nơi hầu hết các thông báo lặp lại. // ví dụ. Nó sẽ ngừng giải mã một tin nhắn và // bắt đầu gửi nó đến nối tiếp tại một thời điểm chính xác // thời điểm mà tin nhắn tiếp theo có khả năng // được truyền đi và có thể bỏ lỡ nó.

// Đặt gói tin "UNKNOWN" có kích thước nhỏ nhất mà chúng ta thực sự quan tâm.

// Giá trị này giúp giảm tỷ lệ phát hiện dương tính giả của nền IR // nhiễu như các thông điệp thực. Cơ hội phát hiện nhiễu IR nền // khi một thông báo tăng lên theo độ dài của giá trị TIMEOUT. (Xem ở trên) // Nhược điểm của việc đặt thông báo này quá lớn là bạn có thể bỏ lỡ một số thông báo ngắn // hợp lệ cho các giao thức mà thư viện này chưa giải mã. // // Đặt cao hơn nếu bạn nhận được nhiều tin nhắn UNKNOWN ngắn ngẫu nhiên khi không có gì // nên gửi tin nhắn. // Đặt thấp hơn nếu bạn chắc chắn rằng thiết lập của mình đang hoạt động, nhưng nó không thấy thông báo // từ thiết bị của bạn. (ví dụ: Các điều khiển từ xa IR khác hoạt động.) // LƯU Ý: Đặt giá trị này rất cao để tắt hiệu quả tính năng phát hiện UNKNOWN. #define MIN_UNKNOWN_SIZE 12 // ==================== cuối THAM SỐ BẢNG TÍNH ====================

// Sử dụng bật tính năng bộ đệm lưu để có phạm vi chụp đầy đủ hơn.

IRrecv không thể thay đổi (RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, true);

giải mã kết quả; // Nơi nào đó để lưu trữ kết quả

// Hiển thị trạng thái có thể đọc được của con người của một thông báo A / C nếu chúng ta có thể.

void dumpACInfo (decode_results * results) {String description = ""; #if DECODE_DAIKIN if (results-> decode_type == DAIKIN) {IRDaikinESP ac (0); ac.setRaw (kết quả-> trạng thái); mô tả = ac.toString (); } #endif // DECODE_DAIKIN #if DECODE_FUJITSU_AC if (results-> decode_type == FUJITSU_AC) {IRFujitsuAC ac (0); ac.setRaw (kết quả-> trạng thái, kết quả-> bit / 8); mô tả = ac.toString (); } #endif // DECODE_FUJITSU_AC #if DECODE_KELVINATOR if (results-> decode_type == KELVINATOR) {IRKelvinatorAC ac (0); ac.setRaw (kết quả-> trạng thái); mô tả = ac.toString (); } #endif // DECODE_KELVINATOR #if DECODE_TOSHIBA_AC if (results-> decode_type == TOSHIBA_AC) {IRToshibaAC ac (0); ac.setRaw (kết quả-> trạng thái); mô tả = ac.toString (); } #endif // DECODE_TOSHIBA_AC #if DECODE_MIDEA if (results-> decode_type == MIDEA) {IRMideaAC ac (0); ac.setRaw (kết quả-> giá trị); // Midea sử dụng giá trị thay vì trạng thái. mô tả = ac.toString (); } #endif // DECODE_MIDEA // Nếu chúng tôi có mô tả thông điệp mà con người có thể đọc được, hãy hiển thị thông báo đó. if (description! = "") Serial.println ("Mô tả Mesg.:" + description); }

// Phần mã chỉ chạy một lần khi khởi động.

void setup () {Serial.begin (BAUD_RATE, SERIAL_8N1, SERIAL_TX_ONLY); chậm trễ (500); // Chờ một chút để kết nối nối tiếp được thiết lập.

#if DECODE_HASH

// Bỏ qua các thông báo có xung bật hoặc tắt nhỏ hơn tối thiểu. Uncv.setUnknownThreshold (MIN_UNKNOWN_SIZE); #endif // DECODE_HASH’tcv.enableIRIn (); // Khởi động bộ thu}

// Phần lặp lại của mã

// void loop () {// Kiểm tra xem mã IR đã được nhận chưa. if (Uncv.decode (& results))) {// Hiển thị dấu thời gian thô. uint32_t now = millis (); Serial.printf ("Dấu thời gian:% 06u.% 03u / n", bây giờ / 1000, bây giờ là% 1000); if (results.overflow) Serial.printf ("CẢNH BÁO: Mã IR quá lớn đối với bộ đệm (> =% d)". "Không nên tin cậy kết quả này cho đến khi điều này được giải quyết." "Chỉnh sửa và tăng CAPTURE_BUFFER_SIZE. / n ", CAPTURE_BUFFER_SIZE); // Hiển thị kết quả đầu ra cơ bản của những gì chúng tôi tìm thấy. Serial.print (resultToHumanReadableBasic (& kết quả)); dumpACInfo (& kết quả); // Hiển thị bất kỳ thông tin A / C bổ sung nào nếu chúng tôi có. năng suất (); // Nạp WDT vì đầu ra văn bản có thể mất một lúc để in.

// Hiển thị phiên bản thư viện mà thư đã được ghi lại.

Serial.print ("Thư viện: v"); Serial.println (_IRREMOTEESP8266_VERSION_); Serial.println ();

// Xuất thông tin định thời RAW của kết quả.

Serial.println (resultToTimingInfo (& kết quả)); năng suất (); // Nạp WDT (lại)

// Xuất kết quả dưới dạng mã nguồn

Serial.println (resultToSourceCode (& kết quả)); Serial.println (""); // Dòng trống giữa các mục nhập output (); // Nạp WDT (lại)}}

Khi cài đặt này được tải lên và chạy với màn hình nối tiếp mở, nó sẽ xuất ra mã để nhấn nút (xem hình)

Viết ra các mã bạn muốn sử dụng để sử dụng sau này. Tôi đã sử dụng excel để ghi lại những gì tôi nhận được cho các nút tôi muốn sử dụng (xem hình ảnh)

Tôi đã chỉnh sửa các nút trong hoạt động Netflix của mình để Gửi tín hiệu tạm dừng từ điều khiển từ xa panasonic.. (xem hình ảnh)

Bước 3: Viết mã để gửi đến đã được đánh số

Viết mã để gửi đến người đã đánh dấu
Viết mã để gửi đến người đã đánh dấu

#ifndef UNIT_TEST # bao gồm #endif #include

#bao gồm

#bao gồm

#bao gồm

#bao gồm

#bao gồm

const char * ssid = ""; // Nhập SSID hereconst char * password = ""; // Nhập Mật khẩu vào đây const char * host = ""; // Ip addresse #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; uint16_t RECV_PIN = 14; IRrecv không thể thay đổi (RECV_PIN); giải mã kết quả; void setup () {không thể thay đổi.enableIRIn (); // Khởi động bộ thu USE_SERIAL.begin (115200); // USE_SERIAL.setDebugOutput (true); SỬ DỤNG_SERIAL.println (); USE_SERIAL.println (); USE_SERIAL.println ();

for (uint8_t t = 4; t> 0; t--) {

USE_SERIAL.printf ("[CÀI ĐẶT] CHỜ% d… / n", t); USE_SERIAL.flush (); chậm trễ (1000); } WiFi.mode (WIFI_STA); WiFiMulti.addAP (ssid, mật khẩu); } void loop () {if (allowcv.decode (& results)) {

// Thay đổi giá trị tín hiệu này cho giá trị bạn nhận được

if (results.value == 0x40040D00606D) {USE_SERIAL.println ("tạm dừng nhận tín hiệu"); wifisend (tạm dừng); chậm trễ (1000);

} if (results.value == 0x400401007273) {

USE_SERIAL.println ("trước đó");

wifisend ("trước"); chậm trễ (1000); } if (results.value == 0x40040100F2F3) {USE_SERIAL.println ("tiếp theo"); wifisend ("tiếp theo"); chậm trễ (1000); }

Uncv.resume (); // Nhận giá trị tiếp theo} delay (100); } void wifisend (Chuỗi dữ liệu) {if ((WiFiMulti.run () == WL_CONNECTED)) {HTTPClient http; USE_SERIAL.print ("[HTTP] begin… / n"); // cấu hình máy chủ bi kịch và url http.begin ("https:// [user]: [pass] @ [ip]: [port] / chromecastpause? data =" + data); USE_SERIAL.print ("[HTTP] NHẬN… / n"); // bắt đầu kết nối và gửi tiêu đề HTTP int httpCode = http. GET (); // Mã httpCode sẽ bị âm nếu (httpCode> 0) {// Tiêu đề HTTP đã được gửi và tiêu đề phản hồi của Máy chủ đã được xử lý USE_SERIAL.printf ("[HTTP] GET… code:% d / n", // tệp được tìm thấy tại máy chủ

if (httpCode == HTTP_CODE_OK) {Chuỗi payload = http.getString (); USE_SERIAL.println (tải trọng); }} else {USE_SERIAL.printf ("[HTTP] GET… không thành công, lỗi:% s / n", http.errorToString (httpCode).c_str ()); } http.end (); chậm trễ (100); }}

Đây là mã tôi đã sử dụng trên nút của mình. Bạn sẽ cần phải cài đặt các thư viện đó.

Bạn có thể kiểm tra bằng cách sử dụng màn hình nối tiếp và nhấn các nút từ xa bạn đã thêm trong mã để xem phản hồi..

Trong dòng:

http.begin ("https:// [user]: [pass] @ [ip]: [port] / chromecastpause? data =" + data);

Bạn cần thay đổi [người dùng] thành người dùng của mình, v.v. KHÔNG có dấu ngoặc. dấu ngoặc ở đó để hiển thị các lĩnh vực phù thủy để thay đổi.

Dòng đó cũng sẽ không hoạt động cho đến khi chúng tôi thiết lập luồng của mình trong gật đầu.

Bước 4: Tạo Luồng được đánh số thứ tự

Tạo Luồng theo Nodered
Tạo Luồng theo Nodered
Tạo Luồng theo Nodered
Tạo Luồng theo Nodered
Tạo Luồng theo Nodered
Tạo Luồng theo Nodered
Tạo Luồng theo Nodered
Tạo Luồng theo Nodered

Như đã đề cập ở phần đầu, tôi sử dụng hass.io với gật đầu. Nếu bạn chạy một thiết lập khác, bạn sẽ cần làm cho điều này khác đi! Bạn có thể thấy trong hình ảnh rằng khi một nút được nhấn, nó sẽ hiển thị trong cửa sổ gỡ lỗi…

Nút tải trọng thay đổi có thể đã bị bỏ qua nếu tôi đã chọn thứ gì đó khác với data = trong bước trước. Nút chuyển đổi mà tôi sử dụng lớn hơn rất nhiều chỉ cần tạm dừng nhưng đó chỉ là vì vậy tôi có thể thêm nhiều tín hiệu ir hơn để sử dụng chromecast cho các đài phát thanh, v.v.

Để chỉ phát tạm dừng, bạn có thể sử dụng luồng trong hình khác.

[{"id": "e6440c30.4a35a", "type": "http in", "z": "869ceb74.0275c8", "name": "", "url": "chromecastpause", "method": "get", "upload": false, "swaggerDoc": "", "x": 133, "y": 98, "wire":

Tôi đã xóa tên người dùng và url khỏi cái này nên bạn có thể cần phải chỉnh sửa nó.

thêm một nút chuyển đổi nếu bạn muốn phản ứng với nhiều hơn là chỉ tạm dừng (ví dụ: xem hình ảnh)

Trong nút trợ lý chính để tạm dừng sử dụng:

name: play pause chromecastdomain: media_playerService: media_play_pausedata: {"entity_id": "media_player. [your chromecast here]"}

cho bản nhạc tiếp theo, chỉ cần sao chép nút đó và chỉnh sửa dịch vụ thành: media_next_track và đặt tên thành: chromecast tiếp theo

Bước 5: Tùy chọn Alexa Tạm dừng Chromecast

Tùy chọn thêm lệnh alexa để tạm dừng chromecast:

Có các tùy chọn ở đây.. Bạn có thể tạo một alexa nnode gọi là tạm dừng chromecast để tạm dừng chromecast, hoặc bạn có thể tạo một tv tạm dừng để kiểm tra hoạt động hòa âm hiện tại và tạm dừng tùy thuộc vào đó.

Tôi sẽ thêm cái này vào đây sau..

Đề xuất: