机柜是 IDC 的重要组成部分,提供使服务器正常运行的外部环境。传统的机柜无法实时监测内部环境,需要人工巡检以保障服务器稳定运行。如何提高监控效率,准确、实时地报告机柜内的状态是一个需要关注的问题。利用各种物联网设备,可以实现数据实时采集、告警等功能。
这里基于 TecncentOS tiny 和 微信小程序,实现了一个机柜监控系统demo,用于采集温湿度数据、监控机柜门禁状态、调节风扇开关。由于条件限制,采用一个触点开关模拟机柜门禁,一个小风扇来模拟机柜内的制冷系统。利用采集到的温湿度数据,可以在服务器温度较高时增强散热效果,在服务器温度适当时节省能源。
采集到的数据先上传至云平台,小程序再从云平台获取数据,达到几乎实时显示数据的效果,控制指令则由小程序发送给云平台,云平台再发送给开发板。效果见视频(进行了一定加速),因为小程序的更新频率设定为 5s,所以数据刷新有一定延时。
doc
中的指南都很详细,有经验的应该能很快配置好。
连接的设备如图所示,一个 DHT11 传感器,一个触点开关,一个风扇。
使用 DHT11 温湿度传感器,系统直接支持该传感器的驱动,直接调用相关的接口即可。
/*********************** DHT11 连接引脚定义 **************************/
#define DHT11_Dout_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define DHT11_Dout_PORT GPIOA
#define DHT11_Dout_PIN GPIO_PIN_6
// 初始化
DHT11_Data_TypeDef dht11_data;
DHT11_Init();
// ...
// 读取数据
DHT11_Read_TempAndHumidity(&dht11_data);
引脚定义及初始化:
#define DOOR_SWITCH_Pin GPIO_PIN_8
#define DOOR_SWITCH_GPIO_Port GPIOB
// ...
GPIO_InitStruct.Pin = DOOR_SWITCH_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(DOOR_SWITCH_GPIO_Port, &GPIO_InitStruct);
GPIO 引脚如何设定对新手来说很困惑,上拉下拉以及推挽开漏还不够了解,这里只能介绍下自己的理解,触点开关的状态是要根据 PB8
的高低电平来判断,触点开关两根线一根接 GND
,另一根接 PB8
,开关闭合后 PB8
与 GND
相通变成低电平,因此可以将 PB8 设为上拉,初始是高电平,如果开关闭合,那么 PB8
变成低电平,反之回到高电平。
int door_switch()
{
// 返回 0 表示开关断开,门关闭
return (HAL_GPIO_ReadPin(DOOR_SWITCH_GPIO_Port, DOOR_SWITCH_Pin) == GPIO_PIN_SET) ? 0 : 1;
}
将正极接在电源,负极接在GPIO引脚,通过设置引脚高低电平来控制风扇开关。
引脚定义及初始化
#define FAN_SWITCH_Pin GPIO_PIN_0
#define FAN_SWITCH_GPIO_Port GPIOA
// ...
HAL_GPIO_WritePin(FAN_SWITCH_GPIO_Port, FAN_SWITCH_Pin, GPIO_PIN_SET);
// ...
GPIO_InitStruct.Pin = FAN_SWITCH_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(FAN_SWITCH_GPIO_Port, &GPIO_InitStruct);
若 PA0
为低电平则 V5.0
与 PA0
之间的电压驱动风扇转动,若 PA0
为高电平,则加在风扇的电压过低无法驱动风扇。
void set_fan_switch(int on)
{
GPIO_PinState fan_state = (on == 1) ? GPIO_PIN_RESET : GPIO_PIN_SET;
HAL_GPIO_WritePin(FAN_SWITCH_GPIO_Port, FAN_SWITCH_Pin, fan_state);
}
int fan_switch()
{
return (HAL_GPIO_ReadPin(FAN_SWITCH_GPIO_Port, FAN_SWITCH_Pin) == GPIO_PIN_SET) ? 0 : 1;
}
在提供的智能灯demo基础之上进行修改,主要修改了数据模板属性的定义以及更新自定义数据的逻辑。
typedef struct _ProductDataDefine
{
TYPE_DEF_TEMPLATE_BOOL m_door_switch;
TYPE_DEF_TEMPLATE_BOOL m_fan_switch;
TYPE_DEF_TEMPLATE_FLOAT m_humidity;
TYPE_DEF_TEMPLATE_FLOAT m_temperature;
TYPE_DEF_TEMPLATE_STRING m_name[MAX_STR_NAME_LEN + 1];
} ProductDataDefine;
数据上传通过两种途径,一是定时上报;二是检测到数据有变化就上报。
void test_data_change()
{
static float old_temperature = -1, old_humidity = -1;
DHT11_Read_TempAndHumidity(&sg_dht11_data);
if (!float_equal(sg_dht11_data.temperature, old_temperature))
{
// 温度改变
}
if (!float_equal(sg_dht11_data.humidity, old_humidity))
{
// 湿度改变
}
old_temperature = sg_dht11_data.temperature;
old_humidity = sg_dht11_data.humidity;
static int old_door_switch = -1, current_door_switch;
current_door_switch = door_switch();
if (old_door_switch != current_door_switch)
{
// 门锁状态改变
}
old_door_switch = current_door_switch;
static int old_fan_switch = -1, current_fan_switch;
current_fan_switch = fan_switch();
if (old_fan_switch != current_fan_switch)
{
// 风扇状态改变
}
old_fan_switch = current_fan_switch;
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。