--- tags: 臉書社團常用資訊 --- # 如何在技術社群有效發問?圖片設計重點 當你在社群中詢問關於程式碼的問題時,請依照下列的建議逐一檢查是否有遺漏資訊。 ## 發問三本柱:程式碼,接線圖,錯誤訊息 ## 1. 原則 -- 不要使用圖片貼程式碼 你不應該使用圖片,你是來問問題的,不是來給大家做視力檢查的。 線上分享程式碼工具整理 1. Arduino Editor : 簡述:這是arduino官方的線上編輯器,同時具有線上分享的功能,如 arduino 的 arduino board manager 和 library manager 都有,適合只用過 arduino ide 的人使用。 網址:https://create.arduino.cc/editor 2. pastebin: 簡述:可以讓你貼上程式碼,然後產生一個 link 讓你貼在討論區發問。 網址:http://pastebin.com/ ## 2. 使用 pastebin 張貼程式碼。 http://pastebin.com/ 可以讓你貼上程式碼,然後產生一個 link 讓你貼在討論區發問。 建議你使用下列的方式: 1.先在 Arduino IDE 上開啟程式碼。如果你是網路上找到的程式碼,也請先使用 Arduino IDE 開啟一個空白草稿碼,然後將你在網路上找到的程式碼貼上取代原本的程式碼。 2.使用 Auto Format (或是按 Ctrl+T) 將程式碼的縮排格式自動設定好。 ![](https://i.imgur.com/5y9E6EE.png) 相信我,這很重要! 時常有人貼了一份全部 "向左對齊" 的程式碼。遇到這種我連看都不想看! 3.將縮排好之後的程式碼全選複製,然後進入 http://pastebin.com/ 貼上。 記得開啟右上方的 **Syntax Highlighting**,底下 **Syntax Highlighting:** 選 `Arduino`。 **Paste Expiration:** 表示這個連結多久以後就會失效,`2 Weeks` 是個不錯的選擇,如果兩週了都沒人理你,大概也不會有人回你了 XD ![](https://i.imgur.com/GZCNDVW.jpg) 4.確認無誤後,點 `Creat New Paste`,然後會產生如下圖的網頁。把網址列附在你的問題貼文上。 ![](https://i.imgur.com/z9v5lqH.jpg) 為什麼貼上程式碼如此重要? 你的程式碼可能需要在真實的 Arduino IDE 上編譯才能看出問題,因此你越讓人方便能貼上程式碼,就越容易有人會願意幫你在真實環境下測試。否則相信我,再怎樣熱心的人也只能眼睛看一看就猜個方向給你。到頭來是誰浪費了時間呢? ## 3. 將發問的重點部分剝離出來 假如你想寫個控制程式,按鍵壓住 2 秒後,會將蒐集到的資料寫入 SD 卡;若按壓持續超過 5 秒則退出。但你在處理按鈕行為時遇到了問題,所以想要在社群中發問。這個時候我會建議你將按鍵處理的部分抽離原本的程式碼,你應該另存成一個獨立的程式碼發問,而 SD 卡讀寫的部分則以 `Serial.println("write data to SD...");` 模擬即可。 這樣做的原因很好理解,如果有人願意幫你測試程式碼,但光是想到得為了你的 SD 卡存取動作得去找 SD 卡接硬體才能執行,大部分的人就懶了。 你應該將真正需要發問的部份抽離出來,另存一個程式檔,確定可以編譯後才貼文發問。以這個例子來說,因為真正想問的是按鈕控制的問題,這個問題甚至可以直接使用 Tinkercad 提供的線上模擬器測試,不需要實體的設備。而且就軟體開發的角度來說,開發過程中有這樣的單元獨立開發與測試也是好的。 #### 總而言之,程式碼發問的訣竅是 -- 你越容易讓人測試除錯,就越容易有人願意回答你。 ## 4. 交代你所使用的函示庫 透過 Arduino IDE 可以讓你從網路上下載函示庫。你必須交代你所使用的函示庫來源為何? 例如你嘗試將溫度顯示在 OLED 模組上卻遭遇了問題,但能驅動 OLED 的函示庫不是只有一個來源。 如果你是透過 Arduino IDE 上搜尋來的。請進入 Manage Libraries ![](https://i.imgur.com/ycdeaBE.png) 找到你所使用的函示庫,例如假如你使用下圖紅框所示的函示庫,請在問題說明中表明。 ![](https://i.imgur.com/ybrKrKT.jpg) 你可以說「使用 Adafruit Feather OLED by Adafruit」的函示庫。或是將底下 **More Info** 的 link 貼上來。以這個例子來說,More Info 事實上是一個 github link: https://github.com/adafruit/Adafruit_FeatherOLED 另外最好也加上函示庫的版本名稱,例如上圖是 v1.0.5 會這樣做的原因是因為有時候函示庫的來源不只一種,或是版本有相容性的問題。也許有人會告訴你用哪一種版本比較好,甚至推薦你用另一個更好用的函示庫。但如果你沒有交代這樣的細節,你永遠也不會得到這樣的資訊。 ## 5. 提供所有的錯誤訊息...對!我說的是 "所有的" 最多人詢問程式碼問題的類型,就是編譯錯誤! 編譯的過程中,IDE 會一一去編譯所用到的函示庫,做鏈結...等等,事實上會做很多事情。 建議各位在設定中將編譯相關的詳細資訊都打開。 ![](https://i.imgur.com/OgqfXoc.jpg) 當發生錯誤時,其實你真正要提供的是 **error:** 字樣的上下幾行資訊。還有若真要貼圖的話,請把視窗拉長一點好嗎,每次看到有人把訊息視窗縮得很小,然後說 "錯誤訊息如下"...看了真的很無言...(= =) 但,其實跟上面講的程式碼一樣,最好的方式就是貼到 http://pastebin.com/ 。你有注意到錯誤發生時,訊息視窗的右邊有個 **Copy error message** 的按鈕嗎? 其實這個方法更簡單~ 按下去就把整個編譯過程的 log 都複製下來了。 ![](https://i.imgur.com/iHV4kCj.jpg) 接著貼到 http://pastebin.com/ 產生 link 即可。 ![](https://i.imgur.com/cy3egyi.jpg) 其實我更建議這種方式,尤其是新手! 因為從編譯的 log 可以看出你到底有沒有引入函示庫,你可能主程式有寫,但是 Arduino IDE 根本就沒引用到你的函示庫。這些訊息不會出現在 error: 但是從編譯的過程可以看出來。所以如果你根本不確定到底有沒有正確地引用函示庫,最好的方式就是 **Copy error message** 然後全部提供! ## 6. 接線圖 如果是簡單的,你可以用文字說明。或是如果你程式碼寫得夠好,一般有經驗的人可以看程式碼的 pin 宣告就知道。但如果是個複雜的系統,你可能會需要提供接線圖。 ## 7. 其他資訊 像是: 使用甚麼板子? UNO、Nano、ESP32...etc. 如果有特殊供電方式的話,也需要交代 (尤其是你控制馬達的時候) ## 8. 範本 這裡提供幾個範本: ### 編譯錯誤 > Hi 各位,我想要做一個 ____ 的功能,但是遇到了編譯錯誤的問題。 > > 我所使用的開發板是 ____。 > > 我在 Arduino IDE 上開發,使用的函示庫有 ____ (v1.0.5)。 > > 主要的程式碼在這: https://pastebin.com/xxxxxxxx > > 但是編譯時遇到了錯誤訊息: https://pastebin.com/ooxxooxx > ... ### 執行不如預期 > Hi 各位,我想要做一個 ____ 的功能,但是遇到了 ____ 的問題。 > > 我所使用的開發板是 ____。供電的方式是 ____。接線圖如下: (發文貼圖) > > 我在 Arduino IDE 上開發,使用的函示庫有 ____ (v2.0.5) 和 ____ (v3.0)。 > > 主要的程式碼在這: https://pastebin.com/xxxxxxxx > > 但是執行時,不如我的預期,當我做 ____ 動作時,COM port 輸出的 log 為: https://pastebin.com/xxxeeexxee