Arduino項目:使用主動蜂鳴器

在這個項目中,我們將使用Arduino來發出聲音,並使用一個主動蜂鳴器。 首先將蜂鳴器連接到一根電線上: 蜂鳴器有一個“+”極,我使用紅色電線連接該極(這是一個好的習慣)。 然後將“-”電線連接到Arduino的GND引腳,將“+”電線連接到數字輸出引腳,這裡我選擇了引腳#9: 現在切換到Arduino程序。為了發出聲音,我們需要向蜂鳴器的“+”引腳寫入HIGH值,延遲一小段時間,例如一毫秒,然後在同一引腳上寫入LOW值: int delay_ms = 5; int buzzer_pin = 9; void setup() { pinMode(buzzer_pin, OUTPUT); } void loop() { digitalWrite(buzzer_pin, HIGH); delay(delay_ms); digitalWrite(buzzer_pin, LOW); delay(delay_ms); } 將程序加載到Arduino上,蜂鳴器將發出低音。 嘗試更改delay_ms變量的值以改變聲音。 然後,您可以通過像這樣的程序使其播放不同的聲音: int buzzer_pin = 9; void setup() { pinMode(buzzer_pin, OUTPUT); } void play(int ms, int delay1, int delay2) { for (int i = 1; i <= ms; i++) { digitalWrite(buzzer_pin, HIGH); delay(delay1); digitalWrite(buzzer_pin, LOW); delay(delay2); } } void loop() { play(100, 1, 1); play(100, 2, 2); play(100, 1, 1); play(100, 2, 2); play(100, 1, 1); play(50, 2, 1); play(100, 3, 2); play(100, 4, 4); }

Arduino項目:讀取類比輸入

在這個項目中,我們將使用一個電位計並將其連接到Arduino的類比輸入引腳,並編寫一個程式來讀取當前的值。 在Arduino的第2個項目中,我們學會了如何讀取數字輸入。讀取到的值可以是 0 或 1,LOW 或 HIGH。 這可以通過數字I/O引腳來完成,引腳編號從 0 到 13。 類比I/O引腳以 A 開頭。在Arduino Uno上,您可以找到6個類比I/O引腳 A0 / A5: 在Arduino MKR 1010 WiFi上,您有7個類比I/O引腳,從 A0 到 A6: 不同的板子擁有不同數量和位置的引腳。這些引腳可以配置為類比輸入或類比輸出。 數字信號只能是高或低。類比信號可以保持一系列的值,在Arduino的情況下,它的範圍從 0 到 1023,對應著輸入端的電壓從0V到5V的程度。 各種傳感器都會提供給我們類比值。想想溫度傳感器、距離傳感器、聲音傳感器、運動傳感器…我們可以使用Arduino讀取它們的數值,並根據數據決定要做什麼。 我們可以使用一個名為 analogRead() 的函數來實現。 但讓我們先建立一個小電路。 在項目“使用電位計建立一個LED調光器”中,我們建立了一個簡單的電路,使用一個電位計控制LED光。現在讓我們複製該電路的一部分,除了現在我們將Arduino放在那裡。 如果將電位計完全向左轉動,我們讀取到的值應該是 0。完全向右轉動時,我們讀到的值應該是 1023,在中間位置時應該是 512。 以下是使用一個10kΩ電位計構建的電路示意圖: 我們從Arduino的電源輸出引腳獲得0V和5V,並將它們連接到麵包板。然後我們將這些電壓級別連接到電位計的輸入引腳,並獲得輸出引腳,將其連接到類比引腳 A1: 我們編寫一個程式從該引腳讀取,並將讀取到的值打印到串行接口,這樣我們就可以從Arduino IDE的串行監視器上讀取它: void setup() { Serial.begin(9600); } void loop() { int value = analogRead(A1); Serial.println(value); } 需要注意的是,我沒有將 A1 引腳明確設置為輸入引腳,因為引腳默認情況下是輸入的。如果我想寫入該引腳,我需要在 setup() 中使用 pinMode() 进行設置。 以下是我們的程式運行時的結果。當電位計完全向左轉動時,我們讀到的值是 0: 當電位計完全向右轉動時,我們讀到的值是 1023(有時由於處理類比值並且不是100%精確,可能是 1022):...

ArrayBuffer

了解什麼是ArrayBuffer以及如何使用它 就像Blob是對磁碟上可用數據的不透明表示一樣,ArrayBuffer是對內存中可用位元組的不透明表示。 構造函數接受一個參數,即以位元組為單位的長度: const buffer = new ArrayBuffer(64) ArrayBuffer有一個(只讀)屬性:byteLength,正如其名,表示其長度以位元組為單位。 它還提供了一個slice()實例方法,從現有ArrayBuffer中創建新的ArrayBuffer,接受一個起始位置和一個可選的長度: const buffer = new ArrayBuffer(64) const newBuffer = buffer.slice(32, 8) 通過ArrayBuffer從互聯網下載數據 我們可以使用XHR從互聯網下載blob,並將其存儲到ArrayBuffer中: const downloadBlob = (url, callback) => { const xhr = new XMLHttpRequest() xhr.open('GET', url) xhr.responseType = 'arraybuffer' xhr.onload = () => { callback(xhr.response) } xhr.send(null) }

ArrayBufferView

了解什麼是ArrayBufferView對象以及如何使用它 一個ArrayBufferView是ArrayBuffer的一部分。 它有一個偏移量和一個長度。 一旦創建,它提供了3個只讀屬性: buffer指向原始的ArrayBuffer byteOffset是這個buffer的偏移量 byteLength是它的內容在字節中的長度 Typed Arrays和DataViews都是ArrayBufferView的實例。

Astro Props(Astro 屬性)

你可能對於像 React、Vue 或 Svelte 這樣的現代 JavaScript 框架中的屬性概念很熟悉。 注意:我之前寫過相關文章,你可以在 React Props、Vue Props 和 Svelte Props 找到這些文章。 屬性是我們將信息傳遞給組件的方式。這包括變數和函數。 Astro 組件 也支持屬性。 以下是如何使用它們。 假設你在 src/components/Hello.astro 中定義了一個 Hello 組件: <p>Hello!</p> 在使用組件時,你可以為它傳遞一個名為 name 的屬性,像這樣:<Hello name="Flavio" />,你可以使用以下語法在組件輸出中顯示名稱: <p>Hello {Astro.props.name}!</p> 通常,在組件的 frontmatter 部分使用對象解構將屬性提取到單獨的變量中,這在擁有複雜組件時很方便: --- const { name } = Astro.props --- <p>Hello {name}!</p> 下面是如何處理多個屬性,以支持這樣的使用方式:<Hello name="Flavio" message="歡迎" /> --- const { name, message } = Astro.props --- <p>{message} {name}!</p> 以這種方式,你可以為未設置的屬性提供默認值: --- const { name = '', message = 'Hello' } = Astro....

Astro 元件

在建立 Astro 專案時,你會看到一些以 .astro 副檔名結尾的檔案。 我們來看一個例子。 讓我們選擇使用最小範本中預設提供的檔案: --- --- <html lang="en"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/x-icon" href="/favicon.ico" /> <meta name="viewport" content="width=device-width" /> <title>Welcome to Astro</title> </head> <body> <h1>Welcome to <a href="https://astro.build/">Astro</a></h1> </body> </html> 元件基本上是 HTML,除了在頂部有兩行 ---。這是 前置資料(frontmatter)。你可能對這個概念從 Markdown 檔案很熟悉,例如在 Hugo 的文章中使用它來設定頁面標題和發佈日期。 注意,如果前置資料為空,你也可以省略它,直接以 HTML 標籤開始元件的定義。在這個例子中,前置資料是預設的 Astro 範例。 然而在 Astro 中的有趣之處在於它可以包含 JavaScript(或者如果你喜歡,也可以使用 TypeScript)。 請注意上面的第一個例子中包含了 html、head 和 body 標籤,因為它是一個頁面元件,這是一種特殊類型的元件,負責回應路由(並且位於 src/pages)。 在 src/pages 中,你也可以放置 .md 檔案,它們將被視為 markdown 頁面。Astro 會將它們渲染為純 HTML,除非你設定了一個佈局。我們將在另一篇文章中看到這是什麼意思。 元件也可以更簡單,比如在以下示例中,我們展示了如何使用 JavaScript(或 TypeScript)在前置資料中定義變數,並在 HTML 中以類似 JSX 的語法使用它們:...

Astro介紹

最近我在各種地方聽到很多關於Astro的討論,於是我決定去瞭解一下。 我有一個困擾:我討厭伺服器。我討厭管理伺服器,我討厭建立伺服器,我討厭必須擔心伺服器。安全性、維護、升級,這些都不是我喜歡的事情,除非是必需的。 這就是為什麼我喜歡使用像Netlify和Vercel這樣的平臺。我使用了很多靜態網站生成器,如Hugo、Next.js、SvelteKit和傳統的簡單HTML網站。 Astro看起來很有趣,因為它朝著這個方向前進,但有著不同的觀點。 以下是Astro對我來說主要的賣點: 它生成靜態網站,對我來說這是一大優點,因為我不想管理伺服器,而且我愛靜態網站。 它不依賴於特定的框架,這讓我在使用不同框架的不同網站時更靈活。 它似乎非常簡單,我喜歡簡單的東西。 它致力於盡可能少地將JavaScript發送到客戶端。 你知道,我看到自十多年來不斷有新的JavaScript框架出現,必須有一些顯著的不同才能出現。 我所看到的第一件事是,Astro是一個不依賴於框架的工具。在這個領域,它在JavaScript相關的領域是獨一無二的。Next.js和Gatsby是建立在React上的,SvelteKit是建立在Svelte上的,Nuxt是建立在Vue上的。 我可以使用Astro來創建一個使用React的網站,然後在另一個網站中使用Svelte或Vue,但可以重用我的Astro專業知識。如果需要,你還可以將不同框架混合使用在網站的不同部分。這並不是我在我的網站中想要做的事情,但對於各種場景來說可能很有用。 最終生成的是一個靜態的HTML網站。在瀏覽器中運行時不需要任何JavaScript庫,除非明確需要。 這是一種稱為以HTML為先,僅在需要時使用JavaScript的方法。 這很酷。我們使用JavaScript構建網站,但大部分工作在構建時完成。 它似乎使用了很多組合的概念,重用我們用其他庫(React/Vue/Svelte/*)構建的東西。 它還借用了其他項目中出現的一些好的想法,比如frontmatter、內置的MDX支持、作用域CSS和基於文件系統的路由。 Astro在2021年6月正式推出,自那時以來引起了很大的熱議。 讓我們來看看它到底是什麼。 我要使用Astro安裝幾個不同的Astro網站,這樣我們就可以看到不同的網站是如何構建的,從非常簡單的網站開始,然後逐步變得更複雜。 創建一個空文件夾,然後運行: npm init astro 這將提示您選擇一個起始模板: 選擇Minimal。等它完成後,運行: npm install 然後運行: npm run dev 在http://localhost:3000/上啟動本地開發伺服器。 選擇Minimal模板將生成一個非常簡單的網站。 現在讓我們創建另一個網站,選擇Blog模板。 以下是Finder中的項目結構: 所有模板默認使用Preact,它是類似React的庫,只是更快、更小。您可以使用Starter Kit選項來選擇其他框架。作為第二步,您可以選擇React、Solid、Svelte或Vue: 讓我們按下空格選擇Svelte(注意,您可以選擇多個框架)。這將生成一個簡單的單頁網站: 注意底部的小部件,帶有+和-按鈕的數字。這是一個Svelte組件。 現在讓我們來看看生成這三個網站的代碼。在查看代碼之前,請在VS Code中安裝Astro擴展: 這將對您的.astro文件應用正確的語法突出顯示。 我有說過.astro文件嗎?是的,因為這是任何Astro項目的構建塊。 我們有兩種不同類型的.astro文件:頁面和組件。 頁面是任何與路由相關的內容,例如/或/blog或/blog/hello-world。 組件是頁面使用的任何代碼,用於抽象或提取公共代碼。 我們將頁面放在src/pages中,將組件放在src/components中。與往常一樣,我們有一個public文件夾,用於存放需要直接訪問的任何文件,例如圖像或其他資源。 在.astro文件中,組織方式有點新穎,但我不想洩露太多,我們將在下一篇博文中看到,因為這是Astro簡短系列的開端。 以下是Astro系列中的文章: Astro組件 在Astro中構建可組合的佈局 Astro Props 將一個簡單的網站轉移到Astro 從網絡中提取數據在Astro

Babel 簡易指南

Babel 是 Web 開發者工具箱中令人驚艷的一員。它是一個很棒的工具,已經存在很長一段時間,但現在幾乎每個 JavaScript 開發者都依賴它,這種情況還會持續,因為 Babel 現在不可或缺,並為所有人解決了一個大問題。 Babel 簡介 安裝 Babel 一個示例 Babel 配置 Babel 預設 env 預設 react 預設 更多關於預設的資訊 使用 Babel 與 webpack 本文介紹的是 Babel 7,目前的穩定版本。 Babel 簡介 Babel 是一個很棒的工具,已經存在很長一段時間,但現在幾乎每個 JavaScript 開發者都依賴它,這種情況還會持續,因為 Babel 現在不可或缺,並為所有人解決了一個大問題。 哪個問題? 這是每個 Web 開發者肯定都遇到過的問題:JavaScript 的某個特性在最新版本的瀏覽器中可用,但在舊版本中卻不行。或者 Chrome 或 Firefox 實現了它,但 Safari iOS 和 Edge 卻沒有。 例如,ES6 引入了箭頭函數: [1, 2, 3].map((n) => n + 1) 這在現代瀏覽器中都有支持。但 IE11 不支持它,也不支持 Opera Mini(怎么知道的?通過檢查 ES6 兼容性表)。 那麼你應該如何解決這個問題呢?你是應該放棄那些舊的/不兼容的瀏覽器,還是應該編寫舊的 JavaScript 代碼,讓所有用戶都開心?...

Bash Shell 腳本編寫入門

這是關於編寫Bash Shell腳本的詳細概述。 腳本編寫是一種自動化在計算機上定期執行的任務的強大方式。 在本教程中,將詳細介紹腳本編寫,並將成為進一步深入和高級教程創建實際腳本的基本參考。 查看我的Bash介紹文章。 Bash提供了一組命令,這些命令組合在一起可以用來創建小程序,按照慣例我們稱之為腳本。 請注意區別。我們不說Bash編程,而說Bash腳本,我們也不稱Bash腳本為"Bash程序"。這是因為在您的腳本變得失控之前,通常可以達到一定的複雜性。 但是Bash腳本非常棒,因為您執行它們時不需要任何其他東西,只需要Bash本身。沒有編譯器,沒有解釋器,只需要您的shell。 與Perl、JavaScript或Python等編程語言相比,您會錯過很多東西。 變量沒有作用域,它們全部是全局的,沒有標准庫,也沒有模塊系統,例如。但優點也非常大:您可以非常輕鬆地像在shell中那樣調用任何CLI工具,且Unix的許多小型實用程序命令的方法確實使腳本編寫能力出眾。使用wget執行網絡請求,使用awk處理文本等等。 Shell腳本是您最好了解的工具之一,至少知道如何在看到它時讀取程序以及它能為您的日常工作帶來的好處。 本教程將指導您了解Bash腳本的理論和概念。將來我將發布更詳細的教程,介紹特定技術或如何解決特定問題。 基礎知識 腳本存儲在文件中。您可以給shell腳本任何名稱和擴展名,這無關緊要。重要的是它必須在第一行上以"shebang"開始: #!/bin/bash 並且它必須是一個可執行文件。 使用chmod這個命令使文件變為可執行: chmod u+x myscript 將myscript文件設置為您的用戶可執行(我將不會深入探討權限問題,但我將很快介紹它們)。 現在,如果您在同一文件夾中,可以通過調用./myscript或使用其完整路徑來執行腳本。 在學習時,我建議您,如果可能的話,使用在線環境進行測試,像這樣的https://rextester.com/l/bash_online_compiler。 註釋 註釋是編寫程序時最重要的事情之一。以“#”符號開頭的行是註釋(除了上面這裡看到的shebang行)。 例如: #!/bin/bash 註釋也可以在行末開始: #!/bin/bash echo ok # this is a comment 變量 您可以使用“=”運算符設置變量: name=value 示例: ROOM_NUMBER=237 name=Flavio nickname="Flavio" 您可以使用 echo 內建命令打印變量並在變量名前加上 $: echo $ROOM_NUMBER echo $name 運算符 Bash實現了一些在編程語言中常用的算術運算符: + 加 - 減 * 乘 / 除 % 取餘數 ** 指數 您可以使用以下方式進行比較: < 小於 <= 小於等於 == 等於 >= 大於等於 > 大於 您還可以使用這些比較運算符:...

Bash shell介紹

Bash是目前大多數系統上的默認shell,包括Linux、macOS以及Windows 10上的WSL。 註:自Catalina(2019年秋季)以來,macOS使用Zsh 有一些歷史原因使得Bash成為世界上最受歡迎的shell。在1989年,當Bash首次發布時,技術世界與現在相去甚遠。當時,UNIX世界中的大多數軟件都是封閉源碼的。Unix本身是專有的,也是封閉源碼的。 要使用Unix系統,您必須使用一個shell。 當時最受歡迎的shell是封閉源碼的,您需要支付費用才能使用它。它被稱為“Bourne shell”,在/bin/sh命令下可用。它之所以被稱為“Bourne”是因為它的創作者是Steve Bourne。 在那些年,Richard Stallman與GNU項目(後來又是Linux)即將引起革命,開始了開源革命。 GNU項目需要一個shell,於是Bash應運而生。Bash受到Bourne Shell的極大啟發,Bash代表“Bourne再次shell”,它是GNU項目的一個重要組成部分,也是該項目最成功的軟件之一,我們仍然在今天使用。 Bash可以執行所有為sh編寫的腳本,這對於其采用是一個必要的功能,它還引入了更多功能,從最早的版本開始,為其用戶提供更好的體驗。從那時以來,Bash獲得了很多改進。本教程介紹了您可以使用Bash執行的最常見和有用的操作。 Bash的第一步 由於Bash是許多系統的默認shell,您只需要開始bash shell就只需以下操作: 登錄到系統(如果是服務器)。 打開終端(如果是您的計算機)。 開始shell後,您應該看到一個提示符(通常以$結尾)。 如何確定shell正在運行bash?請嘗試輸入help並按Enter。 看到了嗎?我們剛才告訴Bash執行help命令。該命令顯示您正在運行的Bash版本以及您可以使用的命令列表。 警告:看到我那裡有的版本了嗎?這是macOS隨附的默認Bash版本,由於許可問題,它不包含更高版本。這個Bash版本來自於2014年。輸入brew install bash使用Homebrew安裝最新的Bash 5.x。 除非您正在創建shell腳本或進行高級操作,否則您通常不會使用bash說明中列出的任何命令。 99%的日常shell使用是在文件夾之間導航和執行像ls,cd和其他常見UNIX實用程序的程序。 瀏覽文件系統 要瀏覽文件系統,您將使用ls命令。它在/bin/ls中可用,並且由於Bash將/bin文件夾列在其路徑列表中,因此您只需輸入ls即可使用它。 ls會列出當前文件夾中的文件。您通常從您的主文件夾開始,它取決於系統,但在macOS下位於/Users下。我的主文件夾位於/Users/flavio。這與Bash無關,而是有關UNIX文件系統的事情,但參數重疊,如果您從未使用過shell,了解這些是很有益的。 要導航到其他文件夾,請使用cd命令,後跟要移動到的文件夾的名稱: cd Documents cd ..會返回到上級文件夾。 根據您的Bash配置,您將在提示符($符號)之前看到您當前的文件夾。或者,您可能不會看到它,但您始終可以通過輸入“pwd”並按Enter來知道您的位置。 pwd表示“工作目錄的路徑名” 命令行編輯 在shell中編寫命令時,請注意您可以使用箭頭鍵向左或向右移動。這是一個shell特性。您可以移動到命令周圍,按退格鍵進行修正。按下Enter鍵會告訴shell繼續並讓系統執行該命令。 這是正常且可接受的行為,但這可能使早期的UNIX用戶感到“驚訝”。 通過鍵盤組合,您可以快速進行編輯,而無需使用箭頭鍵: ctrl+d 刪除當前選定的字符 ctrl+f 跳轉到右邊的字符 ctrl+b 跳轉到左邊的字符 自動完成 Bash在移動文件系統時具有自動完成的功能。嘗試輸入cd Doc 然後按tab鍵,Bash會自動將其完成為cd Documents。如果這些首個字符有多個選擇,Bash將返回列表,以便您可以輸入一些其他字符以幫助它刪除歧義,然後再次按tab鍵以完成。 Shell命令 使用shell,我們可以執行系統中可用的命令。我們可以在命令前綴中使用完整路徑(例如/bin/ls以列出文件夾中的文件),但是shell具有“路徑”的概念,因此我們可以只輸入ls,它就知道大多數命令都在哪裡(我們還可以通過配置它來添加文件夾到這個路徑)。 命令接受參數。例如,ls /bin將列出/bin文件夾中的所有文件。 參數以破折號-為前綴,例如ls -a 告訴 ls 顯示隱藏文件。按照約定,隱藏文件以點(.)開頭。 常見的shell命令 任何系統上都預先安裝了許多命令,這些命令因具體的系統(Linux/macOS)或甚至所用的Linux發行版而異。 然而,讓我們簡單回顧一下您可以運行的最常用shell命令。這些不是shell本身提供的命令,而是通過shell調用的命令行命令。 每當您遇到問題時,例如您不知道一個命令的作用,或者不知道如何使用它,使用man命令。它可以讓您獲得我將列出的所有命令以及更多的命令的幫助。例如,運行man ls。 這些是可以查看、操作文件的命令。 ls:列出文件 cd:更改目錄 rm:刪除文件或文件夾 mv:將文件移動到另一個目錄或更改文件名 cp:複製文件 pwd:顯示當前工作目錄 mkdir:創建文件夾 Unix文件系統中的每個文件都有權限。chmod允許您更改權限(我們現在不深入討論),chown允許您更改文件的所有者。...