Arduino 項目:建立數位溫度計

在這個項目中,我想結合兩個元件,即 1602 LCD 顯示器和 DHT11 溫濕度傳感器,以創建一個實際可用的數位溫度計。 在我們開始之前,先閱讀 DHT11 教學,該教學解釋了如何從傳感器讀取數據: link 然後再閱讀 1602 LCD 教學,其中我解釋了如何將數據寫入顯示器: link 完成後,從電路的角度來看,你只需要將兩個電路添加到同一個基於 Arduino 的項目中: link 實際效果如下: images images images 從程式碼方面來看,我們做了類似的事情。首先,我們先引入 DHT 和 LiquidCrystal 函式庫,然後初始化這兩個元件。 我們在 setup() 中初始化它們,然後在 loop() 中每 2 秒檢查從傳感器接收到的數據,並將其顯示在 LCD 顯示器上: #include <LiquidCrystal.h> #include <DHT.h> DHT dht(2, DHT11); LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { dht.begin(); lcd.begin(16, 2); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { return; } lcd....

arduino-power-bank

#使用行動電源為Arduino供電 我在進行一個Arduino專案時,完成後我說:“嗯,如果能用USB行動電源為它供電並放在室外就很酷了”。 我就這樣做了。我連接了Arduino與行動電源,它工作了! 但大約20秒後,Arduino關機了。 原來是行動電源關閉了。連同Arduino一起關機了。 事實證明,Arduino消耗的電力不足以讓行動電源察覺到有東西連接,它只是浪費電力。 我找到了一些解決方案,包括讓Arduino消耗更多電力。像是這裡所提到的方式。 或者找一個不會自動關閉的行動電源。 在我的情況下,我決定使用可充電電池,因為我正在使用Arduino MKR 1010 WiFi,並且它有一個3.7V的鋰電池選項。

arduino-read-values-http

#從Arduino通過HTTP讀取數值 在本教程中,我想擴展Arduino Web Server教程以讀取由傳感器測量的數值,這樣我們只需打開瀏覽器上的一個頁面就可以看到數據。 例如,我們將使用DHT11傳感器測量溫度,並使用接近傳感器測量對象距離。 我們通過訪問/on URL點亮Arduino上的內置LED,並通過打開/off URL關閉它。其他任何操作都不起作用。 這是來自其他教程的代碼: #include <SPI.h> #include <WiFiNINA.h> WiFiServer server(80); void setup() { char ssid[] = SECRET\_SSID; char pass[] = SECRET\_PASS; Serial.begin(9600); while (!Serial); int status = WL\_IDLE\_STATUS; while (status != WL\_CONNECTED) { Serial.print("Connecting to "); Serial.println(ssid); status = WiFi.begin(ssid, pass); delay(5000); } Serial.print("IP address: "); Serial.println(WiFi.localIP()); server.begin(); } void loop() { WiFiClient client = server.available(); if (client) { String line = ""; while (client.connected()) { if (client....

Arduino專案:map()函數

當你從類比輸入腳取得類比數值時,預設情況下它們的範圍是從0到1023。 這是因為類比讀取的解析度是10位元,2的10次方等於1024。 小提示:在基於ARM的Arduino設備上,如Arduino Zero、Arduino Due和Arduino MKR系列,你可以映射高達12位元,但預設值是0。在這些設備上,你可以調用analogReadResolution(12)來將解析度設置為12位元,從而可以從0到4095範圍內進行映射,而不是1023。 由Arduino語言提供的map()函數可以將這個值範圍映射到不同的範圍。 以下是函數的簽名: int <newvalue> = map(<value>, <original_min>, <original_max>, <new_min>, <new_max>); 需要注意的是,該函數返回一個整數值,小數部分會被截斷。 例如,你可能希望將我們之前提到的1024個原始數值映射到只有10個值的集合,因為你可能有一些只處理10個步驟的邏輯。 你可以這樣做: int acquiredValue = analogRead(A1); int value = map(acquiredValue, 0, 1023, 0, 9); 以下是一個完整的示例: void setup() { Serial.begin(9600); } void loop() { int acquiredValue = analogRead(A1); int value = map(acquiredValue, 0, 1023, 0, 9); Serial.println(value); } 現在,不再有1024個可能的輸入值,而是只有10個可能的值範圍,從0到9。

Arduino專案:使用被動式蜂鳴器

在這個專案中,我們將使用Arduino來通過被動式蜂鳴器產生聲音。 像我們在主動式蜂鳴器的例子中所做的那樣,將蜂鳴器連接到線路,然後連接到Arduino。 蜂鳴器有一個“+”極,我使用紅色線連接(這是一個好習慣)。 然後將“-”線接地到Arduino上,將“+”線接到數字輸出引腳上,在這個例子中我選了8號引腳: 現在我們切換到Arduino程式。 你可以像之前使用被動式蜂鳴器時一樣,使用digitalWrite()來生成聲音,它也能正常工作。 但是Arduino語言還提供了另一個非常適合與被動式蜂鳴器一起工作的函數:tone()。 使用tone()我們可以在蜂鳴器引腳上播放一個指定頻率的聲音,並指定持續時間。 範例: int duration = 500; void setup() { } void loop() { tone(8, 1400, duration); delay(200); tone(8, 800, duration); delay(200); tone(8, 1800, duration); delay(200); tone(8, 600, duration); delay(200); } 你可以使用tone()來進行很多花式的操作,比如播放實際的歌曲。 這個程式碼是Arduino例程的一部分,播放了一首小曲,聽起來比我上面亂弄的聲音好得多: /* Melody Plays a melody circuit: - 8 ohm speaker on digital pin 8 created 21 Jan 2010 modified 30 Aug 2011 by Tom Igoe This example code is in the public domain....

Arduino專案:使用電位計控制伺服馬達

這個專案中,我們將學習如何使用電位計控制伺服馬達。 透過類比輸入腳位,我們可以讀取電位計的旋轉值,範圍從0到1023。 我們將利用這些數值將伺服馬達從0°旋轉到180°。 首先我們需要建立電路,然後撰寫程式碼。 將電源腳位5V和GND連接到麵包板的「+」和「-」行上: 然後將這些訊號連接至電位計的輸入腳位: 將輸出腳位連接至類比I/O腳位A0: 接下來,連接伺服馬達。將棕色線連接至0V,紅色線連接至5V,橙色線連接至腳位9: 現在切換到Arduino IDE以撰寫程式。 首先我們需要讀取電位計的輸入: void setup() { Serial.begin(9600); } void loop() { int value = analogRead(A0); Serial.println(value); } 將此程式上傳至Arduino,您應該可以在序列監視器中看到從0到1023的輸出。 現在我們需要將這個0-1023的數值重新映射為0-180,以供伺服馬達使用。 我們可以使用map()函式來實現: value = map(value, 0, 1023, 0, 180); 接下來,我們將使用一個函式庫。 在Arduino IDE的「Sketch」選單中,選擇「Include Library」,然後選擇「Servo」: 這將在檔案頂部加入#include <Servo.h>這一行。 Servo函式庫是一個內建的函式庫,您可以透過開啟「Tools」和「Manage libraries…」來取得更多關於此函式庫的資訊。 這會開啟Library manager: 在搜尋方塊中搜尋「servo」,您應該會看到相關結果: 點擊「More info」連結,這會在您的瀏覽器中開啟https://www.arduino.cc/reference/en/libraries/servo/這個頁面。 這是獲取任何函式庫相關資訊的方式,不僅僅是這個函式庫,知道如何獲取更多資訊是很有用的。 該頁面列出了一些使用資訊、函式庫暴露的方法以及一些範例: Arduino的好處是它是完全開源的。在這種情況下,您可以在https://github.com/arduino-libraries/Servo找到該函式庫的原始碼,因此您可以撰寫自己修改後的版本,或者僅僅了解其內部運作方式。 我們將使用兩個方法:attach()和write()。 使用attach()函式告訴Servo使用哪個端口。 使用write()函式將伺服馬達移動到指定的角度(參數範圍為0到180)。 但首先我們需要宣告一個Servo物件。我們在setup()函式之前這麼做,使用Servo myservo;: #include <Servo.h> Servo myservo; 然後在setup()函式中,我們將伺服馬達連接至I/O腳位9: #include <Servo.h> Servo myservo; void setup() { myservo.attach(9); } 最後在loop()函式中,我們呼叫myservo....

Arduino專案:閃爍LED

我在Arduino介紹中介紹了Arduino。 在本教程中,我將介紹第一個Arduino專案。我們將開關一個LED燈的電源。 您將學習如何創建您的第一個Arduino程式,通過USB將其上傳到Arduino板,以及如何寫入數字I / O引腳。 這是一個非常簡單的專案,但如果這是您的第一次接觸Arduino,您將學到很多關於Arduino的知識。 我將使用Arduino Uno rev 3克隆板進行教程。 如果您已經有一個Arduino板,您可以使用您現有的板。這裡需要注意的重要事項是板應在5V I / O引腳上工作。 有些板,例如Arduino MKR WiFi 1010,僅使用3.3V I / O引腳。如果您的板是這樣的,那沒有問題,但請記住這種 電壓上的差異。 以下是板子的圖片: 我們可以通過USB-B端口或電池(9V電池效果很好,因為建議的輸入電壓是7-12V)將其供電: 一邊有一組電源引腳和類比I / O引腳: 另一邊有一組數字I / O引腳: 讓我們構建一個簡單的電路來點亮一個LED。我們使用一個1kΩ的電阻,一個黃色的5mm LED,並將其像往常一樣連接到-和+: +和-連接到Arduino的電源引腳,它們提供5V和GND: 正如您可以看到的,當我們用電池給Arduino供電時,LED就亮了: 現在,在這個電路中,Arduino除了將電池提供的9V投入轉換爲5V之外並沒有做其他有用的事情。 讓我們通過編寫我們的第一個Arduino程式讓LED閃爍。 為此,我們必須首先在計算機上安裝Arduino IDE。 打開https://www.arduino.cc/en/software,選擇您的操作系統版本: 軟件下載完成後,對於macOS,您需要將Arduino應用程式移動到Applications文件夾中。請參閱Windows和Linux的安裝說明。 打開程式,您應該會看到一個空白的程式: 正如在Arduino程式語言介紹教程中提到的那樣,setup()函數在程式啟動後僅執行一次,並且通常在其中設置引腳模式。 loop()函數在一個循環中持續執行。 在我們的程式中,我們首先將數字I / O引腳13設置為輸出引腳: #define LED_PIN 13 void setup() { // 將引腳13配置為數字輸出 pinMode(LED_PIN, OUTPUT); } 然後,在loop()中,我們告訴Arduino寫入高電平(5V),等待1秒,然後寫入低電平(0V = 接地),並再次等待1秒,然後不斷重複: void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); } HIGH和LOW是我們的Arduino程式中默認提供的常數。...

Arduino專案:讀取數位輸入

在這個專案中,您將學習使用digitalRead()函數從數位I/O腳位讀取數據。 Arduino Uno板上的數位I/O腳位通常位於USB連接埠一側並可能在腳位上有標示為數位的標籤,就像我的情況一樣: 這些腳位的編號從0到13,但除非沒有足夠的腳位,否則您幾乎不會使用腳位0和1,因為它們用於串列通信(請參閱印刷在腳位上的rx和tx標籤)。 首先,我們將建立電路,然後轉到電腦上的Arduino IDE。 這個電路非常簡單。我們將使用一個按鈕,其中一個引腳連接到Arduino的GND,另一個引腳連接到數位腳位#3(任何其他數位腳位均可)。 我們將每秒檢測腳位#3的電壓水平。我們將定義腳位號碼為常數以避免在代碼中使用神奇數字: #define BUTTON_PIN 3 在setup()函數中,我們呼叫pinMode()將此腳位設置為輸入腳位,並使用INPUT_PULLUP選項: pinMode(BUTTON_PIN, INPUT_PULLUP); 需要使用INPUT_PULLUP選項,因為默認情況下,如果沒有任何東西連接到腳位上(如果按鈕未點擊,電路是斷開的,就像沒有任何東西連接到腳位上),輸入腳位是浮動的,這意味著它容易受到干擾,可能會隨機選擇0或1。 在電路中,我們可以添加上拉電阻或下拉電阻,但更簡單的方法是將INPUT_PULLUP標誌傳遞給Arduino。如果沒有連接任何東西,它將默認為1。 然後,在loop()函數中,我們使用digitalRead()函數獲取輸入腳位的值: int value = digitalRead(BUTTON_PIN); 這個值可以是0或1,取決於輸入。 如果按下按鈕,Arduino將檢測到0。 如果未按下按鈕,Arduino將檢測到1。 您也可以使用常數LOW(對應0)和HIGH(對應1)。 這個值可以打印到串行輸出上,就像在這個程式中一樣: #define BUTTON_PIN 3 void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); Serial.begin(9600); } void loop() { int value = digitalRead(BUTTON_PIN); Serial.print(value); delay(1000); } 保存並上傳程式到Arduino,然後在Arduino IDE中點擊右上角的“Serial Monitor”按鈕: 它將顯示串行接口監視器。請確保底部調整到9600波特率,您應該會看到一堆1,直到您按下按鈕一秒鐘,此時您應該會得到一個0。 我们还可以点亮一个LED。我们可以将LED添加到电路中,但我们也可以使用Arduino Uno板上的內建LED,它映射到数字I/O腳位#13。我们可以这样编写程序: #define BUTTON_PIN 3 void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(13, OUTPUT); digitalWrite(13, LOW); } void loop() { int value = digitalRead(BUTTON_PIN); digitalWrite(13, value); } 实时反映按钮输入值,无需等待1秒。之前我们这样做是为了避免向串行接口写入过多的值,使其难以管理。...

Arduino程式語言介紹

您如何編寫Arduino板的程式?Arduino原生支援一種我們稱為Arduino程式語言或Arduino語言的語言。 這種語言基於Wiring開發平台,而Wiring又基於Processing,如果您不熟悉的話,p5.js就是基於Processing開發的。這是一個相互建立在其他專案之上的長期歷程,以非常開放源碼的方式進行。Arduino IDE基於Processing IDE,而Wiring IDE則基於Arduino IDE之上構建。 在使用Arduino時,我們通常使用Arduino IDE(集成開發環境),這是一個支持所有主要桌面平台(macOS,Linux,Windows)的軟體,它提供了兩個功能:一個帶有集成庫支援的程式編輯器,以及一種將Arduino程式編譯並載入到連接到電腦的板子上的方法。 Arduino程式語言基本上是建立在C++之上的框架。您可以說它在傳統意義上不是一種真正的程式語言,但我認為這有助於初學者避免混淆。 用Arduino程式語言編寫的程式稱為sketch。通常,sketch是以.ino副檔名(從Arduino)保存的。 與“正常”的C或C++的主要區別在於,您將所有代碼包裝到2個主要函數中。當然,您可以有多於2個的函數,但是任何Arduino程式都必須提供至少這兩個函數。 一個函數叫做setup(),另一個函數叫做loop()。第一個函數在程式開始時調用一次,第二個函數在程式運行時重複調用。 我們沒有像您在C/C++中習慣的main()函數作為程式的入口點。一旦編譯您的sketch,IDE將確保最終結果是一個正確的C++程式並將其預處理以添加丟失的輔助函數。 其他的都是正常的C++程式碼,由於C++是C的超集,因此任何有效的C語言也可以是有效的Arduino程式碼。 可能會導致困擾的一個不同之處是,雖然您可以將程式分散在多個檔案中,但這些檔案必須位於同一個文件夾中。如果您的程式將變得非常大,這可能成為一個無法接受的限制,但在那個時候,您可以輕鬆過渡到本地C++設定,這是可能的。 Arduino程式語言的一部分是內建庫,它們允許您輕鬆集成Arduino板所提供的功能。 您的第一個Arduino程式肯定包括使一個LED燈亮起,然後熄滅。為此,您將使用pinMode(),delay()和digitalWrite()函數,以及一些常數,如HIGH,LOW和OUTPUT。 像這樣,這是經典的第一個Arduino項目(“Hello,World!”): #define LED_PIN 13 void setup() { // 將引腳13設定為數位輸出 pinMode(LED_PIN, OUTPUT); } void loop() { // 開啟LED燈 digitalWrite(LED_PIN, HIGH); // 等待1秒(1000毫秒) delay(1000); // 關閉LED燈 digitalWrite(LED_PIN, LOW); // 再等待1秒 delay(1000); } 這都是Arduino程式語言(或者我們最好稱之為套件或函式庫)的一部分。 其他語言支援 請記住,您不僅限於使用這種語言和IDE來編寫Arduino程式。除其他項目外,還有項目讓您使用Node.js代碼,例如Johnny Five項目,在Arduino上運行Python代碼使用pyserial,以及使用Gobot在Arduino上運行Go代碼。但是,Arduino程式語言絕對是您會看到最多教程基於的語言,因為它是使用這些設備的原生且公認的方法。 Arduino程式語言內置常數 Arduino設置了兩個我們可以使用的常數: HIGH代表高電壓級別,根據硬體而定(> 2V在3.3V Arduino Nano板上, > 3V在5V Arduino Uno板上) LOW代表低電壓級別,具體值取決於所使用的Arduino板的型號 然後使用3個常數與pinMode()函數結合使用: INPUT將引腳設定為輸入引腳 OUTPUT將引腳設定為輸出引腳 INPUT_PULLUP將引腳設定為內部上拉電阻 我們還有一個常數LED_BUILTIN,它指向板上引腳的號碼,通常等同於號碼13。 除此之外,我們還有C/C++常數true和false。 Arduino數學常數 M_PI常數pi(3.14159265358979323846) M_E常數e M_LN10數字10的自然對數 M_LN2數字2的自然對數 M_LOG10E對數e以10為底的對數 M_LOG2E對數e以2為底的對數 M_SQRT22的平方根 NAN(非數)常數 Arduino程式語言內置函數 在本節中,我將列出Arduino程式語言提供的內置函數的參考。...

Arduino項目:analogWrite()函數和PWM

我們使用由Arduino語言提供的analogWrite()函數來輸出模擬信號。 好吧,其實不是真正的模擬信號,而是**PWM(脈衝寬度調變)**信號。 以Arduino Uno為例,你會注意到有6個類比輸入引腳A0-A5,但沒有類比輸出引腳。 我們使用數字輸出引腳以特定方式來模擬類比輸出。 PWM意味著脈衝寬度調變,這是一種我們從數字設備模擬類比輸出的技術。我們基本上會發出高電平信號一小段時間,然後發出低電平信號,並且我們不斷重複這個過程,速度非常快。類比設備將根據週期的平均值。高電平的時間越短,平均值越小。 要模擬0V的類比信號,使用: analogWrite(0) 要模擬高電平類比信號(Arduino Uno上的5V),使用: analogWrite(255) 介於這兩個值之間的任何值都是在這兩個值之間的值。2.5V的類比信號是analogWrite(127)。 這適用於輸出5V的設備。一些Arduino設備(例如Arduino MKR 1010 WiFi)最大輸出3.3V,因此這些值將適應輸出引腳可以發出的最高電壓。 並非所有數字輸出引腳都可以做到這一點。特別是我們可以使用analogWrite()的引腳上標有波浪號〜。在Arduino Uno上,我們可以使用3、5、6、9、10、11引腳。 在Arduino MKR 1010 Wifi上,我們可以使用0-8、10、11、A3、A4引腳。 在每個板的官方規格中,您將找到PWM引腳的列表。