首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【IoT迷你赛】基于 TencentOS tiny 和 微信小程序的机柜监控系统demo

【IoT迷你赛】基于 TencentOS tiny 和 微信小程序的机柜监控系统demo

原创
作者头像
gmslermt
修改2019-08-28 16:58:29
9350
修改2019-08-28 16:58:29
举报
文章被收录于专栏:腾讯云IoT腾讯云IoT

机柜是 IDC 的重要组成部分,提供使服务器正常运行的外部环境。传统的机柜无法实时监测内部环境,需要人工巡检以保障服务器稳定运行。如何提高监控效率,准确、实时地报告机柜内的状态是一个需要关注的问题。利用各种物联网设备,可以实现数据实时采集、告警等功能。

这里基于 TecncentOS tiny 和 微信小程序,实现了一个机柜监控系统demo,用于采集温湿度数据、监控机柜门禁状态、调节风扇开关。由于条件限制,采用一个触点开关模拟机柜门禁,一个小风扇来模拟机柜内的制冷系统。利用采集到的温湿度数据,可以在服务器温度较高时增强散热效果,在服务器温度适当时节省能源。

效果

小程序.jpg
小程序.jpg

采集到的数据先上传至云平台,小程序再从云平台获取数据,达到几乎实时显示数据的效果,控制指令则由小程序发送给云平台,云平台再发送给开发板。效果见视频(进行了一定加速),因为小程序的更新频率设定为 5s,所以数据刷新有一定延时。

开发环境

软件

  • Keil5

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,开关闭合后 PB8GND 相通变成低电平,因此可以将 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.0PA0 之间的电压驱动风扇转动,若 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 效果
  • 开发环境
    • 软件
      • 硬件
      • 系统实现
        • 温湿度检测
          • 触点开关检测
            • 风扇控制
              • 数据上报
              相关产品与服务
              云开发 CloudBase
              云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档