Board logo

標題: (29# 2021-08-06 更新 Ver2.2)ESP8266 IR Server [打印本頁]

作者: C_Law    時間: 2019-6-8 22:00     標題: (29# 2021-08-06 更新 Ver2.2)ESP8266 IR Server

本帖最後由 C_Law 於 2022-9-11 17:40 編輯

更新:
34#
2022-09-11
示範寫個 Html 去控制 ESP8266 發射 IR 訊號。

29#
Version 2.2
2021-08-06
這版本有以下改動:
1. 新增 myCmdType = 990,ReDirect,將指令轉發到另一個 IR Server。

28#
Version 2.1
2021-05-14
這版本有以下改動:
1. 將變數名稱 myTxType 改名為 myCmdType,事關每個指令不局限用於發射遙控訊號,改名比較合理。
2. 重寫 TxOriginal,以 ReadRawLine() 讀取原裝 irplus 的 raw 格式指令。
3. 新增 myCmdType = 1,自製發射 Raw 格式訊號的指令。
4. 新增 myCmdType = 999,開/關 myDebugMode()。

27#
Version 2.0
2021-02-16
這版本有以下改動:
1. 改用 WeMos D1 mini 的 GPIO pin no.。
2. 讀取訊號時可解碼 NEC portocol 的訊號。
3. 新增兩種自製設定檔編碼:
  3a. 可重複發射,模擬 Press & Hold 實體遙控器按鈕的效果
  3b. 製作 NEC Protocol 遙控器設定檔的新方法。



ESP8266 IR Server
第一次玩 ESP8266。這製作的首要目的是用 Android 手機程式 irplus LAN 經 WiFi 控制 ESP8266 發射紅外線遙控訊號。
https://play.google.com/store/apps/details?id=net.binarymode.android.irpluslan

https://irplus-remote.github.io/#wifi

雖然我用緊的手機本身都有紅外線發射功能,不過我係屋企食飯的位置同電視機的角度太斜,食飯時想校下大細聲都要企起身行過兩步對正小小部電視機先至遙控得到,就因為懶得行這兩步(懶是科技進步的最大原動力 ),我見用開的手機遙控程式 irplus 有出 WiFi/藍牙版的 irplus LAN,於是試下整這個 Server,將 Server 固定放在平時坐疏化睇電視的位置旁邊,IR LED 對正電視機及其它機頂盒、DVD 機之類的影音產品,就可以係屋企 Router 的 WiFi 覆蓋範圍內任何位置都用到手機經 WiFi 遙控這堆影音產品。

1.安裝 ESP8266 的 USB driver、Arduino IDE 及 ESP8266 library
2.安裝 Mark Szabo 的 IRremoteESP8266 library
3.硬件
4.修改及上載 ESP8266IRServer.ino
5.設定 irplus LAN
6.用 Web browser 讀取/發射遙控訊號
7.自製 irplus 遙控器設定檔


1.安裝 ESP8266 的 USB driver、Arduino IDE 及 ESP8266 library
如果有玩開 Adruino 及 ESP8266,可跳到下一步。

以下網址有相關的安裝程序:
https://www.instructables.com/id/Programming-the-WeMos-Using-Arduino-SoftwareIDE/

2.安裝 Mark Szabo 的 IRremoteESP8266 library
以下網址可找到安裝程序:
https://github.com/markszabo/IRremoteESP8266

3.硬件
我使用 WeMos D1,外接的零件如下:
3-01.gif

由於 ESP8266 是行 3V3,因此 IR receiver 的供電腳也需使用 3V3,如果用 5V 的話可能會損壞 ESP8266。

至於 IR 輸出,由於 ESP8266 的輸出電流有限,如果直接推動 IR LED 的話會好暗,就算 IR LED 好準的對正受控電器,有效發射距離都好短(大約 1m 多小小),所以要經 NPN transistor 放大電流去推。我用 5V 向 IR LED 供電(反正塊 WeMos D1 由 USB 供電,有 5V),足夠電壓串連兩、三粒 IR LED,一來可增加光度,二來可以將 LED 分開角度安裝以增加有效發射範圍。至於我在圖中選用的電阻值,只因為我手頭上有這些電阻,無需要跟足,大約就可以(一般 IR LED 特性大約是 Vf=1V4 @ 100mA)。

至於 LED,純粹用來顯示使用狀態,可有可無,而 WeMos D1 板上本身有 Onboard LED(Pin 14),ESP8266 也有 Onchip LED(Pin 9,不過是 pull up,即是 Pin9=High,LED=Off;Pin9=Low,LED=On)。

為了方便,測試時將線路減省到:
3-02.jpg

IR LED 改為紅色 LED,而且不經 Transistor,直接由 Pin 4(白色線)去 LED 經限流電阻去 Gnd。使用普通 LED 是為方便做測試時可以睇得到閃光。雖然是普通 LED,但距離受控電器近(一、兩吋)的話仍然可以遙控到。

註:
我用的 WeMos D1 board,雖然外形同 Arduino UNO 一樣,但 I/O pin 的排列次序不一樣。
圖中下方的一排窿位,由左邊開始是 UNO 的 Pin 0~13,不過:
D1 Pin  5 相當於 UNO Pin  3(左邊數起第  4 個窿)
D1 Pin  4 相當於 UNO Pin  4(左邊數起第  5 個窿)
D1 Pin 14 相當於 UNO Pin 13(左邊數起第 14 個窿,Gnd 左邊)(D1 Onboard  LED)
D1 Pin  2 相當於 UNO Pin  9(左邊數起第 10 個窿)(ESP8266 Onchip LED, pull up)(*)

*
針腳位同 instructables 網頁內個 Table 不一樣,或者係因為我塊板係 D1,而 Instructables 塊板係 D1R2。

4.修改及上載 ESP8266IRServer.ino
到以下網址下載 Ver `1.0:
https://sites.google.com/site/chineseinput/electronics/esp8266irserver

將 ESP8266IRServer.rar 解壓後可得到以下檔案:
a.ESP8266IRServer.ino  本 Server 的程式
b.Raw.irplus  Raw 格式 irplus 遙控設定示範檔
c.Readme.html  說明檔

用 Arduino IDE 打開 ESP8266IRServer.ino,上載前必需在開頭位置作出以下修改:
設定 Port no.、 WiFi 的 SSID 及 Password
  1. // some parameters used for WiFi
  2. const unsigned int PortNo = 80;
  3. const char* SSID1 = "ssid1";               // SSID and Password for WiFi connection
  4. const char* PW1 = "password1";
  5. const char* SSID2 = "ssid2";
  6. const char* PW2 = "password2";
複製代碼
PortNo 是本 Server 使用的 Port no.,預設是 80。

ssid* 和 password* 是連接 WiFi 的 SSID 及 Password。我設計是可以用兩組,是方便自己用,一組用來連接屋企 WiFi Router,另一組是用於手機分享出去的 WiFi。如有需要可以增加或減小,但要在 void setup() 之內再作相應的修改:
  1. wifiMulti.addAP(SSID*, PW*);
複製代碼
如有需要可再作出以下修改:
a.修改 I/O pin
b.修改遙控訊號參數


a. 修改 I/O pin
以 WeMos D1 板來講,可用的 Pin no.包括 2、4、5、12~15。當中:
Pin 2  = ESP8266 的 Build-in LED(pull up)
Pin 14 = WeMos D1 板的 Onboard LED

以下是預設使用的 I/O pin:
  1. // assign I/O pins
  2. const uint16_t IrIn = 5;   // From IR receiver data pin
  3. const uint16_t IrOut = 4;  // To IR LED driver
  4. const uint16_t LED = 14;   // To LED
複製代碼


b. 修改遙控訊號參數
  1. // some parameters used for IR signal
  2. const unsigned long DefRGap = 35000;    // Default min. gap length in microseconds between two signal streams
  3. const uint16_t BufSize = 1001;          // buffer size
複製代碼
DefRGap
用於讀取遙控訊號時判斷分隔位置。當長按一個遙控制,通常遙控器會重複發射訊號,而重複發射之間的間隔時間(RGap)一般是數萬 μs(數十 ms),當讀取到一個 Space 的長度超過 RGap,會視作是分隔,輸出結果時會分行,DefRGap 是 RGap 的預設數值(μs),詳情可以看「6.用 Web browser 讀取/發射遙控訊號」。

BufSize
遙控訊號串的 Mark + Space 總數量。一般遙控器的一組訊號串,Mark + Space 的總數量由幾十至百幾,冷氣機遙控號可以長達數百。預設 1001 應足以應付。(因為由開頭的 Mark 到最後的 Mark,所以總數是單數)

將 ESP8266IRServer.ino 修改及存檔後,就可以上載到 ESP8266。

完成上載後,LED 會開著,打開 Arduino 的 Serial monitor 會見到「Connecting....」,後面的「.」會增加,表示正在嘗試連接 WiFi。

當成功連接到 WiFi,LED 會熄,Serial monitor 會出現:
Connected to: SSID*
IP address: 192.168.1.123
Port no.: 80
MDNS responder started
HTTP server started


SSID* 是本 Server 連接到的 WiFi SSID
192.168.1.123 是本 Server 獲分派的 IP address
80 是 ESP8266 使用的 Port no.

5.設定 irplus LAN
在 Android 手機安裝 irplus LAN,注意,irplus 有三個版本,分別是:
irplus,原裝版本,使用手機內置的紅外線發射功能
irplus LAN,irplus 的變種,改用藍牙、WiFi 控制外置紅外線發射器。
irplus WAVE,irplus 的變種,用手機的 3.5mm headphone 位以音效放式發射紅外線
本製作需使用 irplus LAN,不要裝錯。

打開 irplus LAN,按左上角的「三」Menu→Setting,輸入 Server 的 IP-Address:PortNo 後就可以使用(當然,手機同 Server 經 WiFi 接駁到同一個 Router,又或者 Server 直接接駁到手機分享出去的 WiFi),例如:
http://192.168.1.123:80

5-01.jpg

5-02.jpg

5-03.jpg

irplus 本身已內置一些常見牌子電器的遙控設定檔,按左上角的「三」Menu→Add 可加入所需的遙控設定。
5-04.jpg

加入遙控設定檔後就可以嘗試按 irplus LAN 的遙控掣,按掣時,Server 的 LED 會閃,表示正在發射,只要 Server 的 IR LED 對住受控電器,受控電器應該會有反應。如果 LED 有閃但受控電器無反應,可能用錯遙控設定檔,可嘗試改用同牌子同種類但不同 Model no. 的遙控設定檔再試過。

如果 irplus 沒有適合的內置遙控器設定檔,可以先用本 Server 讀取原裝遙控器的訊號,然後自製 Raw 格式的遙控器設定檔。詳請可以看以下 6 和 7 部份。

6.用 Web browser 讀取/發射遙控訊號
在 Web browser 網址列打入:
http://ip-address:port-no
便可以進入本 Server 介面。
6-01.jpg

ip-address
本 Server 的 IP address。

port-no
Server 使用的 Port no.。

例如:
http://192.168.1.123:80

a.讀取遙控訊號
Repeat Gap(rgap)
一般影音產品的遙控器,如果長按一個掣,遙控器通常會以固定間隔重複發射訊號。本 Server 讀取遙控訊號時,當讀到一個 Space 的長度超過 RGAP,便會視作兩個訊號之間的間隔,輸出結果時會分行。不同的遙控 Protocol 會有不同的間隔時間,一般是數萬 μs(數十 ms)。預設值是 35000μs。

Button Gap(bgap)
用本 Server 讀取遙控訊號時,可以連續讀取多個掣。按完一個掣後放開手,隔小小時間(不多於 1s)後再按下一個掣。當讀取到一個 Space 的長度超過 BGAP,便會視作兩個掣之間的間隔,輸出結果時會額外再分行。預設值是 RGAP 的 3 倍。

RGAP 和 BGAP 的數值應根據以下方式選擇:
遙控訊號最長的 Space(不包括間隔) < RGAP < BGAP < 1000000(1s)

輸入 rgap 和 bgap 數值後按 Read 掣,Server 的 LED 應該會亮起來,表示可以接收遙控訊號,如果:
1.按 Read 掣後 5s 內都沒收到遙控訊號,或者
2.按完一個掣後 1s 內再沒收到下一個掣,又或者
3.Buffer 已用完
這時候 LED 便會熄滅,表示已結束讀取。讀到的結果將傳回 Web browser 下面的大方格。

以 NEC protocol 的遙控器為例,按兩個遙控掣後傳回的結果會類似:

http://192.168.1.123:80/read?rgap=35000&bgap=105000
151 pulses were read.
157 buffer spaces were used.
2 buttons were read.

Button 1
(68)9000 4500 560 ... 560 (42020)
(4)9000 2250 560 (98190)
(4)9000 2250 560 (213056)

Button 2
(68)9000 4500 560 ... 560 (42020)
(4)9000 2250 560 (98190)
(4)9000 2250 560 (98190)
(3)9000 2250 560


Button * 之下,每行開頭括號內的數值是這一段 Stream 的 Mark 和 Space 總數量。
以 NEC Protocol 為例,主訊號的格式先是一對 Header 的 Mark 和 Space,之後是 32 bit 訊號,每 bit 都是一對 Mark 和 Space,之後就是 End mark 和 Gap space,總數就是:1+1+32(1+1)+1+1=68。

括號之後就是這段 Stream 的 Mark 和 Space 的時間長度(μs)。最後數值如果是 Space 會以括號()包圍,以上為例,最後的 Space 長 42020μs,大過 rgap(=35000),因此會當作一個 Gap,會分行。

下一行就是 NEC protocol 的 Repetitive stream,格式是一對 Header 的 Mark 和 Space,之後是 End mark 和 Gap space,前面括號內的數值就是 1+1+1+1=4。最後的 Space 長 98190μs,大過 rgap,但仍然細過 bgap(=105000),所以會視作一個 Gap,之後會分行。

第三同樣是 Repetitive stream,不過最後的 Space 長 213056(按兩個掣之間大約放開手 0.2 秒)超過 bgap,這個 Space 會視作兩個掣之間的分隔,所以會額外分開多一行。

之後就是屬於下一個掣的數值,如此類推,直到最後一行,這行最後的數值是 Mark,所以最後一個數值無用括號()包圍。不過要留意最頭的 Buffer 用量,如果已達到 BufSize(預設 1001),最後的訊號資料可能因為 Buffer 已用盡而被刪短,所以最後一個掣的最後一行數值未必正確,有可能需要重新再讀取。

除了用本 Server 的介面讀取遙控訊號外,亦可以在網址列打入:
http://ip-address:port-no/read?rgap=RGAP&bgap=BGAP

例如:
http://192.168.1.123:80/read?rgap=30000&bgap=105000

rgap 和 bgap 都非必要,如果沒註明便會跟預設值,例如:
http://192.168.1.123:80/read?rgap=40000
沒註明 BGAP,BGAP 將會是 3*RGAP= 120000

http://192.168.1.123:80/read?bgap=100000
沒註明 RGAP,Server 將使用 RGAP 的預設值 35000

http://192.168.1.123:80/read
RGAP 和 BGAP 都沒註明,會使用預設值 35000 及 105000(=3*35000)

b.發射遙控訊號
Carrier
發射遙控訊號的 Carrier frequency(Hz),預設是 38000(38kHz)。

Code
遙控訊號的 Mark/Space 長度(μs),每個數值以空格( )或加號(+)分隔。由第一個 Mark 開始到最後一個 Mark。亦即是上面用 Read 掣讀到的訊號資料。通常一個掣只需要第一行的數值(不包括一頭一尾被括號包圍的數值)。以上面讀取到的 NEC 訊號為例,只需將一個掣的第一行數值 9000 4500 560...560 抄入去 Code 方格(只要紅字數值,不要最尾括號內的紫色數值)。

輸入 Carrier 和 Code 後就可以按 Transmit 掣發出訊號。

如需要連同 Repeat 一齊發射,例如加一個 Repeat,可將主訊號(第一行連同最尾括號內的色 Space 值),再加上一個 Repeat(第二行綠色數字,但不包括最尾淺綠色的 Space 值) 抄入 Code 內:
9000 4500 560...560 42020 9000 2250 560

想再加多一個 Repeat 就再抄多一行:
9000 4500 560...560 42020 9000 2250 560 98190 9000 2250 560
即是主訊號的頭 Mark 到尾 Space(紅+紫),第一個 Repeat 的頭 Mark 到尾 Space(第二行的綠+淺綠),以及第二個 Repeat 的頭 Mark 到尾 Mark(第三行只要藍色數值,不要最尾的淺藍色 Space 值)。如此類推。

不過,有些遙控 Protocol 可能需要更多訊號串,例如 Sharp 的訊號分兩組(Normal、Inverted),受控電器需要先後數到兩組訊號先至會有反應,要成功遙控 Sharp 電器就需要抄兩行數值入去 Code,即是要有第一行及第二行數值(但不包括最尾的淺綠色 Space 數值)先至算是一個完整的 Sharp 訊號:
++
要加多一個 Repeat 就要一對的加,即是:
+++淺綠+++
加兩個 Repeat 就要再加多一對,即是:
+++淺綠++++淺綠++++淺綠+++

Mark 和 Space 實際使用的 Buffer 數量不可超過 BufSize。注意,由於 Mark Szabo 的 IRremoteESP8266 library 是以 uint16_t(ie. 0~65535) 儲存 Mark 和 Space 的數值。當要發射的數值超過 65535μs,例如一個 200,000μs 的 Space,我的做法是把它當作 65535(s)+0(m)+65535(s)+0(m)+65535(s)+0(m)+3395(s),因此這個超過 65535μs 的 Space 實際上佔用 7 個 Buffer 位。

除了用本 Server 的介面發射遙控訊號外,亦可以在網址列打入:
http://ip-address:port-no/?carrier=HZ&code=M+S+M+S...+M

ip-addressPort-no 如上。
HZ 是遙控訊號的 Carrier frequency。
M+S+M+S+...+M 係遙控訊號的時脈長度(microseconds),由 Mark 開始到最尾的一個 Mark,每個 Mark 和 Space 之間以加號(+) 或空格( )分隔。
以 NEC protocol 的遙控訊號為例,網址將類似:
http://192.168.1.123:80/?carrier=38000&code=9000+4500+560+...+560
或者
http://192.168.1.123:80/?carrier=38000&code=9000 4500 560 ... 560

7.自製 irplus 遙控設定檔
以下是 Raw 格式的基本設定檔例子:
  1. <irplus>
  2.   <device manufacturer="BrandName" model="ModelNo" columns="12" format="WINLIRC_RAW" frequency="38000">
  3.     <button label="測試" labelSize="25.0" span="12">9000 4500 560</button>
  4.     <button label="&#1045541;" labelSize="18.0" span="4" backgroundColor="FFFF0000">400 500 600</button>
  5.     <button label="tGreen" labelSize="18.0" span="4" labelColor="FF00FF00">500 600 700</button>
  6.     <button label="tRbY" labelSize="18.0" span="4" labelColor="FFFF0000" backgroundColor="FFFFFF00">100 200 300</button>
  7.     <space multiple="9" />
  8.     <button label="fillBlue" labelSize="18.0" span="3" fillColor="FF0000FF">800 900 100</button>
  9.   </device>
  10. </irplus>
複製代碼
這設定檔會做出如下的遙控器:
7-01.jpg

以下是設定檔內的參數說明:

<device....> 內有以下參數:
manufacturer="BrandName"
純文字,畫面上方顯示的遙控器牌子名

model="ModelNo"
純文字,畫面上方顥示的遙控器型號

columns="12"
十進制數字,手機屏幕闊度的分割份數(請看以下 Button 部份)

format="WINLIRC_RAW"
指定用 Raw 格式的設定檔

frequency="38000"
十進制數字,遙控器的 Carrier frequency(Hz),如果沒有註明,預設值是 38000(38kHz)。

之後每行 <button...>M S M ... M</button> 是每個遙控掣的資料。
<button...>內包括以下參數:
label="測試"
純文字或 Decimal NCRs code。遙控掣上顯示的文字/圖案。例如 "測試"、"tGreen" 或者 "&#1045541"(= Power 掣的圖案)。如果不知道所需圖案的 Decimal NCRs code,可先用文字代替,等 Import 後再用 Edit 修改,詳請看本部尾部。

labelSize="25.0"
十進制數字,遙控掣上的文字/圖案尺寸

span="4"
十進制數字,遙控掣的橫向尺寸。配合 device 內的 columns 使用,columns 值是手機屏幕闊度的分割份數,span 值就是一個掣佔用的份數。以 columns="12" 及 span="4" 為例,這個掣的闊度就是手機闊度的 4/12 = 1/3。

backgroundColor="FFFF0000"
十六進制數字,這個掣的底色,格式是 AARRGGBB,AA(Alpha)值必定是 FF,之後是紅綠藍的數值。FFFF0000 就是純紅色。例如圖中的 Power 掣就是紅色底。

labelColor="FF00FF00"
十六進制數字,這個掣的文字顏色,格式如上。FF00FF00 就是純綠色。圖中的「tGreen」掣就是綠色字。

backgroundColor 和 labelColor 可以同時使用,例如圖中的「tRbY」掣就是黃底紅字。

fillColor="FF0000FF"
十六進制數字,格式如上。實色無字掣的顏色,亦即是 backgroundColor 和 labelColor 都用 "FF0000FF"。例如圖中最後的純藍色掣。雖然這個掣看似無字,但仍然需要有 label="XXX"。

以上三個 Color 都非必要,如無註明,將會用預設的深灰底,白色字。

M S M ... M
十進制數字,是這個遙控掣訊號的每個 Mark/Space 長度(microseconds),每個數值用 Space 分隔,由第一個 Mark 開始,到最後一個 Mark。
以「6.用 Web browser 讀取/發射遙控訊號」讀到的訊號為例,通常每個掣只需要第一行的數字(不要頭尾括號內的數字),以上面的例子,這堆數字就是:
9000 4500 560...560

不過有些遙控 Protocol 需要兩行,例如 Sharp 的遙控訊號是分兩組,受控電器必須先後數到兩組訊號才會有反應,這種 Protocol 就需要用兩行數值:
第一行(包括最尾括號內的 Space)的數值之後再加上及第二行的數值(不要頭尾括號內的數值)

<space multiple="9" />
十進制數字,留空位置。同樣是配合 device 的 columns 值使用。以 9 為例,就是留空 9/12 = 3/4 位置(圖中最後一行掣)。

寫好設定檔後以 UTF-8 純文字格式存檔為 *.irplus,將設定檔抄入手機後就可以用 irplus 左上角「三」Menu→Import 將這設定檔加入 irplus。

上面提到,如要想使用圖案做 Label 但不知道相關的 Decimal NCRs code,寫設定檔時可暫時用文字代替,Import 後選擇遙控器,再按「三」Menu→Edit,按所需的掣(例如圖中紅色 Power 掣),然後按 Icon 選擇所需的圖案。
7-02.jpg

7-03.jpg

完成所有修改後記得要按右上角的「剔」號儲存新設定。

現在 HKEPC 出 Post,每次修改 1# 都要答一次「我不是機器人」!?

via HKEPC IR Pro 3.5.2 - Android(3.2.0)

圖片附件: 7-03.jpg (2019-6-8 22:25, 65.99 KB) / 下載次數 382
https://www.hkepc.com/forum/attachment.php?aid=2131501&k=688683666fee253c34611053795fcff2&t=1781679495&sid=18r2mxuX7k



圖片附件: 3-02.jpg (2019-6-8 22:25, 45.93 KB) / 下載次數 372
https://www.hkepc.com/forum/attachment.php?aid=2131502&k=8ca7f91c34dd58137b7f834d0917ca1b&t=1781679495&sid=18r2mxuX7k



圖片附件: 5-01.jpg (2019-6-8 22:25, 35.94 KB) / 下載次數 398
https://www.hkepc.com/forum/attachment.php?aid=2131503&k=3b88921c7e109d953fd0eda7ddf7221d&t=1781679495&sid=18r2mxuX7k



圖片附件: 5-02.jpg (2019-6-8 22:25, 21.58 KB) / 下載次數 331
https://www.hkepc.com/forum/attachment.php?aid=2131504&k=3e9a3fb39ded386631c3ce45cbdbb0d8&t=1781679495&sid=18r2mxuX7k



圖片附件: 5-03.jpg (2019-6-8 22:25, 21.4 KB) / 下載次數 392
https://www.hkepc.com/forum/attachment.php?aid=2131505&k=7eddaf27e8d6b9c68068631fbd397008&t=1781679495&sid=18r2mxuX7k



圖片附件: 5-04.jpg (2019-6-8 22:25, 15.94 KB) / 下載次數 334
https://www.hkepc.com/forum/attachment.php?aid=2131506&k=6e54fec5e6763aa43b67aa55f42921c9&t=1781679495&sid=18r2mxuX7k



圖片附件: 7-01.jpg (2019-6-8 22:25, 13.22 KB) / 下載次數 422
https://www.hkepc.com/forum/attachment.php?aid=2131507&k=26514b6b20962d1f2363854aa1854f6f&t=1781679495&sid=18r2mxuX7k



圖片附件: 7-02.jpg (2019-6-8 22:25, 19.63 KB) / 下載次數 385
https://www.hkepc.com/forum/attachment.php?aid=2131508&k=ae29cc7ad601f60fb5af824233586630&t=1781679495&sid=18r2mxuX7k



圖片附件: 6-01.jpg (2019-6-8 23:11, 68.16 KB) / 下載次數 362
https://www.hkepc.com/forum/attachment.php?aid=2131512&k=d0235fdaef08b22feb0450e77e6413dd&t=1781679495&sid=18r2mxuX7k



圖片附件: 3-01.gif (2019-6-8 23:39, 9.63 KB) / 下載次數 425
https://www.hkepc.com/forum/attachment.php?aid=2131519&k=22ef368bfe5e71e8c56ebf8af04499c7&t=1781679495&sid=18r2mxuX7k


作者: marlin12    時間: 2019-6-8 23:53

手機本身都有紅外線發射功能,不過我係屋企食飯的位置同電視機的角度太斜
C_Law 發表於 2019-6-8 22:00


如果只係[角度太斜]既問題,用塊[反射鏡]放在電視既紅外線接收器斜對面,就可以反射來自手機既紅外線,唔使搞咁大壇野。
作者: C_Law    時間: 2019-6-9 00:01

本帖最後由 C_Law 於 2019-6-9 00:06 編輯
如果只係[角度太斜]既問題,用塊[反射鏡]放在電視既紅外線接收器斜對面,就可以反射來自手機既紅外線,唔 ...
marlin12 發表於 2019/6/8 23:53


角度只係其中一個原因,還有其它因。

例如我想係房都遙控到放在客廳的有線電視,無理由由房到廳放好多塊反射鏡(好似 1980's 年代一套經典電影 Brazil/妙想天開,女主角由廳到廁所裝好多鏡,目的係瞓係沖涼缸都睇到電視)。N 年前屋企裝修時拉電話線入房,專登用 4 芯電話線,兩芯用作電話,另外兩芯用來做 IR Extender。今次整這個 IR Server,一來因為懶,二來當係學下 ESP8266,三來就係掉走埋個 IR Extender。


作者: morris    時間: 2019-6-9 10:33

本帖最後由 morris 於 2024-3-22 13:15 編輯

......
作者: xo_ox    時間: 2019-6-10 09:16

強貼LM x2
作者: bbsunny    時間: 2019-6-10 17:57

下一步我覺得你應該玩聲控
手機開APPS我經WIFI用博聯控制電視已經覺得開APPS好麻煩
作者: C_Law    時間: 2019-6-10 18:36

下一步我覺得你應該玩聲控
手機開APPS我經WIFI用博聯控制電視已經覺得開APPS好麻煩 ...
bbsunny 發表於 2019/6/10 17:57


其實 irplus 已經有聲控功能。不過初出這功能時,我仍然用緊 IR 版,既要拎住手機向著受控電器,個口又要對住手機 Mic,個姿勢都幾礙眼,所以只係貪玩試過下,未有認真試。

有時間的話,或者再試下用 WiFi 版的 irplus LAN再玩下,反正現在手機已無需要對住受控電器,應該易用過 IR 版。

不過,啟用 irplus 的聲控功能都有個麻煩,因為會 Overlay 個聲控掣上畫面,這個掣會阻住原本遙控設檔檔的掣。而使用聲控時要用手指按住個聲控掣去講,有機會想聲控時按錯本來的掣,又或者想按掣卻按錯聲控掣。
作者: YES_MAN    時間: 2019-6-10 19:57

請教下,
手機有內置IR做遙控,
Google play那個lirc apps,
最容易讀到自訂的lirc device config file?
作者: C_Law    時間: 2019-6-10 20:05

請教下,
手機有內置IR做遙控,
Google play那個lirc apps,
最容易讀到自訂的lirc device config file? ...
YES_MAN 發表於 2019/6/10 19:57

試下這個:
https://irplus-remote.github.io/converter/lirc.html

不肯定有無記錯,我最初用 irplus 時好似是用它去將WinLIRC 的設定檔轉去 irplus。

via HKEPC IR Pro 3.5.2 - Android(3.2.0)
作者: xo_ox    時間: 2019-6-11 17:52

ESP8266 IR Server

第一次玩 ESP8266。這製作的首要目的是用 Android 手機程式 irplus LAN 經 WiFi 控制 E ...
C_Law 發表於 2019-6-8 22:00



    請問有沒有零件號碼,想做一個。
       謝謝
作者: C_Law    時間: 2019-6-11 21:20

請問有沒有零件號碼,想做一個。
       謝謝
xo_ox 發表於 2019/6/11 17:52

其實我都係淘寶求其買!

我搵返之前淘的紀錄:
ESP8266
我塊係 WeMos D1。不過如果我再揀的話會搵 WeMos Mini D1,比較細塊,功能又差不多。十幾人仔就有。不淘的話,印象中係鴨街新昌見過,但不記得幾錢。

三腳紅外接器
VS1838B,約兩毫幾人仔/粒。這類接收器,好多廠有出,有不同Model,不同頻率(一般來講用 38kHz 可應付到大大部份用途,如果齋做發射,可以不裝接收器),3 隻腳的次序亦有不同(我買過的都是 Out/Gnd/Vs,但拆舊電器見過有 Out/Vs/Gnd)。鴨街華輝都有,不知 Model no.,要 HK$12/粒!!

IR LED
真係求其到紀錄入面都無 Model no.!

NPN transistor
求其細功率 NPN 都得,我用 9013 係好多年前買落用剩的。

電阻數值
同我係 1# 線路圖差不多就得,識計就自已計下數。

via HKEPC IR Pro 3.5.2 - Android(3.2.0)
作者: xiao    時間: 2019-6-11 23:06

請問有沒有用32bit數目的library
手工填timing 比較麻煩
作者: C_Law    時間: 2019-6-12 06:45

本帖最後由 C_Law 於 2019-6-12 07:34 編輯
請問有沒有用32bit數目的library
手工填timing 比較麻煩
xiao 發表於 2019/6/11 23:06


你意思係想入 32bit HEX 數值去做 irplus 的遙控設定檔?

係可以,其實 irplus 除了 RAW 之外,起碼另外有兩種做設定檔方法:
1.針對 NEC protocol,好似以下舊 Post 的有線 FanHUB 設定檔
https://www.hkepc.com/forum/viewthread.php?fid=180&tid=2427054
<device...> 內的format 改用"WINLIRC_NEC1",而<button...>M S M S...</button>的 M S M S...部份改為 HEX 數值,就會做到根據 NEC protocol timing/bit 數的遙控器設定檔。

2.<device ...> 內使用 format="WINLIRC_SPACEENC"
例如將上面個有線 FanHUB 設定檔的 <device ...> 行改寫成:
<device manufacturer="CableTV" model="FanHUB" columns="12" format="WINLIRC_SPACEENC" toggle-bit-pos="0" one-pulse="560" one-space="1690" zero-pulse="560" zero-space="565" header-pulse="9000" header-space="4500" gap-space="39770" gap-pulse="560" bits="16" pre-bits="16">

就可以做到自定 Header/1/0...etc 的 Mark 和 Space 長度。而且不限於 32bit,我不知最長可做到幾多 bit,但我試過整屋企部古董「凶宅」(日立 OEM)冷氣機遙控器,有成一百零幾 bit 都做得到。

WINLIRC_RAW、WINLIRC_NEC1、WINLIRC_SPACEENC 只係三種我整過的 Format。其實還有其它 format,裝 irplus 後用「三」Menu→Add 加入其它內置的設定檔睇下,還會搵到其它 format 的設定檔,可以用「三」menu→Edit 開出來睇下它的寫法。我最初用 irplus 都係開它內置的設定檔睇先至學識整上述三種 format 的設定檔。

Uploaded_via_HKEPC_IR_Pro_Android(5b602).jpg

不過,就算用 WINLIRC_RAW 以外的 format,實際使用時,irplus 都係先轉返做 Mark/space pulse length 然後才經 WiFi 送出去。而且收到的數值會同實際數值有出入,例如 NEC Header mark 的 9000,發送出去後,Server 實際收到的數值可能變成 89XX~91XX。我不知實際是怎樣轉,只知道收到的數字一定是 26 倍數(但又未必 Round 去最接近的 26 倍數),而且改 carrier freq. 的話又會變另一個數,即使用 WINLIRC_RAW,Server 收到的數字都同樣係會變。不過這小小偏差,一般電器都仍然可以正確解讀到遙控。

圖片附件: Uploaded_via_HKEPC_IR_Pro_Android(5b602).jpg (2019-6-12 07:04, 129.48 KB) / 下載次數 223
https://www.hkepc.com/forum/attachment.php?aid=2132087&k=3c804a5c296eff41206968afc1094ba8&t=1781679495&sid=18r2mxuX7k


作者: xiao    時間: 2019-6-12 09:12

回覆 13# C_Law


    看來不錯
請問怎樣解決耗電的問題
手機和ESP都費電
作者: C_Law    時間: 2019-6-12 17:54

看來不錯
請問怎樣解決耗電的問題
手機和ESP都費電
xiao 發表於 2019/6/12 09:12


電方面我無太在意。

手機方面,反正用遙控的時間多數係睇電視的時候,而平日都係一路睇電視一路拎住部手機篤篤篤,所以用手機做遙控都不會額外用多幾多手機電。

ESP8266 方面,我屋企個廳係搵個舊電腦 ATX 牛長期開著向高清機頂盒、錄電視用的 3.5" HDD、Router...etc 供電(費事插到一大堆火牛),可以係隻 ATX 牛拉條 5V 線向 ESP8266 供電。

除此之外,現在好多電視機/高清機頂盒/山寨 DVD 機之類影音產品都有 USB port,有些就算在所謂「Power Off」的時候(實際上應該叫 Standby),個 USB port 都仍然有電,只要無熄這類電器的插蘇電掣,就長期有 5V 電可以向 ESP8266 供電。

用開有 USB 充電位的拖板又可以向它取電,反正這類拖板十之八九都無掣去開關 USB 火牛,拖板有電,隻牛就有電。

出街用就可以插手機尿袋。
作者: C_Law    時間: 2019-6-22 18:15

本帖最後由 C_Law 於 2019-6-22 18:27 編輯

上面 13# 提到,irplus LAN 傳送出去的 Timing 數值會隨著 Carrier frequency 而改變,我發現 Carrier frequency 越大,Server 收到的 Timing 數值亦會變得越大。如果用作紅外線遙控的話,小小 Timing 改變,受控電器一般都能正確解讀到。不過,如果我想將 irplus LAN 借用做其它用途呢?

其實 irplus LAN 可視作一個單向傳送指令的使用介面,由 irplus LAN 發出指令,ESP8266 收到指令就作出相關的工作,例如我想傳個 1 去開燈、傳個 2 去開風扇、傳個 0 就關閉所有電器,這時候,ESP8266 就需要將 irplus LAN 改變了的數值還原才能接收到正確的指令。

假設數值 A 係我心目中想 ESP8266 取得的指令,而 B 係被 irplus LAN 改變後發送出去的數值,我發現可以用以下方式將 B 還原返做 A。

首先製作 WINLIRC_RAW 格式的 irplus LAN 遙控設定檔時,用 100A 取代 <button...>M S M ... M</button> 內的 M S M...M 部份。可以一次過傳送多個數值,總之每個都乘 100。

當 ESP8266 接收到來自 irplus LAN 被改變後的每個 B,即是我原先個 ESP8266IRServer.ino 之內的 void irpluslan() 入面分割 server.arg(1) 的 while loop 內讀取到的 Temp 數值:
  1. float B = (float)Temp;
  2. float fFactor = 100.0;  // 設定檔內每個數值被乘大的倍數
  3. unsigned long C;  // 還原後的數值,計出來應該等如原本的 A
  4. C = (unsigned long)(B * 38461.53846 / (float) Hz / fFactor + 0.5);
複製代碼
 

38461.53846 這個數值是來自 1,000,000/26,因為我見 irplus LAN 傳出去的 Timing 數值必定被改為 26 的倍數,所以我估計 irplus LAN 改變 Timing 數值的方式必定同 26 有關,結果就試出這個數值。

我測試過 Carrier frequency 由 30kHz 到 60 kHz(每 Step 1kHz 的試),A 由 0~255,由 B 還原出來的 C 都等如原本的 A。既然可以正確傳到 1 Byte,即係可以設計任何指令由 irplus LAN 傳給 ESP8266。

fFactor = 100 只係貪方便,也可以其它更大的數值,例如用 256 (方便用 Hex 數值)都應該得,不過我未試過。但不能用太細,我試過用 26,但間中會有些錯。

BTW,我無認真學過 C++,想問下,以上面幾行 Code 內講,幾個 () 內的 unsigned long, float 否可省去。例如第一行,Temp 本身是 long,而 B 被 declare 做 float,是否還需要在 Temp 之前加 (float)。又例如計 C 的一行,入面有float 又有 long 的 variable,我想全部以 float 去計,最後先至變返做 long。
作者: xiao    時間: 2019-6-24 18:26

本帖最後由 xiao 於 2019-6-24 18:33 編輯

回覆 16# C_Law


    IR 一般用 1/3 duty cycle 調製, 同樣時間的長度, 頻率和脈衝數成正比. 如果頻率高了, 脈衝數變大很合理.
所以用RAW CODE, 例如 32 bit 數據來做應該可以避開這種疑問

類似的 subroutine, 一般不會直接寫 TIMING 的細節, 而保持在 PROTOCOL 層面運作, 做起來會比較容易閱讀和維護.
只要單獨寫 TIMING 細節時才考慮調製頻率, 就會大幅減低寫碼難度, 也容易維護修訂.
  1. //----------------------------------------------------------------------------
  2. void NEC_header(){
  3. /*
  4.   __asm
  5.     lda #16
  6.     jsr _NEC_1T_MARK
  7.     dbnza .-3 ; branch to avoe line if Acc>0  
  8.     lda #8
  9.     jsr _NEC_1T_SPACE
  10.     dbnza .-3 ; branch to avoe line if Acc>0
  11.   __endasm;
  12. */
  13.   for (temp=0; temp<16; temp++) {
  14.     NEC_1T_MARK();
  15.   }

  16.   for (temp=0; temp<8; temp++) {
  17.     NEC_1T_SPACE();
  18.   }
  19. }


  20. void NEC_stop(){
  21.   NEC_1T_MARK();
  22.   NEC_1T_SPACE();
  23.   for (temp=0; temp<24; temp++){
  24.     delay1ms();  
  25.   }  
  26. }

  27. void NEC_bit0(){
  28.   NEC_1T_MARK();
  29.   NEC_1T_SPACE();  
  30. }

  31. void NEC_bit1(){
  32.   NEC_1T_MARK();
  33.   NEC_1T_SPACE();
  34.   NEC_1T_SPACE();
  35.   NEC_1T_SPACE();
  36. }
  37. //----------------------------------------------------------------------------
複製代碼

作者: C_Law    時間: 2019-6-24 22:33

本帖最後由 C_Law 於 2019-6-24 22:35 編輯

回覆 17# xiao

我試過用同一個 NEC 訊號,以不同 format 去做遙控設定檔,結果是:

WINLIRC_NEC1
這 IR Server 發出的訊號,由另一個三腳接收器讀取,無論在 irplus LAN 入面怎麼改 Carrier frequency,讀取到的 Timing 都好接近 NEC 的預設值(Header=9000/4500、One=1690/560、Zero=560/560...etc)。

WINLIRC_SPACEENC
填 NEC 的預設數值入去設定檔,就算 Carrier frequency 用預設的 38kHz,讀到的 Timing 都細過正確的 NEC 數值,讀到的 Waveform 係比正常 NEC Waveform 縮窄了。要用類似 16# 的計算方式事先改數值,寫設定檔時要將數值改大(變成 Header=9109/4555、One=1711/567、Zero=567/567),發射出來的實際 Timing 先至係會係 NEC 的預設值。不過,想改 Carrier frequency 的話,又要再計過數先至會發射到正確的 Timing, Carrier frequency 加大,Timing 也變大,讀的的 Waveform 會拉闊了;相反,減 Carrier frequency,Timing 也減小,讀的的 Waveform 會縮窄。

WINLIRC_RAW
將 NEC 的 32-bit Hex code 轉返做 Timing 寫入設定檔,結果會同 WINLIRC_SPACEENC 一樣。

應該係 irplus LAN 問題。

最麻煩係,無論用什麼 Format 的設定檔,irplus LAN 始終係轉為 http://ip-address:portNo/?carrier=Hz&code=M+S+M+...M 的格式傳送出去。Server 只會收到 Carrier frequency 和一堆 Timing 數值,根本不知原本是什麼 Format 的設定檔,不知要不要再改 Timing(原本係 NEC 格式設定檔就不用改,SPACEENC 和 RAW 的都要改。況且 irplus LAN 可能重有其他設定檔格式,都不知要不要改)。
作者: xiao    時間: 2019-6-25 10:50

回覆  xiao

我試過用同一個 NEC 訊號,以不同 format 去做遙控設定檔,結果是:

WINLIRC_NEC1
這 IR Ser ...
C_Law 發表於 2019-6-24 22:33


這種誤差時間1.3%, 通常很多機器都可以的, 但是有些超過0.3%就會失敗, 例如遇到過的 MAGIC TV 在 0.2% 才正常.

要改正人家的 library, 很大工程, 除非慢慢看慢慢試驗. 問題應該是類似用了浮點數, 截斷轉換, 軟件延時等

https://github.com/markszabo/IRr ... ster/src/IRsend.cpp
有關 delay, modulation
作者: C_Law    時間: 2019-7-14 22:34

本帖最後由 C_Law 於 2019-7-14 22:56 編輯

終於得閒整返個實際放係廳長用的 IR Server(之前一直搭 Breadboard 用住先 )。

用兩粒 IR LED 分別指去不同方向,Forward current 大約 100mA。遙控距離足夠大部份香港人家居用途。用作指示用途的 LED 用返塊 WeMos D1 的 Onboard LED,無再額外加 LED 做指示燈。WeMos D1 連埋我塊萬用板裝入個半透明膠盒仔,再搵個手機架夾住個盒,校好 IR LED 發射角度向正一堆受控電器。

ESP8266 IR Server2.gif

HW-1.jpg

HW-3.jpg

紅線係塊萬用板背面的連線。塊板開返個大窿方便睇到塊 WeMos D1 的 Onboard LED。
HW-2.jpg

圖片附件: ESP8266 IR Server2.gif (2019-7-14 22:33, 6.6 KB) / 下載次數 226
https://www.hkepc.com/forum/attachment.php?aid=2137970&k=39a5c7c7cb394999e761123380049702&t=1781679495&sid=18r2mxuX7k



圖片附件: HW-3.jpg (2019-7-14 22:33, 147.32 KB) / 下載次數 177
https://www.hkepc.com/forum/attachment.php?aid=2137971&k=0359b4f1db576e531d37f84ebbae6ee1&t=1781679495&sid=18r2mxuX7k



圖片附件: HW-2.jpg (2019-7-14 22:33, 149.99 KB) / 下載次數 209
https://www.hkepc.com/forum/attachment.php?aid=2137972&k=4ca2f7fbeb8adb4df6d4a4b2022cfa15&t=1781679495&sid=18r2mxuX7k



圖片附件: HW-1.jpg (2019-7-14 22:33, 148.41 KB) / 下載次數 198
https://www.hkepc.com/forum/attachment.php?aid=2137973&k=f39469a974b0ecf502dfc444d3bf3b3e&t=1781679495&sid=18r2mxuX7k


作者: C_Law    時間: 2020-12-25 17:54

本帖最後由 C_Law 於 2021-5-14 22:13 編輯

未完, 更新中

預告,新增三個功能:
1. 可重覆發射,模擬實體遙控器 Press & Hold button 的效果
2. 製作 NEC Protocol 遙控器設定檔的新方法
3. 讀取遙控訊號時可解碼 NEC 訊號

Uploaded_via_HKEPC_IR_Pro_Android(ce264).jpg

Uploaded_via_HKEPC_IR_Pro_Android(72e67).jpg


其實軟件方面一早寫好,自己屋企都用了一段日子,只差寫個說明放上來,原本諗住聖誕假期可以搞得掂,但係一開工寫說明,屋企就有嘢要維修,唯有先搞屋企的維修,之後又發現以往用開來放檔案給人下載的 Google site 改了版,又要摸索下新版的玩法。到昨晚又發現屋企可能穿了食水喉 ……唉!明乎其實一波三折! 唯有暫時 Hold 住這個更新。

不過都 Show 小小成果出來先:
V2TX1.gif

上圖係用以前整落的 WinLIRC Audio Receiver 以錄音方式錄取到的遙控訊號波形。
A. 原裝 LG TV 遙控器的 Vol- 掣。長按了大約半秒。

B. 新的可終止重複發射掣(預設 12 次) + 新的 NEC protocol 設定方式做的 Vol- 掣。一共發射了一次主訊號+12 下重複訊號。

C. 同上,但完成重複前再按一下任何掣,就會立刻終止。

D. 新的強制重複發射掣(預設 9 次並已設定間隔為 110000=0.11s)+ 新的 NEC protocol 設定方式做的 Vol- 掣。雖然重複發射完成前再按多一下 Vol- 掣,但仍然繼續發射重複訊號,直到發射完第 9 次就再發射後來再按的 Vol-。雖然這個強制重複掣同時設定了間隔時間,但由於後面個 Vol- 掣用了我新做的 NEC protocol 設定格式,當中已規定了重複訊號的間隔,因此會跟 NEC Protocol 的格式做重複發射,忽略之前個重複掣的間隔設定。

E.用新的可終止重複發射掣(預設 12 次)  + irplus LAN 本身有的 Raw 格式 LG TV 的 Vol- 掣。由於只有主訊號,所以即使係重複發射,都係重複發射主訊號。而由於之前個重複掣內未有設定重複之間的間隔時間,會用預設的 DefTxGap=100000(0.1s)。

F. 用新的強制重複掣(預設 9 次並已設定間隔為 110000=0.11s) +  + irplus LAN 本身有的 Raw 格式 LG TV 的 Vol- 掣。可見到波形同上面 E. 的差不多,但間隔闊了小小。

我覺得最有用係 C,例如想好似長按住實體遙控器的 Vol- 掣直到當音量下降到想要的水平就放開手停止音量再下降,可以做一個 50 次的可終止重複掣,先按這重複掣再按 Vol- 掣,當音量降到想要的水平就再求其按一個掣去終止下降音量。

強制重複掣就要好小心用。尤其是 Vol+,有機會一直校大聲到喇叭拆聲,想停就一係用手掩住 IR LED 等到所有重複都發射完,一係就按 ESP8266 的 Reset。

via HKEPC IR Pro 3.6.1 - Android(3.3.1)

圖片附件: Uploaded_via_HKEPC_IR_Pro_Android(72e67).jpg (2020-12-25 17:53, 142.15 KB) / 下載次數 185
https://www.hkepc.com/forum/attachment.php?aid=2239393&k=9fc0467dde7ddb637cfee87855137593&t=1781679495&sid=18r2mxuX7k



圖片附件: Uploaded_via_HKEPC_IR_Pro_Android(ce264).jpg (2020-12-25 17:53, 141.2 KB) / 下載次數 154
https://www.hkepc.com/forum/attachment.php?aid=2239394&k=fb9e4581b13aa66e440ece887334871d&t=1781679495&sid=18r2mxuX7k



圖片附件: V2TX1.gif (2021-1-3 18:35, 56.84 KB) / 下載次數 172
https://www.hkepc.com/forum/attachment.php?aid=2241493&k=185ffc1e27354b738717db417d28a3f4&t=1781679495&sid=18r2mxuX7k


作者: Kin_2012    時間: 2020-12-25 21:10

回覆 1# C_Law

正呀, 有時間當學野好 !

至於現實求方便, 好多電視都有 BT 遙控, 另外現成的有 Harmony 做晒以上果堆野
作者: C_Law    時間: 2020-12-26 17:06

本帖最後由 C_Law 於 2020-12-26 17:15 編輯
回覆  C_Law

正呀, 有時間當學野好 !

至於現實求方便, 好多電視都有 BT 遙控, 另外現成的有 Harm ...
Kin_2012 發表於 2020/12/25 21:10

未用過可 BT 遙控的電視機。

用手機 App 經 BT 遙控?
可否同時多部手機駁去電視機?
即係家中各人各自用自已手機去遙控, 電視機要不要先解除原本手機的連線才可接收另一部手機做遙控?

我用緊的 irplus LAN 係可 BT/WiFi, 但官網的 Arduino + BT 模組的做法, 只可連接一部手機, 想用另一部手機就要先斷開原先部手機的連線。所以我選擇用 WiFi, 所有已連線到同一個 WiFi Router 的手機都遙控到。

via HKEPC IR Pro 3.6.1 - Android(3.3.1)
作者: Kin_2012    時間: 2020-12-27 14:07

未用過可 BT 遙控的電視機。  

用手機 App 經 BT 遙控?
可否同時多部手機駁去電視機?
即係家 ...
C_Law 發表於 2020-12-26 17:06


電視的 BT 遙控, 同一般紅外線的電視遙控一樣, 只係由用紅外線轉用 BT,  咁就無死角又唔怕有野遮到.

至於 Harmony 的功能可以參考佢的網站 https://www.logitech.com/en-us/products/harmony/harmony-hub.html

我係支持 DIY 的
師兄可以睇下現成的產品, 睇下有無咩靈感搵到.
作者: marlin12    時間: 2020-12-29 19:01

另外現成的有 Harmony 做晒以上果堆野
Kin_2012 發表於 2020-12-25 21:10

一套Harmony遙控+app+hub就要150元美金(約1200元港幣),仲要全屋電器換晒做Harmony friendly devices。
作者: Kin_2012    時間: 2020-12-29 19:11

一套Harmony遙控+app+hub就要150元美金(約1200元港幣),仲要全屋電器換晒做Harmony friendly devices。 ...
marlin12 發表於 2020-12-29 19:01


剩係樓主的 man hour 已遠遠超過1200元港幣了, 為興趣學野當然無問題.
就算一般人只買零件 + 組裝,  時間加成本都唔只1200元港幣.

另外所謂 Harmony friendly devices, 基本上大路牌子都 ok.
你可以試下係屋企搵件唔支援的睇下...

Harmony works with over 270,000 devices from 6,000+ brands
https://support.myharmony.com/en-us/compatibility
作者: C_Law    時間: 2021-2-16 22:54

本帖最後由 C_Law 於 2021-8-7 16:15 編輯

Version 2.0
這版本有以下改動:
1. 改用 WeMos D1 mini 的 GPIO pin no.。
2. 讀取訊號時可解碼 NEC portocol 的訊號。
3. 新增兩種自製設定檔編碼:
  3a. 可重複發射,模擬 Press & Hold 實體遙控器按鈕的效果
  3b. 製作 NEC Protocol 遙控器設定檔的新方法。




到以下網址下載 Ver 2.0:
https://sites.google.com/site/chineseinput/electronics/esp8266irserver

將 ESP8266IRServer_2_0.rar 解壓後可得到以下檔案:
a.ESP8266IRServer_2_0.ino  本 Server 的程式
b.Raw.irplus  Raw 格式 irplus 遙控設定示範檔
c.Readme.html  說明檔

同 Version 1 一樣,上載到 ESP8266 前必需先修改:
SSID/Password
Port no.

如有需要,亦可修改 I/O pin no.。

除此之外,Version 2.0 新增兩個變數:bool LED_ON 以及 long DefTxGap。

LED_ON 是指示用的 LED 著燈時的 Logic state,以 ESP8266 上的 Onchip LED 做指示燈的話,由於這 LED 本身是以 Pull_up 方式接駁,因此 LED_ON 預設值是 false(ie. Low 的時候著燈、High 的時候熄燈),如果用 Pull_down 方式接駁指示 LED,需要將 LED_ON 改為 true。

DefTxGap,是重複發射時的預設間隔時間(μs),預設是 100000(=0.1s),如有需要也可修改。

所有下面使用例子中會用到的 Button 都已加入 Raw.irplus。
DemoIrplus.gif
  



硬件改動
改用 WeMos D1 mini 的 GPIO pin no.,不過仍然以 Comment 方式保留 WeMos D1 的 pin no.,有需要時可在開頭 assign I/O pin 位置內改回舊版的 Pin no.。

除此之外,為方便我做測試時可直接駁 IR receiver 和 IR LED 去 D1 mini,我在 assign I/O pin 內加入 IrOutGnd、IrInVcc、IrInGnd 等三條 Pin,如無需要,可在 assign I/O pin 及 Setup 內刪除有關這幾條 Pin 的設定。




SimpleSetup.gif

注意,ESP8266 的 I/O pin 輸出電流有限,以上接駁 IR Led 的方法只為方便測試,實際使用時仍然需要跟 1# 用 Transistor 放大電流。




新增功能
本版本新增以下三個功能:
解碼 NEC 訊號
重複發射
新的 NEC 設定檔




解碼 NEC 訊號
用 Web browser 讀取遙控訊號時會和之前版本一樣顯示每一段訊號串的 Pulse length,但如果讀取到的訊號屬於 NEC protocol,會在 Pulse length 行之下顯示解碼後所得的 32bit NEC code,以及這訊號的新設定檔編碼(詳情看下面「新 NEC 設定檔」)。
ReadNEC.gif

暫時只能解碼 NEC protocol 的訊號,讀到其他訊號時會跟舊版一樣顯示 Pulse length,但 Pulse length 行之下會顯示 Unknown type。




新的自製設定檔方式
之前在 13# 和 16# 提過,用 irplus LAN 發射 Raw 格式的設定檔內的遙控訊號時,實際傳送到 ESP8266 的時脈長度會和設定檔內的數值有小小偏差,雖然這偏差不至於會影響到遙控功能(受控電器一般都容許有一定的誤差),但如果用作傳送其他指令去控制 ESP8266,就必需確保 ESP8266 能收到心目中想要的數值。

雖然我不能改變 irplus LAN 發送數出去的方式,但可以移船就磡,製作設定檔時先改變心目中想傳送的數值,當 ESP8266 收到後就以相反方式將數值還原到原來心目中想傳送的數值。

新的設定檔方式以 irplus LAN 的 Raw 格式設定檔為藍本,設定檔內每個 Button 內的 M S M S...M 部份,都會用以下四個數值作開頭:
0 100000 R 100myTxType
(:由 Version 2.1 起,所有 myTxType 己改名為 myCmdType)

第一個數值必定是 0,不能改。
原本 M S M S...M 的第一個數值是遙控訊號的第一個 Mark 長度,正常來講不會是 0,因此我以此作為區分,當 ESP8266 收到到一個 Button 的第一個數值不是 0,代表這是原裝 irplus 格式,將以原本的方式發射遙控訊。如果第一個數值是 0 就以我的方式去處理。

第二個數值必定是 100000(100k),不能改。
以我觀察,irplus LAN 實際傳送到 ESP8266 的數值必定是 26 的倍數,而且會因應設定檔內的 Carrier frequency 而改變。我用第二個數值 100k 作為基準,本 Server 會計算實際收到的數值和 100k 的比例,之後收到的數值就可以按這比例還原出真正想要的數值。雖然我無可能完全測試任何 Carrier frequency 及任何數值,但試過以 38kHz 的設定檔,可以正確傳送到 0~255,既然可準確傳送到 1 Byte,理論上任何長度的數值都可以分開 1 Byte 又 1 Byte 的傳送出去。

第三個數值 R
用作指定重複發射方式。重複發射可分為可終止和強制兩種。詳情請看下面「myTxType=0」。

第四個數值 100myTxType
之前提過, irplus LAN 實際傳送出去的數值必定是 26 的倍數,因此為了可以將接收到的數值還原到心目中想要的數值,寫設定檔時起碼要先將數值乘大 26 倍,而為了方便計數,我選用 100。至於 myTxType 是我自製的新編碼分類號碼,暫時有兩種:
myTxType=0,用於指示重複發射下一個 Button。
myTxType=2,用於發射 NEC protocol 遙控訊號。




myTxType = 0
可模擬 Press & Hold 實體遙控器上一個掣的重複發射動作。

雖然 irplus 本身可在設定檔的<device> 行內設定重複發射次數,不過一旦以這方法設定重複次數,整個設定檔內的所有 Button(Macro 除外)都會跟這個次數重複發射。我就覺得這個設定方式其實不太適合實際應用,事關一般遙控器上的大部份掣都無需要重複發射,即使是有需要 Press & Hold 去重複發射的掣,例如調校音量大細,每次所需要的重複發射次數是以當時的實際情況而定,根本不適宜事先設定一個固定的重複次數。

因此我增設這個 myTxType=0 的 Repeat 掣編碼,作用是指示本 Server 重複發射下一個接收到的 Button,例如想好似 Press & Hold 實體遙控器的 Vol- 掣,可先按 Repeat 掣再按 Vol- 掣。

Repeat 掣的編碼如下:
0 100000 R
或者
0 100000 R 0 100RptGap

等等先!之前講過每個新編碼必定以 4 個數值開頭,為何這裡的第一種編碼只得 3 個數值!?
這是因為 irplus LAN 的 Raw 設定檔格式,每個 Button 必定由第一個 Mark 到最後一個 Mark,因此必定是單數的數量,當 irplus LAN 送出一串 Pulse length 時還會在最後補多一個 0(估計 irplus 作者原意是在最後傳一個長度是 0 的 Space,確保到最後關閉 IR Led),這個額外傳送出去的 0 正好可用作第 4 個數值的 100myTxType(=0),基於懶得就懶的原則,這情況下用三個數值就夠。

3 個數值的重複掣:0 100000 R
先講只需 3 個數值的重複掣,頭兩個數值已在上面講過,不再重複。至於第三個數值 R 可以有兩種寫法:
R=10000r
或者
R=100fr
分別是可中途終止的重複發射,及強制完成的重複發射。

可終止的重複發射:R=10000r
r 是可中途終止的重複發射次數,本 Server 會將下一個接收到的掣重複發射 1+r 次(如果是 NEC protocol 之類分開主訊號和重複訊號的遙控訊號,則會發射 1 次主訊號再加 r 次重複訊號)。

如果想在重複發射次數完成前終止發射,只需要按下任意一個掣,正在重複發射的訊號便會立刻終止。這個新按的掣純綷是用來終止之前的重複動作,不會發射出去。

例如想做一個重複發射 1+30 次的「r30」掣,r=30,ie. R=300000,這個掣的的編碼就是:
0 100000 300000

整個 Button 行會是:
<button label="r30" labelSize="12.0" span="3">0 100000 300000</button>

例如想模擬 Press & Hold 實體遙控器的 Vol- 掣去降低音量,實際操作是先按這個 r30 掣(指示本 Server 去重複發射下一個接收到的掣),這時候本 Server 的 LED 會亮起,表示正在等待要重複發射的掣,這時候按 Vol- 掣便會開始重複發射(相當於 Press & Hold 實體遙控器上的 Vol- 掣),當音量下降到心目中想要的水平便可以任意按一個掣去終止發射(相當於放開實體遙控器的掣)。當然,如果已重複發射了指定的 1+30 次,也會停止發射。

如果按下 r30 掣後 3 秒內都沒收到下一個掣,LED 便會熄滅,表示重複動作已被取消。

以下是用以前整落的 WinLIRC Audio Receiver 以錄音方式錄取到的遙控訊號(下同),RawVol- 掣是以原本 irplus raw 格式做出來的 LG 電視機 Vol- 掣(NEC Protocol,只有主訊號)。
r30.gif

強制完成重複發射 R=100fr
fr 代表 Force repeat,強制重複,數值範圍是 1<=fr<=99。用法和可終止的重複掣一樣,先按這個強制重複發射掣,再按實際需要重複發射的掣,不過分別是正在重複發射時不會因為中途有另一個掣被按下而終止,本 Server 會繼續重複發射直到指定的重複次數完成,而新按的掣會在現有的重複發射次數完成後發射出去。

例如想做一個強制發射 1+50 次的掣「fr50」,R=100fr=100x50=5000,整個掣的 Button  行會是:
<button label="fr50" labelSize="12.0" span="3">0 100000 5000</button>

5 個數值的重複掣:0 100000 R 0 100RptGap
頭 3 個數值如上,不再解釋,第 4 個是 100myTxType,而我定義重複掣的 myTxType = 0,所以第 4 個數值必定是 0。

最後 100RptGap 的 RptGap 是重複發射時,每一段訊號的分隔時間(μs)。如果沒註明 RptGap(即是以前的 3 個數值的重複掣),會用預設值 DefTxGap(=100000=0.1s)。
例如以下的 fr50g150m 掣,是強掣重複 50 次,間隔時間為 150ms(=150000μs,100RptGap=15000000),整個掣的 Button 行就是:
<button label="fr50g150m" labelSize="12.0" span="3">0 100000 5000 0 15000000</button>

下圖顯無預設和有預設分隔時間的分別:
gap.gif

但如果跟在重複掣後面真正要重複發射的掣是使用我新自定的編碼方式做出來,而這個掣本身已有特定的間隔時間(例如我自定的 NEC protocol 編碼方式,詳情請看下面「myTxType=2,NEC Protocol」),就會跟個訊號本身的間隔時間。

慎用強制重複,尤其用於 Vol+ 掣,事關不能終止,錯誤使用會一直提高音到爆聲,想終止提高音量唯有擋住粒 IR LED 直到重複發射次數完成,又或者按 Reset 掣。

雖然使用強制重複發射有一定的風險,但我仍然加入這種重複發射方式。事關屋企老人家睇電視時開得好大聲,而我就好怕下次一開電視就好大聲(尤其半夜想開電視睇)。雖然電視機有 Mute 掣可立刻變靜音,不過現在的電視普遍都要時間去「開機」,剛開機後可能要等一兩秒才可接受下一步的操作,按 Power 掣後如果太快按 Mute 掣,電視機根本收不到 Mute 掣,按得太遲的話,已經響出聲。唯有想到用 Macro 掣,熄電視前先將部機靜音。不過又面對另一個問題,因為我部電視機如果先用 Mute 掣靜音後熄機,當下次開機時會自動 Unmute 變回原來的音量,結果又係照舊一開機就好大聲。於是又想到先重複降低音量然後才熄機,不過,如果用之前的可終止的重複發射掣去重複降低音量,會因為後面跟住個 Power 掣而立刻終止重複降低音量的動作,結果就做了這個強掣重複發射的掣。

不過,用 irplus LAN 發出 Macro 掣時只會將 Macro 內所有掣一個接一個的傳送出去。當我想先收細音量才熄電視,收細音量所需的時間可能長達數秒,本 Server 不會在這段時間接收新 Button,跟在後面的電視機 Power 掣可能因為太耐無被接收而 Timeout 消失了,因此製作 Macro 掣時要在 Power 掣前加入幾秒間隔時間,irplus LAN 會等幾後才送出 Power 掣,確保 Power 掣不會因為太早送出而 Timeout。

而寫 Macro 掣時插入等候時間的寫法是在兩個掣之間插入:
{xxxx}
當中的 xxxx 是等候時間(ms)。雖然用 irplus LAN 的 Macro 介面設定間隔時間時最長只可以設定到 5000ms,但我試過事後用人手打開設定檔更改時間,可改到超過 5000ms。

以原裝 irplus Raw 格式的 RawVol- 掣去做先收細音量然後熄電視的 Marco 掣 RawV-P 為例,整個 Button 行是:
<button label="RawV-P" labelSize="12.0" span="3" macro="true">[BrandName - ModelNo];fr50g150m;[BrandName - ModelNo];RawVol-;{10000};[BrandName - ModelNo];myNecPwr;</button>

按這個「RawV-P」的 Macro 掣後 irplus LAN 會先連續送出 fr50g150m 及 RawVol- 掣,等 10 秒後才送出 Power 掣。
RawV-P.gif

RawVol- 本身長度約為 68ms,而強制重複掣設定間隔時間是 150ms,發射 1+50 次 RawV- 的時間為 51x68+50x150,大約是 11s,為何在 Power 掣之前只需插入 10s 等候時間!?

原因是 irplus LAN 發出的掣,Router 亦會保留幾秒去等待接收方作出反應,所以中間無需要等足發射 1+50 次的時間。當然,等足 11s 亦無妨。

雖然我整這個 Macro 掣的原意是想熄電視前先收細音量,但其實一樣可以用來開電視,因為電視機本來就無開著,初頭發射的幾十下降低音量訊號根本無對部電視機無作用,只係按掣後要等前面幾十下降低音量訊號發射完才開著部電視。

其實,既然用 irplus LAN 做 Macro 掣時可在中途插入間隔時間,想到先收細音量後熄機的目的,也可用可終止的重複發射加 Vol- 掣,只要在後面插入足夠的間隔時間,重複收細音量的動作就不會被跟在後面的 Power 掣去終止。不過當初我不知道原來做 Macro 掣可在中途插入間隔時間,所以才會再額外做個強制重複的方式。雖然後來發現其實無必要,但既然都做了出來,就由得它保留下來,當是多一個做重複發射的選擇。




myTxType = 2 NEC Protocol
以下是我自定的 NEC Protocol 編碼格式:
0 100000 R 200 100B3 100B2 100B1 100B0 0

頭三個數值同重複掣一樣,不再解釋。我自定的 NEC 掣編碼方式,可以預定重複發射次數,即係只需按一個掣就重複發射。如果無需要事先設定重複發射次數,可以設定 R=0。

第四個數值是 100myTxType,我定義 NEC Protocol 的 myTxType=2,所以這個數值必定是 200。

之後 100B3 100B2 100B1 100B0 的 B3~B0 就是 32bit NEC 數值的 4 個 Byte,每 Byte 要乘 100 倍。

至於最後的 0,是由於前面一共有八個數值,而 irplus 的 Raw 格式設定檔內每個掣的時脈數量必定要是單數,因此需要在最後補多一個 0。

以我部使用 NEC Protocol 的 LG 電視機為例,Vol- 掣的 32bit NEC Hex 數值是 0x20DF 0xC03F,將這 4 byte 轉做 10 進制就是 32、223、192、63,這個掣的無預設重複次數的編碼就是:
0 100000 0 200 3200 22300 19200 6300 0
註,當使用 Web browser 由本 Server 讀取 NEC 遙控訊號時所顯示的一行 My irplus code 就是這一行數值。

整個 Button 行就是:
<button label="myNecVol-" labelSize="12.0" span="3">0 100000 0 200 3200 22300 19200 6300 0</button>

下圖分別是長按原裝遙控器 Vol- 掣,以及用 fr50g150m 重複掣加我的 NEC 編碼的降低音量掣 myNecVol- 所錄得的訊號波形。
RptMyNec.gif

雖然重複掣設定間隔時間為 150ms,但由於跟在後面的 myNecVol- 掣用我的 NEC 編碼做出來,所以不會理會前面重複掣所設定的間隔時間,而係跟從 NEC Protocol 本身的間隔時間。因此同原裝遙控器的訊號大致上是一樣。

以下是用 Macro 方式先收細音量(myNecVol-)再熄電視的訊號波形:
V-P.gif

這個 V-P 的 Macro 掣,整個 Button 行是:
<button label="V-P" labelSize="12.0" span="3" macro="true">[BrandName - ModelNo];fr50g150m;[BrandName - ModelNo];myNecVol-;{4000};[BrandName - ModelNo];myNecPwr;</button>

同之前用 RawV-P 比較,之前係發射 1+50 次主訊號,而 V-P 是發射 1 次主訊號加 50 次重複訊號。對我部電視機來講,會有實際分別。同樣是 1+50 次,全部是主訊號的話,電視機只會一下又一下的降低音量,原成後,音量只降低了 51 度(整個音量範圍是 0~100);但發射 1 下主訊號後加 50 下重複訊號的話,當部電視機收到頭幾下重複訊號後,便會開始加快音量下降速度,結果會總共降低大約 70 度。

當重播錄影檔案時用左右箭嘴飛片的話,分別更明顯,重複發射幾十次箭嘴的主訊號,可能只跳到一兩分鐘位置,但一下主訊號加幾十下重複訊號,足以成條片由頭飛到落尾。




原本打算聖誕假期放這個新版本上來,但臨時有事做,拖下拖下就拖了個幾兩個月。

暫時只做了 NEC Protocol 的解碼及發射程序,事關目前我屋企所有有遙控的電器,全部都是用 NEC Protocol,我沒其他電器去試其他 Protocol。如有需要,可參巧 myDecodeNec() 及 myTxNec()的寫法,再寫其他遙控 Protocol 的解碼/發射程序(其實 Mark Szabo 的 IRremoteESP8266 library 本身都可解碼/發射多種不同 Protocol,但我懶得詳細去睇用法,寧願自己寫) 。

其實,irplus LAN 可以準確傳送 1 Byte 到 ESP8266,即係任何數值都可以分開 1 Byte 又 1 Byte 的用 irplus LAN 傳送,本 Server 不再侷限用來發射紅外線遙控號,例如可以自定一個 myTxXXX()程序,跟根據接收到的數值去做其他事,就好似控制一條 I/O pin 輸出 H or L,用來駁 Relay 去控制一件電器的電源開關。

圖片附件: ReadNEC.gif (2021-2-16 22:40, 34.3 KB) / 下載次數 223
https://www.hkepc.com/forum/attachment.php?aid=2249360&k=adf9c5f2dd462efc570b74da3493ba4d&t=1781679495&sid=18r2mxuX7k



圖片附件: r30.gif (2021-2-16 22:41, 25.17 KB) / 下載次數 170
https://www.hkepc.com/forum/attachment.php?aid=2249361&k=737ff9cc3289acdd4625d9cfb9c8c5e5&t=1781679495&sid=18r2mxuX7k



圖片附件: gap.gif (2021-2-16 22:42, 20.97 KB) / 下載次數 176
https://www.hkepc.com/forum/attachment.php?aid=2249362&k=eeebad92fa3e0a09083d77467e38264e&t=1781679495&sid=18r2mxuX7k



圖片附件: RawV-P.gif (2021-2-16 22:42, 13.85 KB) / 下載次數 175
https://www.hkepc.com/forum/attachment.php?aid=2249363&k=fa9181f1a612ccb41b032ca231e43f02&t=1781679495&sid=18r2mxuX7k



圖片附件: RptMyNec.gif (2021-2-16 22:42, 19.09 KB) / 下載次數 172
https://www.hkepc.com/forum/attachment.php?aid=2249364&k=4d828a61cb59306a25fcaa47f299ccb0&t=1781679495&sid=18r2mxuX7k



圖片附件: V-P.gif (2021-2-16 22:43, 11.8 KB) / 下載次數 185
https://www.hkepc.com/forum/attachment.php?aid=2249365&k=fbeff11868c2ead6ce9a74aa8f8eba25&t=1781679495&sid=18r2mxuX7k



圖片附件: DemoIrplus.gif (2021-2-17 04:07, 21.42 KB) / 下載次數 194
https://www.hkepc.com/forum/attachment.php?aid=2249387&k=9d627cb51b130d7518b9aae0406e04c8&t=1781679495&sid=18r2mxuX7k



圖片附件: SimpleSetup.gif (2021-2-17 22:08, 67.49 KB) / 下載次數 208
https://www.hkepc.com/forum/attachment.php?aid=2249535&k=f259333b8b06c7e364df63207ebc9679&t=1781679495&sid=18r2mxuX7k


作者: C_Law    時間: 2021-5-14 22:22

本帖最後由 C_Law 於 2021-8-7 16:18 編輯

Version 2.1
這版本有以下改動:
1. 將變數名稱 myTxType 改名為 myCmdType,事關每個指令不局限用於發射遙控訊號,改名比較合理。
2. 重寫 TxOriginal,以 ReadRawLine() 讀取原裝 irplus 的 raw 格式指令。
3. 新增 myCmdType = 1,自製發射 Raw 格式訊號的指令。
4. 新增 myCmdType = 999,開/關 Debug Mode。

這版本新增的各個示範指令的遙控掣,已加入遙控器設定示範檔 Raw.irplus 內。
Uploaded_via_HKEPC_IR_Pro_Android(c8270).jpg




到以下網址下載 Ver 2.1:
https://sites.google.com/site/chineseinput/electronics/esp8266irserver

將 ESP8266IRServer_2_1.rar 解壓後可得到以下檔案:
a. ESP8266IRServer_2_1.ino  本 Server 的程式
b. Raw.irplus  Raw 格式 irplus 遙控器設定示範檔
c. Readme.html  說明檔
d. CommandList.html  所有可用的指令

同過往的版本一樣,上載到 ESP8266 前必需先修改:
SSID/Password
Port no.

如有需要,亦可修改 I/O pin no.,及 LED_ON 的預設值。




新增功能
本版本新增以下兩個功能:
myCmdType = 1,自製發射 Raw 訊號的指令格式。
myCmdType = 999,開/關 Debug Mode。




myCmdType = 1,自製發射 Raw 格式訊號的指令。
以下是我自定的 Raw 編碼指令格式:
0 100000 R 100 f 100MLen scale m1 s2 m3...mX MGap rm1 rs2 rm3...rmX RGap

如需使用 Web browser 發出指令,需要在開頭再加上:
http://ip-address:port-no/?carrier=HZ&code=
ip-address:port-no = 本 Server 的 ip address 和 Port no.
Hz,為配合原裝 irplus lan 的格式,必需在這裡加入 Carrier frequency。不過,實際會跟後面指令的 f 數值。但如果後面的 f = 0,便會使用前面的 Hz 數值。

例如:
http://192.168.1.123:80/?carrier=38000&code=0 100000 R 100 f 100MLen scale m1 s2 m3...mX MGap rm1 rs2 rm3...rmX RGap

頭 3 個數值同重複掣一樣,27# 的 myTxType = 0 已有詳細解譯,不再在此重複。

第 4 個數值是 100myCmdType,我定義我自製發射 Raw 格式訊號的 myCmdType = 1,因此第 4 個數值必定是 100

第 5 個數值 f 是這遙控訊號的 Carrier frequency(Hz)。如果 f = 0,將會使用 irplus config. file header 內的 Carrier frequency。

第 6 個數值是 100MLen。有些遙控訊號分開主訊號和重複訊號兩截,例如 NEC Protocol,當長按遙控掣,主訊號只會發射一次,之後重複發射重複訊號直至放開遙控掣。MLen 就是主訊號的 Mark + Space 總數量,由第一個 Mark 到重複訊號之前的 Space,因此 MLen 必定是雙數。這數值需要乘 100 倍變 100MLen

如果這訊號沒分開主訊號和重複訊號,而係相同的訊號不斷重複(例如 Panasonic protocol),需設定 MLen = 0

第 7 個數值是 Scale。之前在 13#、16# 和 27# 有提過,使用 Raw code 時,irplus LAN 實際發送出去的 Pulse length 會跟 config. file 內的數值略有不同,Scale 是用來修正這誤差,可以是 1 或者 100。

如果不需作出修正,可設定 Scale = 1,其實一般有遙控功能的家電,接收遙控訊號時都容許有一定的誤差,就算不修正,應該都可以正常遙控得到。

如果需要修正便要設定 Scale = 100。而緊接在後面的所有 Pulse length 數值(包括 Gap space) 都要乘 100 倍。

後面的 m1 s2 m3...mX MGap 是主訊號的 Pulse length(μs),由第一個 Mark(m1) 到最後一個 Mark(mX),以及緊接在主訊號後面的一個 Space(MGap)。如果 Scale = 100,每個數值都需要乘 100 倍。如果沒有主訊號和重複訊號之分(MLen = 0),可省略這部份。

再後面的 rm1 rs2 rm3...rmX RGap 是重複訊號的 Pulse length(μs),由第一個 Mark(rm1)到最後一個 Mark(rmX),以及緊接在後面的一個 Space(RGap)。如果 Scale = 100,每個數值都要乘 100 倍。

以下是幾種我遇見過的遙控訊號實例:
1. 分主訊號和重複訊號
2. 重複發送相同訊號
3. 梅花間竹重複發送兩個不同訊號
4. 只發送一次訊號

新的自製 Raw 格式指令可做到以上 4 種的效果。

1. 分主訊號和重複訊號(例如 NEC Protocol)
以下是一個典形 NEC protocol 訊號的波形(來自一部山寨 DVD Player 的 Play 掣):
AD1.gif

這種訊號會先發射一段主訊號,然後以固定間隔時間重複發射另一段訊號。如果以本 Server 讀取這訊號,所得的結果會類似:
Button 1
(68)8950 4460 560 567 530...(部份省略)...560 (39587)
    NEC: 0x00FF 0xB847
    My irplus code: 0 100000 0 200 0 25500 18400 7100 0
(4)8982 2179 560 (95351)
    NEC: Repeat
(4)8979 2179 552 (95359)
    NEC: Repeat
(4)8924 2240 529 (95374)
    NEC: Repeat


第一行 Pulse length 是主訊號。開頭括號內的數值就這一行的 Mark 和 Space 總數量,即是 MLen。後面就是 m1 s2 m3...mX,而最後的括號內數值就是 MGap

第二行 Pulse length 是重複訊號,開頭括號之後的數值就是 rm1 rs2  rm3,而最後的括號內的數值就是 RGap

如果要做一個掣去非強制重複這訊號 5 次(r =5, ie. R=50000)、Carrier frequency=f=38000Hz、不作 Pulse length 修正(Scale = 1),整個指令是(示範檔內的 myRawNec+r5):
0 100000 50000 100 38000 6800 1 9046 4562 621 568 590...(部份省略)...563 39723 9046 2290 590 96021

以下是比較原裝遙控器(上)及經本 Server 用以上指令(下)發射出來的訊號波形:
AD2.gif

放大主訊號部份:
AD3.gif

2. 重複發送相同訊號(例如 Panasonic protocol)
以下是長按一部 Panasonic VCR 遙控器 Play 掣所錄得的訊號波形:
PV1.gif

這種訊號會以固定間隔不斷重複。如果以本 Server 讀取這訊號會得到類似以下結果:
Button 1
(100)3489 1752 415 453 415...(部份省略)...415 (74269)
    Unknown type
(100)3486 1751 415 453 415...(部份省略)...415 (74268)
    Unknown type
(100)3479 1759 415 453 415...(部份省略)...423 (74267)
    Unknown type

每行 Pulse length 的數值都大同小異,只是讀取訊號時有小許數值上的偏差,每一節都是相同的訊號。

由於沒主訊號,所以 MLen = 0,而且沒有 m1 s2 m3...mX MGap。每一節訊號的頭一個 Mark 到最後一個 Mark 就是 rm1 rs2 rm3...rmX,而最後在括號內的數值就是每節訊號的分隔時間 RGap
PV2.gif

如果要做一個掣去強掣重複這訊號 3 次(fr=3, ie. R = 300)、Carrier frequency = f = 38000Hz、不作 Pulse length 修正(Scale = 1),整個指令是(示範檔內的 myRawPana+fr3):
0 100000 300 100 38000 0 1 3489 1752 415 453 415...(部份省略)...415 74269

以下是比較原裝遙控器(上)及經本 Server 用以上指令(下)發射出來的訊號波形:
PV3.gif

放大一節訊號:
PV4.gif

3. 梅花間竹重複發送兩個不同訊號(例如 Sharp protocol)
以下是長按 Sharp 電視機遙控器 Vol+ 掣所錄得的訊號波形:
ST1.gif

如果以本 Server 讀取這訊號會得出以下結果:
Button 1
(32)301 1737 247 750 255 751 246 751 255 750 247 1752 246...(部份省略)...254 (43751)
    Unknown type
(32)277 1733 247 751 254 751 247 751 254 751 246 751 247...(部份省略)...246 (41745)
    Unknown type
(32)331 1682 300 705 301 697 247 758 300 698 300 1698 300...(部份省略)...254 (43733)
    Unknown type
(32)346 1683 300 697 301 705 300 697 300 705 301 697 300...(部份省略)...300 (41677)
    Unknown type

驟眼看波形就好似上面 Panasonic protocol 的遙控訊號,重複發送一個訊號。但如果看讀取到的遙控時脈數值會發現頭兩行數值的後半段是不一樣,將波形放大來看也可看到兩段波形是不一樣。整個訊號是每兩行(A 和 B)的不斷重複,即是 A B A B...的重複發射。
ST2.gif

我會將兩行訊號駁埋當一組訊號去處理(A+B),而每組訊號不停重複。
ST3.gif

由於是整個訊號(A+B)重複,無分主訊號和重複訊號,所以 MLen = 0,而且沒有 m1 s2 m3...mX MGap

至於 rm1 rs2 rm3 ... rmX 就是整個 A 段由第一個 Mark 到最後括號內的 Space,再加上 B 段由第一個 Mark 到最後一個 Mark,而 RGap 就是 B 段最後括號內的 Space。

如果要做一個掣去強掣重複這訊號 3 次(fr=3, ie. R = 300)、Carrier frequency = f = 38000Hz、修正 Pulse length(ie. Scale = 100),後面所有 Pulse length 要乘 100,指令是(示範檔內的 myRawSharp+fr3+Scale):
0 100000 300 100 38000 0 100 30100 173700 24700...(部份省略)...25400 4375100 27700 173300 24700...(部份省略)...24600 4174500

以下是比較原裝遙控器(上)及經本 Server 用以上指令(下)發射出來的訊號波形:
ST4.gif

放大一節 A 訊號:
ST5.gif

放大一節 B 訊號:
ST6.gif

ps. 屋企以前用 Sharp 的大牛龜電視機,當時測試過,將遙控訊號改為 A B B B B B... 都遙控得到。因此也可以用第一種分主訊號(A)和重複訊號(B)的方式去做這遙控掣。又或者掉轉用 B 行先之後係 A 都得。

4. 只發送一次訊號(例如冷氣機遙控訊號)
以下是長按我屋企部古董「凶宅」冷氣機(日立OEM 年代)遙控掣所錄的訊號波形:
HA1.gif

如果以本 Server 讀取這訊號會得到類以以下結果:
Button 1
(211)3363 3386 407 1283 407 438 407...(部份省略)...408
    Unknown type

   
雖然是長按遙控掣,但遙控器只會發出一次訊號,不會重複。很多冷氣機都是用這種遙控方式。

我會將這種訊號視作是分開主訊號和重複訊號處理,不過係無重複訊號。
HA2.gif

由於這訊號不會重複,如果以本 Server 去讀取訊號,所讀到的數值只會是由第一個 Mark 到最後一個 Mark,總數量會是單數,因此開頭括號內的數值會是單數,而由於我定義 MLen 是由第一個 Mark 到最後一個 Mark 之後的 Space,因此 MLen 會是開頭括號內的數值 211 + 1 = 212

至於 m1 s2 m3 ... mX 就是開頭括號內之後的所有數值。

至於 MGap,雖然這訊號不會重複,但由於原裝 irplus LAN 的 Raw 格式 Code 的數量必定係單數,而 myCmdType=1 的指令開頭有 7 個數值(單數),再加上這個訊號由 Mark 到最尾的 Mark 的數量又係單數,夾埋是雙數,因此最尾都要加多一個數值,令總數量變成單數,所以要在最尾補一個 MGap = 0

最後的 rm1 rs2 rm3 ... rmX RGap,由於這訊號不會重複,可以省略。

整個指令是(示範檔內的 myRawHitachiAC):
0 100000 300 100 38000 21200 1 3363 3386 407 1283 407 438 407...(部份省略)...408 0
當中的:
R = 300 = 強制重複 3 次(*)
100myCmdType = 100
f = 38000Hz
100MLen = 100*(211+1) = 21200
Scale = 1 = 不修正 Pulse length

以下是比較原裝遙控器(上)及經本 Server 用以上指令發射出來的訊號的波形(下):
HA3.gif

(*)正常來講,這種訊號不會重複發射,所以應該是 R=0。我故意在示範檔內用強制重複 3 次,目的是想講解使用這指令時即時有重複次數,但實際都只是發射訊號一次。如果按這掣之前先按重複掣,結果都會是一樣只發射一次。

放大訊號部份:
HA4.gif




myCmdType = 999,開/關 Debug Mode。
開/關 Debug mode,指令是:
0 100000 0 99900 0

頭 3 個數值跟重複掣一樣,27# 的 myTxType = 1 已有詳細解譯,不再在此重複。由於這指令不涉及重複發射,因此第 3 個數值 R 不會影響結果,用 0 就可以,反正最終在 myDebugMode() 內都會將重複發射的數值重置為 0。

第 4 個數值 100myCmdType,我定義開/關 Debug mode 的 myCmdType = 999,所以這數值必定是 99900。

第 5 個數值必定是 0。由於原裝 Raw 格式的 irplus config. file 內每個掣的編碼都是由第一個 Mark 到最後一個Mark,數量必定是單數,而這個指令之前只有 4 個數值,所以必需在後面補多一個 0。

Debug mode 的作用是方便我寫這個 Sketch 時做 Debug。可於 Sketch 內有需要的位置加入 if (myDebug){Do something;} 去做其他事,例如 serial.print 當時某些 variable 的數值。如覺得無需要,可刪除 Sketch 內所有 if(myDebug) {} 相關的程式碼。

Debug mode 預設是 false。用這指令可切換成 true/false。

ps. 啟用 Debug mode 後,由於中途需要時間去執行一堆 if (myDebug{},因此發射出去的遙控訊號會略有不同。

以下是遙器示範檔內 myRawNec+r5 掣的指令:
0 100000 50000 100 38000 6800 1 8950 4460 560 567 530 567 560 568 552 567 507 598 552 568 560 560 529 575 552 1691 529 1698 552 1667 560 1690 530 1690 560 1661 559 1691 506 1713 560 1667 553 567 560 1667 553 1690 529 1691 559 568 529 568 560 567 552 568 529 1698 552 568 529 568 560 567 553 1667 560 1689 506 1713 560 39587 8982 2179 560 95351


開啟 Debug mode 後,用手機發送示範檔內的 myRawNec+r5 掣時,會 serial.print 出以下資料:
ReadRawLine result:True
0 98800 49400 104 37544 6708 0 8840 4394 546 572 520 572 546 572 546 572 494 598 546 572 546 546 520 572 546 1664 520 1690 546 1638 546 1664 520 1664 546 1638 546 1664 494 1690 546 1638 546 572 546 1638 546 1664 520 1664 546 572 520 572 546 572 546 572 520 1690 546 572 520 572 546 572 546 1638 546 1664 494 1690 546 39104 8866 2158 546 94198 1
MLen=68 *FirstRptMarkIdx=68 *FinalMarkIdx=70 i=74
idx:Buf[idx]
0:8840 1:4394 2:546 3:572 4:520 5:572 6:546 7:572 8:546 9:572 10:494 11:598 12:546 13:572 14:546 15:546 16:520 17:572 18:546 19:1664 20:520 21:1690 22:546 23:1638 24:546 25:1664 26:520 27:1664 28:546 29:1638 30:546 31:1664 32:494 33:1690 34:546 35:1638 36:546 37:572 38:546 39:1638 40:546 41:1664 42:520 43:1664 44:546 45:572 46:520 47:572 48:546 49:572 50:546 51:572 52:520 53:1690 54:546 55:572 56:520 57:572 58:546 59:572 60:546 61:1638 62:546 63:1664 64:494 65:1690 66:546
*MGap=39104
idx:Buf[idx]
68:8866 69:2158 70:546
*RGap=94198
End of ReadRawLine()

myTxRaw
Main stream:TxRaw()  CodeLen=67,  Hz=38000
idx:Buf[idx]
0:8840 1:4394 2:546 3:572 4:520 5:572 6:546 7:572 8:546 9:572 10:494 11:598 12:546 13:572 14:546 15:546 16:520 17:572 18:546 19:1664 20:520 21:1690 22:546 23:1638 24:546 25:1664 26:520 27:1664 28:546 29:1638 30:546 31:1664 32:494 33:1690 34:546 35:1638 36:546 37:572 38:546 39:1638 40:546 41:1664 42:520 43:1664 44:546 45:572 46:520 47:572 48:546 49:572 50:546 51:572 52:520 53:1690 54:546 55:572 56:520 57:572 58:546 59:572 60:546 61:1638 62:546 63:1664 64:494 65:1690 66:546
End of TxRaw()

MGap=39104
TxRpt=5
TxRaw()  CodeLen=3,  Hz=38000
idx:Buf[idx]
0:8866 1:2158 2:546
End of TxRaw()

...(部份省略)...

TxGap=94198
TxRpt=1
TxRaw()  CodeLen=3,  Hz=38000
idx:Buf[idx]
0:8866 1:2158 2:546
End of TxRaw()


註:
ReadRawLine result:True 之下的一行數值,是本 Server 實際從 irplus LAN 接收到的數值。之前提過 irplus LAN 會改變遙控器設定檔內的數值才發送出去,這裡可見實際收到的數值與設定檔內的數值是不一樣。除此之外,最後還多了一個 1,這是 irplus LAN 額外加上去的 Space(以前有提過,估計 irplus 作者是刻意用一個 Space 結尾,以確保到最後關掉 IR LED),如果這指令是由 Web browser 發出,將不會有最後的這個數值。

由於 myRawNec+r5 掣的指令並無修正 Pulse length(Scale = 1),所以一堆 idx=Buf[idx] 的數值與當初用本 Server 向實體遙控器讀取到的 Pulse length 不一樣。

如果想修正 Pulse length,需要在指令內使用 Scale = 1,並且將所有 Pulse length 數值乘 100 倍。例如示範檔內的 myRawSharp+fr3+Scale 掣。

以下是由本 Server 讀取 Sharp 電視機遙控器的 Vol- 訊號所得的 Pulse length 數值:
Button 1
(32)301 1737 247 750 255 751 246 751 255 750 247 1752 246 759 246 1752 247 758 247 1751 247 856 193 705 247 758 247 1751 247 751 254 (43751)
    Unknown type
(32)277 1733 247 751 254 751 247 751 254 751 246 751 247 1759 247 751 246 1759 247 751 247 1751 254 1750 255 1751 247 751 247 1759 246 (41745)
    Unknown type


以下是遙控器示範檔內使用 Scale = 100 以及所有 Pulse length 乘 100 倍的 myRawSharp+fr3+Scale 掣的指令:
0 100000 300 100 38000 0 100 30100 173700 24700 75000 25500 75100 24600 75100 25500 75000 24700 175200 24600 75900 24600 175200 24700 75800 24700 175100 24700 85600 19300 70500 24700 75800 24700 175100 24700 75100 25400 4375100 27700 173300 24700 75100 25400 75100 24700 75100 25400 75100 24600 75100 24700 175900 24700 75100 24600 175900 24700 75100 24700 175100 25400 175000 25500 175100 24700 75100 24700 175900 24600 4174500


以下是啟用 Debug mode 後使用 myRawSharp+fr3+Scale 掣所 Serial print 出來的資料:
ReadRawLine result:True
0 98800 286 104 37544 0 104 29744 171626 24414 74100 25194 74204 24310 74204 25194 74100 24414 173108 24310 74984 24310 173108 24414 74880 24414 173004 24414 84578 19058 69654 24414 74880 24414 173004 24414 74204 25090 4322604 27378 171210 24414 74204 25090 74204 24414 74204 25090 74204 24310 74204 24414 173784 24414 74204 24310 173784 24414 74204 24414 173004 25090 172900 25194 173004 24414 74204 24414 173784 24310 4124406 1
MLen=0 *FirstRptMarkIdx=0 *FinalMarkIdx=62 i=66
0:301 1:1737 2:247 3:750 4:255 5:751 6:246 7:751 8:255 9:750 10:247 11:1752 12:246 13:759 14:246 15:1752 16:247 17:758 18:247 19:1751 20:247 21:856 22:193 23:705 24:247 25:758 26:247 27:1751 28:247 29:751 30:254 31:43751 32:277 33:1733 34:247 35:751 36:254 37:751 38:247 39:751 40:254 41:751 42:246 43:751 44:247 45:1759 46:247 47:751 48:246 49:1759 50:247 51:751 52:247 53:1751 54:254 55:1750 56:255 57:1751 58:247 59:751 60:247 61:1759 62:246
*RGap=41745
End of ReadRawLine()

...以下省略...

雖然本 Server 從 irplus LAN 接收到的數值仍然與遙控器設定檔內的指令不同,但最終所得的一堆 idx:Buf[idx] 數值可還原到當初由本 Server 向實體遙控器讀取到的數值。

圖片附件: AD1.gif (2021-5-14 22:18, 6.61 KB) / 下載次數 179
https://www.hkepc.com/forum/attachment.php?aid=2263486&k=95829aafa60289723e808a5a9c1b6722&t=1781679495&sid=18r2mxuX7k



圖片附件: AD2.gif (2021-5-14 22:18, 8.23 KB) / 下載次數 178
https://www.hkepc.com/forum/attachment.php?aid=2263487&k=3284097e3a492caa3729e3c842903fbe&t=1781679495&sid=18r2mxuX7k



圖片附件: AD3.gif (2021-5-14 22:18, 9.48 KB) / 下載次數 156
https://www.hkepc.com/forum/attachment.php?aid=2263488&k=b5531aacae6fb97f698ba273def22d5f&t=1781679495&sid=18r2mxuX7k



圖片附件: PV1.gif (2021-5-14 22:18, 5.27 KB) / 下載次數 177
https://www.hkepc.com/forum/attachment.php?aid=2263489&k=297a7a378d11694b0420c39f16f4b390&t=1781679495&sid=18r2mxuX7k



圖片附件: PV2.gif (2021-5-14 22:18, 7.07 KB) / 下載次數 214
https://www.hkepc.com/forum/attachment.php?aid=2263490&k=48e9ec82963e39985ad752900b09c8e3&t=1781679495&sid=18r2mxuX7k



圖片附件: PV3.gif (2021-5-14 22:18, 9.66 KB) / 下載次數 179
https://www.hkepc.com/forum/attachment.php?aid=2263491&k=2d9fcc3223d6e3155064d6cbf2b85811&t=1781679495&sid=18r2mxuX7k



圖片附件: PV4.gif (2021-5-14 22:18, 9.61 KB) / 下載次數 157
https://www.hkepc.com/forum/attachment.php?aid=2263492&k=761854b05e17f9470602289dadf624c6&t=1781679495&sid=18r2mxuX7k



圖片附件: ST1.gif (2021-5-14 22:18, 5.95 KB) / 下載次數 178
https://www.hkepc.com/forum/attachment.php?aid=2263493&k=ed2b0064a153dd21e43cf0e1e356936b&t=1781679495&sid=18r2mxuX7k



圖片附件: ST2.gif (2021-5-14 22:18, 7.48 KB) / 下載次數 186
https://www.hkepc.com/forum/attachment.php?aid=2263494&k=3cc3ae26ef82862c837522b9c4ba035b&t=1781679495&sid=18r2mxuX7k



圖片附件: ST3.gif (2021-5-14 22:18, 7.49 KB) / 下載次數 175
https://www.hkepc.com/forum/attachment.php?aid=2263495&k=aebf593fea02979ee36603d8eb8511c1&t=1781679495&sid=18r2mxuX7k



圖片附件: ST4.gif (2021-5-14 22:18, 8.65 KB) / 下載次數 179
https://www.hkepc.com/forum/attachment.php?aid=2263496&k=e776fcb9f3464f49ad1ecba58be622dc&t=1781679495&sid=18r2mxuX7k



圖片附件: ST5.gif (2021-5-14 22:18, 7.81 KB) / 下載次數 190
https://www.hkepc.com/forum/attachment.php?aid=2263497&k=a3442908f310492c69626a2d04491149&t=1781679495&sid=18r2mxuX7k



圖片附件: ST6.gif (2021-5-14 22:18, 7.84 KB) / 下載次數 191
https://www.hkepc.com/forum/attachment.php?aid=2263498&k=588fe4e6ad4bd5e8e71084654c256e25&t=1781679495&sid=18r2mxuX7k



圖片附件: HA1.gif (2021-5-14 22:19, 4.15 KB) / 下載次數 179
https://www.hkepc.com/forum/attachment.php?aid=2263499&k=7ebb9d93d854e9cfc95dfd1785831681&t=1781679495&sid=18r2mxuX7k



圖片附件: HA2.gif (2021-5-14 23:37, 7.39 KB) / 下載次數 169
https://www.hkepc.com/forum/attachment.php?aid=2263500&k=ee9681e83b0fdfa1a4598c41e142f767&t=1781679495&sid=18r2mxuX7k



圖片附件: HA3.gif (2021-5-14 22:19, 6.65 KB) / 下載次數 163
https://www.hkepc.com/forum/attachment.php?aid=2263501&k=6e0bd7b7ea4b0726af9e24da1b6aeec8&t=1781679495&sid=18r2mxuX7k



圖片附件: HA4.gif (2021-5-14 22:19, 13.68 KB) / 下載次數 158
https://www.hkepc.com/forum/attachment.php?aid=2263502&k=7d83423ccfb21b9d5b998811573249ec&t=1781679495&sid=18r2mxuX7k



圖片附件: Uploaded_via_HKEPC_IR_Pro_Android(c8270).jpg (2021-5-14 23:01, 131.17 KB) / 下載次數 152
https://www.hkepc.com/forum/attachment.php?aid=2263504&k=1ef7e73f6318121cc877766484018de5&t=1781679495&sid=18r2mxuX7k


作者: C_Law    時間: 2021-8-6 19:27

本帖最後由 C_Law 於 2021-8-7 16:19 編輯

Version 2.2
這版本有以下改動:
1. 新增 myCmdType = 990,ReDirect,將指令轉發到另一個 IR Server。

這版本新增的各個示範指令的遙控掣,已加入遙控器設定示範檔 Raw.irplus 內。
Screenshot_Ver2_2.jpg

註:
由於轉發功能涉及另一個 IR Server 的 IP-Address 和 Port No.,因此示範檔內的 RD2B 及 RD2B20myNecVol- 兩個掣都需要因應實際情況作出修改才可正常使用。




到以下網址下載 Ver 2.2
https://sites.google.com/site/chineseinput/electronics/esp8266irserver

將 ESP8266IRServer_2_2.rar 解壓後可得到以下檔案:
a. ESP8266IRServer_2_2.ino  本 Server 的程式
b. Raw.irplus  Raw 格式 irplus 遙控器設定示範檔
c. Readme.html  說明檔
d. CommandList.html  所有可用的指令

同過往的版本一樣,上載到 ESP8266 前必需先修改:
SSID/Password
Port no.

如有需要,亦可修改 I/O pin no.,及 LED_ON 的預設值。




新增功能
myCmdType = 990,ReDirect,將 Command 轉發至另一個 IR Server。

irplus LAN 本身只可設定將指令發送到一個指定 IP-Address:Port no. 的 IR Server,如果想控制另一個 IR Server 便要修改 irplus LAN 的設定。即使用 Android 手機的應用雙開功能開多一個 irplus LAN,都只可控制到兩個 IR Server,而且要分開兩個 irplus LAN 去分別控制,使用上多小有點不便。以一個一廳兩房的住宅單位來講,如果想廳和每間房都想各自放個 IR Server(一共 3 個),當需要控制第三個 IR Server,便一定要改其中一個 irplus LAN 的設定。

有見及此,本版本新增轉發功能,將其中一個 IR Server 視作主 Server(A),當主 Server 收到轉發指令就會將相關指令轉發到指定的 IR Server(B),從而做到用一個 irplus LAN 控制多個 IR Server。
Redirect.gif

以下是兩種轉發方式的指令:
1.轉發掣,指示主 Server 將下一個指令轉發出去。
2.合拼轉發掣,將轉發指令和被轉發的指令合併成一個指令。




1.轉發掣
轉發掣指令內有目標 Server 的 IP address 和 Port No.,用法就好似重複掣,當主 Server 收到重複掣指令便會亮起 LED,表示正在等待下一個指令,這時候再按另一個掣,主 Server 就會將這個掣的一個指令轉發去剛才指定的目標 Server 及關掉主 Server 的 LED。如果按下轉發掣後 3 秒內都無按下一個掣,主 Server 便會關掉 LED,表示終止等待。

轉發掣的指令格式如下:
0 100000 0 99000 100A 100B 100C 100D 100PortNo
頭 3 個數值在 27# 的 myTxType = 0 已有詳細解譯,不再在此重複。不過,由於轉發指令不涉及重複發射,所以第 3 個數值必定是 0

第 4 個數值是 100myCmdType,我定義轉發功能的 myCmdType = 990,因此第 4 個數值必定是 99000

第 5~8 個數值 100A 100B 100C 100D 是目標 Server 的 IP-Address A.B.C.D,每個數值都要乘 100 倍。

第 9 個數值 100PortNo 是要轉發到的 IR Server 的 Port no.,同樣,需要乘 100 倍。

假設 irplus LAN 設定控制 IP:Port = 192.168.1 50:8080 的主 Server(A)。如果想控制 IP:Port = 192.168.1.51:8081 的目標 Server(B),可以做以下的 RD2B(Redirect to B)轉發掣:
<button label="RD2B" labelSize="12.0" span="6">0 100000 0 99000 19200 16800 100 5100 808100</button>

如果想由 Server B 發射 myNecVol- 掣的 IR 訊號,可以先按下 RD2B 掣然後按 myNecVol- 掣,當 Server A 收到 RD2B 掣後再收到後面的 myNecVol- 掣,Server A 就會將後面 myNecVol- 掣的指令轉發去 Server B,然後由 Server B 發射 myNecVol- 掣的 IR 訊號。

如果想用一個掣完成以上動作,可以另外做一個 MacroRD2BmyNecVol- 的 Macro 掣:
<button label="MacroRD2BmyNECVol-" labelSize="12.0" span="6" macro="true">[BrandName - ModelNo];RD2B;[BrandName - ModelNo];myNecVol-;</button>
按一下 MacroRD2BmyNecVol- 掣等如先按 RD2B 再按 myNecVol-。

不過要注意,轉發掣只會將下一個按下的掣的頭一個指令轉發出去,如果下一個掣本身是 Macro 掣,只有 Macro 掣內頭一個指令會被轉發出去,其餘指令仍然會由主 Server 去處理。例如先按 RD2B 再按 Macro 掣 V-P(這個 Macro 掣的指令順序包括:強掣 50 下的重複掣、LG 電視機 Vol- 掣、等待 4 秒、LG 電視機 Power 掣),只有最頭的重複掣指令會轉發到 Server B(Server B 的 LED 會因此而亮起,表示正在等待將要重複發射的指令,但由於再無其他指令傳送 Server B,它的 LED 會在 3 秒後熄滅,表示已終止等待),V-P 掣餘下的指令將由 Server A 繼續處理,因此 Server A 會發出 1 下 Vol- 掣的 IR 訊號、等待 4 秒、發出 1 下 Power 掣 IR 訊號。

如果想 Server B 去做相當於 V-P 掣的動作,就要另外做一個 Macro 掣,在原本的 Macro 掣內的每個指令前插入 RD2B,即是:
RD2B、強掣 50 下的重複掣、RD2B、Vol- 掣、等 4 秒、RD2B、Power 掣。

注意,Macro 掣 V-P 內的等待時間,是由 irplus LAN 處理,所以不需要在之前加入 RD2B。irplus LAN 向主 Server 發出 Vol- 掣後會先等 4 秒才繼續發出餘下的 RD2B 和 Power 掣。

2.合拼轉發掣
雖然用 Macro 掣可以指示主 Server 將指令發送到另一個 Server,但由於 irplus LAN 發出 Macro 指令時會在每個指令之間插入小小間隔時間,所以用 Macro 掣去做轉發動作會有點反應遲頓。

為加快反應時間,轉發指令可以和被轉發的指令合拼成一個指令,一次過發送去主 Server,格式如下:
0 100000 0 99000 100A 100B 100C 100D 100PortNo Carrier Command

頭 9 個數值如上。

第 10 個數值 Carrier 是轉發後由另一個 Server 發出 IR 的 Carrier frequency,如果 Carrier=0,便會跟原本由 irplus LAN 發向主 Server 發出指令時時所指定的 Carrier frequency。如果跟在後面的指令本身帶有 Carrier frequecny(例如 myTxNEC、myTxRaw),便會跟後面指令的 Carrier frequency。

由第 11 個數值起的 Command,是任何可以用 WINLIRC_RAW 格式寫入設定檔的指令,例如:原裝 irplus 的 Raw 格式指令、myTxRaw、myTxNEC,或者其他 0 100000 開頭的「my乜乜物物」指令。但整個指令需乎合 irplus LAN 的 WINLRIC_RAW 格式設定檔的要求,即是整行指令必定有單數數量的數值。

假設想由 192.168.1.51:8081 的 Server B 發出可終止的重複 20 下 LG 電視機 Vol- 掣 的 IR 訊號:

轉發到 Server B 的指令如上面的轉發掣:
0 100000 0 99000 19200 16800 100 5100 808100

LG 電視機的 Vol- 訊號是 NEC protocol:0x20DF 0xC03F(相當於 10 進制的 32-223-192-63),以 myCmdType = 2 的方式重複發射 20 下這個可終止的指令是:
0 100000 200000 200 3200 22300 19200 6300 0

整個合拼轉發掣就是:
<button label="RD2B20myNecVol-" labelSize="12.0" span="12">0 100000 0 99000 19200 16800 100 5100 808100 38000  0 100000 200000 200 3200 22300 19200 6300 0</button>

中間紅字的數值是要 Server B 發射 IR 訊號時使用的 Carrier frequency,但由於後面屬於本身已有指定 Carrier frequency 的 myCmdType =2 的 NEC protocol 訊號,所以無論這紅字是什麼數值,都會使用 NEC protocol 預設的 38kHz。

如果後面的指令本身不包括 Carrier frequency(例如原裝  irplus LAN 的 Raw 格式),Server B 就會使用這紅字數值作為 Carrier frequency。如果這紅字數值是 0,Server B 就會使用原本由 irplus LAN 發向主 Server(A) 時所指定的 Carrier frequency。

按一下 RD2Br20myNecVol-,Server B 便會開始重複發射 1+20 下 LG 電視機的 Vol- 掣,由於這個掣後面的指令是可終止的重複發射指令,只需有新指令到達 Server B 便會立刻終止,而這個掣又是經主 Server A 轉發指令到 Server B,所以再按這掣可令 Server B 立刻終止重複發射。

雖然用合併轉發掣可以一次過將轉發指令和被轉發的指令送到主 Server,但由主 Server 再轉發去 Server B 仍然需要一段時間(我估要視乎當時 WiFi 的強弱、Router 整體流量、Router 本身的質素……等等的因素),情況良好的時候,Server B 可以近乎即時有反應,但即使是慢的時候,都明顯快過用 Macro 掣的方式分開發送轉發指令然後再發被轉發指令。

圖片附件: Screenshot_Ver2_2.jpg (2021-8-6 19:25, 44.85 KB) / 下載次數 157
https://www.hkepc.com/forum/attachment.php?aid=2276482&k=ff8229638d520108c1fd0a030b2b446d&t=1781679495&sid=18r2mxuX7k



圖片附件: Redirect.gif (2021-8-6 19:25, 8.69 KB) / 下載次數 179
https://www.hkepc.com/forum/attachment.php?aid=2276483&k=b5a64da95e6f43b36a961736faef9e5b&t=1781679495&sid=18r2mxuX7k


作者: gab    時間: 2021-8-8 18:14

複雜到睇緊外星文咁 xd
好很堅呀樓主
作者: C_Law    時間: 2021-10-3 17:00

本帖最後由 C_Law 於 2021-10-12 18:40 編輯

已改用 WeMos D1 mini 一段時間,現在才得閒 Post 相上來。

我用 2x18650 電池盒做外殼,夠放 WeMos D1 mini、萬用底板和其他零件。
Boxed.jpg

塊萬用板的駁線如下(Click 圖可放大):
Layout.gif

以下是這設定下,程式的開頭位置所需要作出的修改:
  1. /* For D1 mini board.*/
  2. const uint16_t IrIn = 0;      // From IR receiver=D3
  3. const uint16_t IrOut = 14;    // To IR LED driver=D5
  4. const uint16_t LED = 16;      // ## LED=D0

  5. bool LED_ON = true;  // ## false if LED was connected PULL_UP

  6. // Optional I/O pins for D1 mini board.
  7. /* ##
  8. const uint16_t IrInGnd=4;     //** Gnd for IR receiver=D2
  9. const uint16_t IrInVcc= 5;     //** Vcc for IR receiver=D1
  10. const uint16_t IrOutGnd=16;   // Gnd for IR LED=D0
  11. */
複製代碼
所有有關 Optional pin 都要移走或 Remark。

在 Setup 內的修改:
  1.   /*Optional for D1 mini*/
  2.   /* ##
  3.   pinMode(IrInGnd, OUTPUT);     // Optional, for D1 mini
  4.   digitalWrite(IrInGnd, LOW);   // Optional
  5.   pinMode(IrInVcc, OUTPUT);     // Optional
  6.   digitalWrite(IrInVcc, HIGH);  // Optional
  7.   pinMode(IrOutGnd, OUTPUT);    // Optional
  8.   digitalWrite(IrOutGnd, LOW);  // Optional
  9.   */
複製代碼
將萬用板裁到 1.5"x2.9" 後,再搵粗銼磨磨右邊,萬用板連塊 D1 mini 左邊凸出的位置,左右長度剛剛好可 Fit 入 2x18650 電池盒,我本來係塊板同個盒都開了窿諗住上螺絲固定塊板,但實際上只要塊板長度磨到剛剛好,連埋塊 D1 mini 裝入盒內係不會移位,可以螺絲都慳返。

不過我做錯了兩點,首先是初時想試個盒的上蓋是否是否剛好係 USB 插座位置,一開始就心急係盒的上蓋側面的正中央鎅開個口,事後才發覺應該將塊 WeMos 再向上推高兩行,令塊萬用板下面留更多空間,裝 IR LED 時可以更有彈性,容易扭去指住不同方向。

另一樣錯就係不應用 D0/GPIO-16 駁 LED,事後再睇返資料話用這條 Pin 有機會影響到 Upload 程式上去塊 D1 mini。(無真正查証是否這原因,但之前未裝 LED 前試過係 Upload 到,裝了之後再 Upload 就會 Fail,好在我塊 D1 mini 不是焊死上塊萬用板,只要拆返出來就可以正常 Upload)。(事後再試,似乎不關事)

萬用板的正面,我用普通 16 pin IC 座剪返開做兩排焊上萬用板,用來插塊 D1 mini:
CompSide.jpg

塊 D1 mini 焊上排針,就可以插上去萬用板的插座。
Socket.jpg

雖然排針的長度係過長,但我無剪短,由得塊 D1 mini 升高小小,因為放入盒後,從側面看,D1 mini 的 USB 座剛好係正個盒的上蓋邊,只需將上蓋鎅開個口就可以夠位插入 USB micro 線。如果剪短排針,就要上下蓋都要鎅開。不過,上蓋內原本有些用來固定電池的支撐膠片,要將部份削走,否則會頂位塊 D1 mini 不能合蓋。
EndView.jpg

背面:
SolderSide.jpg

我用這種夾,可以輕易扭去不同角度,將個 IR Server 夾上去屋企電視櫃的右邊:
Clamp.jpg

扭好兩粒 IR LED 的角度,就可以控制到相中見到的影音電器。
InUse.jpg

另外,有粒黃光 LED 用來做 Status LED,將它屈返向塊萬用板背面,方便自己睇。粒 LED 由 D1 mini 的 i/o pin 經 10kΩ 電阻再去 G,睇起來會好暗,但我係專登,不想睇電視時太過被這 LED 分心。
LED.jpg

今次我無裝到 IR Receiver,但原本程式內設定 IrIn 的 Pin mode 係 Pull up,所以無裝 IR receiver 也不會影響程式運作。而塊萬用板右上部份有好大空置面積,要裝返上去都好容易。

圖片附件: Clamp.jpg (2021-10-3 16:50, 22.95 KB) / 下載次數 189
https://www.hkepc.com/forum/attachment.php?aid=2285725&k=f0577684afc2710e2bc7976bc7826533&t=1781679495&sid=18r2mxuX7k



圖片附件: EndView.jpg (2021-10-3 16:50, 29.64 KB) / 下載次數 186
https://www.hkepc.com/forum/attachment.php?aid=2285726&k=6fb82f9b9bb3865af432ca685d4e56ce&t=1781679495&sid=18r2mxuX7k



圖片附件: Boxed.jpg (2021-10-3 17:05, 37.91 KB) / 下載次數 177
https://www.hkepc.com/forum/attachment.php?aid=2285737&k=d3795900d267326e683fb181c467d9ff&t=1781679495&sid=18r2mxuX7k



圖片附件: Layout.gif (2021-10-3 17:08, 36.99 KB) / 下載次數 177
https://www.hkepc.com/forum/attachment.php?aid=2285740&k=abb9b9b4d7949eef4732810b70d99cc1&t=1781679495&sid=18r2mxuX7k



圖片附件: CompSide.jpg (2021-10-3 17:25, 59.95 KB) / 下載次數 195
https://www.hkepc.com/forum/attachment.php?aid=2285741&k=e7f884d0295fa8cec52f92c6557fd003&t=1781679495&sid=18r2mxuX7k



圖片附件: SolderSide.jpg (2021-10-3 17:35, 71.76 KB) / 下載次數 160
https://www.hkepc.com/forum/attachment.php?aid=2285743&k=c742cc0dc2f54b1ab56041a01d258fe3&t=1781679495&sid=18r2mxuX7k



圖片附件: Socket.jpg (2021-10-3 17:40, 30.58 KB) / 下載次數 192
https://www.hkepc.com/forum/attachment.php?aid=2285744&k=5eff387584fb856ce9567a1cf84c1b12&t=1781679495&sid=18r2mxuX7k



圖片附件: InUse.jpg (2021-10-3 17:54, 63.28 KB) / 下載次數 179
https://www.hkepc.com/forum/attachment.php?aid=2285747&k=085240bbd4173b117628881b7d90d7db&t=1781679495&sid=18r2mxuX7k



圖片附件: LED.jpg (2021-10-3 18:01, 46.64 KB) / 下載次數 193
https://www.hkepc.com/forum/attachment.php?aid=2285749&k=15a6eed8327b2fded7972d150bc0aad9&t=1781679495&sid=18r2mxuX7k


作者: bbsunny    時間: 2022-3-28 12:05

技術文要推下,雖然宜家我用緊綠米HUB
作者: freddy    時間: 2022-4-26 22:52

C_Law 師兄,
真係堅, 仲要將資料咁詳細分享, 真係無得頂.
作者: C_Law    時間: 2022-9-11 17:36

本帖最後由 C_Law 於 2022-9-12 16:42 編輯

放假無聊搵事做!

早在 1# 時已講過可以係電腦用 Web browser 做發射,方法是在網址列打入:
  1. http://IP-address:Port/?carrier=HZ&code=theCode
複製代碼
平日開住電腦工作時(基本上我一開電腦就開埋 Web browser),想話控制下房的風扇、冷氣,用返 Web browser 會方便過拎手機,一早就想正正經經寫個 Html 用來控制,不過就係一直懶得做。這個周末放假無所事事,終於的起心肝試下做。

我無 iPhone,無得試,或者 iPhone 都可以用 Web browser 開個 Html 去做遙控。

以下是做一個只有一個 Button 的 Html 檔的基本內容:
  1. <HTML>
  2.   <meta charset="utf-8">
  3.   <HEAD>
  4.     <TITLE>One Button</TITLE>
  5.   </HEAD>
  6.   <body>
  7.     <form action="http://IP-address:Port/?carrier=38000HZ&code=theCode" method="post">
  8.       <button accesskey="k" type="submit" formtarget="frmTx">ButtonText</button>
  9.     </form>
  10.     <iframe src="" name="frmTx" style="width: 0; height: 0; border: 0; border: none; position: absolute;""></iframe>
  11.   </body>
  12. </HTLM>
複製代碼
做出來的效果會係:
OneButton.jpg

由 <form...> 到 </form> 就係一個 Button 的內容,當中:
http://IP-address:Port/?carrier=HZ&code=theCode 是用作發射的 Link
accesskey="k" 的 k 是自定的 Keyboard shortcut(*)
ButtonText 是 Button 上的文字

條 Link 入面的 HZ 是遙控訊號的 Carrier frequency,通常係 38000。 theCode,可以係原裝 irplus 的 m s m...m 的格式,也可以係我之前自定的格式。但不能整 Macro button,或者等將來再有心機時去諗下解決方法。

係 <button...> 內可以加入 style 去改 Button 的外觀,例如加顏色框(我會用作表示不同電器的遙控掣)、改 Button 的底色和文字顏色之類。

如果想加入更多 Button,就需要加入更多的 <form...>...</form>,可以用 Table 方式去擺放每個 Button 位置。而每條 Link 都係獨立寫入去,即係一個 Page 就可以分別控制多個不同 IP-address/Port no. 的 ESP8266。

以下就係我目前自己用的 Html 所做出的效果(Click 圖可放回原大)。紅色框的 Button 是客廳部 MagicTV(有時企人係廳睇電視,我會係房睇 MagicTV 錄影了的節目或者 Cut 廣告)、藍色框的掣是冷氣機、粉紅色框係電風扇。我用 FHD(1920x1080) 的 Mon,Full screen 開 Web browser 去開這個 Html,下面有足夠位開 PotPlayer 去睇廳部 MagicTV(起碼個 PotPlayer 開得夠大去睇到 MagicTV 畫面上的文字),右邊亦有好多位剩,可以再加埋有線電視的遙控掣入去(已經加埋,右邊綠色框的掣就係有線 FanHub 的遙控掣)。
myRoom.jpg

(*)
雖然寫 Html 時可以切定用 Keyboard shortcut 去操作,但 Browser 需要連埋 Modifier 一齊用,例如 Opera、Chrome 要用 Alt-,FireFox 要用 Alt-Shift-。例如以上的 accesskey="k",用 Opera 時可以按 Alt-K 代替用 Mouse 去 Click 個 Button,當然,用返 Mouse 去 Click 都得。

我慣用 Opera,不過 Opera 本身已用了幾個 Alt- 的 Keyboard short:
Alt-D 會跳到網址列
Alt-F 會開 Main menu
Alt-P 會開 Settings
寫 Html 時就要避開以上的 Accesskey(雖然入去 Opera 的 Settings 可以更改這幾個 Keyboard short),所以我做這個 Html 時都無係 D/F/P 的幾個掣加 Accesskey。至於其他 Web browser 都可能本身已用了一些 Keyboard shortcut,不過我無認真搵過。

另外 Accesskey 只可以單位的 Keyboard char,例如 a~z、數字、標點符號,但好似不能用箭嘴、Home、Del、NumPad0...9、F1...12 之類。

圖片附件: OneButton.jpg (2022-9-11 17:34, 9.36 KB) / 下載次數 176
https://www.hkepc.com/forum/attachment.php?aid=2338512&k=fdffb57b44bb404a3e31c20809137ce3&t=1781679495&sid=18r2mxuX7k



圖片附件: myRoom.jpg (2022-9-12 16:42, 148.9 KB) / 下載次數 173
https://www.hkepc.com/forum/attachment.php?aid=2338624&k=a073a94954873ecb6493b0d8266a8815&t=1781679495&sid=18r2mxuX7k






歡迎光臨 電腦領域 HKEPC Hardware (https://www.hkepc.com/forum/) Powered by Discuz! 7.2