2020年1月10日 星期五

運用紅外線光閘控制LED


參考資料
紅外線發射接收器http://keejko.blogspot.com/2017/12/blog-post_55.html
阿簡生物筆記:Arudino的光電閘計時裝置http://a-chien.blogspot.com/2016/07/arudino.html

完成品


連接圖
紅外線接收器是深色的那個


這樣寫的話就可以達到東西穿透會關燈的效果

-----------以下為程式碼--------

#define LED 13
#define IRreceiver 2

void setup() {
    pinMode(LED, OUTPUT);     
    pinMode(IRreceiver, INPUT);   
    Serial.begin(9600);
}

void loop(){

    int state = digitalRead(IRreceiver);
    if(state == HIGH) {
        digitalWrite(LED, LOW);
    } else {
        digitalWrite(LED, HIGH);
    }
    delay(100);
}

2020年1月5日 星期日

方格紙、筆記本內頁PDF檔製作網頁

因為太好用了所以想特別寫文章分享一下
方格紙製作https://incompetech.com/graphpaper/multicolor/
網頁操作說明:
跟上圖右側一樣的方格紙
A4、每大格1cm、每中格5mm、每小格1mm的PDF下載(PDF下載)



其他筆記本內頁製作https://incompetech.com/graphpaper/

探究教學-pa分析發現+pc討論傳達課程-體溫與水分恆定

體溫與水分恆定課程是第一學期中粉適合做實驗能力總結的課程,所以設計了一個完整實驗與學習單,以培養學生繪製折線圖與條狀圖的技能,建立分析數據與發現規律的能力。
所需要的工具有:
紅外線溫度計-1隻/組
透明塑膠袋-4個/組
橡皮筋-2條/組
學習單(word下載)


這類型的溫度計便宜又容易測量,建議買4號電池版本,電池會比較容易取得


選擇額頭、手心、手背的關係是因為跟核心溫度與體表溫度、汗腺多寡有關,選擇三個部位可以讓學生比較:哪兩個部位體溫比較接近?哪兩個部位在運動後或靜坐後變化比較接近?原因又是如何?運用不同學生的數據可以得到許多滿合理的推論,就可以訓練學生觀察比對與類化概念,但是總結時也需要告訴學生這些都還是推論,不能把自己做全體的結果,但可以因此更去思考要怎麼證明這些推論。

手套塑膠袋的實驗可以讓流汗後的水蒸氣集中在塑膠袋中,凝結成水滴後就可以看清楚,等到發現有霧氣時停止計時,因為每個學生判斷的方式不同,就請他們自己抓一個標準即可

兩個實驗室幾乎同時進行的,先測量完體溫後將塑膠袋套在單手上,一邊等待每分鐘的體溫測量,一邊觀察手上塑膠袋變化,其實滿忙碌的
4人一組的話就可以1人靜坐、1人跑步、1人注意時間協助測量、1人紀錄,或是兩兩一小組進行

學生有可能會有這樣的觀察與紀錄




這個課程第一次正式上的時候是發方格紙給學生,而且沒有學習單,需要兩節課完成,所以有學習單的狀況下希望可以壓縮到一節課,等正式課程上完再看看是否能夠完成。


方格紙線上製作網頁https://incompetech.com/graphpaper/
傳統方格紙線上製作網頁https://incompetech.com/graphpaper/multicolor/

2019年10月25日 星期五

校外教學之教與學、批評反思與建議

間隔一年遇到相同場地行程的校外教學,覺得有一些事情可以好好思考
我們戶外教學根據的法條是:國民中小學辦理戶外教育實施原則
一學年一次變成一學期一次竟然是由觀光局建議提案給教育局修訂的,主要原因是拯救國旅,整件事情都非常荒謬,可以見到扭曲的跨部會整合與外行領導內行、頭痛醫眉毛的國內沉痾,為了救國旅所以增加戶外教育,而不是為了教育性而增加戶外教育,根本本末倒置。
另外導師行政帶學生出門的法規是什麼?學生發生問題的責任歸屬是什麼?學校的法律後盾是什麼?這些完全都沒有提到,反正就是規定訂了,後勤補給也自己想辦法,沒有任何規劃。
於是就出現戶外教學外包給旅行社,導師心不甘情不願帶學生出門2-3天,打破要賠做好是你應該的狀況,各種不情願的光怪陸離景象也因此產生。因為這個畸形的制度,與培養巨嬰而非一個完整的人的法律規範,各種商業考量下,我們現行的戶外教學大多是以這種形式呈現的,而每個角色的心態大致如下:
學生:要出去玩2-3天了很開心,但是2天要2500左右,3天要3500左右,經濟上要考量。
導師:要陪學生出去2-3天了很擔心,陪伴這麼長時間困擾就增加了,學生在外闖禍了很難處理,受傷了很難處理,我自己也有家庭卻要陪這些學生出來,有問題還要我負責,旅行社處理好學生這幾天大小事情,平安出去,平安回來。
學校行政:平安出門,平安回來,不要丟學校的臉。
旅行社:有錢賺,學生開心,老師安心。

有沒有發現上面沒有一件事情的核心是教育?

因此希望能點出一些問題點,與些許的解決方法,在擔任過導師、行政,並考過導遊領隊證照與長期個人獨自自助旅行的多重角色與經驗裡,能夠釐清出一些解決的方法與可以強調的重點,在無須改變太多現行體制之下,我們可以從不同的角度做哪些事情,以更完整戶外教學的內涵。

一、校外教學的教學目標、目的、內容、方法分別是什麼?
有些學校可能會來一場人生的壯遊,或是溯溪、自行車環島、登山,這些通常出現在學校有某個超堅強團隊的狀況下才有機會成形,而且要融入平日各項教育中,十分的耗時費力,但這樣的耗時費力狀況下,大多是少子化到需要起死回生的學校可以進行的事情,他們可能有比較少量的學生與僅需要幾名教師聯合家長就可以推動起來。
所以請問我們常態的這些戶外教學的目標、目的、內容與方法應該是什麼呢?
教學目標:
依據國民中小學辦理戶外教育實施原則內的目標就滿不錯的了,但是目前能做到的真的很少。
教學目的:
換個場地與拉長時間進行一趟特別的旅程,而且是在教室內做不到的事情

教學內容:
依照十二年國教議題切入(十二年國教基本綱要議題融入說明手冊),點出可能會遇到的內容

四項重要議題
1.性別平等教育:男女住宿規則、異性牽手
2.人權教育:遊覽車內唱歌或是放影片選擇(民主)、導師領隊帶領風格(威權)、學生隱私權與人格權(隱私與自然人權)、尊重、個人責任、社會責任
3.環境教育:垃圾、一次性餐具、夜市、國家公園、保護區、離開遊覽車的環境教育
4.海洋教育:海生館

十五項其他重要議題切入
1.品德:這是一個廢文條目,詳見下方補充
2.生命:生命教育包含五個主題;哲學思考、人學探索、終極關懷、價值思辨、靈性修養,這些主題在戶外教學展現的部分就滿多樣的,舉凡用餐禮儀、住宿禮儀、對旅宿業服務人員之禮節、同儕合作與關懷、
3.法治:遊覽車撥放影片與MTV版權等智財權、交通法規、旅館物品合理使用財產權、性別平等法、刑法性騷擾等議題
4.安全:生命安全、交通安全、網路交友安全、住宿安全(防盜鎖使用與應門)
5.防災:逃生演練、交通災害應變、住宿災害應變、危機處理
6.家庭:小組活動與班級活動之同儕間的類似家庭支持與住宿時的家庭生活互動之學習
7.生涯規劃:不同觀光工廠的職業介紹、旅宿業、攤販、博物館員、解說員等工作人員
8.多元文化:新移民、新住民與移工在台灣生活的觀察
9.原住民族:在地族群介紹與接觸
10.閱讀素養:可以結合走讀來設計活動或配合當地旅遊書籍規劃
11.戶外:健行、小登山,因為人數較多所以難度不宜太高,主力可以放在童軍露營的冒險與合作教育
12.國際:越在地越國際,可以找尋適合推薦給外國人的旅遊素材,或是修正旅遊景點告示牌內的翻譯資訊或不合理的看板,找到比較好的範本等
13.資訊:可以在出發前進行旅遊規劃,建立行程,線上共編或是進行照片蒐集等
14.能源:可能會經過風力發電、核電廠、火力發電廠時,可以進行相關介紹與觀察
15.科技:旅行中會看到的便捷設施之操作與功能

二、不同角色可以怎麼改變一點點就更符合教育目的
學生:你們是來學習的,請認真享受體驗
導師:你們是去工作的,但法律會保障你們權利與責任
家長:你們要暫時轉交管教權利、權力和責任給學校和子弟本身,首先盡量相信學校第一線處置而不是學生說法,相信證據而不是說詞,因為當事者一定隱瞞現實,學校相較之下比較不會說出沒有證據的言論。只是可能大家都會被當事者耍,請跟學校站在一起教育孩子,但也要用完整證據去監督學校老師是否努力教育學生成為一個人的角色。
教務:了解實施場域的可能的教學策略,組成教師團隊進行學習單規劃,並於出發前後進行相關教學,主要是連結正式課程與校外教學之關係。
輔導:主要進行生命、家庭、生涯規劃議題之教育準備。關於活動間的學生團隊合作、心情狀態、職業與生涯規劃等進行統整。
學務:統整導師對於活動間的性平、人權、環境、品德、法治、安全、戶外等議題的共識,進行課程設計。讓學生在活動中學習成為一個負責、守法、合作、注意安全、維護環境的自然成人。需針對活動間的學生生活禮儀、活動安全、住宿規範、活動時間等進行相關人權、法治與性平教育等相關範疇進行共識決,並確實在戶外教學進行這些教學目標。
總務:安全與防災教育議題內容規劃

旅行社:行程串聯,盡量能規劃豐富議題的活動,統整解說內容,配合學校安排行程與輔助教學,強調生活教育與守時觀念。

景點:
可以做的事情是看一下國中小課本,或是請現職教師協助觀察探究思考型學習單或解說板,答案最好在某處解說板上,以下是建議的方向
博物館:你們應該是專業的,但目前台灣博物館大部分看起來離普及教學專業有很大段的距離,科普推廣部分可以參考國高中小學課綱內容去設計,問題導向優先,實物展示請規畫好可以觸摸(請做簡單強壯一點,能不凸出來被凹斷轉壞的設計優先)跟禁止觸摸(乾脆就隔玻璃)的區域,解說內容的設計與標示
遊樂園:地理地景、風速、G力加速度、向心力、暈眩、旋轉、新科技(4D、AR、VR)、美學、安全
觀光工廠:詳細的介紹職業需求、典範人物跟物品製成與材料

三、政府與法規部分該如何修正
教育部:
不要再被不專業綁架了,應該依照校外教學的教學方式,先找學校與老師討論,包含偏鄉小校與都會大校都有不一樣的問題與解決的策略,接著再找相關人員討論,包含旅行社、縣市政府教育部、重點博物館遊樂園、交通部、經濟部等,進行對校外教學這件事情的問題分析與提出各方觀點,並統計出更適合國人的校外教學方式,甚至於推廣戶外教育、冒險教育等範疇。

法規與經費:
經費:校外教學的母法是國民中小學辦理戶外教育實施原則,其中的十一點提到經費來源由各地方政府自訂補充,網路上(植根法律網)可以找到的有分成詳細說明經費,包含隨隊人數的有:台北市彰化市花蓮縣;由這些資料可以知道教師員額大概是每班一個導師,基本兩位行政人員,每超過五台車增加一位為原則;說的比較模糊的:台中市嘉義縣高雄市;沒說經費:台南市101年資料;2013左右教師免費旅遊的相關資訊延燒,有討論出詳細規定比較完整的辦法(新聞)。本來畢業旅行的定位就比較清晰一些了,包含修正名詞為校外教學,教師經費由主管機關支出,免於轉嫁給學生,因此每年戶外教學都會有挪出每班一個左右的低收入戶、經濟困難等減免經費的名額,如果把學生繳費拿去給老師使用會被質疑,如果用於公益的經濟困難同學就相較不會被說話了。
工時與權責:關於教師帶隊出門的部分的工時與工作內容就很曖昧不明了,畢竟帶隊出去依照責任來說可以是24小時全時待機的,有些學校因此也會有加班補修等相關辦法,但不是全國一致的,這點比較可惜,如果在法規辦法上能略為說明相關規定的話,對於老師這個職業在戶外教學的工作權責就更能夠釐清了。

經濟部觀光局:干你們O事,要賺錢去改良交通、廣宣、軟體拉笨蛋,不然經費拿出來阿,國家買單,懂?


關於品德教育內容多廢在以下說明,
因為他就是包含人權的自由尊重、法治、性平,但是又本身講不清楚自己是什麼的東西,一開始講善,但沒有其他根基的善即是偽善,所以可以稱為偽善教育。唯一跟其他議題比較大的不同是孝悌仁愛這種八股爛東西(你這樣要我怎麼教小孩那派又會跳出來了,中國五千年傳統歷史課本讀錯本那派也會跳出來),我吃的鹽比你吃的飯多所以我說的就有道理的教育,常常叫人要有品的人最沒品了。自由民主國家根本不用孝悌仁愛,因為這根本包含了輩分威權等觀念,如果轉換成生命教育的尊重與關懷就完全沒這問題了。只有有品德的大人才有機會培養出有品德的小孩,先讓自己有品再說...
十二年國教基本綱要議題融入說明手冊品德教育整體說明與其他議題重複處
品德發展層面:品德教育需要增進個人、社會、自然與世界等多元層面的發展,包括:
良好生活習慣與德行『家庭』『生命』『人權』『法治』、自尊尊人『生命』、與自愛愛人『生命』、溝通合作『生命』並維繫和諧人際關係『生命』、重視群體
規範與榮譽、關懷生活環境與自然生態永續發展、關心在地與全球道德議題並增進公民
意識與行動等。
品德核心價值:品德教育需要培養各種品德核心價值,包括:尊重生命『生命』、孝悌仁愛生命、誠實信用法治、自律負責生命、謙遜包容生命『人權』、欣賞感恩『生命』、關懷行善生命及公平正義『人權』等。
品德關鍵議題:品德教育需要探究社會生活中各個重要道德議題,主要包括:生命倫理、
家庭倫理『家庭』法治『人權』、族群平權『多元文化、科技倫理『科技、關懷弱勢生命『人權』、社會公義『人權』及專業倫理等。

教育部品德教育促進方案教學方法與其他議題重複處
創新品德教育 6E 教學方法及成效評量
1.『生命』典範學習(Example):鼓勵教師或家長等學生生活親近之人物成為學生學習典範,發揮潛移默化之效果。
2.『生命』啟發思辨:鼓勵各級學校對為什麼要有品德、品德的核心價值與其生活中實踐之行為準則進行討論、澄清與思辨。
3.『生命』勸勉激勵:鼓勵各級學校透過影片、故事、體驗教學活動及生活教育等,常常勸勉激勵師生實踐品德核心價值。
4.『人權』環境形塑:鼓勵各級學校透過校長及行政團隊發揮典範領導,建立具品德核心價值之校園景觀、制度及倫理文化。
5.『生命』體驗反思:鼓勵各級學校推動服務學習活動、課程及社區服務,實踐品德核心價值。
6.『生命』正向期許:鼓勵各級學校透過獎勵與表揚,協助學生自己設定合理、優質的品德目標,並能自我激勵,不斷追求成長。

2019年10月22日 星期二

輔導團到校輔導2

107學年第一次的輔導團到校輔導,我分享的是
1.教具『手機顯微鏡』與操作方法,並讓每個到場的老師領取10個手機顯微鏡
2.十二年國教新課綱素養導向教學-學習表現-探究能力-問題解決,包含其內涵與課程設計方法

108學年先接續107年分享部分,說明手機顯微鏡的進階用法,與其他輔助顯微鏡觀察的好工具
1.手機顯微鏡操作

2.手機顯微鏡觀察水中小生物
3.顯微鏡輔助器材-顯微鏡用手機夾

另外關於十二年國教新課綱自然領域,介紹的是
素養導向教學-學習表現-探究能力-思考智能-建立模型
簡報內容如下


首先將科學分類成三大部分
1.知識概念
2.工具技能
3.科學方法



試著將七、八、九年級上下學期的自然科實驗分成:有無實驗設計、量化或質化,並做成四象限圖,可以發現七年級首重觀察,八年級重視量化跟實驗設計,而我們每週1次的探究教學也可以從這個方向去發想






除了探究教學以外,新課綱素養導向教學還有另一個區域是:思考智能
要訓練學生的思考智能之前,我們必須先知道什麼東西是思考智能,這部分可以參考阿簡老師-新竹光華國中簡志祥老師的文章
演講紀錄-探究課程工作坊之分析與發現(6)-用運算思維進行科學方法
這一系列的文章都很經典,也是探究教學的很好入門磚。

在這樣的課程設計下,教師必須先檢視每個實驗課程的細節,並抽絲剝繭到最小化單位為止,以理化課程竹筷乾餾為例,教師應該拆解出竹筷乾餾的最小單位,並去蕪存菁的詢問自己:這個實驗到底是要教學什麼概念?

如果授課時只是覺得竹筷乾餾是一個很有趣的課程,可以噴火還可以在課後用炭筆寫字,這樣的層次其實是不太科學的,而這部分我們分析起來可以發現:竹筷乾餾是放在-有機物,這個單元裡面,目的其實是為了驗證什麼是有機物
進一步思考為什麼要乾餾竹筷,不乾餾其他東西呢?還是因為竹筷比較有趣?
判斷是否為有機物就只能用乾餾而已嗎?
因此教師也可以更聚焦在運用乾餾這個技巧來讓學生觀察日常生活中的東西是否為有機物,或是直接給不一樣的組別操作不同材料,並統整學生需要學習的素養有哪些,這樣就可以是一個探究教學課程規劃的方式了。

另外的方法我們也可以用在所有的科學實驗,將這些實驗模組化、去蕪存菁、思考要教授的知識、技能與情意個別是那些,先問自己WHY,在問自己HOW,這樣設計起來的科學實驗就會更符合探究教學的精神了。而老師思考課程的同時,也就是訓練教師的思考智能,包含建立模型-運算思維-問題拆解-模組化-化繁為簡-演算法...這些技巧也就能夠潛移默化在課程當中,讓學生學習到符合科學與問題解決的態度了。


2019年10月18日 星期五

arduino物理實驗組:溫濕度+光學混光+音頻調整+超音波測距+馬達角度控制20191101

完成了一個可以處理國中物理相關問題的器材,包含光學、聲音、運動學、溫度變化的測量展示儀器,感謝龍山國中鄭志鵬小P老師讓我參考他的程式,還有網路上的其他資源,加上數位深耕計畫提供材料、金源與進度壓力才能逼迫我自己寫出這個東西。
基本上還缺一個功能就完整了,到時候再改版

基本上如果能夠照下方連接圖插好,把程式碼寫進去nano裡面就可以運作了

所需要準備的器材,露天買起來含電池總價大概是700多塊一套,可以請廠商協助裝成一盒
aduino nano V3.0 ATMEGA328P
arduino nano UNO多用 擴展板 (E006)
麵包板SYB-170
輕觸按鍵開關4P立式
電阻10KΩ
可變電阻WH148+梅花柄塑膠旋鈕
0.96吋黃藍雙色I2C IIC通信12864OLED

DHT11模組YS-31電子積木(A023)
DS18B20不鏽鋼封裝防水型
電阻4.7KΩ
LED紅綠藍各1 or LED共陰全彩
無源蜂鳴器5V
超音波測距模塊HC-SR04
伺服馬達SG90 Tower Pro

杜邦線公母頭 4色*3組,3色*4組,2色*1組

中號無格塑膠小盒子15.8*11.8*5.8即可收納
電源推薦18650+充電盒

連結圖如下(未連接到版上的黑色接GND,紅色接5V)

長按按鈕換選單,短按按鈕換功能,可調式電阻旋鈕調整採樣更新時間or數值

選單0  DHT11溫濕度+不鏽鋼防水溫度計
    功能1  顯示溫濕度+不鏽鋼溫度計溫度(採樣更新頻率100ms~1100ms)
    功能2  顯示溫濕度+不鏽鋼溫度計溫度+6組過去數值(採樣更新頻率100ms~1100ms)
    功能3  顯示溫濕度+不鏽鋼溫度計溫度+6組過去數值(採樣更新頻率1000ms~11000ms)
 


選單1 RGB燈(我加了一個衛生紙燈罩,可以讓顏色混和更均勻,其實就是用衛生紙把燈包起來就好)
    功能1  旋鈕調整R紅色亮度0~255
    功能2  旋鈕調整G紅色亮度0~255
    功能3  旋鈕調整B紅色亮度0~255
 


選單2 蜂鳴器
    功能1  旋鈕調整Hz頻率0~1000
    功能2  旋鈕調整Hz頻率0~10000
 


選單3 超音波測距(2cm~60cm較準確,僅取這一段)
    功能1  顯示距離(採樣更新頻率100ms~1100ms)
    功能2  顯示距離+9組過去數值(採樣更新頻率100ms~1100ms)
    功能3  顯示距離+9組過去數值(採樣更新頻率10ms~110ms)
 



選單4 伺服馬達
    功能  旋鈕調整馬達角度5~180
 




選單5 介紹畫面


---------------以下是arduino程式碼-------------
/*
 * design by orangeV,taiwan,tainan 台南大成國中 蔡智恆
 * need libraries 需要程式庫<Servo.h>,<DHT.h>,<SPI.h>,<Wire.h>,<Adafruit_GFX.h>,<Adafruit_SSD1306.h>,<OneWire.h>,<DallasTemperature.h>
 */
int
potPin = A3,
R = 0,
button = 2,
buzzer = 3,
motorPin = 4,
ds18b20 = 9,
DHTPin = 10,
ledRPin = 5,
ledGPin = 6,
ledBPin = 11,
cR=0,cG=0,cB=0,
trigPin = 12,        //Trig Pin
echoPin = 13,        //Echo Pin
menu1N = 5,
menu2N = 6,
delaytime = 100;

float cm = 0.0;
int i=0 , j,cm0[9]={0};


//motor
#include <Servo.h>
Servo myservo;


//DHT11/22
#include <DHT.h>
DHT dht(DHTPin, DHT11);



//D18B20
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(ds18b20);
DallasTemperature sensors(&oneWire);

                 

//OLED
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
//OLEDsetting
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif





//menu
int mode1=1, mode2=0;

void setup() {
  Serial.begin(9600);

  //buzzer
  pinMode(buzzer,OUTPUT);

  //soundsonic
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //ds18b20
  sensors.begin();

  //button
  pinMode(button, INPUT_PULLUP);

  //DHT
  Wire.begin();
  dht.begin();


  //motor
  myservo.attach(motorPin);


  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();

}

void loop() {
  int sw = digitalRead(button);
  R = analogRead(potPin);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.setTextSize(1);
  if(sw == HIGH)menu();
  if(mode2 == 3)DHTxx();
  if(mode2 == 1)RGBLED();
    if ( mode2 != 1 ) {
      analogWrite(ledRPin, 0);
      analogWrite(ledGPin, 0);
      analogWrite(ledBPin, 0);
    }
  if(mode2 == 2)Buzzer();
    if ( mode2 != 2 ) noTone(buzzer);
  if(mode2 == 0)supersonic();
  if(mode2 == 4)motor();
    if ( mode2 != 4 ) myservo.write(0);
  if(mode2 == 5)openmenu();
 
}

void menu(){   
  int k0,k1,tt=0;
  AA1: k0=digitalRead(button);  delay(30);
  k1 = digitalRead(button);
  if (k1==LOW) goto AA1;  //判断按键是否低电平,如果低,循环检测,如果高则下一句
  AA2: tt++;             //对按键高电平计数
  k0 = digitalRead(button);  delay(10);
  k1 = digitalRead(button);
  if (k1==HIGH) goto AA2;  //判断按键是否高电平,如果高,继续计数,如果低电平,则表示按键结束
  if (tt<30)   mode1 = mode1 + 1;         //如果按键时间小于30*10ms=0.3s
  if (tt>80)  mode2 = mode2 + 1;         //如果按键时间大于80*10ms=0.8s
  if ( mode2 == menu2N ) mode2 = 0;
  if ( mode1 == menu1N ) mode1 = 1;
}

void openmenu(){
  display.setTextSize(1);
  display.print("orangeV design");
  display.setTextSize(2);
  display.setCursor(0,12);
  display.print("DCJHS LAB");
  display.display();
  display.clearDisplay();
  R = 0;
  mode1 = 1;
}

void Buzzer(){
  R = analogRead(potPin);
  int R1=0,R10=0;
  if ( mode1 >= 3 ) mode1 = 1;
  display.print("Sound");
  display.setCursor(40,0);
  if (mode1==1){
    display.println(" 0 ~ 1000 HZ");
  }else{
    display.println(" 0 ~ 10000 HZ");
  }
  display.setTextSize(2);
  if(R<10){
    noTone(buzzer);
    display.print(0);
  }else{
    if(mode1==1){
    R1 = R - 10;
    tone(buzzer,R1);
    display.print(R1);
    }else if(mode1==2){
    R10 = R*10-100;
    tone(buzzer,R10);
    display.print(R10);
    } 
  }
  display.setCursor(60,12);
  display.println("Hz");
  display.display();
  display.clearDisplay();
  delay(100);
}

void supersonic(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float duration = pulseIn (echoPin, HIGH),
      cm = (duration) / 58.2
  ;
  if ( mode1 >= 4 ) mode1 = 1;
  display.print("SoundSonic 2to60");
  display.setCursor(100,0);
  display.print("mod");
  display.println(mode1);
  display.setTextSize(1);
  display.print("t= ");
  R = analogRead(potPin);
  delaytime = R/100 * 100+100;
  if(mode1==3) delaytime = delaytime/10;
  display.print(delaytime);
  if(mode1==2) delaytime = delaytime - 90;
  if(mode1==3) delaytime = delaytime - 10;
  display.setCursor(44,8);
  display.println("ms");
  int cm10=cm*10;
  display.setTextSize(2);
  if (cm<60&&cm>2){
    display.print(cm10/10);
    display.setTextSize(1);
    display.setCursor(25,23);
    display.print(".");
    int cm100=cm*100;
    display.print(cm100%100/10);
  }else{
    display.print("err");
  }
  display.setTextSize(2);
  display.setCursor(37,16);
  display.println("CM");

  display.display();
  display.clearDisplay();

  if(mode1==2||mode1==3){
    Serial.print(cm);
    Serial.print("CM");
    Serial.print(delaytime);
    Serial.println("ms");
    if(i>=9)i=0;
    if(i<9){
      if (cm<60&&cm>3){
        cm0[i]=cm;
      }else{
        cm0[i]=0;
      }
      display.setTextSize(1);
      display.setCursor(70+20*(i%3),(i/3)*7+10);
      display.print("*");
      display.setCursor(75,10);
      display.print(cm0[0]);
      display.setCursor(95,10);
      display.print(cm0[1]);
      display.setCursor(115,10);
      display.print(cm0[2]); 
      display.setCursor(75,16);
      display.print(cm0[3]);
      display.setCursor(95,16);
      display.print(cm0[4]);
      display.setCursor(115,16);
      display.print(cm0[5]);
      display.setCursor(75,23);
      display.print(cm0[6]);
      display.setCursor(95,23);
      display.print(cm0[7]);
      display.setCursor(115,23);
      display.print(cm0[8]);
      i++;
    }
  }
  delay(delaytime);
}

void DHTxx(){
  sensors.requestTemperatures();
  float DHThum = dht.readHumidity();
  float DHTtemp= dht.readTemperature();
  float cc = sensors.getTempCByIndex(0);
 
  display.print("T & H ");
 
  if ( mode1 >= 4 ) mode1 = 1; 
  display.print("t = ");
  R = analogRead(potPin);
  delaytime = R/100 * 100+100;
  if(mode1==3) delaytime = delaytime*10;
  display.print(delaytime);
  display.println(" ms");
 
  display.print(DHThum,0);  //小數點0位
  display.print("% ");
  display.print(DHTtemp,1); //小數點1位
  display.println("C");
  display.setTextSize(2);
  if(cc>-127){
    display.print(cc,1);
  }
  display.print("C");
 
  if(mode1>=2){
    if(i>=6)i=0;
    if(i<6){
      if (cc>-170){
        cm0[i]=cc;
      }else{
        cm0[i]=0;
      }
      display.setTextSize(1);
      display.setCursor(60+30*(i%2),(i/2)*6+10);
      display.print("*");
      display.setCursor(65,10);
      display.print(cm0[0],1);
      display.setCursor(95,10);
      display.print(cm0[1],1);
      display.setCursor(65,16);
      display.print(cm0[2],1); 
      display.setCursor(95,16);
      display.print(cm0[3],1);
      display.setCursor(65,22);
      display.print(cm0[4],1);
      display.setCursor(95,22);
      display.print(cm0[5],1);
      i++;
    }
  }
  display.display();
  display.clearDisplay();
  delay(delaytime);
  delaytime = 0;
}
void motor(){
  R = 0;
  R = analogRead(potPin);
  R = map(R, 0, 1023, 0, 175);  // 0-1024 -> 0-180
  myservo.write(R);
  display.println("motor 5 ~ 180");
  display.setTextSize(2);
  display.print("angle  ");
  display.print(R+5);
  delay(15);
  display.display();
  display.clearDisplay();
}
void RGBLED(){
  R = 0;
  if ( mode1 >= 4 ) mode1 = 1;
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 255);  // 0-1024 -> 0-255
  display.print("RGB LED");
  if(mode1==1){
    display.println("   R");
    cR=R;
  }else if(mode1==2){
    display.println("   G");
    cG=R;
  }else if(mode1==3){
    display.println("   B");
    cB=R;
  }else{
    display.println("   clear");
    cR=0;
    cG=0;
    cB=0;
  }
  display.print("R=");
  display.println(cR);
  display.print("G=");
  display.println(cG);
  display.print("B=");
  display.println(cB);
  display.display();
  display.clearDisplay();
  analogWrite(ledRPin, cR*0.8);//調弱輸出電壓,保護LED燈跟眼睛
  analogWrite(ledGPin, cG*0.4);
  analogWrite(ledBPin, cB*0.8);
}
--------------以上是程式碼--------------



自從學了比較正統的語言學之後,雖然覺得還是差很多練習,但是有感覺比較順一點了,目前工作進度是這樣,DHT11溫溼度、DS18b20溫度、超音波測距、顏色顯示與調整1按鈕1可變電阻、馬達可變電阻調整角度、發聲頻率調整等...

--------------第一版構思--------------
int
PulseWire = A2,
Threshold = 550,
potPin = A3,
R = 0,
ds18b20 = 1,
button = 2,
buzzer = 3,
motorPin = 4,
DHTPin = 10,
ledRPin = 5,
ledGPin = 6,
ledBPin = 11,
cR=0,cG=0,cB=0,
trigPin = 12,        //Trig Pin
echoPin = 13,        //Echo Pin
cm = 0,
menu1N = 4,
menu2N = 6,
delaytime = 100;

//motor
#include <Servo.h>
Servo myservo;

//DHT11/22
#include <DHT.h>
DHT dht(DHTPin, DHT11);

//DS18b20
#include <DallasTemperature.h>
OneWire oneWire(ds18b20);
DallasTemperature sensors(&oneWire);

//程式庫標頭檔
#include <OneWire.h>

//OLED
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
//OLEDsetting
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

//menu
int mode1=1, mode2=0;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  //buzzer
  pinMode(buzzer,OUTPUT);

  //soundsonic
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //ds18b20
  sensors.begin();

  //button
  pinMode(button, INPUT_PULLUP);

  //DHT
  dht.begin();

  //motor
  myservo.attach(motorPin);
  myservo.write(90);

  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}

void loop() {
  int sw = digitalRead(button);
  R = analogRead(potPin);
  display.setTextColor(WHITE);
  display.setCursor(0,0);             //字體位置
  display.setTextSize(1);             //字體大小
  if(sw == HIGH)menu();
  if(mode2 == 0)RGBLED();
    if ( mode2 != 0 ) {
      analogWrite(ledRPin, 0);
      analogWrite(ledGPin, 0);
      analogWrite(ledBPin, 0);
    }
  if(mode2 == 1)DHTxx();
  if(mode2 == 2)Buzzer();
    if ( mode2 != 2 ) {
      noTone(buzzer);
    } 
  if(mode2 == 3)supersonic();
  if(mode2 == 4)motor();
  if(mode2 == 5)openmenu();
}

void menu(){
  unsigned long duration = pulseIn(button, HIGH ,2500000);
  if (duration != 0) {               
    Serial.print("duration: ");
    Serial.print(duration);
    Serial.println(" microseconds");
    mode1 = mode1 + 1;
  } else {
    Serial.println("timeout");
    mode2 = mode2 + 1;
  }
  if ( mode2 == menu2N ) mode2 = 0;
  if ( mode1 == (menu1N+1) ) mode1 = 1;
}

void openmenu(){
  display.setTextSize(1);
  display.print("orangeV design");
  display.setTextSize(2);
  display.setCursor(0,12);
  display.print("DCJHS LAB");
  display.display();
  display.clearDisplay();
  R = 0;
  mode1 = 1;
}

void Buzzer(){
  R = analogRead(potPin);
  int R1=0,R10=0;
  if ( mode1 >= 3 ) mode1 = 1;
  display.print("Sound");
  display.setCursor(40,0);
  if (mode1==1){
    display.println(" 0 ~ 1000 HZ");
  }else{
    display.println(" 0 ~ 10000 HZ");
  }
  display.setTextSize(2);
  if(R<10){
    noTone(buzzer);
    display.print(0); 
  }else{
    if(mode1==1){
    R1 = R - 10;
    tone(buzzer,R1);
    display.print(R1);
    }else if(mode1==2){
    R10 = R*10-100;
    tone(buzzer,R10);
    display.print(R10);
    } 
  }
  display.setCursor(60,12);
  display.println("Hz");
  display.display();
  display.clearDisplay();
  delay(100);
}

void supersonic(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  long duration = pulseIn (echoPin, HIGH),
       cm = (duration) / 58.2
  ;

  if ( mode1 >= 3 ) mode1 = 1;
  display.print("SoundSonic");
  display.setCursor(100,0);
  display.print("mod");
  display.println(mode1);
  display.setTextSize(2);
  display.print(cm);
  display.setCursor(50,9); 
  display.println("CM");
  display.setTextSize(1);
  display.print("sampling=  ");
  R = analogRead(potPin);
  delaytime = R + 100;
  display.print(delaytime);
  display.setCursor(100,24);
  display.print("ms");
  display.display();
  display.clearDisplay();

  if(mode1==2){
    Serial.print(cm);
    Serial.print("CM");
    Serial.print(delaytime);
    Serial.println("ms");
  }
  delay(delaytime);
}

void DHTxx(){
  float DHThum = dht.readHumidity();
  float DHTtemp= dht.readTemperature();
  display.println("DHT");
  display.setTextSize(2);
  display.print(DHThum,0);  //小數點0位
  display.print("% ");
  display.print(DHTtemp,1); //小數點1位
  display.print("C");
  display.display();
  display.clearDisplay();
  delay(delaytime);
}

void motor(){
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 180);  // 0-1024 -> 0-180
  myservo.write(R);
  display.println("motor");
  display.setTextSize(2);
  display.print("angle  ");
  display.print(R);
  delay(15);
  display.display();
  display.clearDisplay();
}

void RGBLED(){
  if ( mode1 >= 4 ) mode1 = 1;
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 255);  // 0-1024 -> 0-255
  display.print("RGB LED");
  if(mode1==1){
    display.println("   R");
    cR=R;
  }else if(mode1==2){
    display.println("   G");
    cG=R;
  }else if(mode1==3){
    display.println("   B");
    cB=R;
  }else{
    display.println("   clear");
    cR=0;
    cG=0;
    cB=0;
  }
  display.print("R=");
  display.println(cR);
  display.print("G=");
  display.println(cG);
  display.print("B=");
  display.println(cB);
  display.display();
  display.clearDisplay();
  analogWrite(ledRPin, cR);
  analogWrite(ledGPin, cG);
  analogWrite(ledBPin, cB);
}


--------------第二版按鈕不敏銳--------------
int
PulseWire = A2,
Threshold = 550,
potPin = A3,
R = 0,
ds18b20 = 1,
button = 2,
buzzer = 3,
motorPin = 4,
DHTPin = 10,
ledRPin = 5,
ledGPin = 6,
ledBPin = 11,
cR=0,cG=0,cB=0,
trigPin = 12,        //Trig Pin
echoPin = 13,        //Echo Pin
cm = 0,
menu1N = 4,
menu2N = 6,
delaytime = 100;

int i=0 , j,cm0[6]={0};

//motor
#include <Servo.h>
Servo myservo;

//DHT11/22
#include <DHT.h>
DHT dht(DHTPin, DHT11);

//DS18b20
#include <DallasTemperature.h>
OneWire oneWire(ds18b20);
DallasTemperature sensors(&oneWire);

//程式庫標頭檔
#include <OneWire.h>

//OLED
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
//OLEDsetting
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

//menu
int mode1=1, mode2=0;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  //buzzer
  pinMode(buzzer,OUTPUT);

  //soundsonic
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //ds18b20
  sensors.begin();

  //button
  pinMode(button, INPUT_PULLUP);

  //DHT
  dht.begin();

  //motor
  myservo.attach(motorPin);
  myservo.write(0);

  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}

void loop() {
  int sw = digitalRead(button);
  R = analogRead(potPin);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.setTextSize(1);
  if(sw == HIGH)menu();
  if(mode2 == 3)RGBLED();
    if ( mode2 != 0 ) {
      analogWrite(ledRPin, 0);
      analogWrite(ledGPin, 0);
      analogWrite(ledBPin, 0);
    }
  if(mode2 == 1)DHTxx();
  if(mode2 == 2)Buzzer();
    if ( mode2 != 2 ) {
      noTone(buzzer);
    }
  if(mode2 == 0)supersonic();
  if(mode2 == 4)motor();
  if(mode2 == 5)openmenu();
}

void menu(){ 
  int k0,k1,tt=0;
  AA1: k0=digitalRead(button);  delay(30);
  k1 = digitalRead(button);
  if (k1==LOW) goto AA1;  //判断按键是否低电平,如果低,循环检测,如果高则下一句
  AA2: tt++;             //对按键高电平计数
  k0 = digitalRead(button);  delay(10);
  k1 = digitalRead(button);
  if (k1==HIGH) goto AA2;  //判断按键是否高电平,如果高,继续计数,如果低电平,则表示按键结束
  if (tt<30)   mode1 = mode1 + 1;         //如果按键时间小于30*10ms=0.3s
  if (tt>80)  mode2 = mode2 + 1;         //如果按键时间大于80*10ms=0.8s
  if ( mode2 == menu2N ) mode2 = 0;
  if ( mode1 == (menu1N+1) ) mode1 = 1;
}

void openmenu(){
  display.setTextSize(1);
  display.print("orangeV design");
  display.setTextSize(2);
  display.setCursor(0,12);
  display.print("DCJHS LAB");
  display.display();
  display.clearDisplay();
  R = 0;
  mode1 = 1;
}

void Buzzer(){
  R = analogRead(potPin);
  int R1=0,R10=0;
  if ( mode1 >= 3 ) mode1 = 1;
  display.print("Sound");
  display.setCursor(40,0);
  if (mode1==1){
    display.println(" 0 ~ 1000 HZ");
  }else{
    display.println(" 0 ~ 10000 HZ");
  }
  display.setTextSize(2);
  if(R<10){
    noTone(buzzer);
    display.print(0);
  }else{
    if(mode1==1){
    R1 = R - 10;
    tone(buzzer,R1);
    display.print(R1);
    }else if(mode1==2){
    R10 = R*10-100;
    tone(buzzer,R10);
    display.print(R10);
    } 
  }
  display.setCursor(60,12);
  display.println("Hz");
  display.display();
  display.clearDisplay();
  delay(100);
}

void supersonic(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  long duration = pulseIn (echoPin, HIGH),
      cm = (duration) / 58.2
  ;
  if ( mode1 >= 3 ) mode1 = 1;
  display.print("SoundSonic");
  display.setCursor(100,0);
  display.print("mod");
  display.println(mode1);
  display.setTextSize(1);
  display.print("sampling=  ");
  R = analogRead(potPin);
  delaytime = R/100 * 100+100;
  display.print(delaytime);
  display.setCursor(100,8);
  display.println("ms");

  display.setTextSize(2);
  if (cm<60&&cm>3){
    display.print(cm);
  }else{
    display.print("??");
  }
  display.setCursor(45,16);
  display.println("CM");
  display.display();
  display.clearDisplay();

  if(mode1==2){
    Serial.print(cm);
    Serial.print("CM");
    Serial.print(delaytime);
    Serial.println("ms");
    if(i>=6)i=0;
    if(i<6){
      if (cm<60&&cm>3){
        cm0[i]=cm;
      }else{
        cm0[i]=0;
      }
      display.setTextSize(1);
      display.setCursor(75,16);
      display.print(cm0[0]);
      display.setCursor(95,16);
      display.print(cm0[1]);
      display.setCursor(115,16);
      display.print(cm0[2]);
      display.setCursor(75,23);
      display.print(cm0[3]);
      display.setCursor(95,23);
      display.print(cm0[4]);
      display.setCursor(115,23);
      display.print(cm0[5]);
      i++;
    }
  }
  delay(delaytime);
}

void DHTxx(){
  float DHThum = dht.readHumidity();
  float DHTtemp= dht.readTemperature();
  display.println("DHT");
  display.setTextSize(2);
  display.print(DHThum,0);  //小數點0位
  display.print("% ");
  display.print(DHTtemp,1); //小數點1位
  display.print("C");
  display.display();
  display.clearDisplay();
  delay(delaytime);
}

void motor(){
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 180);  // 0-1024 -> 0-180
  myservo.write(R);
  display.println("motor");
  display.setTextSize(2);
  display.print("angle  ");
  display.print(R);
  delay(15);
  display.display();
  display.clearDisplay();
}

void RGBLED(){
  if ( mode1 >= 4 ) mode1 = 1;
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 255);  // 0-1024 -> 0-255
  display.print("RGB LED");
  if(mode1==1){
    display.println("   R");
    cR=R;
  }else if(mode1==2){
    display.println("   G");
    cG=R;
  }else if(mode1==3){
    display.println("   B");
    cB=R;
  }else{
    display.println("   clear");
    cR=0;
    cG=0;
    cB=0;
  }
  display.print("R=");
  display.println(cR);
  display.print("G=");
  display.println(cG);
  display.print("B=");
  display.println(cB);
  display.display();
  display.clearDisplay();
  analogWrite(ledRPin, cR);
  analogWrite(ledGPin, cG);
  analogWrite(ledBPin, cB);
}

--------------第三版快完成了--------------
int
PulseWire = A2,
Threshold = 550,
potPin = A3,
R = 0,
button = 2,
buzzer = 3,
motorPin = 4,
ds18b20 = 9,
DHTPin = 10,
ledRPin = 5,
ledGPin = 6,
ledBPin = 11,
cR=0,cG=0,cB=0,
trigPin = 12,        //Trig Pin
echoPin = 13,        //Echo Pin
menu1N = 4,
menu2N = 6,
delaytime = 100;

float cm = 0.0;
int i=0 , j,cm0[9]={0};

//motor
#include <Servo.h>
Servo myservo;

//DHT11/22
#include <DHT.h>
DHT dht(DHTPin, DHT11);



//
#include <OneWire.h>

//DS18b20
#include <DallasTemperature.h>
OneWire oneWire(ds18b20);
DallasTemperature sensors(&oneWire);


//OLED
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
//OLEDsetting
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

//menu
int mode1=1, mode2=0;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  //buzzer
  pinMode(buzzer,OUTPUT);

  //soundsonic
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //ds18b20
  sensors.begin();

  //button
  pinMode(button, INPUT_PULLUP);

  //DHT
  dht.begin();

  //motor
  myservo.attach(motorPin);
  myservo.write(0);

  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}

void loop() {
  int sw = digitalRead(button);
  R = analogRead(potPin);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.setTextSize(1);
  if(sw == HIGH)menu();
  if(mode2 == 0)DHTxx();
  if(mode2 == 1)RGBLED();
    if ( mode2 != 1 ) {
      analogWrite(ledRPin, 0);
      analogWrite(ledGPin, 0);
      analogWrite(ledBPin, 0);
    }
  if(mode2 == 2)Buzzer();
    if ( mode2 != 2 ) noTone(buzzer);
  if(mode2 == 3)supersonic();
  if(mode2 == 4)motor();
    if ( mode2 != 4 ) myservo.write(0);
  if(mode2 == 5)openmenu();
}

void menu(){ 
  int k0,k1,tt=0;
  AA1: k0=digitalRead(button);  delay(30);
  k1 = digitalRead(button);
  if (k1==LOW) goto AA1;  //判断按键是否低电平,如果低,循环检测,如果高则下一句
  AA2: tt++;             //对按键高电平计数
  k0 = digitalRead(button);  delay(10);
  k1 = digitalRead(button);
  if (k1==HIGH) goto AA2;  //判断按键是否高电平,如果高,继续计数,如果低电平,则表示按键结束
  if (tt<30)   mode1 = mode1 + 1;         //如果按键时间小于30*10ms=0.3s
  if (tt>80)  mode2 = mode2 + 1;         //如果按键时间大于80*10ms=0.8s
  if ( mode2 == menu2N ) mode2 = 0;
  if ( mode1 == (menu1N+1) ) mode1 = 1;
}

void openmenu(){
  display.setTextSize(1);
  display.print("orangeV design");
  display.setTextSize(2);
  display.setCursor(0,12);
  display.print("DCJHS LAB");
  display.display();
  display.clearDisplay();
  R = 0;
  mode1 = 1;
}

void Buzzer(){
  R = analogRead(potPin);
  int R1=0,R10=0;
  if ( mode1 >= 3 ) mode1 = 1;
  display.print("Sound");
  display.setCursor(40,0);
  if (mode1==1){
    display.println(" 0 ~ 1000 HZ");
  }else{
    display.println(" 0 ~ 10000 HZ");
  }
  display.setTextSize(2);
  if(R<10){
    noTone(buzzer);
    display.print(0);
  }else{
    if(mode1==1){
    R1 = R - 10;
    tone(buzzer,R1);
    display.print(R1);
    }else if(mode1==2){
    R10 = R*10-100;
    tone(buzzer,R10);
    display.print(R10);
    } 
  }
  display.setCursor(60,12);
  display.println("Hz");
  display.display();
  display.clearDisplay();
  delay(100);
}

void supersonic(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float duration = pulseIn (echoPin, HIGH),
      cm = (duration) / 58.2
  ;
  if ( mode1 >= 4 ) mode1 = 1;
  display.print("SoundSonic 2to60");
  display.setCursor(100,0);
  display.print("mod");
  display.println(mode1);
  display.setTextSize(1);
  display.print("t= ");
  R = analogRead(potPin);
  delaytime = R/100 * 100+100;
  if(mode1==3) delaytime = delaytime/10;
  display.print(delaytime);
  display.setCursor(44,8);
  display.println("ms");
  int cm10=cm*10;
  display.setTextSize(2);
  if (cm<60&&cm>2){
    display.print(cm10/10);
    display.setTextSize(1);
    display.setCursor(25,23);
    display.print(".");
    int cm100=cm*100;
    display.print(cm100%100/10);
  }else{
    display.print("err");
  }
  display.setTextSize(2);
  display.setCursor(37,16);
  display.println("CM");

  display.display();
  display.clearDisplay();

  if(mode1==2||mode1==3){
    Serial.print(cm);
    Serial.print("CM");
    Serial.print(delaytime);
    Serial.println("ms");
    if(i>=9)i=0;
    if(i<9){
      if (cm<60&&cm>3){
        cm0[i]=cm;
      }else{
        cm0[i]=0;
      }
      display.setTextSize(1);
      display.setCursor(70+20*(i%3),(i/3)*7+10);
      display.print("*");
      display.setCursor(75,10);
      display.print(cm0[0]);
      display.setCursor(95,10);
      display.print(cm0[1]);
      display.setCursor(115,10);
      display.print(cm0[2]);
      display.setCursor(75,16);
      display.print(cm0[3]);
      display.setCursor(95,16);
      display.print(cm0[4]);
      display.setCursor(115,16);
      display.print(cm0[5]);
      display.setCursor(75,23);
      display.print(cm0[6]);
      display.setCursor(95,23);
      display.print(cm0[7]);
      display.setCursor(115,23);
      display.print(cm0[8]);
      i++;
    }
  }
  delay(delaytime);
}

void DHTxx(){
  sensors.requestTemperatures();
  float DHThum = dht.readHumidity();
  float DHTtemp= dht.readTemperature();
  float cc = sensors.getTempCByIndex(0);

  display.print("T & H ");

  if ( mode1 >= 4 ) mode1 = 1;
  display.print("t = ");
  R = analogRead(potPin);
  delaytime = R/100 * 100+100;
  if(mode1==3) delaytime = delaytime*10;
  display.print(delaytime);
  display.println(" ms");

  display.print(DHThum,0);  //小數點0位
  display.print("% ");
  display.print(DHTtemp,1); //小數點1位
  display.println("C");
  display.setTextSize(2);
  if(cc>-127){
    display.print(cc,1);
  }
  display.print("C");

  if(mode1>=2){
    if(i>=6)i=0;
    if(i<6){
      if (cc>-170){
        cm0[i]=cc;
      }else{
        cm0[i]=0;
      }
      display.setTextSize(1);
      display.setCursor(60+30*(i%2),(i/2)*6+10);
      display.print("*");
      display.setCursor(65,10);
      display.print(cm0[0],1);
      display.setCursor(95,10);
      display.print(cm0[1],1);
      display.setCursor(65,16);
      display.print(cm0[2],1);
      display.setCursor(95,16);
      display.print(cm0[3],1);
      display.setCursor(65,22);
      display.print(cm0[4],1);
      display.setCursor(95,22);
      display.print(cm0[5],1);
      i++;
    }
  }
  display.display();
  display.clearDisplay();
  delay(delaytime);
  delaytime = 0;
}

void motor(){
  R = 0;
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 180);  // 0-1024 -> 0-180
  myservo.write(R);
  display.println("motor");
  display.setTextSize(2);
  display.print("angle  ");
  display.print(R);
  delay(15);
  display.display();
  display.clearDisplay();
}

void RGBLED(){
  R = 0;
  if ( mode1 >= 4 ) mode1 = 1;
  R = analogRead(potPin);
  R = map(R, 0, 1020, 0, 255);  // 0-1024 -> 0-255
  display.print("RGB LED");
  if(mode1==1){
    display.println("   R");
    cR=R;
  }else if(mode1==2){
    display.println("   G");
    cG=R;
  }else if(mode1==3){
    display.println("   B");
    cB=R;
  }else{
    display.println("   clear");
    cR=0;
    cG=0;
    cB=0;
  }
  display.print("R=");
  display.println(cR);
  display.print("G=");
  display.println(cG);
  display.print("B=");
  display.println(cB);
  display.display();
  display.clearDisplay();
  analogWrite(ledRPin, cR);
  analogWrite(ledGPin, cG);
  analogWrite(ledBPin, cB);
}


----
按鍵程式參考
https://www.geek-workshop.com/thread-28007-1-1.html