本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于 Arduino 的智能家居时钟

发布时间:2021-12-18
分享到:

基于 Arduino 的智能家居时钟

发布时间:2021-12-18
分享到:

基于 Arduino 的智能家居时钟,可以显示来自 Homematic 系统的温度和其他数据。

硬件组件

  • Arduino MKR Wifi 1010  ×    1    
  • Adafruit 4 位 7 段显示器带 I2C 背包 - 亮白色 ×    1    
  • Adafruit 双色 8x8 LED 方形像素矩阵带 I2C 背包 ×    1    
  • 锂聚合物电池,带连接器 JST PHR-2 (3,7 V; 1200mAh) ×    1    

项目背景

我曾经在我们的客厅里有一个便宜且不准确的带有温度显示的时钟,我想用它来替换它,因为它可以像您今天所期望的那样自行设置时间和日期。它还应该显示我可用的 Homematic 智能家居数据,例如温度传感器和其他信息(例如门铃传感器)。

由于市场上没有这样的设备,我决定自己制作。

我决定在这个项目中使用 Arduino“Mkr Wifi 1010”,主要是为了 WiFi 访问能力和可用资源。有一些有趣的学习,我认为对其他人从同一块板开始会有用(请参阅下面的详细说明)。

我的 “HM” 时钟显示的特点:

  • 准确的自设置时钟(访问 NTP 互联网时间服务以设置微控制器的 RTC)
  • 从 Homematic(或类似的智能家居系统)接收并显示 2 个温度(内部和外部)
  • 在明亮的 7 段 LED 显示屏上显示时间、日期和温度
  • 7 段 LED 将在夜间变暗(可编程)
  • 额外的 8x8 双色点阵显示器显示状态符号(例如 WiFi、温度或 NTP 更新等)
  • 可以显示附加信息(例如,我添加了一个由 Homematic 门铃传感器触发的可视门铃)
  • 可以通过网页控制(使用IP地址或路由器符号名称在本地WiFi中访问)
  • 有备用电池,测量电源电压和电池电量(剩余百分比)并知道它何时由 USB 供电

使用的零件:

  • Arduino MKR Wifi 1010
  • 4x Adafruit 4-Digit 7-Segment Display with I2C Backpack - 亮白色
  • 1 个 Adafruit 双色 8x8 LED 方形像素矩阵,带 I2C 背包
  • 可选:LiPo Akku 带连接器 JST PHR-2 (3, 7 V; 1200mAh)

说明:

1. 要构建您自己的 HM 显示时钟,我建议使用 Mkr1010 和通过跳线连接的显示器在面包板上开始。(外壳盒的设计不包括在此处 - 也许我稍后会添加一些东西......但后来作为 3D 打印版本)。硬件设置非常简单 - 请参阅提供的原理图:

  • 将 Mkr1010 板安装在面包板上并通过(微型)USB 电缆连接到您的 PC
  • 准备 5 个显示模块并将它们全部连接到相同的 I2C 总线(Mkr1010 的 SCL、SDA 引脚)和电源(3.3V 和 GND)。确保正确设置每个显示器的 I2C 地址以避免地址冲突(请参阅下面的详细信息)
  • 在“5V 引脚”和“A1”之间以及“A1”和“GND”之间连接 2 个相等的电阻,例如 2.2k 作为简单的分压器
  • 可选择连接 LiPo 电池(3.7V;1.2Ah 典型值);确保连接器的极性正确(详情见下文)就是这样。

2.准备你的Arduino IDE:

2.1首先将目标设置为“Boards - Arduino SAMD board - Arduino MKR WiFi 1010”(也许你想先尝试一些简单的Mkr WiFi 1010板示例)

2.2 然后为 I2C 驱动的显示器下载并安装必要的 Adafruit-LEDBackpack 库(请参阅 Adafruit 网站上提供的良好说明:https ://learn.adafruit.com/adafruit-led-backpack/downloads )

2.3 获取我的 Arduino 源代码(见下文),它包含 3 个文件:

  • HMClockDisplay.ino - 主要源代码
  • menu_inline_css7.h - HTML 菜单源代码(用于网站)
  • Symbols.h - 8x8 点阵显示的一些符号

确保它们都在一个文件夹中

2.4在源代码开头的“用户设置”部分更改您的个人设置:输入您的家庭WiFi网络SSID(名称)和密码,并根据需要调整您的时区和夏令时(DST):

// 用户设置 : // WIFI 设置char ssid[] = " XXX "; // 您的 WiFi 网络名称char pass[] = " YYY "; // 您的 WiFi 密码// 时区设置int GMT = 1; // 适应您的时区(例如德国是 GMT+1 -> 设置为 1 )int DST = 0; // 调整夏令时(默认 = 0:无 DST(冬季)

注意:对于初始测试,我建议使用您的“正常”本地 WiFi 访问(没有像访客 WLAN 那样的重大限制)以避免任何问题。

2.5. 编译并上传代码到Arduino开发板

使用串行监视器从设备获取详细信息以进行初始测试。将有许多日志输出,可以帮助您了解 WiFi 连接问题等任何问题。

详细说明:
1. WiFi
Mkr Wifi 1010 板基于连接到 u-blox 模块 NINA-W10 的微控制器 SAMD21,NINA-W10 是一种在 2.4GHz WiFi 范围内运行的低功耗芯片组。要访问您的本地 WiFi 网络,所提供的 WiFiNINA 库提供了所有必需的功能。有大量使用 WiFiNina 的示例和现有项目。请参阅本可用文档

在我的项目中,我使用 WiFi 网络访问:

  • 接入网络时间协议NTP,定时设置实时时钟
  • 提供一个简单的配置网页(基本上它充当一个小服务器)
  • 从我的 Homematic 智能家居系统接收要显示的数据(温度等)

笔记:

  • 在 Arduino IDE 中对 Mkr1010 板进行初始设置后,您可能需要更新 Nina 固件。可以在 Arudino IDE 中查看和更新​​版本。上面提到的 WiFiNINA 网页中描述了此更新过程。

  • 要从本地 WiFi 网络轻松访问设备,请将网络路由器配置为始终为其使用相同的 IP 地址。大多数路由器还允许您分配设备名称(因此您无需在浏览器中输入 IP 地址)。我使用了“HMDisplayClock”,它允许我通过简单地输入http://HMDisplayClock来访问 WiFi 网络中任何浏览器中的控制页面(或者,使用 Arduino Mkr 1010 板的 IP 地址当然也可以工作......)

  • 如果您想对自己的 WiFi 连接设备进行编程,该设备需要始终可以访问,这里有一个提示:请务必定期检查您是否仍处于连接状态。您的路由器会不时断开设备与网络的连接……因此,如果您只建立一次 WiFi(在设置程序中),您将在几个小时后断开连接。就我而言,我每秒都在“handleWifiClient”子例程中检查连接。

2.自定时钟
Arduino 将从返回“纪元时间”的网络时间协议(NTP) 服务中获取准确时间。返回的“纪元时间戳”是自 1970 年 1 月 1 日以来经过的秒数。因此需要将时间戳转换为人类可读的日期和时间信息。此外,必须进行时区和夏令时校正。调整时区的子程序基于 Doug Domke 的优秀作品“It's about time”

为此,Doug 的例行 fixTimeZone() 是一个很大的帮助,因为调整时区可能相当复杂。微控制器 (SAMD21) 的内置实时时钟将使用此信息定期设置(我每小时更新一次)。收到成功的 NTP 更新后,矩阵显示屏上的绿色“NTP”符号会亮起几秒钟:

3. 显示
为了可视化所有信息,我决定使用大而明亮的 LED 显示屏。它们可以安装在烟雾玻璃盖后面,并允许时钟模块的漂亮设计。此外,我使用双色 8x8 矩阵模块获取职业状态信息。

所有显示模块均由 Adafruit 制作,文档齐全并带有软件库。显示器由 I2C 控制(全部连接在同一条总线上)并且可以由 3.3V 供电。(注意 Mkr1010 是3.3V设备,所以不要与 5V 部件混用!)。

  • I2C 寻址:使用多个模块,需要设置每个显示模块的 I2C 地址以避免地址冲突。每个显示器上有 3 个“地址调整焊接跳线”可用。确保为每个模块设置不同的地址。有关更多详细信息,请参阅 Adafruit 页面:在我的情况下,我选择了以下地址(请参阅设置程序): 时间显示模块:0x70 日期显示模块:0x71 Temp1 显示模块:0x73 Temp2 显示模块:0x74 矩阵显示模块:0x72
  • 功率预算检查:所有显示器都连接到 MKR1010 板 VCC 引脚,这是一个稳定的 3.3V 输出。MKR ZERO 的规格说明它可以提供高达 600 mA 的电流。MKR WiFi 1010 也是如此,因为它使用相同的稳压器 (AP2112K-3.3)。我的测量结果显示,由 3.3V 提供的所有 4 个显示器总共消耗的电流不超过 120mA,所以应该没问题。

4. 家庭集成
为了可视化来自 Homematic 智能家居系统的温度值等信息,中央单元 (CCUx) 需要通过本地 WiFi 连接向时钟提供传感器数据。为此,CCU 使用参数访问时钟的网页...像这样:“ http://HMDisplayClock /?tempR=20.5”

使用您自己的时钟版本,尝试先在您的浏览器中手动输入它...如果一切正常,它将正确的温度显示更新为 20.5C,如下所示:

然后按照以下步骤启用自动从 Homematic 中央控制单元 (CCUx) 向时钟发送数据:

4.1.在您的 Homematic CCU 中安装以下两个插件:

a) XML-API :提供 xml 请求功能作为可用 HM 设备(例如传感器)的接口https://github.com/homematic-community/XML-API

b) CUxD Deamon:使用 WiFi 访问https://www.homematic-inside.de/go/cuxd使用脚本命令 CMD_EXEC 将数据发送到时钟

要在安装 CUxD 后首次启用 CMD_EXEC 功能,请在 CUx 守护进程中输入设置并创建一个类型为“(28) System”且具有“Exec”功能的新设备,然后通过您的 CCU 收件箱确认新设备并重新启动您的CCU(此步骤的说明在这里(德语):https : //homematic.simdorn.net/cuxd-installation/ )

4.2. 要选择应显示在 HM 显示时钟上的特定 homematic 传感器名称(数据点),请执行以下步骤:打开 XML-API 菜单:

设置->控制面板->附加软件->XML-API设置->状态列表

... 将列出所有执行器...

找到正确的 <datapoint> 并将确切名称复制到文本编辑器

例如“HmIP-RF.000ED8A9909BB2:1.ACTUAL_TEMPERATURE”

4.3. 创建一个简单的 CCU 程序来定期发送数据。就我而言,我希望我的室内和室外温度传感器每 10 分钟自动发送到时钟。

为此,我创建了一个时间控制序列作为 CCU 程序,如上所示。这个 CCU 程序将每 10 分钟执行一次,然后调用这样的脚本:

string Temp1 = dom.GetObject(" BidCos-RF.OEQ0670990:1.TEMPERATURE ").Value().ToString(2); string Temp2 = dom.GetObject(" HmIP-RF.000ED8A9909BB2:1.ACTUAL_TEMPERATURE ").Value().ToString(2); string url = " http://HMDisplayClock /?tempL="#Temp1;dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O - "#url); 字符串 url = " http://HMDisplayClock /?tempR="#Temp2; dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O - "#url);

用您选择的数据点替换上面第 1+2 行中的传感器对象(参见步骤 4.2)

上述方法当然可以进一步扩展。在我的例子中,每次我的家庭门铃传感器被激活时,我也用它来显示门铃符号。

最后 - 只是为了完整性 - 您当然可以使用任何其他本地服务来提供数据,而不是 Homematic,只要您可以以上述 http 访问格式发送信息。

5. 电池(可选)
您可以选择使用锂聚合物充电电池在断开 USB 电源连接后保持时钟运行。Arduino Mkr WiFi 1010 板有一个内置充电器 Li-Po 充电电路 (BQ24195),它允许 Arduino MKR WiFi 1010 使用电池电源或外部 5 伏电源运行,在使用外部电源运行的同时为 Li-Po 电池充电.

要检测应用中的USB-Power(+Charging)或电池模式,测量 Mkr1010 板的“5V”输出引脚是一种合适的方法:如果测得的 5V 引脚上的电压在 5V 左右,则连接 USB 电源, 如果使用电池,则为 3.3V。使用从 5V 引脚到 A1 和 GND 的 2:1 分压器 (2xR) 来监控电压电平(因为无法为 3.3V ADC 输入提供 5V 电压!)。有关详细信息,请参阅原理图。

要测量电池电压本身,请使用 Mkr1010 板上提供的输入信号,通过“sensorValue = analogRead(ADC_BATTERY);”

电压(3.3-4.2V)是剩余容量的一个很好的指标。我正在评估 5 个不同的级别(请参阅源代码)。

注意事项:

  • Arduino推荐使用锂聚合物可充电单节电池,3.7V,1024mAh左右
  • 电池的连接器类型是 JST PHR-2(在 Arduino 端它是 JST S2B-PH-SM4-TB)。重要提示:检查 JST PHR-2 连接器的极性!板子的 USB 连接器在你的左边,+ 应该是左边的引脚(朝向 USB 连接器),见下图。一些可用的 LiPo 电池具有反极性!幸运的是,如果需要,很容易改变连接器的极性。

  • 关于切换电源的重要说明- 这没有得到很好的记录:根据 Arduino 的说法,从一个电源切换到另一个电源应该自动完成。但是:如果 MKR Wifi 1010 使用 Li-Po 电池运行,然后插入 USB 进行充电,它将受到极大的电流限制!因此,CRG LED 会在一段时间后闪烁,并且由于电源不足,开发板将断电。这是由于以下限制:由于没有实现TI BQ芯片的USB监控功能(D+和D-),因此无法分辨它是哪种电源。因此,BQ24195L 将安全值 0x30 写入 reg 0x00,将输入功率限制为 100mA。然后充电进入 DPM 模式,电池上的充电电压下降以限制电流。(来源:https : //forum.arduino.cc/t/mkr-wifi-1010-battery-circuit-operation/565243/46)解决方案:如果从电池切换回 USB 电源以返回到默认设置。就我而言,我正在使用看门狗重置(请参阅源代码)。肯定有更优雅的方法来解决这个问题(例如重新配置 BQ24195),但对我来说这已经足够了。

 

方案原理图下载

方案电路图下载

代码下载

感谢您的阅读,本文来源于外国网站翻译,原作者mac70,如涉及侵权请联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论