Arduino 板和 Arduino IDE 非常適合創(chuàng)建可以激活 LED、讀取傳感器、激活伺服或任何數(shù)量的獨(dú)特物理計(jì)算應(yīng)用程序的小代碼片段。此類操作通常開始時(shí)很簡(jiǎn)單——例如,讓計(jì)時(shí)器上的 LED 閃爍——但隨著程序的擴(kuò)展和程序員技能的提高,最終會(huì)變得相當(dāng)復(fù)雜。
組織擴(kuò)展代碼的一種出色技術(shù)是使用函數(shù),即可以根據(jù)需要從程序的其他部分(例如通過(guò)主循環(huán))調(diào)用的代碼片段。對(duì)于有經(jīng)驗(yàn)的程序員來(lái)說(shuō),這種技術(shù)可能已經(jīng)過(guò)時(shí)了,但對(duì)于那些從其他學(xué)科進(jìn)入 Arduino 的人來(lái)說(shuō),盡早接受函數(shù)范式通常會(huì)對(duì)你有好處。
聲明一個(gè)函數(shù)
在最基本的形式中,額外函數(shù)看起來(lái)幾乎與您在開始新草圖時(shí)在第 1 行和第 6 行看到的設(shè)置和循環(huán)函數(shù)一樣(圖 1)。這些函數(shù)需要在另一個(gè)函數(shù)之外聲明,并且具有唯一的名稱。事實(shí)上,主循環(huán)函數(shù)的簡(jiǎn)單復(fù)制/過(guò)去/修改可用于在您的代碼中創(chuàng)建一個(gè)新函數(shù)。

圖 1. 新功能 copypasta。
調(diào)用函數(shù),繼續(xù)
當(dāng)然,聲明一個(gè)從不被調(diào)用且不做任何事情的函數(shù)純粹是浪費(fèi)空間,所以讓我們讓它做一些有趣的事情(圖 2)。下面的示例基本上重新格式化了 Arduino Blink 草圖以將閃爍放入一個(gè)函數(shù)中,并添加一個(gè)串行輸出以讓您知道它“延遲閃爍打開和關(guān)閉”。

雖然這對(duì)簡(jiǎn)化代碼沒(méi)有任何作用,但如果您想在主循環(huán)中的多個(gè)點(diǎn)執(zhí)行相同類型的閃爍/響應(yīng)操作,請(qǐng)考慮如何簡(jiǎn)化事情。無(wú)需編寫 5 行代碼,您只需使用 blinkAndTalk(); 調(diào)用新函數(shù)。
不需要太多用處就能看出這種簡(jiǎn)化是如何疊加起來(lái)的,尤其是在函數(shù)更復(fù)雜的情況下。這種代碼分段還有助于在其他程序中重用代碼,因?yàn)槟梢愿鶕?jù)需要在那里復(fù)制/粘貼。在 Arduino IDE 中,將函數(shù)放在最后很好,但如果您使用不同的環(huán)境(例如 PlatformIO),順序可能很重要。
函數(shù)返回值
除了將代碼簡(jiǎn)化為易于重用的塊外,函數(shù)還可以返回一個(gè)值。Arduino.cc 提供了如何執(zhí)行此操作的示例,將 myMultiplyFunction 稱為 k = myMultiplyFunction(i, j);。這里的括號(hào)不是空的,而是將變量傳遞給函數(shù)本身,并且 k 由返回結(jié)果設(shè)置;函數(shù)中的行(圖 3)。

圖 3.來(lái)自 Arduino 示例的代碼。
另一種傳遞值的方法是在函數(shù)中設(shè)置一個(gè)全局變量,它可以在主循環(huán)或任何你需要結(jié)果的地方使用。出于多種原因,包括生成更復(fù)雜的代碼以及使這些函數(shù)更難重用,使用 return 是這里更好的選擇。如果您很好奇,下面顯示了如何做到這一點(diǎn)的示例:

圖 4. 可能,但通常不推薦。
一旦您準(zhǔn)備好將幾行代碼轉(zhuǎn)移到編程上更有趣的應(yīng)用程序中,請(qǐng)記住函數(shù)是您的朋友。他們?cè)谧畛踉O(shè)置時(shí)會(huì)花一些心思,但隨著事情變得更加復(fù)雜,他們可以支付巨額紅利。
我最近寫了一段代碼,其中一小部分如下所示,接近 300 行。然而,主循環(huán)在括號(hào)內(nèi)只有 4 行,主要是為了調(diào)用一些單獨(dú)的函數(shù)。老實(shí)說(shuō),我應(yīng)該將其進(jìn)一步分解為功能塊,從而可能會(huì)減小程序的大小并為自己省去一些麻煩。規(guī)劃在這里有很長(zhǎng)的路要走。

圖 5. 對(duì)于主循環(huán)中的代碼行(注釋省略)
審核編輯:郭婷
-
傳感器
+關(guān)注
關(guān)注
2573文章
53934瀏覽量
781845 -
led
+關(guān)注
關(guān)注
243文章
24338瀏覽量
685025 -
Arduino
+關(guān)注
關(guān)注
190文章
6509瀏覽量
195301
發(fā)布評(píng)論請(qǐng)先 登錄
使用 LinkBoy 將程序?qū)С鰹?C 語(yǔ)言代碼并燒錄至 Arduino ESP32 開發(fā)板
詳解hal_entry入口函數(shù)
深入理解C語(yǔ)言:函數(shù)—編程中的“積木塊”藝術(shù)
免費(fèi)分享Arduino入門+進(jìn)階(全套例程+書籍)
下一代物聯(lián)網(wǎng):芯科科技和Arduino借助邊緣AI和ML簡(jiǎn)化Matter設(shè)計(jì)和應(yīng)用
《ESP32S3 Arduino開發(fā)指南》第二章 Arduino基礎(chǔ)知識(shí)
函數(shù)指針的六個(gè)常見(jiàn)應(yīng)用場(chǎng)景
分析C語(yǔ)言代碼結(jié)構(gòu)的設(shè)計(jì)問(wèn)題
低代碼與傳統(tǒng)開發(fā)的區(qū)別 低代碼與無(wú)代碼開發(fā)的區(qū)別
用于 SPI 絕對(duì)編碼器的 Arduino 示例代碼

使用Arduino函數(shù)簡(jiǎn)化代碼
評(píng)論