---
# System prepended metadata

title: 如何在技術社群有效發問？圖片設計重點
tags: [臉書社團常用資訊]

---

---
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
