一疑故、時(shí)間函數(shù)
(一)delay()函數(shù)
? 1.delay()函數(shù)簡(jiǎn)介
描述:將程序暫停給定參數(shù)的時(shí)間量(以毫秒為單位)
函數(shù)原型:delay(ms)
參數(shù):ms - 暫停的毫秒數(shù)
返回值:無(wú)
? ? ? 2.什么是函數(shù)险绘?
? ? ? Delay()函數(shù)是常用的時(shí)間函數(shù)之一覆山,當(dāng)程序運(yùn)行到delay這一行時(shí)俐东,會(huì)暫停一段時(shí)間,暫停的時(shí)間據(jù)取決于括號(hào)中的數(shù)字了公给,例如基协,delay(100),則函數(shù)會(huì)暫停100ms之后繼續(xù)往下執(zhí)行剑按,delay(200)則會(huì)在200ms之后繼續(xù)執(zhí)行疾就,但這個(gè)總不是那么的準(zhǔn)確,與我們所用的CPU吕座,各種軟硬件的參數(shù)密切相關(guān)虐译,切記不要用它進(jìn)行太過(guò)精密的計(jì)算,他的選擇或是根據(jù)一遍遍測(cè)驗(yàn)得到的吴趴,有些經(jīng)驗(yàn)豐富的人憑經(jīng)驗(yàn)就可大體估計(jì)出他的數(shù)值漆诽。
? ? 3.延時(shí)函數(shù)的作用
? ? 或許有的人會(huì)問(wèn),為什么我們要使用延遲函數(shù)锣枝,而且就延遲了或許不到一秒鐘厢拭,這不是增加了指令的響應(yīng)時(shí)間么?猜想一下代碼的讀取速度和人的反應(yīng)速度撇叁,這個(gè)差別不是十幾二十倍的關(guān)系供鸠,舉個(gè)單片機(jī)的例子,我們都知道單片機(jī)的處理速度是很快的陨闹,有的時(shí)候?yàn)榱俗屛覀儽阌谟^察需要加入延時(shí)楞捂,例如一個(gè)指示燈的亮滅薄坏,如果不加入延時(shí)是看不出來(lái)的,再有就是鍵盤(pán)去抖動(dòng)寨闹,一般按鍵都有20ms左右的抖動(dòng)胶坠,為了更好的檢測(cè)防止干擾,也需要延時(shí)一段時(shí)間在進(jìn)行判斷繁堡,否則鍵盤(pán)的抖動(dòng)會(huì)影響我們的檢測(cè)結(jié)果沈善,總之延時(shí)的作用在不同的情況下也不同。
? ? ? 4.Delay()函數(shù)在arduino函數(shù)中的應(yīng)用
? ? ? 在之前的Blink程序中椭蹄,我們通過(guò)使用延時(shí)函數(shù)闻牡,使LED按一定頻率閃爍。Arduino提供了毫秒級(jí)和微秒級(jí)兩種延時(shí)函數(shù)绳矩。運(yùn)行延時(shí)函數(shù)時(shí)罩润,會(huì)等待指定的時(shí)間,再運(yùn)行此后的程序埋酬,我們可以通過(guò)參數(shù)設(shè)定延時(shí)時(shí)間哨啃。以下就是延時(shí)函數(shù)在arduino函數(shù)中的應(yīng)用,延時(shí)函數(shù)就是為了使觀測(cè)效果更明顯写妥。
(二)millis()函數(shù)
? 1拳球、millis()函數(shù)簡(jiǎn)介
描述:返回自Arduino板開(kāi)始運(yùn)行當(dāng)前程序以來(lái)的毫秒數(shù)。大約50天后珍特,此數(shù)字將溢出(回到零)
語(yǔ)法: time = millis()
參數(shù):無(wú)
返回值:程序啟動(dòng)后的毫秒數(shù)(unsigned long 類(lèi)型)
? 2.什么是millis()函數(shù)祝峻?
? ? millis在英語(yǔ)中解釋為微秒,millis()函數(shù)會(huì)返回一個(gè)值扎筒,這個(gè)值代表的是當(dāng)前cpu的時(shí)間莱找,單位為微秒,舉個(gè)例子long begintime=mills();? endtime=mills();然后用endtime的值減去begintime的值就能算出時(shí)間差嗜桌,這樣可以用來(lái)定時(shí)奥溺,也可以不用占用cpu時(shí)間,所以當(dāng)寫(xiě)的程序比較長(zhǎng)時(shí)骨宠,這個(gè)函數(shù)很有用浮定。而且我們身邊也有很多使用million函數(shù)的例子啊,我們都知道层亿,在電腦中我們可以使用左右鍵來(lái)實(shí)現(xiàn)不同的操作桦卒,然而在手機(jī)中我們并沒(méi)有左右鍵,手機(jī)沒(méi)辦法判斷我們是用左手進(jìn)行操作還是右手進(jìn)行操作匿又,這時(shí)候方灾,millis函數(shù)就發(fā)揮其作用了,他通過(guò)判斷人手按屏幕時(shí)間的長(zhǎng)短來(lái)執(zhí)行不同的操作碌更,按屏幕時(shí)間的長(zhǎng)短便是通過(guò)millis函數(shù)來(lái)計(jì)算的裕偿,還記得以前的按鍵手機(jī)洞慎,長(zhǎng)按“#”鍵解鎖,不知道你們能否想起這樣的例子來(lái)呢嘿棘。
? ? 3.millis()函數(shù)和delay()函數(shù)的區(qū)別
? ? 上文中我們主要介紹的是millis() 函數(shù)作為定時(shí)器的用處拢蛋,我們都知道delay()函數(shù)一個(gè)主要的作用就是延時(shí),然而這個(gè)功能也被millis()函數(shù)竊取到了蔫巩,millis()函數(shù)可以替代delay()函數(shù),實(shí)現(xiàn)其延時(shí)功能快压,而且milis()函數(shù)在用作延時(shí)函數(shù)時(shí)可以在每次延遲中加入自定義邏輯圆仔,在每次延遲的過(guò)程中完成多個(gè)操作。
? 4.millis()函數(shù)在ardinuo中的應(yīng)用
二蔫劣、數(shù)學(xué)函數(shù)
? ? ? 數(shù)學(xué)函數(shù)的掌握比較的簡(jiǎn)單坪郭,他們?cè)诔绦蜷_(kāi)頭均需加上#include<math.h>,min()函數(shù)脉幢、max()函數(shù)歪沃、abs()函數(shù)、三角函數(shù)和我們數(shù)學(xué)上接觸的并無(wú)區(qū)別嫌松,我大致粗略的講解一下沪曙,主要給大家介紹的是map()函數(shù)和constrain()函數(shù)。
? ? (一)map()函數(shù)
? 1萎羔、map()函數(shù)簡(jiǎn)介:
描述:將數(shù)字從一個(gè)范圍重新映射到另一個(gè)范圍液走。
函數(shù)原型:map(value, fromLow, fromHigh, toLow, toHigh)
參數(shù):
value:要映射的數(shù)
fromLow:當(dāng)前值范圍的下限
fromHigh:當(dāng)前值范圍的下限
toLow:目標(biāo)值范圍的下限
toHigh:目標(biāo)值范圍的上限
返回值:映射后的值
? ? 2.map()函數(shù)的應(yīng)用
? ? Map在英文中解釋為地圖,那么map()函數(shù)就應(yīng)該具有地圖的一些性質(zhì)贾陷,即一對(duì)一缘眶,在map()函數(shù)中輸入一個(gè)值,那么就會(huì)輸出唯一的一個(gè)值髓废。Map函數(shù)有五個(gè)參數(shù)巷懈,其中第一個(gè)值是我們輸入的值,第二個(gè)參數(shù)和第三個(gè)參數(shù)是可輸入的第一個(gè)參數(shù)的范圍慌洪,第四五個(gè)參數(shù)則是我們將要映射的值的范圍顶燕,如果我們不想限制值得范圍,也可以不用填寫(xiě)值得范圍蒋譬,因?yàn)橛袝r(shí)候我們需要的值不在規(guī)定的區(qū)間內(nèi)割岛。map()函數(shù)使用整型數(shù)進(jìn)行運(yùn)算因此不會(huì)產(chǎn)生分?jǐn)?shù)。小數(shù)的余數(shù)部分會(huì)被舍去犯助,不會(huì)四舍五入或者平均癣漆。
? ? 3.map()函數(shù)在ardinuo中的應(yīng)用
? ? 如圖所示是一個(gè)Arduino 溫度傳感器NTC測(cè)溫的代碼片段,因?yàn)榍耙粋€(gè)代碼的AD值飄得厲害剂买,所以溫度值也就飄惠爽,這次的代碼嘗試調(diào)整線(xiàn)性函數(shù)和映射AD值癌蓖,從2^10位降到8位、7位測(cè)試其穩(wěn)定性婚肆。而這一功能的實(shí)現(xiàn)就是依賴(lài)于map()函數(shù)租副,圖中標(biāo)黃的部分就是我們的map()函數(shù)。當(dāng)出現(xiàn)的值的范圍太小或者太大以至于我們操作很難進(jìn)行下去的時(shí)候较性,map()函數(shù)就發(fā)揮其作用啦用僧。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 5 arduino 溫度傳感器NTC測(cè)溫
? (二)constrain()函數(shù)
? ? 1、constrain()函數(shù)簡(jiǎn)介
描述:將數(shù)字約束在一個(gè)范圍內(nèi)赞咙。如果此數(shù)小于該區(qū)間的最小值則返回最小值责循,若在此區(qū)間內(nèi)則顯示該值,若大于該區(qū)間的最大值則顯示最大值攀操。
函數(shù)原型:constrain(x, a, b)
參數(shù):
? ? ? ? x:要約束的數(shù)字
? ? ? ? a:范圍的下限
? ? ? ? ? b:范圍的上限
返回值:
? ? ? ? ? ? 如果 x 在(a, b) 范圍內(nèi):返回 x
? ? ? ? ? ? 如果 x 小于 a:返回 a
? ? ? ? ? ? ? 如果 x 大于 b:返回 b
? ? 2.什么是constrain()函數(shù)
? ? Constrain是強(qiáng)制院仿、限制的意思,他就是為了把某些東西限制在一定范圍內(nèi)速和,他作為數(shù)學(xué)函數(shù)歹垫,那么自然也不例外了,我們可以輕而易舉的推理出它的作用就是把數(shù)限制在一定范圍內(nèi)颠放,舉個(gè)例子吧排惨,假如你是一位老師在批改學(xué)生的卷子,一個(gè)學(xué)生卷面整潔碰凶,解題正確詳細(xì)若贮,在你心里已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)100分了,但是呢痒留,滿(mǎn)分就是100分谴麦,所以你只能給予他最高分,相反一個(gè)同學(xué)不寫(xiě)卷子還亂涂亂花伸头,縱然你很氣憤匾效,但你的理智告訴你,你只能給他打最低分0分恤磷。Constrain()函數(shù)在程序中的作用就相當(dāng)我們的理智面哼,不能計(jì)算機(jī)給我們什么數(shù)我們就輸出什么數(shù),計(jì)算機(jī)也要有自己的判斷和思考扫步,而constrain()函數(shù)的作用就是計(jì)算機(jī)的判斷依據(jù)魔策。
? ? 3.constrain()函數(shù)的應(yīng)用
? ? 如圖所示是根據(jù)RGB值來(lái)改變LED燈的代碼,通過(guò)這種方式河胎,如果發(fā)來(lái)的值超過(guò)了PWM的允許值闯袒,也能夠正常執(zhí)行。 這些值還要用255減一下,以適配共陽(yáng)RGB LED政敢,作差后才是在0時(shí)LED關(guān)閉其徙,在255時(shí)LED打開(kāi)。在約束和數(shù)學(xué)運(yùn)算完成后喷户,RGB LED內(nèi)的三個(gè)小LED就能夠工作了唾那。
? ? (三) min()函數(shù)、max()函數(shù)
? ? Min()函數(shù)和max()函數(shù)看起來(lái)很簡(jiǎn)單褪尝,但在輸入?yún)?shù)的時(shí)候要注意相比較的參數(shù)類(lèi)型需要是相同的闹获,min(a,b)的值等于a、b兩者之間的最小值河哑,max(a,b)則等于兩者之間的最大值昌罩,代碼實(shí)例如圖所示:
? ? (四)? abs()函數(shù)
? ? Abs(x)函數(shù)就是一個(gè)絕對(duì)值的求值運(yùn)算,其思想很簡(jiǎn)單灾馒,就是我們小學(xué)學(xué)的那種|5|=5,|-5|=5這種簡(jiǎn)單的運(yùn)算遣总,調(diào)用他的方式有兩種睬罗,一種是直接在函數(shù)中定義y=abs(x),當(dāng)我們?cè)诔绦蛑袑?duì)這個(gè)函數(shù)調(diào)用較少,而且計(jì)算很簡(jiǎn)單時(shí)旭斥,我們可以直接定義容达,這個(gè)方法簡(jiǎn)單易學(xué):而第二方法是在頭文件中定義,這個(gè)就比較困難而且有點(diǎn)難度垂券,我們必須要注意括號(hào)的運(yùn)用花盐,下圖中我就用兩個(gè)abs()函數(shù),來(lái)區(qū)分一下他們的區(qū)別菇爪。
? ? 對(duì)于abs1(x)來(lái)說(shuō)算芯,如果函數(shù)式子如圖所示。Test(abs1(-1)+2)凳宙,則先判斷x是否小于零熙揍,當(dāng)x小于零時(shí),直接就為-x了氏涩,當(dāng)x大于零時(shí)届囚,才會(huì)+2,原程序就相當(dāng)于abs1(x) (x<0)? -x:x+2是尖;對(duì)于abs2(x)來(lái)說(shuō)意系,函數(shù)相當(dāng)于((x<0)? -(x+2):x+2)。
? ? (五)? 三角函數(shù)
? ? 三角函數(shù)包括sin(rad)饺汹、cos(rad)蛔添、tan(rad),分別返回rad的正弦值、余弦值作郭、正切值陨囊。這個(gè)函數(shù)大家應(yīng)該都不陌生,想必學(xué)過(guò)三角函數(shù)的人都不陌生這個(gè)函數(shù)9的應(yīng)用吧夹攒,他的用法和數(shù)學(xué)函數(shù)的用法一樣蜘醋,只不過(guò)寫(xiě)到了計(jì)算機(jī)內(nèi)部,方便我們進(jìn)行快速準(zhǔn)確的運(yùn)算咏尝,下面就是一個(gè)三角函數(shù)的例子压语。