本帖最后由 routeros.cn 于 2024-4-22 21:36 编辑
中移铁通插排 CMPOWER W1 适用于 Arduino 的库
基础代码
https://github.com/routeroscn/SY7T609
需要适当修改适用
比较粗糙
根据 https://github.com/baejinhoon-kor/IC
和
https://github.com/shzlww/esphome_custom_components
做的修改适用
适用于获取电压电流等常用参数
电量获取有点问题 没有做研究了
test.txt 参考代码没有做考证
关于自动校正电压如果有稳定的电源参考值
比如当前已知电压 是 230v
程序可以第一次 启动的时候
// 因为是第一次自动校准0x038270 230v
sendCalibration(0x038270);
如果是手动 可以 sendCalibration(230000);
电流 也可以参考增加函数去校准 目前看电流不太需要校准
包含校准的代码更新在了github 附件中的没有包含 (懒)
这个芯片的自动校准还是 很科学的
关于 控制上的一些代码
仅供参考 可能很久没逛过论坛了编辑下代码经常丢字(看名字大家应该知道鄙人是玩路由的 今年没事才玩下esp 也不能白嫖 分享下过程)
#define LED_PIN 16 // 定义指示灯连接的GPIO引脚
const int relayMasterPin = 0; // 主继电器连接的GPIO引脚
const int relaySlavePin = 12; // 从继电器连接的GPIO引脚
const int relayEnablePin = 15; // 继电器控制引脚连接的GPIO引脚
//主继电器控制
void toggleMasterRelay(bool state) {
setGPIO0State(relayEnablePin, HIGH); // 启用继电器控制
if (state) {
setGPIO0State(relayMasterPin, HIGH);
//setGPIO0State(14, HIGH); //红色
} else {
setGPIO0State(relayMasterPin, LOW);
//setGPIO0State(14, LOW); //
}
setGPIO0State(relayEnablePin, LOW); // 禁用继电器控制
}
///从继电器控制
void toggleSlaveRelay(bool state) {
setGPIO0State(relayEnablePin, HIGH); // 启用继电器控制
if (state) {
// 如果要打开从继电器,则首先检查主继电器状态
if (customDigitalRead(relayMasterPin) == HIGH) {
// 如果主继电器已打开,则直接打开从继电器
setGPIO0State(relaySlavePin, HIGH);
setGPIO0State(5, HIGH);
} else {
// 如果主继电器未打开,则先打开主继电器,然后再打开从继电器
setGPIO0State(relayMasterPin, HIGH);
//setGPIO0State(14, HIGH);
delay(100); // 等待一段时间确保主继电器已经打开
setGPIO0State(relaySlavePin, HIGH);
setGPIO0State(5, HIGH);
}
} else {
if (customDigitalRead(relayMasterPin) == LOW) {
// customDigitalRead(relayMasterPin) == LOW && Actionsource == 0 按键
// 如果主继电器已打开,则直接打开从继电器 //只有是按键操作的时候执行这一步
setGPIO0State(relayMasterPin, HIGH);
} else {
// 如果要关闭从继电器,则直接关闭从继电器
setGPIO0State(relaySlavePin, LOW);
setGPIO0State(5, LOW);
}
}
setGPIO0State(relayEnablePin, LOW); // 禁用继电器控制
}
//控制Io状态
void setGPIO0State(int pin, int state) {
if (pin == 0 || pin == 14 || pin == 16 || pin == 5 || pin == 12 || pin == 15) {
// 如果 pin 是 0、2 或 15,使用反逻辑
digitalWrite(pin, !state);
} else {
// 否则,正常操作
digitalWrite(pin, state);
}
// if (powemode == 3) {
// writeRelayStateToEEPROM();
// }
}
// 公共获取函数
int customDigitalRead(int pin) {
// 如果是IO 0、2或16,则进行逻辑反转
if (pin == 0 || pin == 14 || pin == 16 || pin == 5 || pin == 12 || pin == 15) {
return !digitalRead(pin);
} else {
// 否则,正常读取
return digitalRead(pin);
}
}
|