You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebIOPi环境下树莓派2与Arduino Nano I2C断连的JS告警实现问询

当然可以实现I2C断开的诊断式JS告警!

结合你目前WebIOPi + Arduino Nano(I2C)的环境,我给你两种实用的方案,能轻松实现连接中断时的告警提示:

方案一:定时后台检测 + 前端告警

这种方式会定期主动检查I2C连接状态,适合需要实时监控连接情况的场景:

步骤1:在Python脚本中添加连接检测逻辑

修改你的WebIOPi Python脚本,加入I2C状态检测的函数,并通过macro暴露给前端:

import webiopi
from webiopi.devices.i2c import I2C

# 替换成你的Arduino I2C地址
ARDUINO_I2C_ADDR = 0x08
i2c_device = I2C(ARDUINO_I2C_ADDR)

def check_i2c_link():
    """检测I2C连接是否正常"""
    try:
        # 这里根据你和Arduino的通信协议调整,比如发送一个心跳命令
        # 示例:尝试读取一个字节,或者发送一个空指令
        i2c_device.readByte()
        return True
    except IOError:
        # 捕获I2C通信异常,说明连接中断
        return False

# 将状态暴露给前端的macro
@webiopi.macro
def get_i2c_connection_status():
    return "online" if check_i2c_link() else "offline"

步骤2:前端JS定时查询并触发告警

在你的WebIOPi网页中添加JS代码,定时调用上面的macro,根据返回状态触发告警:

<script type="text/javascript">
// 检测间隔(毫秒),建议5-10秒
const CHECK_INTERVAL = 5000;
let previousStatus = "online";

function updateI2CStatus() {
    // 调用WebIOPi macro获取状态
    webiopi().callMacro("get_i2c_connection_status", [], function(status) {
        const statusElement = document.getElementById("i2c-status-indicator");
        
        if (status === "offline" && previousStatus === "online") {
            // 连接从正常变为断开,触发告警
            alert("⚠️ 警告:I2C连接已中断!请检查线路或Arduino设备。");
            statusElement.textContent = "连接中断";
            statusElement.style.color = "#dc3545";
        } else if (status === "online" && previousStatus === "offline") {
            // 连接恢复的提示
            alert("✅ I2C连接已恢复正常!");
            statusElement.textContent = "正常连接";
            statusElement.style.color = "#28a745";
        }
        
        previousStatus = status;
    });
}

// 页面加载后启动定时检测
window.onload = function() {
    setInterval(updateI2CStatus, CHECK_INTERVAL);
    // 初始化状态显示
    updateI2CStatus();
};
</script>

<!-- 页面上显示连接状态的元素 -->
<div class="status-box">
    I2C连接状态:<span id="i2c-status-indicator">检测中...</span>
</div>

方案二:捕获操作失败的异常告警

这种方式是在用户操作(比如点击LED开关按钮)时,捕获I2C通信失败的异常,触发告警,适合关注操作有效性的场景:

修改你页面上的按钮点击逻辑,添加错误回调:

<script type="text/javascript">
function toggleLED() {
    // 调用控制LED的macro,添加错误回调
    webiopi().callMacro(
        "toggle_led",  // 替换成你实际控制LED的macro名称
        [],
        function(result) {
            // 操作成功的处理逻辑(比如更新按钮状态)
            console.log("LED状态已更新");
        },
        function(error) {
            // 捕获到通信错误,判断是否为I2C相关问题
            if (error.message.includes("IOError") || error.message.includes("I2C")) {
                alert("⚠️ 操作失败:I2C连接已中断,请检查设备!");
            } else {
                alert("操作失败:" + error.message);
            }
        }
    );
}
</script>

<button onclick="toggleLED()">开关LED</button>

一些实用提示

  • 调整Python中的check_i2c_link函数,要匹配你和Arduino之间的实际通信协议,比如如果是自定义指令,就发送一个心跳包而非盲目读取字节,避免误判。
  • 定时检测的间隔不要设置得太短,5-10秒的间隔既能保证实时性,也不会给设备带来额外负担。
  • 告警方式可以更友好,比如用自定义模态框代替浏览器原生的alert,或者在页面顶部固定显示警告条,提升用户体验。
  • 注意WebIOPi版本差异,部分旧版本的API调用可能是webiopi.callMacro而非webiopi().callMacro,请根据你的版本适配。

内容的提问来源于stack exchange,提问作者Irmantas Zemaitis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:56:04