2026年2月26日 星期四

Raspberry Pi4 與小龍蝦 openclaw 的連接問題 (應用 telegram)

首先在raspberryPi4安裝Openclaw
# 更新系統
sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl build-essential
# 安裝 Node.js 22
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
# 安裝 openclaw
curl -fsSL https://openclaw.ai/install.sh | bash

安裝完後接著去設定telegram的APP
這些網路上教學很多可參考!!

以下是我安裝完後跟 telegram 在溝通時的問題與解決方法!!
問題1. 在telegram上下 /start 沒有回應
很多 Pi 都是卡 IPv6。
sudo nano /etc/dhcpcd.conf
在最後一行添加noipv6
sudo nano /boot/firmware/cmdline.txt
在最後一行添加ipv6.disable=1
然後在/home/pi/.openclaw的openclaw.json修改
"channels": {
    "telegram": {
      "enabled": true,
      "dmPolicy": "open",
      "botToken": "your telegram token",
      "allowFrom": [
        "*"
      ],
      "groupPolicy": "allowlist",
      "streaming": "partial"
    }
  },
  "gateway": {
    "port": 18789,
    "mode": "local",
    "bind": "lan",
    "controlUi": {
      "enabled": true,
      "allowedOrigins": [
        "http://192.168.1.41:port",
        "http://192.168.1.104:port"
      ]
    },

問題2. ⚠️ API rate limit reached. Please try again later. (rate_limit)
這個問題出在telegram 下指令給 openclaw時, 去找尋答案時還是會用到 model上的token
所以要執行順利一點還是要花點錢!!






應用例:從telegram下達指令, 透過 openclaw 來控制raspberryPi的IO做家電控制
在/home/pi/.openclaw/workspace建立skills目錄跟skills/gpio-control
/home/pi/.openclaw/workspace/skills/gpio-control













led_control.py
import RPi.GPIO as GPIO
import sys

def set_led(pin, state):
    GPIO.setmode(GPIO.BCM) # 使用 BCM 編號
    GPIO.setup(pin, GPIO.OUT)
    if state == "on":
        GPIO.output(pin, GPIO.HIGH)
        print(f"Pin {pin} is now ON")
    else:
        GPIO.output(pin, GPIO.LOW)
        print(f"Pin {pin} is now OFF")
    # 注意:在 AI 持續控制場景下,通常不立即執行 GPIO.cleanup()
    # 以免狀態重置,但在程式退出前應呼叫。

if __name__ == "__main__":
    # 從命令列接收參數:python led_control.py 17 on
    pin_num = int(sys.argv[1])
    target_state = sys.argv[2]
    set_led(pin_num, target_state)
skill.json
{
  "name": "control_raspberry_pi_gpio",
  "description": "控制樹莓派的 GPIO 針腳開關(例如開關燈或馬達)",
  "parameters": {
    "type": "object",
    "properties": {
      "pin": { "type": "number", "description": "GPIO 針腳編號 (BCM)" },
      "state": { "type": "string", "enum": ["on", "off"], "description": "開啟或關閉" }
    },
    "required": ["pin", "state"]
  },
  "handler": "python3 path/to/led_control.py {{pin}} {{state}}"
}















2026年2月22日 星期日

Arduino Mega2560 EEPROM 的應用

問題: arduino mega2560 接電源接頭 跟 UART後設定完後斷開UART後設定值不見的問題 
在 Arduino 設計中,當序列埠 (Serial Port) 被開啟或關閉(例如拔掉 USB 或關閉序列監控視窗)時,DTR 訊號會觸發晶片重設。
這通常是因為 Arduino Mega 2560 的預設自動重設 (Auto-Reset) 機制,以及變數儲存在 RAM (隨機存取記憶體) 中導致的。
可以使用內建的 EEPROM 來保存設定!!
引入函式庫:#include <EEPROM.h>。
儲存設定:使用 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];
};

// ==========================================================
// 宣告一個全域變數來存放我們的設定
// ==========================================================
RelaySettings relayConfig;

// ==========================================================
// 輔助函數:載入您指定的預設值,並將其寫入 EEPROM
// ==========================================================
void SaverelayConfig() {
// 使用 EEPROM.put() 將整個結構體一次性寫入 EEPROM
  EEPROM.put(SETTINGS_ADDR, relayConfig);
 
  // 寫入魔術數字,標記 EEPROM 已被成功初始化
  EEPROM.put(MAGIC_NUMBER_ADDR, MAGIC_VALUE);

  Serial.println("已成功載入並儲存到 EEPROM。");

  }

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' 將所有設定恢復為預設值。");

}











2026年2月2日 星期一

Arduino Mega2560 產品 Burn-In 燒機設計

依照專案需求
1. 同時16 port relay 切換電源
2. 有10組 Config 設定 可執行不一樣的開機跟關機時間
3. 治具端 有兩顆 按鍵 a. 當下的config 開始執行 b. 停止執行
4. 上位機設定程式, 可設定10組的config值
硬體: 
1. Mega2560 => FW 設計
2. 16 port 5VDC relay board 
上位機程式設計:


Demo:


2026年1月14日 星期三

C# 實作ESP32-CAM的網路監視系統

在前一篇文章 ESP32-CAM 實作 RTSP 多人連接 中實現了ESP32-CAM的RTSP FW設定
接續後是用c#撰寫一個前台利用RTSP影像監視系統.
主體架構為:輸入RTSP位址進行RTSP Stream到 PictureBox上
在MDI多重視窗中可以增加多台的RTSP ESP32-CAM Device
在個別的WebCAM視窗中, 可以針對個別的影像進行
Record Video 或是擷取圖片
也可以使用VLC軟體來進行監看主要是在同一個網域內!!