一個用 Arduino 實現的完整項目

2022-02-08 單片機

收錄於話題 #開源項目 18個

限時乾貨下載:回復「教程」獲取單片機電子書,回復「仿真」獲取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 S1Backspace0x08ADS2F10x80ADS3F20x81ADS4F30x82ADS5F40x83

MFK_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仿真資料。

> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >

如何分享到朋友圈點擊右上角「...」 三個點,在彈出菜單選擇「分享到朋友圈」單片機訂閱號微信名:單片機
每天更新單片機各種知識,電子製作DIY,及電子行業最新資訊,關注我們,棒棒噠!熱門文章推薦

回復下面數字或直接點擊,獲取相關文章:

001:《單片機初學者必看》

002:《周立功寫給學單片機的年輕人的話》

003:《牛人談:軟體與硬體的入門難度與精通時間跨度》

004:《學習51單片機有感;學習用書推薦;必寫的幾個程序》

005:《幾種使用過的單片機比較》

006:《ARM+LINUX學習路線(學習順序,知識點及書籍推薦)》

007:《ARM/DSP/FPGA/CPLD/SOPC/SOC區別和聯繫》

008:《趣味電子製作:藝術家手中的食品發電-電子diy》

009:《我的經歷: 從一名產線工人到單片機工程師》

010:《哥們花20萬從德國帶回來一工具箱》

相關焦點

  • 3個簡單上手的arduino項目
    到底arduino是什麼?arduino是一個開源的控制平臺,其簡單的輸入輸出接口和控制命令簡化了元器件的控制,使工程師可以迅速將電子控制應用到其它的領域中。對於設計師來說,它溝通了設計與編程之間的橋梁。它足夠簡單,足夠靈活,設計師很快就可以用其把自己心中的想法實現。
  • 用Arduino開發物聯網設備之初識Arduino
    軟體部分:這部分也就是我們平時說的Arduino,我們其實使用的就是arduino框架來對很多的mcu來進行編程。這裡很多小夥伴其實有很多疑問,比如為什麼要用arduino來進行?使用arduino來開發的都是MCU,MCU是微處理器,他們的售價基本上都是幾塊錢十來塊錢,不是通用處理器和我們電腦手機之類的CPU不是一個性能級別,他們根本就不能運行高級程式語言像Java之類的。因為我們要mcu做的事情很簡單,因此根本就不需要它們有很強的性能,自然而然他們性能就很低了。
  • 10個輕鬆上手製作的Arduino項目
    正是因為這個原因,我們為初學者收集到10個任何人都可以做的Arduino項目!為了讓您開始入門,最好使用Arduino入門套件,包含:Arduino開發板、跳線、電阻、麵包板、LED和按鈕。一些項目需要額外的部件,我們將列出可以購買它們的連結。在下面的所有項目中,我們使用circuito.io作為BoM(物料清單)、連線指南和代碼示例。
  • 利用atmega328P搭建arduino最小系統
    一、前言前段時間,學校給我們工作室配了近一百套的arduino Uno,我已經用它們來做了一些小玩意兒
  • arduino項目:製作自動噴水炮
    今天給大家介紹一個互動性強的arduino遊戲,特別適合這個炎熱的夏天戶外娛樂,這個項目利用了特別精確靈敏的微波傳感來對移動物體進行識別,達到可以在傳感識別後發送指令給伺服電機,由伺服電機和跟它固定在一起的噴水頭同時進行隨機的轉動。並且同時噴出水來。由於是伺服隨機轉角,所以經過傳感前面的人並不能用經驗判斷噴水方向,因此互動娛樂性更強。
  • 用Arduino製作簡易磁懸浮裝置
    剛做好的一個下推式磁懸浮裝置~需要的外圍東西很少,用arduino uno控制,l298n驅動四個線圈電磁鐵,配合霍爾傳感器就能懸浮了
  • arduino控制步進電機移動絲杆實現撥片架水平移動
    這篇博客不同於前面的樹莓派和底盤子系統的控制了,而是要進行講解分析如何通過arduino控制步進電機移動絲杆實現撥片架的水平移動了,那麼為什麼要實現這麼一個功能呢?按照上述方法連接好信號線後,就可以編寫arduino程序控制步進電機了,在這裡我使用了2種方法控制步進電機。按鍵控制之前做電賽的時候還有一塊調參的板子,上面有按鍵還有撥碼,因此我就將其用作按鍵控制絲杆的調試工具了。
  • 【項目展示】基於arduino的自動澆花……飯盒?(多圖慎入!)
    這是設計圖(很初步的構想,實際實現和這個圖有一些細微的區別):(原諒我的靈魂畫風→_→)關於如何澆水,有兩種方案:用小刀刻出要鑽孔的位置,避免鑽歪(就是圖中Q和R之間刻了一個標記):警告:對玻璃纖維板切割、鑽孔,一定要注意粉塵汙染!
  • 1.優化arduino程序存儲空間
    (3)減小系統的整體功耗,即消耗儘可能少的電,保證節能;簡單一句話來說的話就是,我們希望可以在佔用最少的設備存儲空間時,用消耗最少的電量來使程序執行的最快,這樣我們的產品才能更簡單、廉價、可靠。在本次教程中通過使用atmega2560底層代碼來實現以前相同的功能,這樣就可以保證程序佔用空間及運行速度更快,因為我們常用的arduino函數都是底層函數的一個封裝,使我們使用起來更為方便。經過代碼優化,可以將程序的佔用空間可以減小大約50%,通過本次教程的學習還可以使我們更為了解arduino程序底層的實現機制。
  • 【DIY】可能是最實用最便宜的 arduino 溫溼度計方案,200615整合家用聲控溫溼度計完整方案
    下邊介紹一個非常簡單,並且容易的電子溫溼度計製作方法。arduino nano(約10元)所有電子模塊和導線都可以在一家店買到,加上運費也就20+元。盒子,用來做溫溼度計的結構,我用的是個茶葉盒,用電磨機在上邊開孔。(不小心給竹葉青做了個廣告)程序非常簡單,使用米思齊(mixly)編寫,先初始化數碼管模塊,然後循環:溫度顯示每兩秒,溼度顯示兩秒。
  • 我攢了一個arduino編程學習套盒
    玩arduino怎麼能沒有一套像模像樣的套件呢?雖然可以利用仿真玩arduino編程。
  • 以 Arduino 之名,點亮 LED 燈
    選擇 Arduino IDE 是因為操作步驟簡單,用其他工具寫入固件也沒問題,不在本教程討論。相比動輒99,上百元的入門學習套件,本教程所用的元件價格便宜,品質不打折扣。首先,下載安裝 Arduino IDE,Windows 8.1/10 (https://dev.tencent.com/u/daoquan/p/arduino/git/raw/master/ide/arduino-1.8.9-windows.exe),Mac OSX(https://dev.tencent.com/u/daoquan/p/arduino/git/raw/master/ide
  • 樂創物聯物聯網架構之硬體層中間件Arduino簡介
    Arduino是一個硬體和軟體的開源電子平臺,它適用於進行交互式項目。Arduino通過接收來自許多傳感器的輸入來感知環境,並通過控制燈光,電機和其他執行器來影響其周圍環境。你可以通過使用Arduino IDE編寫代碼來告訴Arduino該做什麼。
  • Arduino Leonardo吐槽:我怎麼就不香了?
    它有20個數字輸入/輸出引腳(其中7個可用於PWM輸出、12個可用於模擬輸入),一個16 MHz的晶體振蕩器,一個Micro USB接口,一個DC接口,一個ICSP接口,一個復位按鈕。它包含了支持微控制器所需的一切,你可以簡單地通過把它連接到計算機的USB接口,或者使用AC-DC適配器,再或者用電池來驅動它。
  • arduino驅動帶撥片的ST90S微型舵機完成貨物撥取任務
    之前我寫了arduino驅動步進電機帶動絲杆運動的博客,連結在下面:arduino控制步進電機移動絲杆實現撥片架水平移動既然已經可以驅動絲杆帶動撥片架運動了,接下就是需要驅動ST90S微型舵機來帶動撥片撥取貨物了,本博客就介紹arduino如何驅動ST90S微型舵機
  • 【蘑菇雲課堂】Arduino入門教程01 -- 驅動安裝及下載Blink程序
    每周五,蘑菇雲課堂將推出入門教程系列,一起來Arduino吧STEP 1: 下載Arduino IDE打開網頁輸入網址http://arduino.cc/en/Main/SoftwareArduino IDE老版本下載連結:http://arduino.cc/en/Main/OldSoftwareReleases進入到頁面後
  • arduino和樹莓派
    Arduino實際上只是一個微控制器,並不是一臺迷你電腦。微控制器只是電腦中的一個部分,與樹莓派相比只能算是一個子集,提供的功能有限。儘管Arduino可以通過一些小型的類C應用程式進行編程,但它無法運行一個全面完整的作業系統。所以想用Arduino來取代你家裡的媒體中心是不可能的。另一方面,樹莓派就是一臺電腦,我想你應該知道我的意思。
  • 如何使用Arduino UNO製作一臺PM2.5顯示器
    1 ---- NC 2 ---- NC 3 ---- 5V 4 ---- NC 5 ---- GND 6 ---- arduino-tx 7 ---- arduino-rx 4-數字管連接: 1— ser--連接到arduino8 2— clk—連接至arduino9
  • Arduino跟我學:智能洗衣雲提醒
    它採用了雙軸加速度計來檢測運動和振動的墊圈(或烘乾機),當機器不再振動時它會通過手機簡訊來提醒我們衣服洗好了。我們儘量使用一些可以在電子零件商店採購或在線購買的工具來建立這個簡單的系統,並簡化發送這個警報的過程。根據下面的步驟來完成這個簡單又實用的項目吧。
  • Arduino在嵌入式開發中應用案例之arduino點亮LED
    由一個歐洲開發團隊於2005年冬季開發。其成員包括Massimo Banzi、David CuarTIelles、Tom Igoe、Gianluca MarTIno、David Mellis和Nicholas ZambetTI等。     本分享一個通過arduino點亮LED的案例。