您有没有想过您的锅炉何时以及为什么要运行并为您的家供暖?你想用 Arduino 自动化你的加热系统吗?OpenTherm 防护罩专为您设计。它将允许您使用 Arduino 监控和控制您的 OpenTherm 锅炉。
去年,我想将我的燃气加热锅炉与壁炉调节器结合起来。我的 BAXI 锅炉和恒温器非常智能,所以我很自然地想扩展锅炉来控制壁炉。我厌倦了所有那些允许我这样做的昂贵的官方 BAXI 扩展。
因此,我为自己构建了一个OpenTherm 网关,它允许我拦截恒温器和锅炉之间的通信,并放置一个可以点燃锅炉或使用壁炉热量的算法——[关于调节器的更多信息]。
由于有很多人想要类似的东西,我决定创建一个模块——Arduino shield——这将使任何人都可以很容易地控制他们的房子供暖。
* 请注意,这些仅在您的锅炉配备了必要的附件时可用
电子电路基于使用 PIC 微控制器的OpenTherm 网关项目。我已经为 Arduino 进行了调整,并创建了一个很好的 Arduino UNO 兼容布局。
您可以使用上述原理图和Gerber 文件自行创建屏蔽。我正在通过PCBWay制造我的电路板- PCB Prototype the Easy Way。您可以让他们在一周内创建和运送这些漂亮的蓝色美女。蓝色阻焊层与基础绿色同价!我也喜欢他们的客户服务,没有什么问题。或者您可以订购预先包装好的DIY 套件。
第一个示例将向您展示如何使用防护罩创建您自己的自定义恒温器。你需要什么:
如上图所示将您的锅炉与 Arduino OpenTherm 屏蔽连接,将屏蔽连接到您的 Arduino 上,您就可以开始编程了。Arduino OpenTherm IO 库包含以下示例,向您展示如何与锅炉进行通信。
void loop() {
if (OPENTHERM::isIdle()) {
message.type = OT_MSGTYPE_READ_DATA;
message.id = OT_MSGID_SLAVE_CONFIG;
message.valueHB = 0;
message.valueLB = 0;
Serial.print("-> ");
OPENTHERM::printToSerial(message);
Serial.println();
OPENTHERM::send(BOILER_OUT, message); // send message to boiler
}
else if (OPENTHERM::isSent()) {
OPENTHERM::listen(BOILER_IN, 800); // wait for boiler to respond
}
else if (OPENTHERM::getMessage(message)) { // boiler responded
OPENTHERM::stop();
Serial.print("<- ");
OPENTHERM::printToSerial(message);
Serial.println();
Serial.println();
delay(100); // minimal delay before next communication
}
else if (OPENTHERM::isError()) {
OPENTHERM::stop();
Serial.println("<- Timeout");
Serial.println();
}
}
首先,使用OPENTHERM::isIdle检查是否没有挂起的命令。如果没有,您可以发送下一个。在此示例中,您请求从属配置标志。如果命令成功发送,您必须开始使用OPENTHERM::listen调用监听来自锅炉的回复。方法OPENTHERM::getMessage只要有来自从站的待处理回复,并且如果出现问题或发生超时,方法OPENTHERM::isError 就会返回 true。该库包含 OpenTherm 消息结构,其中包含来自协议的解码数据,因此您根本不需要关心格式。签出源代码这是有据可查的。所有类型的消息都列在常量中,或者您可以查看OpenTherm 文档。
struct OpenthermData {
byte type;
byte id;
byte valueHB;
byte valueLB;
float f88();
void f88(float value);
uint16_t u16();
void u16(uint16_t value);
int16_t s16();
void s16(int16_t value);
}
第二个示例将向您展示如何将中间人设备连接到 OpenTherm 总线以监控锅炉和恒温器或拦截它们的通信。你需要什么:
如上图所示,将屏蔽连接到锅炉和恒温器之间的总线。您可以看到它中断了这两个设备之间的总线。现在您的通信中断了,除非您将网关软件上传到您的 Arduino 中,该软件会将命令和回复从恒温器转发到锅炉,反之亦然。在Arduino OpenTherm IO 库中再次有一个很好的例子。
void loop() {
if (mode == MODE_LISTEN_MASTER) {
if (OPENTHERM::isSent() || OPENTHERM::isIdle() || OPENTHERM::isError()) {
OPENTHERM::listen(THERMOSTAT_IN);
}
else if (OPENTHERM::getMessage(message)) {
Serial.print("-> ");
OPENTHERM::printToSerial(message);
Serial.println();
OPENTHERM::send(BOILER_OUT, message); // forward message to boiler
mode = MODE_LISTEN_SLAVE;
}
}
else if (mode == MODE_LISTEN_SLAVE) {
if (OPENTHERM::isSent()) {
OPENTHERM::listen(BOILER_IN, 800); // reply need to be send back in 800ms
}
else if (OPENTHERM::getMessage(message)) {
Serial.print("<- ");
OPENTHERM::printToSerial(message);
Serial.println();
Serial.println();
OPENTHERM::send(THERMOSTAT_OUT, message); // send message back to thermostat
mode = MODE_LISTEN_MASTER;
}
else if (OPENTHERM::isError()) {
mode = MODE_LISTEN_MASTER;
Serial.println("<- Timeout");
Serial.println();
}
}
}
网关只是开始监听恒温器命令。如果检测到请求,它将对其进行解析并将其转发给锅炉。网关现在将开始监听锅炉回复。如果在 800 毫秒内收到回复,网关会将回复转发回恒温器。恒温器和锅炉都不会知道它们之间有什么额外的东西。正如您所看到的,有足够的空间来编写您自己的代码,这些代码可以捕获消息并从中读取有用的信息(状态、温度、压力、统计数据……)。您甚至可以覆盖或丢弃您不喜欢的请求或回复。
如您所见,与您的智能供暖系统进行通信并使其更加智能非常容易。在下一篇文章中,我将在我的OpenTherm 调节器中向您展示该硬件的更多实际用法。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !