基于arduino的oled12864电子时钟和菜单功能
基于arduino和I2C協議OLED12864的電子時鐘和菜單功能
說明:
up使用了基于Arduino的 OLED12864 顯示,并在此之上編寫了具有菜單選擇功能的電子時鐘。由于僅用了一周的課程設計時間進行編寫,且up自身編寫水平能力有限,故只能從實現目標的角度來說完成了設計,由于程序還存在著很多改進地方,加上第一次寫博客,請路過的各位針對程序和博客提出有意義的意見,謝謝。
--------------------------------以下進入正題------------------------------------
一 系統硬件設計
1.1 系統總體分析
系統主要由三個部分組成,見下圖。分別是單片機最小系統板,鍵盤模塊和顯示模塊,其中鍵盤模塊為單向輸入,顯示模塊為雙向輸入輸出。
1.2 硬件電路設計
1.2.1 單片機最小系統板
此次采用的是arduino UNO R3單片機,其他型號單片機均可兼容,但需要注意Arduino mini可能會存在RAM和ROM空間不足的情況,一下為最小系統板的連線原理圖。圖雖然亂但只需注意mega328P的12、13、14、15和18號引腳,分別對應UNO的6,7,8,9和12號引腳,還需注意這五個引腳與鍵盤的接線方式。
1.2.2 鍵盤模塊
在設計的系統中我們需要用鍵盤來輸入數值。此次鍵盤共有5個按鍵,實物中從左至右功能依次為‘菜單’,‘上一個’,‘下一個’,‘是’,‘否’,并均作為獨立按鍵依次連接在arduino UNO的12,9,8,7,6五個I/O口上。
鍵盤按下相應端口呈高電平,未按下呈低電平,原理圖見下
1.2.3 顯示模塊
本次采用的是顯示模塊是基于I2C協議的OLED 12864模塊,針對arduino使用了庫Adafruit_GFX.h和Adafruit_SSD1306.h兩個庫文件。原理圖見下
二 程序設計及調試
2.1 主要子程序設計
2.1.1 鍵盤鍵入程序及其流程圖
(1)流程圖
(2)源程序
void keyboard() {if (digitalRead(up)== 1){delay(10); if (digitalRead(up)== 1){arrow_pos = arrow_pos - 8;if (arrow_pos < 8)arrow_pos = 24;}}if (digitalRead(down) == 1){delay(10)if (digitalRead(down) == 1){arrow_pos = arrow_pos + 8;if (arrow_pos > 26)arrow_pos = 8;}if (digitalRead(y) == 1){delay(10)if ((digitalRead(y) == 1) && (layer < 13)){layer_b = layer;layer = 10 + arrow_pos / 8;}}if (digitalRead(n) == 1){if (digitalRead(n) == 1){if (layer == 1)flag_menu = 0;layer = layer_b;}} }2.1.2 實時時間顯示程序
(1) 流程圖
(2)源程序
void oled_i2c_go(){ display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(47, 1);display.print("T I M E"); display.setTextSize(2); display.setCursor(17, 14); for (int i = 0; i < 8; i++) display.print(a[i]); display.display(); }2.1.3 實時時間計算程序
(1) 流程圖
(2)源程序
void Time_Interrupt() {if (flag_m == 1){ m1++;flag_m = 0;}if (m1 > 9){m2++; m1 = 0;if (m2 > 5){f1++; m2 = 0;if (f1 > 9){f2++; f1 = 0;if (f2 > 5){s1++; f2 = 0;if ((s2 >= s2set) && (s1 >= s1set)) {s2 = 0; s1 = 1; f2 = 0; f1 = 0;if ((s2set == 1) && (s1set == 2)) { if (flag_apm == 0)flag_apm = 1;elseflag_apm = 0;}}else if (s1 > 9)s2++; s1 = 0;}}} }2.2 總體程序流程圖
注:layer值是判斷進入哪個菜單的標志,其中在一級菜單時,layer=1,二級菜單layer=1+二級菜單序號*10
2.3 程序調試和結果分析
2.3.1 程序測試階段
首先插上電源,自動進入計時界面。在無任何操作的情況下一直為顯示實時時間的畫面。
按下菜單鍵,進入第一級菜單,最上部顯示標題“M E N U”,下部顯示三個子菜單選線,左邊有箭頭指向子菜單,箭頭指向的子菜單可由鍵盤的“上”和“下”兩個功能鍵進行調整。若想返回實時時間界面,按下功能鍵“否”即可,若進入子菜單,按下功能鍵“是”即可。
12小時制與24小時制轉換子菜單。進入該子菜單有標題“change 12_24”和兩個選項“choose 12”、“choose 24”,使用“上”、“下”功能鍵進行選擇,最后按“是”確定,或按“否”返回一級菜單。
鬧鐘設定子菜單。進入該子菜單有標題“Set clock”,并有待設定時間“00:00:00”,運用“上”“下”功能鍵進行滾動設定每一位數,功能鍵“是”表示確認設定當前位且進入下一位設定,當設定完最后一位按“是”則設定完畢并啟動鬧鐘,功能鍵“否”表示取消當前位設定并轉而設定上一位。若設定的時間不符合規范,則設定失敗。當鬧鐘時間到時,單片機最小系統板上Led燈會亮起或高亮。
時間設定子菜單。進入該子菜單有標題“Set time”,并有待設定時間“00:00:00”,與設定鬧鐘的方式一致設定實時時間,設定完畢最后一位按下“是”則會返回一級菜單,再返回實時顯示界面。
2.3.2 結果分析
從調試結果來看,該設計實現了實時顯示時間,12與24小時制的轉換,設定鬧鐘和設定實時時間這4個功能 ,并且實時時間采用了定時器計時,提高時間的準確性。
參考文獻
[1] Michael Margolis.Arduino 權威指南[M].北京;人民郵電出版社,2015:210-250
[2] 張榮標.微型計算機原理與接口技術[M].北京:機械工業出版,2018:45-90
[3] Bjarne Stroustrup.C++程序設計:原理與實踐[M].北京.機械工業出版社,2017:193-200
附錄
程序清單:
https://github.com/tlwwjzx/Arduino-OLED12864-Clock-Menu
注:初次用GitHub,碩士的標簽始終不會改,目前本科一枚大佬輕噴。
總結
以上是生活随笔為你收集整理的基于arduino的oled12864电子时钟和菜单功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fluent案例1- 空气流经障碍物-3
- 下一篇: docker可视化管理工具