Arduino和布林運算:條件為真時永遠大於零!

how to use boolean variables with Arduino

borkus- stock.adobe.com

目錄
1布林邏輯運算
1.1電晶體邏輯電路與二進位
2 示例
2.1邏輯運算子
2.2雙繼電器狀態機

1 Arduino布林邏輯運算

二進位和布林運算有時候看起來就像是流行語一樣,尤其是“二進位”,但這只是因為人們一旦瞭解了之後就會馬上喜歡上這種思維模式。提示:它們就是法拉利的酷極客。

在這些事物的核心模組中,二進位屬於機器的部分,如果您想要控制機器,尤其是微控制器,那麼您必須時常對二進位進行深入研究。尤其是Arduino Uno(atmega328p),它只有2KB SRAM。這是一個精益系統,如果您想要它運行更大的項目,那就要很聰明地使用二進位才行。如果要將大型陣列存儲在PROGMEM和EEPROM(快閃記憶體)中,您必須使用這個方法。

1.1電晶體邏輯電路和二進位

“為什麼不直接使用十進位系統?”這一問題非常重要,必須首先解答。一旦您理解了二進位系統的設計初衷,您就會更加喜歡布林邏輯運算的。
設想有一個電晶體,它在任何給定時間都可能處於“ON”或“OFF”狀態。該電晶體可以描述兩個值(2**1)。但是,如果您想要計數更大的值該怎麼辦?添加另一個電晶體,您可以數到4(2**2),三個(2**3)可以讓您數到8,以此類推。為了增加您的學習樂趣,可以打開一個python腳本,然後將以下內容複製粘貼到您的腳本中來查看8位元/1位元組的可能狀態:

輸出如下:

以及最高16位元/2位元組:

輸出如下:

在十進位系統中,僅僅使用16個手指和腳趾不可能數出65,535只寶可夢(包括起始值0)。但是使用二進位就可以!

如果看起來有點晦澀難懂的話,不要氣餒。把每個二進位數字字想像成一個電晶體:1是“ON”,0是“OFF”。使用十進位系統來描述數位255需要256只電晶體(包括0),而使用二進位系統,我們可以只用8只電晶體來描述256種狀態。它是“0b11111111”,8位元為一個位元組。它在早期的電腦實驗室種節省了大量空間,因為那個時候電晶體既不小也不高效(您見過真空管嗎?)。

這就是我們在平板電腦和手機上玩Pokémon Go的時候計算所捕獲寶可夢數量的方式。除了記憶體限制,它的計數大小是沒有上限的。

使用Arduino時,我們使用“位元組”型資料類型(實際上是uint_8t)來告訴編譯器我們想要一個0-255範圍內的值。然而,布林型變數要簡單得多!布林型變數可以僅用一個電晶體來表示,真(true)為“ON”,假(false)為“OFF”。您可以使用一個很小的狀態機來確定您的電機是否在運行,並在setup()函數之前對其進行全域聲明。

當電機啟動時,您需要對其進行更新,使用以下代碼:

您可以使用它來控制系統的行為,例如,保證您的Arduino在電機運行時不進行任何操作。

您可能已經注意到了符號“!”,這是邏輯非運算子,在人類語言中的意思是“不是”。Arduino C++中可用的關係運算子是“!=”、“>=”、“<=”、“>”,但今天講述的是布林邏輯運算。這與變數之間的關係無關(例如確定一個值是否大於另一個值),因為邏輯運算子“!”—邏輯非,“&&”—邏輯與,和“||”—邏輯或已經足以創建出令人生畏的複雜運算式了。雖然有時候我們稱之為二進位運算子,但是不要偏離了方向。

如果到目前為止您都能理解了,可以查看更高級的邏輯運算。

2示例

2.1邏輯運算子

按照上面的二進位位元,我們在實例中使用邏輯運算子。我們使用了Arduino IDE,請參閱此文的簡介。
現在,讓我們用二進位的方式讀到“1”!

這看似簡單,但是功能非常強大。讓我們做一個更長的複合表達!

[ begin Boolean_logical_operators.ino ]

[ end Boolean_logical_operators.ino ]

按下CTRL+SHIFT+M彈出串列監視器,並輸入一個4位值,以空格分隔,類似“1 0 1 0”這樣的資料,然後按下“Send(發送)”。您將看到以下輸出:

Serial monitor handles 4-bit input

如果幸運的話,您將看到以下內容:

Boolean 4-bit minigame WINNER!

該Arduino草圖展示了布林邏輯運算的多種用途。無論在哪個應用中需要使用“真”,或者是“假”,我們都可以使用布林邏輯運算。

2.2雙繼電器狀態機

2.1中的示例只是一個用來演示邏輯運算子的小程式。本節所創建的是一個有用的狀態追蹤中繼模組,您可以進行修改和添加。將代碼複製到Arduino IDE一個新的草圖中,然後使用CTRL+U上傳。然後,使用CTRL+SHIFT+M(或在Linux/MacOS上 使用“python3 -m serial.tools.miniterm”,Windows上使用TeraTerm/Putty)查看串列監視器。如果輸入“0”並發送,則可以查看當前繼電器狀態(為“ON”或“OFF”)。

如果您輸入“1”,您將切換到繼電器1,如果它是“OFF”為“ON”,如果是“ON”則為“OFF”。發送“2”則會對繼電器2進行相同的操作。對於這兩個繼電器,狀態保存在布林型變數(“relay1State”和“relay2State”)中,並且對於每個繼電器,LED會在其真正為“ON”時亮起。
除了Arduino之外,不需要任何其他東西來使用該程式。製作之前先玩一下吧!
'true' && 'false' can coexist

以下代碼是專門按照適合於在Arduino IDE上使用布林值的方式來編寫的。

在硬體方面,我從不信任那些用於重載的藍色5V繼電器,但是已經確認了這些繼電器在高達~200W的負載下性能良好。那麼開始享受製作的樂趣吧!

 

2x 2N7000 N溝道MOSFET https://www.newark.com/on-semiconductor/2n7000/n-channel-mosfet-60v-200ma-to/dp/58K9650
2x ROHM SLR343BC4TT32 3mm 藍色LED https://www.avnet.com/shop/us/products/rohm/slr343bc4tt32-3074457345627700657?CMP=EMA_ECIA_inventoryfeed_VSE?aka_re=1
2x BAT86 蕭特基二極體 https://www.newark.com/search?st=bat86%20schottky%20diode
Arduino Uno 或 Arduino Nano https://store.arduino.cc/arduino-uno-rev3

https://store.arduino.cc/arduino-nano

2x 4.7 千歐 + 2x 470 歐姆電阻 https://www.newark.com/multicomp/cfr0w4je006kil/resistor-kit-carbon-film-axial/dp/24M1011
麵包板 https://www.newark.com/twin-industries/tw-e41-1020/breadboard-solderless-830-tie/dp/56T0251
杜邦線 https://www.newark.com/adafruit/759/kit-contents/dp/88W2571
2x 5V 繼電器 https://www.newark.com/omron-electronic-components/g5le-1a4-dc5/relay-spst-no-250vac-30vdc-10a/dp/83F5375

2.2.1 開始構建!

按下圖所示將所有部件進行連接,首先是麵包板,然後是原型板。我們就是這樣做的。

prettyStateMachine

Halfway done, !prettyStateMachine

唯一需要注意的是正確使用BAT86肖特基二極體。您必須將陰極(BAT86上的黑環,通常在別的二極體上是白環)朝向繼電器的正極端子(上圖右側),否則會出現問題(短路)。環標記了陰極(k),確保它與正極端子對齊!請看這張圖,放大藍色繼電器的部分:

Cathode to positive relay terminal

這是組裝好的圖片。Arduino Nano原型板上的附加元件內容不在本文的範圍內,而且這部分也很無趣。

!prettyStateMachine, is it true?

!prettyStateMachine, 這是“真”嗎?

!prettyStateMachine, 這是“真”嗎?
您可以查看以下代碼:

[ begin prettyStateMachine.ino ]

[ end prettyStateMachine.ino ]

現在我們就有了狀態追蹤功能了,例如,我們可以查看當前的繼電器狀態,並且可以隨意對其進行反轉。我們已經介紹了帶有邏輯運算子的複合運算式,您可以將此代碼用作未來專案的範本。

帶RTC的溫室水培控制器,帶DHT22的高度優化室內溫度控制器,以及無線感測器上的DS18B20陣列,甚至HVAC的智慧驅動:您可以用自己的技術實現想要的功能!

Lasse Efrayim Jespersen
Lasse Efrayim Jespersen
Lasse出生於以色列,後移居到緯度較冷的地區。出於個人天然的興趣愛好,他一步步走近了直接的Perl、高效的C/C++、以及優雅的MicroPython。他非常喜歡用ESP8266/ESP32/Raspberry Pi 和Arduino來構建機器。

Check us out on Social Media