在 Arduino 設計中,當序列埠 (Serial Port) 被開啟或關閉(例如拔掉 USB 或關閉序列監控視窗)時,DTR 訊號會觸發晶片重設。
這通常是因為 Arduino Mega 2560 的預設自動重設 (Auto-Reset) 機制,以及變數儲存在 RAM (隨機存取記憶體) 中導致的。
可以使用內建的 EEPROM 來保存設定!!引入函式庫:#include <EEPROM.h>。
儲存設定:使用 EEPROM.put(address, data)。
讀取設定:在 setup() 中使用 EEPROM.get(address, data) 載入舊值。
儲存設定:使用 EEPROM.put(address, data)。
讀取設定:在 setup() 中使用 EEPROM.get(address, data) 載入舊值。
#include <EEPROM.h>
// ==========================================================
// EEPROM 記憶體位址定義
// ==========================================================
const int MAGIC_NUMBER_ADDR = 0;
const int SETTINGS_ADDR = sizeof(byte); // 設定結構體的起始位址
const byte MAGIC_VALUE = 0xAC; // 自訂一個魔術數字
const int NUM_RELAYS = 16;
// ==========================================================
// 1. 定義設定的結構體
// ==========================================================
struct RelaySettings {
byte orgConfigNumber;
byte AllRelayFlag;
byte RunConfigFlag;
byte ConfigNumber;
uint8_t ConfigFlag[NUM_RELAYS];
unsigned long DelayTime ; //--設定 relay1~16延遲打開時間
unsigned long OnTime_Arr[NUM_RELAYS];
unsigned long OffTime_Arr[NUM_RELAYS];
};
//unsigned long runMillis[NUM_RELAYS];
// ==========================================================
// 宣告一個全域變數來存放我們的設定
// ==========================================================
RelaySettings relayConfig;
void setup()
{
Serial.println("\n--- Arduino EEPROM 陣列範例啟動 ---");
// ==========================================================
// 檢查 EEPROM 中的魔術數字,判斷陣列資料是否有效
// ==========================================================
byte storedMagicValue;
EEPROM.get(MAGIC_NUMBER_ADDR, storedMagicValue);
if (storedMagicValue == MAGIC_VALUE) {
// 如果魔術數字匹配,表示 EEPROM 已經被初始化過,可以安全讀取陣列
Serial.println("偵測到有效設定,從 EEPROM 載入...");
EEPROM.get(SETTINGS_ADDR, relayConfig);
}
else {
// 如果不匹配,表示首次運行或資料損毀,則載入預設值並存入 EEPROM
Serial.println("EEPROM 無有效設定,載入預設值並儲存...");
loadDefaultsAndSave();
}
printCurrentSettings(); // 顯示目前載入的設定
Serial.println("\n輸入 'reset' 將所有設定恢復為預設值。");}








