發表文章

A001 番外篇 如何處理需要等很久的外部呼叫

圖片
A001 番外篇  如何處理需要等很久的外部呼叫         有個FB朋友私我,問我說,要呼叫一個DS18B20 溫度計,但是精度要很高的話,會被哪個感測器拉住很長的時間,導致按鈕的掃描繪被嚴重延遲那要怎麼做? 其實Arduino 很多的Lib 的Example 在設計的時候都是以你只要跑一個功能來設計的,這樣使用的人會比較好了解怎麼去使用那個Lib. 但是如果使用者要同時呼叫很多不同的Lib 的時候就會有撞牆的問題。 以上述的DS18D20 溫度感測器來說,Loop 裡面如果週期性的要取得溫度,然後更新,同時還要接收使用者的按鈕輸入時,就很容易遇到在讀取溫度的時候,按鈕沒法按的問題,為何?? 因為 DS18B20 進行轉換溫度的時候 ,不能即時回應,要等待一陣子才行。 這就會像這樣,你去餐廳點餐。餐點要現做,於是你點餐後只能在那邊等老闆煮好。。 所以你就只能在那邊等,哪裡也不能去。。。。。 但是,如果您在點完餐之後,稍微了解一下老闆多久之後可以煮好,那從點餐到煮好的這段時間,您就可以跑去做你自己的事情了!! 所以這樣怎麼實做最簡單,假設外部的設備需要10 秒才能回應,是否就要停止運作10秒等它呢? 這裡使用 simpleTimer 這個好玩的Lib 來做解釋。 假設我們要點一個LED 燈,十秒之後要滅掉,一般最暴力的大概就是這樣 loop(){ digitalWrite(LED_PIN, HIGH); delay(100000); digitalWrite(LED_PIN, LOW); } 不過這樣做,所有的時間都花在delay 上面了,啥事也不能做,所以簡單的調用一下SimpleTimer 的 setTimeout(unsigned long d, timer_callback f) 就可以簡單的處理這種需要等待很久時間後才需要進行下一個動作的呼叫。 簡單的範例程式碼如下 ,大致來說就是,程式設定一個定時鬧鐘,鬧鐘到了就去做我們規定的事情。 下面的範例是設定一個10 秒後會自動把LED關掉的鬧鐘。所以使用者只要把燈開起來之後,10秒後鬧鐘就會自己起來把LED 給關了。 在Loop() 中,因為要讓鬧...

002 如何用4個圖面拆解小設備需求( 說明 )

圖片
002 如何用4個圖面拆解小設備系統需求 結論先講在前面,我們要用4個圖面來捕抓小裝置的需求與行為。簡單來說,可以想像我們要導演一齣戲,那我們要準備的事項大概有: 1. 要找那些演員/ 角色的關係 (靜態) 2. 演員的互動  (動態) 3. 每個角色在劇裡出現的場景/ 不同場景的變化關係 4. 單一場景該演員要做的事情 要描述一個人的行為,可能要由好多的面向來說明。同樣的要描述一個系統的行為也是。隨著系統複雜度的增加,要單純的使用一個流程圖來描述整個裝置的行為就會有點不夠。 以往繪製流程圖的時候常常會有很難描述的事情,或是如果要分工的時候很難去拆分大家的工作跟相對的配合流程,這也是系統變複雜的一種體現。 那是否有一套方法可以用來簡單的拆解系統的行為,然後最後變成可以用的程式架構,最後進一步把程式寫完,然後再可以利用這套圖來進行需求驗證呢? 下面這四種圖的使用剛好可以用來捕捉系統的行為,包含靜態行為與動態行為。整個的使用邏輯跟繪製的順序是這樣的。 系統方塊圖 (System Block) 時序圖 (Sequence Diagram) 狀態圖 (State Diagram) 流程圖 (Flow Diagram) 系統方塊圖 (System Block) 系統方塊圖是用來描述系統的系統內部成員的圖面,諸如有那些感測器? 那些制動器 ? 用那些介面串聯。然後是否會連接到後端(上層) 的設備,使用那種通訊方式... 等等 系統方塊圖就是這齣戲的演員表,他表現出了整齣戲所有人的關係,下面這張就是所謂的關係圖(引用日本網友的神鵰俠侶關係表),也就是一個靜態的系統描述。 簡單的系統方塊圖範例 在接下來的 時序圖 中,就是根據不同的情境(場景),這些演員的互動。戲劇會精采,就是劇情與演員互動的恰到好處。系統會運作的好,角色之間的互動就很重要啦。 時序圖 (Sequence Diagram) 狀態圖 (State Diagram) 比較簡單的說明一下狀態圖。以十字路口這個場景來比喻 主要主角有兩個 紅綠燈  跟 行人 當  紅綠燈    ...

003 捕抓系統的行為

圖片
003 捕抓系統的行為  可以描述系統的所有行為是要做這類小系統的重要步驟之一,下面的狀態圖是一個帶有門禁的小設備箱控制的狀態流程圖。 這個箱體門禁控制器主要的功能 檢查使用者密碼 偵測開關箱 將狀態的變化傳遞至伺服器(服務器,Server) 偵測惡意(非法)的開關門狀態 正常的流程應該是這樣的 使用者拿著ID key 解鎖開門後,箱門打開。然後在箱體內把該設定好的東西設定好之後,關門上鎖。在開關門的同時系統的門禁狀態包含使用者的ID會被送到後台。 這個應該是很一般使用情境,但是在捕捉系統的整個行為時需要同時去了解非法的使用狀態,諸如 沒有ID 就硬開門 (暴力解) 某個ID忘了關門上鎖  某個ID 故意將門掩上,但是故意不上鎖 (讓後續來的人可以直接開門) 開了很久沒有關 (也可能是箱門感測器壞了) 諸如此類的另外狀態,才是我們最花時間要去處理的部分,基本上撰寫程式的時候沒有想到,那實際上遇到的時候控制器肯定就沒法正確處理 (可能會跑出某種非意料中的反應)。 面下的APP 是 iSO 跟Android 上面都有的一個快速繪製系統圖、流程圖、狀態圖、時序圖的工具叫做 DrawExpress 推薦給大家。這個App 就是設計來繪製這類的圖形,可以很輕鬆的進行繪製與重新排列。 前一篇  後一篇

001 使用Arduino生態建構小型設備程式框架

圖片
#使用Arduino生態建構小型設備程式框架 #引子 因為工作的關係,需要常常弄一些小型的裝置放到現場去給別人使用,久而久之就偷懶使用Arduino 生態系來進行這類小系統的程式撰寫。 因為這種小裝置通常都是用來串聯(膠合)一些本來就存在的設備,所以系統的重點在於”串” 起整個連結。 雖然我本身在研發RTOS的單位(資策會嵌入式系統實驗室2000~2004)混過幾年,但是這類的小東西用RTOS實在是太耗費心力,於是久而久之就利用Arduino 現有的一些library 來搭建一個屬於我自己的工作流程,在這裡分次的為大家介紹一下我的手法 所謂的框架就是某種可以重複利用的招,我的招有兩階段.... 畫下列四種圖來形容一個系統(如下圖) 用這一些特定招式來實作這個系統 https://github.com/allen54a0/moreStableArduinoCode/wiki 下列是我對這個框架的期待 • 可以快速建立原型 • 方便單元測試/ 系統測試 • 固定的發展架構(Frame Work) • 簡單的程式架構 (Setup() Loop() …… ) • “最好” 是Hard real time 對部分高手來說這可能是雕蟲小技,不過我用Arduino 生態系這麼久,也靠他清理了不少案子,覺得還是要要野人獻曝一下,回饋社群。 這是我拆解工作的流程,一律先畫圖,然後再把架構寫好, 最後放程式進去。 系統方塊圖是一個靜態的描述圖,說明整個系統的硬體連接 方式。 sequence diagram 說明系統跟其他系統的"動態" "順序" "關係" 流程圖雖然很基本,但是很重要 大便的大致流程是 進廁所,放下馬桶坐墊,脫褲子,大便,擦屁股,穿褲子, 然後沖水,掀馬桶蓋,離開廁所 雖然我們天天在做,但是上面的順序只要隨便轉換一組,保 證會讓你很難過。。 我就常看到有人不先規劃直接就開寫,常常弄到褲子上面都 是大便還清不完。。

000 Arduino 與我的做工人生

圖片
在使用Arduino 生態系來解決我工作上的一些整合工前,我主要是使用PIC 18 系列來當作我設計解決手上問題的工具。 在2009年左右開始接觸Arduino (主要是 Arduino Duemilanove)後,逐漸發現這個小傢伙實在是好用的很,於是在很多的專案裡面都改用Arduino 來做為開發的主軸。 很多人會問Arduino 是否穩定? 是否可以當做產品來使用,我會回答: 可以,"BUT " ......... 就是這個BUT ... 就是我要跟大家聊的主題: " 如何在 Arduino (生態系) 上面開發穩定的的產品 " " 某某情境要用怎樣的寫法" " 如何拆解一個案子  " 只要實作的目標規模不是很大,我想都可以用我這 "使用Arduino生態建構小型設備程式框架" 來進行拆解 下面是我做過的一些案子,類型都差不多,就是讓原本就存在的A 設備 連上B 系統,而Arduino 生態系豐富的資源,就可以讓我們在Arduino 百貨裡面很快地找到方案,然後套用到該運用裡面,下面就讓我們開始吧! 001  使用Arduino生態建構小型設備程式框架