/* 自定義代碼塊樣式 */

2021年3月25日 星期四

安裝 Home Assistant

 markdown

Home Assistant 我是用官方的映象檔安裝在樹莓派上使用,下載的檔案就直接燒錄在SD卡即可,這邊我使用的燒錄軟體是Rufus

但別急著插進樹莓派開機,還要設定WiFi連線,才能讓樹莓派連上網路

在SD卡根目錄下,新增一個CONFIG的目錄,裡面再新增一個network目錄

在network目錄內,增加一個文字檔案 my-network

[connection]
id=resin-wifi
type=wifi

[wifi]
hidden=true
mode=infrastructure
ssid=你的SSID名稱

[ipv4]
method=auto

[ipv6]
addr-gen-mode=stable-privacy
method=auto

[wifi-security]
auth-alg=open
key-mgmt=wpa-psk
psk=你的Wifi密碼

把ssid與wifi密碼修改完後,就可以插入樹莓派開機了

插入電源開機。第一次開機HA會自動下載最新版的 Home Assistant 並執行,耗時約 20 分鐘。

在等待更新的過程中,也可以打開瀏覽器輸入 http://hassio.local:8123 或是http://homeassistant.local:8123 看到HA的畫面

等待更新結束後,會看到建立帳號的畫面,就依照畫面指示,完成資料填寫即可






2020年10月23日 星期五

PL2303 傳輸線更換為 CH340N 晶片

手邊有兩個USB to Uart 的傳輸線都不能使用,可能是PL2303又掛了,所以這次不使用2303的IC,想要改裝成CH340的試試

從官網上查到有一個CH340N type,封裝只有8 pin,又不用外加振盪器,就入手了幾顆進行測試


首先當然是把PL2303從板子上移開,振盪器也卸除掉,如下圖


接著找看看有沒有相關的Pin 腳可以直接焊接就好


目前找到最好的擺法就是把 IC 反過來,背面朝上的方式,如下圖


焊接完後的結果


焊接的過程中,腦海中一直浮現一段話,「工程師沒什麼了不起的,只是比較會做手工藝而已」,這是一個業務朋友跟一個採購對話的內容,想想自己好像也是一個比較會做手工藝的工程師而已呀,哈

好了,焊接完成後,沒意外的話,應該就會在裝置管理員中看到COM Port了


後面再用 PUTTY 測試TXD/RXD是否正常,把TXD/RXD 短路在一起,Putty開啟 serial 模式,鍵盤敲什麼字元,Putty 終端機就應該要顯示什麼字元,如果都有顯示,代表正確焊接,收工啦













2020年10月20日 星期二

智能插座改造 -- 冷氣紅外線控制

markdown

一連買了好幾個智能插座後,一直用漆包線焊接也不是辦法,便動手layout一片板子,製做小量的PCB,汰換插座內的藍芽控制板,一樣是用 ESP8266 當主要控制器,還把未用到的pin也拉出,以備不時之需


因為機構的關係,所以 RXD pin 腳被犧牲了,背後還有個指示用的 LED 要跨接上去


焊接後的樣子如下,但下方的又被我改造了一番,我將本來控制繼電器的 pin 腳,改為紅外線發射 LED ,控制辦公室的冷氣,採用的是 Daikin 的Arduino 模組,也就是本來繼電器應該要ON 的時候,IR LED 會發射冷氣機ON的編碼,OFF時就發射OFF的編碼




紅線就只是壞掉的USB充電線,剪掉後僅使用5V電源,用膠帶黏在辦公室OA板上,使用著App 遠端開啟冷氣冷房,收工





智能插座 --- App篇

markdown

智能插座的硬體都改裝完成後,總是要能夠用手機操作吧,但我又不會寫App,這樣單有個插座硬體插座也是英雄無用武之地呀。

我自已是用 iPhone 手機,下載過好多個App都無法適用,某日不小心看到這個,安裝後,似乎可以滿足我要的功能


免費版只能使用10個 device,不過也夠用了,至少目前用不到那麼多,等超過了再購買App也行

下方左圖是正常使用畫面,右圖為 Edit 模式,預設的範例中有溫度曲線圖, 環狀溫度顯示方式,溫度設定等等的功能,更多功能可以自行研究,我們這邊只用到開關功能,圖中顯示在最下面的裝置 AC plug1,在Edit 編輯模式中,按下要修改的device 齒輪圖示,就進入了編輯模式


下圖左,首先看到的就是這個device的名稱(name),這邊示取名為AC plug1
然後把最下面 PUBLISH VALUES 中的 True與 False 分別改為 ON與OFF,
這意思表示當開關為【開】時,會在 Publish topic string 後面加上ON或OFF的字串,讓device去分析收到的訊息是要開啟裝置還是關閉裝置

接著要設定要發佈的訊息,按下 Publish 就進入設定畫面,如下圖右
把Topic string 填入發佈的訊息字串,這邊例子是填入 /devices/AC plug1/action
開啟 Allow publish,最下方的QoS選擇 At least once,也就是QoS1



接著要設定MQTT 主機,先按下主螢幕左上角的三藍線icon,再按下左下方的Settings,就可以看到如下圖左的設定畫面

點選 Configuration 組態設定,就會出現下圖右的 設定,在Host 端填入主機位址,若沒有,可以參考這裡  https://test.mosquitto.org/

設定完成後,回到主畫面,即完成設定了






至此算完成了,可以在回到家前,遠端把裝置開啟了









2020年6月19日 星期五

使用 VB 透過 SCPI 控制儀器設備

markdown
因要讀取電表的資料,所以接觸了SCPI這個語言,這次又要讀取示波器的波形資料,所以乾脆整理了一下使用的命令,方便於日後查詢

SCPI (Standard Command for Programmable Instrumentation)可程式化儀器標準語言,是透過ASCII語法來與儀器做溝通

簡單的命令範例如下
MEASure:VOLTage:DC?;:MEASure:CURRent:AC?
當然首先要先安裝電腦端的驅動程式,因為電表是使用Keysight的,所以就上Keysight網站找驅動程式了,下載網址

網站中有三套軟體,IO Libraries Suite是最主要的驅動,會安裝VisaComLib這個Library,主要是透過這個Library跟儀器做溝通的,所以至少要安裝這套軟體

在VB6中,要使用VisaComLib時,需要先引用它,所以要到 [專案] --> [設定引用項目] 中,選取 [VISA-COM 5.12 Type Library] 後才能開始寫應用程式

在VB6中宣告如下

 '--- General define ---
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'declare to use "sleep"
Dim ioMgr As VisaComLib.ResourceManager
Dim instrument As VisaComLib.FormattedIO488

'--- function define ---
Dim ioMgr As VisaComLib.ResourceManagerDim instrument As VisaComLib.FormattedIO488
Dim sndBuffer As String
Dim rcvBuffer As String
Set ioMgr = New VisaComLib.ResourceManager
Set instrument = New VisaComLib.FormattedIO488
Set instrument.IO = ioMgr.Open("USB0::10893::4865::MY59022278::0::INSTR")
instrument.SetBufferSize IO_IN_AND_OUT_BUFS, 64

*IDN?是所有儀器通用的命令,透過這個指令來查詢儀器的 ID。儀器通常會回傳製造商名稱、儀器型號,以及製造商提供的韌體版本英數字元
instrument.WriteString "*IDN?"
Debug.Print instrument.ReadString
讀取電壓與電流的程式如下
'--------------------------
' Volt
'--------------------------
    status = commSend(instrument, "SENSe:VOLTage:DC:NULL:VALue:AUTO 1")
    status = commSend(instrument, "CONFigure:VOLTage:DC 10,0.001")        ' mV resolution
    status = commSend(instrument, "SAMPle:COUNt 1")
    status = commSend(instrument, "*WAI")
    rcvBuffer = commQuery(instrument, "READ?")
    
'--------------------------
' Current
'--------------------------
    status = commSend(instrument, "SENSe:CURRent:DC:NULL:VALue:AUTO 1")
    status = commSend(instrument, "CONFigure:CURRent:DC 1E-6")        
    status = commSend(instrument, "CURRent:DC:RES 1E-6")                        ' uA resolution
    status = commSend(instrument, "SAMPle:COUNt 1")
    status = commSend(instrument, "*WAI")
    rcvBuffer = commQuery(instrument, "READ?")
電表是使用USB連接,後來要控制R&S示波器,就想改用TCP/IP的方式試試,也是OK的喔,下面列出幾個範例,讀取波形電壓平均值、上升時間及波形的各點電壓資料
'==================================
' R&S RTM3004 波形平均值
'==================================
    instrument.WriteString "TRIGger:A:EDGE:SLOpe NEGative"
    instrument.WriteString "MEASurement1:SOURce CH2"
    instrument.WriteString "MEASurement1:MAIN MEAN"
    instrument.WriteString "MEASurement1:RESult? MEAN"
'==================================
'Measure rise time 
'==================================
    instrument.WriteString "TRIGger:A:EDGE:SLOpe NEGative"
    instrument.WriteString "MEASurement1:SOURce CH2"
    instrument.WriteString "REFLevel:RELative:MODE TEN"		' 10% - 90%
    instrument.WriteString "MEASurement1:MAIN RTIMe"
    instrument.WriteString "MEASurement1:RESult?"  
'==================================
' Wave RAW data
'==================================  
    instrument.WriteString "TRIGger:A:MODE NORMal"           ' Normal trigger
    instrument.WriteString "TRIGger:A:EDGE:SLOpe NEGative"      ' Negative edge
    
    instrument.WriteString "FORM ASC"							  ' output format ASCii
    instrument.WriteString "FORM:BORD LSBF"
    instrument.WriteString "CHAN1:DATA:POIN DEF"
    
    instrument.WriteString "SINGle"                     ' Single trigger
    
    instrument.WriteString "CHANnel1:DATA:HEAD?"
    Debug.Print instrument.ReadString
    
    instrument.WriteString "CHANnel1:DATA?"
    Debug.Print instrument.ReadString
下面是UART、USB與TCP/IP的宣告方式
'=========
 'UART
 '=========
    Set instrument.IO = ioMgr.Open("ASRL6::INSTR")  ' COM6
    
    Dim serInfc As VisaComLib.ISerial
    Set serInfc = instrument.IO
    serInfc.BaudRate = 9600                         ' 9600bps baud rate
    serInfc.FlowControl = ASRL_FLOW_NONE
    serInfc.Timeout = 10000
    instrument.IO.SendEndEnabled = True
    instrument.IO.TerminationCharacter = 10          ' could be 10 (line feed) or 13 (carriage return)
    instrument.IO.TerminationCharacterEnabled = True
    instrument.IO.Timeout = 10000
    
 '=========
 'USB
 '=========
    Set instrument.IO = ioMgr.Open("USB0::0x0AAD::0x01D6::104068::INSTR")
    instrument.SetBufferSize IO_IN_AND_OUT_BUFS, 64
    Set serInfc = instrument.IO
    
 '=========
 'TCP/IP
 '=========
    
    Set instrument.IO = ioMgr.Open("tcpip0::192.168.0.13::instr")        ' ip addr 192.168.0.13
    instrument.SetBufferSize IO_IN_AND_OUT_BUFS, 64
    Set serInfc = instrument.IO
下面是用Arduino與ADS1015做的4通道電表,解析度至小數第二位,使用VBA透過UART讀取電表至Excel表格中
Arduin 用的SCPI Library 有蠻多個 (Vrekrer_scpi_parser) (Open Instrument Control),下面範例是使用OIC的Library完成的



2020年6月4日 星期四

智能插座改造

markdown
最近看到一個智能插座,因為沒有App的支援,所以老闆就便宜賣,價格超便宜,就買了幾個回來準備拆開研究看看,拆開後如下


底部插座跟Relay部分可以延用,上面有一片小板,是藍芽控制板,既然沒有App支援,就乾脆改裝WiFi版的智能插座吧

從抽屜中拿出ESP8266模組,研究一下藍芽小板的走線後,便把藍芽模組拆掉


因為頂部空間有限,要焊接ESP8266上去似乎不太夠,便用漆包線延長,固定在側邊

最後再裝回原來的樣子,WiFi版的智能插座硬體部分就完成了



ESP8266的韌體一樣使用Arduino做開發,使用 IotWebConf 及 arduino-mqtt 的Library,
並以 IotWebConf07MqttRelay 範例進行修改

韌體/硬體完成後,就可以用手機進行設定了,如下是連線後跳出的畫面,按下configure page就可以進行設定



Thing name 可以修改成自己想要的名稱,之後設定 MQTT 時會需要這個名稱
AP password 就是登入這個裝置的WiFi密碼
WiFi SSID 要讓裝置連線的 AP SSID名稱
WiFi password 要讓裝置連線的 AP SSID 密碼  
MQTT server 讓裝置可登入的MQTT sever,因我自己是在 NAS 上增加MQTT的服務,所以這邊是填家中的NAS IP address

接著是新增加的功能,本來的範例除了可以遠端控制外,我還想讓裝置有定時的功能,所以多增加五組的開關機時間

--------------------------------------------------------------------------------

都設定完成後,準備進行測試

安裝 Chrome MQTT延伸擴充功能進行測試,如下為 MQTTLens 套件



一樣將MQTT server設定好,訂閱的路徑設定好,應該就可以對裝置進行操作了

如下圖

Subscribe : /devices/testThing/status 
Publish : /devices/testThing/action

其中的 testThing 就是前面透過手機所設定的 Thing name 名稱

在 Message 填入ON或OFF即可進行測試



--------------------------------------------------------------------------------

以上都在電腦端測試完成後,手機App呢? 

參考另一篇文章,App的設定

https://mattlinotes.blogspot.com/2020/10/app.html

下一步,準備把溫度與濕度 sensor 也一併整合進這個智能插座中,掌握當下的房間狀況,決定要不要遠端啟動受控裝置了


2019年11月28日 星期四

遇見 LittlevGL

markdown



很久很久前,剛開始研究 ARM嵌入式系統時,就對圖形化介面吸引,希望能有一套開源、輕量、開機快速又能支援顯示中文的GUI,後來有找到一個名為ParaGUI的平台,不過基於沒太多時間研究,所以只稍稍碰了一下下,玩了幾個widge就沒再繼續了

這陣子在網上亂逛時,無意發現,原來還有一套能滿足我想要的GUI平台,LittlevGL,簡稱 LVGL

網頁寫的簡單明暸,有什麼功能,啪拉啪拉一籮筐,重點是體積小,80 kB Flash, 12 kB RAM就能執行起來了,這對一般的MCU來說,就是一大福音呀

在Github上,也已有提供 Arduino的lv\_arduino library,下載後直接使用即可,不過Arduino版的LVGL圖形顯示是建立在TFT\_eSPI library上,所以必須先讓TFT_eSPI能正確驅動 LCD螢幕,LVGL才能正常顯示

後續再慢慢介紹設定與使用方式,重點是中文字的顯示呀

(圖片來源:LittlevGL官網)

在ESP32S3使用 Adafruit_TinyUSB 建立 HID 裝置進行讀寫

Adafruit_USBD_HID usb_hid; #define USB_VID 0xCafe #define USB_PID 0x4011 #define USB_MANUFACTURER "ESP32S3" #define USB_PRODUCT ...