限時乾貨下載:回復「教程」獲取單片機電子書,回復「仿真」獲取Proteus仿真資料,百度盤群組分享連結更新時間:2017-08-8,失效請在文末留言,不要在後臺留言,你也可以在後臺菜單「資源搜索」搜索更多你想要的網盤資源!
來源:http://www.oschina.net/translate/a-complete-project-with-arduino?utm_source=tuicool
英文原文:A complete project with Arduino
參與翻譯 (3人) : realZ, leoxu, Ley
我有一個上小學的女兒. 作為一位父親,當然該負起責任. 我喜歡自己作為父親的角色,對此我毫無疑問. 但因此所帶給我的困擾則是無止境的數學學習事務. 有時候這真的讓我很頭疼. 2+2, 5+6, 4+3,一遍又一遍. 那才剛開始呢, 現在又多了減法: 5-4, 10-4 .. 而每個人都知道這是沒有結束可言的. 我抱怨的夠多了,因而決定利用此項技術. 你知道的,技術為人而生, 而現在是為我而存在. 到這裡來,我親愛的 Arduino, 我需要你.
在最開始的時候,我希望這個項目能很容易實現. 我預計所有需要做的事情就是寫一些函數來展示一些數字,並且為了根據趣味性,也許要來點蜂鳴聲和一些LED燈光. 然後,情況在我開始精心考慮它的時候發生了改變, 出現了一些硬體管理問題, 然後是內容管理問題. 我們這個小小的 Arduino 應用程式變成了一個認真把握的東西,這導致我寫下了這篇文章. 讓我們先從需求開始吧.
計劃需求系統可以顯示一個菜單,提供一些基本的操作:加、減、乘、除 。
用戶(我的女兒)可以用鍵盤從菜單上選擇一種算數運算來學習。
會有一些難度級別:在選擇運算後,難度級別會顯示出來。
根據選擇的難度級別,會隨機顯示出一些問題,用戶可以用鍵盤迴答這些問題。
用戶可以在確認前修改自己的答案。
在確認答案後,根據正確與否會顯示出一條信息。
如果三次答錯,將會顯示出正確答案。
用戶可以瀏覽菜單(點開菜單並選擇菜單項)。
系統應具有音頻和視頻警告API,錯誤信息可以通過該API發送。
每種算術運算有一個限時小測環節。
限時小測隨機從簡到難給出問題。
測試後會顯示出統計數據(回答了多少題目,答對了多少題目)。
在用戶接近時系統可以引起她的注意。
可以有一些數學以外的娛樂環節,比如讓她唱首歌、親自己的爸爸等等。如果不這麼做,用戶將無法繼續使用系統。
警告API可以用來在娛樂環節做一些有趣的事情。
我們在這個項目中需要什麼:
Arduino Mega:http://arduino.cc/en/Main/arduinoBoardMega2560
字符液晶面板(Serial LCD):http://www.dfrobot.com/index.php?route=product/product&filter_name=adkeyboard&product_id=197#.UvNglbQSHxQ
矩陣鍵盤 :https://www.sparkfun.com/products/8653
模擬鍵盤 :http://www.dfrobot.com/index.php?route=product/product&filter_name=adkeyboard&product_id=197#.UvNglbQSHxQ
PIR運動傳感器:http://www.cooking-hacks.com/pir-motion-sensor
LED 和 400歐姆電阻
數字蜂鳴模塊:http://www.dfrobot.com/index.php?route=product/product&filter_name=buzzer&product_id=84#.UvNc2rQSHxQ
連接線
看看下面的硬體設計:
注意一些和上面不匹配的部分:
LCD應該是字符LCD。
Arduino UNO應該用Mega替代。
(我用Arduino UNO開啟了這個項目,但是因為內存的需要後來改用Arduino Mega繼續這個項目。開始的時候,Arduino UNO工作的很好。但是,當代碼量增加,我無法將RAM使用量控制在Arduino UNO的容量之內,然後就想你所想的,我最終啟用了Arduino Mega,它有8K的SRAM。)
軟體設計
圖1:設計的概覽
系統被分為2個主要部分。就像你在圖1中看到的,第一個模塊負責硬體的管理。
輸入系統:我們有兩個不同的鍵盤,他們被統一在一起,對外提供統一的接口。統一的鍵盤信息將在(矩陣鍵盤或模擬鍵盤上的)任何按鍵被按下時告知註冊的客戶端。
輸出系統:具有附加功能的字符液晶面板。
發信系統:統一發信子系統。它由一個LED和一個數字蜂鳴器組成,它將不同的信號轉化為目標客戶端的編碼。它將不同的信號轉換為客戶端代碼,客戶端代碼可以根據需求運行各種代碼。
運動檢測:用PIR傳感器實現運動檢測。當有人被檢測到,它觸發一個信號來引起注意。
表現層負責與用戶的交互。它包含圖形界面的處理(菜單和頁面)並包含管理子系統。
UI管理:在這個子系統中,我們定義了圖像對象。一個菜單列表被顯示出來供用戶選擇。一個菜單項可以顯示出子菜單或者一個頁面。用戶可以通過輸入顯示在其上的索引來選擇菜單項。通過按'Escape'鍵來返回上級菜單。如果一個菜單項是一個頁面,選擇後將會將這個頁面顯示出來。頁面可以顯示出其上面的信息,並等待用戶輸入來改變它的內容,此時按下'Escape'鍵就會顯示出用戶菜單。如果用戶輸入錯誤,可以通過按'Backspace'鍵刪除答案。根據答案的正確與否,相應的信號將會被觸發。
內容管理:這個子系統提供顯示在屏幕上的內容,包括各種算術運算的各種難度級別的生成算法。客戶端代碼(頁面)會向這個子系統請求內容。
簡單的類框圖如下。這些圖像展示了基本的框架,幫助你更容易的理解實際的類實現。
MFK_InputDevice將Keypad2和AdKeyboard統一為同一個接口。它處理它們的事件,並向其客戶端提供一組新的編碼,如下所示。
圖2:輸入子系統
按鍵映射:
KeypadButtonKeyValue (hex) Matrix0 '0'0x30Matrix 1 '1' 0x31Matrix 2 '2' 0x32Matrix 3 '3' 0x33Matrix 4 '4' 0x34Matrix 5 '5' 0x35Matrix 6 '6' 0x36Matrix 7 '7' 0x37Matrix 8'8' 0x38Matrix 9'9' 0x39Matrix *Escape0x1BMatrix #Enter0x0DAD S1Backspace0x08ADS2F10x80ADS3F20x81ADS4F30x82ADS5F40x83MFK_OutputDevice繼承自SerialLCD類。它結合SerialLCD類的功能,並對其進行了增強。
圖3:輸出子系統
一個信號模式從信號源產生。一個模式連同它的索引被儲存在信號控制器中。想要啟動一個信號模式非常簡單,只要用它的索引從信號控制器調用它。
圖4:發信系統
在硬體管理層頂層的是MFK_Hardware類。它只會所有其他硬體設備,對客戶端隱藏多餘的複雜性。舉例來說,PIRMotionandSignalController沒有被暴露給客戶端。但是輸入和輸出設備必須要向外界開放,因為UI系統需要對這些功能的直接訪問。信號模式也是在這個類裡構建的,可以通過索引來訪問他們。
圖5:硬體管理
表現層這一層負責與用戶進行交互,它提供了視覺元素和內容。
ContentFactory根據toContentTypeEnum和ContentLevelEnum創建ContentProviders。客戶端得到ContentFactory的實例,之後他可以請求一個content provider。
圖6:內容管理
VisualItem是所有的視覺元素(菜單和頁面)的基類。它還將硬體管理和呈現結合起來。'show' 和'msgbox'方法通過調用和回調VisualItem提供的方法使用輸出設備(MFK_OutputDevice)和輸入設備(MFK_InputDevice) 。'msgbox'方法也有能力啟動一個信號模式,只要調用硬體(MFK_Hardware)的'signal'方法就可以了。
菜單就像他的名字一樣,提供了一系列的菜單項可以選擇。用戶可以通過一個菜單項前面的索引選擇它,然後菜單 'show' VisualItem。
Pageis是顯示內容的視覺工具。除了娛樂內容,它會等待用戶的輸入。用戶'Enter'她的答案,顯示信息告知她對錯。顯示信息之後,就需要從內容管理獲取新的內容。
Chapter是ContentProvider和Page之間的中間類。當一個頁面被第一次顯示時,與其相關的chapter和ContentProvider就會被創建。用戶的答案直接由chapter處理,並由chapter判斷其對錯。Chapter也對頁面內的學習會話進行統計。FunChapter是一種不向用戶要求答案的chapter,QuizChapter是限時的chapter。在一個quiz chapter中,問題只有在時間截止之前才能回答。
圖7:UI管理
實現我希望你已經清楚了系統的通用結構。現在,是時候深入到代碼中去,那裡是真正的樂趣開始的地方。
我想以MathForKid.ino開始。它是上傳到Arduino主板上的主要代碼。
MFK_Hardware* hw; Menu* mainMenu; void setup() { Serial.begin(9600); hw = MFK_Hardware::getInstance(); hw->begin(); CreateUI(); mainMenu->show();} void loop() { hw->update(); VisualItem *v = VisualItem::getActiveItem(); if(v!=NULL) v->update();}
就這麼多。在Arduino上運行你的應用吧。好吧,也許解釋一下會更好。
正如我在「軟體設計」那部分開頭所說的,我們有兩個部分:一個用來硬體管理,另一個用來展示。它們在代碼頂部定義為全局變量,我們在 'setup'函數中將它們初始化。'loop'函數調用代碼來更新它們。
事實上,CreateUI方法也是在這個文件中實現的。當用戶開始交互時,它創建用戶接口。mainMenu、所有的子菜單和一切頁面都是這個方法產生的,chapter的屬性也是其賦予的。
void CreateUI() { mainMenu = new Menu("main"); Menu* m = new Menu("+"); mainMenu->addMenuItem(m); Page* p = new Page("L1"); p->setChapterProperties(Chapter::NormalChapter, \ ContentFactory::Addition, ContentFactory::Level1Content); m->addMenuItem(p); p = new Page("L2"); p->setChapterProperties(Chapter::NormalChapter, \ ContentFactory::Addition, ContentFactory::Level2Content); m->addMenuItem(p);...
我們接著來看這個應用的設計模式。
就像你所想的,MFK_Hardware是Facade模式的一個例子。它將底層的硬體管理問題隱藏起來,並對客戶端提供了乾淨的接口。它同時也是 Singleton模式的代表,因為整個系統運行時其只產生一個實例。為了實現這個功能,MFK_Hardware的構造器、複製和賦值操作都被聲明為私有方法。
MFK_Hardware(); MFK_Hardware(MFK_Hardware const&); void operator=(MFK_Hardware const&);
你只能通過getInstance靜態方法訪問它們,這個方法是公共的:
static MFK_Hardware* getInstance() { static MFK_Hardware hw; return &hw; };
限時乾貨下載:回復「教程」獲取單片機電子書,回復「仿真」獲取Proteus仿真資料。
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
如何分享到朋友圈點擊右上角「...」 三個點,在彈出菜單選擇「分享到朋友圈」單片機訂閱號微信名:單片機回復下面數字或直接點擊,獲取相關文章:
001:《單片機初學者必看》
002:《周立功寫給學單片機的年輕人的話》
003:《牛人談:軟體與硬體的入門難度與精通時間跨度》
004:《學習51單片機有感;學習用書推薦;必寫的幾個程序》
005:《幾種使用過的單片機比較》
006:《ARM+LINUX學習路線(學習順序,知識點及書籍推薦)》
007:《ARM/DSP/FPGA/CPLD/SOPC/SOC區別和聯繫》
008:《趣味電子製作:藝術家手中的食品發電-電子diy》
009:《我的經歷: 從一名產線工人到單片機工程師》
010:《哥們花20萬從德國帶回來一工具箱》