Webduino Note
===
## 觀察
1. 基本上測量值的時候,不同的值才會產生新的事件。例如 Photocell 的開始偵測,其實是根據每次取樣時間所量測的值,如果和上一次不同的話,就產生新的事件。
2. 體驗版可以把目前的結果暫存起來,會得到一個連結網址;Pro版則是用檔名來儲存,而且有容量限制(一般是20個,用優惠卷可以增加數量)。Pro版的儲存容量相對比較受限,但可以使用匯出匯入的方式來補足容量的不足,也可以使用 jsbin 來存放自己的專案。
3. 偵測板子狀態,可使用這個擴充模組:https://fustyles.github.io/webduino/DeviceStatus_20181109/blockly.json
會得到以下的新模組

然後可以再根據其狀態做相應的處理。
4. 在大陸地區會連上大陸的 Server,其他地區會連上另一個 Server
```javascript=
WebArduino.DEFAULT_SERVER = 'wss://ws.webduino.io:443';
WebArduino.SERVER_CHINA = 'wss://ws.webduino.com.cn';
```
## 實驗
1. 偵測板子狀態的擴充模組:

- 先連上,執行有反應。接著斷線,會顯示 ERROR。這時再把板子連上,沒有反應了。
- 先不連上,執行後等一段時間,會顯示 ERROR。這時再把板子連上,沒有反應。
- 先不連上,執行後再趕快連上板子,結果可能顯示 ERROR,版本號 (連上時會即刻傳送版本號),或數值,然後停止,也可能正常操作。 ==> 應該是看哪一個事件先發生,基本上只要發生 ERROR,板子就掛了,事件偵測也終止。
- 如果希望斷線後(或未連線就執行)再把板子接上,仍然能夠正常執行的話,必須重新執行這個模組方塊,可以使用以下的接法(連上時設定狀態為 1,未連上設定狀態為 0)

2. 使用 boardReady:

- 先連上,執行有反應。接著斷線,會顯示 ERROR。這時再把板子連上,沒有反應了。
- 先不連上,執行後沒有反應。
3. 用上面方塊產生程式碼,然後在 board options 後面加上 true 參數,這樣即使一開始板子沒有連線,每隔 5 秒也會重新檢查一次連線狀態,那等板子連上線之後就可以正常執行。不過要注意,當板子斷線之後,如果已經出現 ERROR (可能要30秒左右),那麼再重新連上線還是可以正常執行;如果還沒出現 ERROR,然後就重新連線的話,量測會中斷。這時只要讓它重新顯示 ERROR 之後再重新連線就可以了。

4. 跟板子有關的事件和訊息編號
```javascript=
var BoardEvent = {
ANALOG_DATA: 'analogData',
DIGITAL_DATA: 'digitalData',
FIRMWARE_VERSION: 'firmwareVersion',
FIRMWARE_NAME: 'firmwareName',
STRING_MESSAGE: 'stringMessage',
SYSEX_MESSAGE: 'sysexMessage',
PIN_STATE_RESPONSE: 'pinStateResponse',
READY: 'ready',
ERROR: 'error',
BEFOREDISCONNECT: 'beforeDisconnect',
DISCONNECT: 'disconnect',
RECONNECT: 'reconnect'
};
/**
* Message command bytes (128-255/0x80-0xFF)
* https://github.com/firmata/protocol/blob/master/protocol.md
*/
var DIGITAL_MESSAGE = 0x90,
ANALOG_MESSAGE = 0xE0,
REPORT_ANALOG = 0xC0,
REPORT_DIGITAL = 0xD0,
SET_PIN_MODE = 0xF4,
REPORT_VERSION = 0xF9,
SYSEX_RESET = 0xFF,
START_SYSEX = 0xF0,
END_SYSEX = 0xF7;
// Extended command set using sysex (0-127/0x00-0x7F)
var SERVO_CONFIG = 0x70,
STRING_DATA = 0x71,
// SHIFT_DATA = 0x75,
// I2C_REQUEST = 0x76,
// I2C_REPLY = 0x77,
// I2C_CONFIG = 0x78,
EXTENDED_ANALOG = 0x6F,
PIN_STATE_QUERY = 0x6D,
PIN_STATE_RESPONSE = 0x6E,
CAPABILITY_QUERY = 0x6B,
CAPABILITY_RESPONSE = 0x6C,
ANALOG_MAPPING_QUERY = 0x69,
ANALOG_MAPPING_RESPONSE = 0x6A,
REPORT_FIRMWARE = 0x79,
SAMPLING_INTERVAL = 0x7A;
// SYSEX_NON_REALTIME = 0x7E,
// SYSEX_REALTIME = 0x7F;
```