温湿度计加红外控制空调

更新时间Invalid datexi mengrang

概况

在物联网领域,红外控制是构建智能家具控制系统的必备技术之一,例如空调、取暖器等。

遥控器是用来远程控制的机械装置,融合了现在的数字编码技术后,发展成为了可以通过红外线接收器,将接收到的红外信号转化为电信号,再经过遥控器内部的处理器解码、调出相应的指令,达成控制机顶盒等设备的远程指令操作。

本次 Demo 结合涂鸦三明治开发板和 MCU SDK,制作了一个具备温湿度检测和红外控制的智能空调的原型。

物料清单

硬件 (4)
  • 涂鸦三明治 Wi-Fi MCU 通信板(WB3S)

    数量:1

    适用于涂鸦 IoT 自定义方案中,照明、台灯、灯丝灯、调光器、照明遥控器、排插、开关、家电、运动健康、传感类产品原型。

  • 涂鸦三明治红外遥控功能板

    数量:1

    一款无线发射与接收装置,能学习中心频率为 37.9KHz 的红外信号进行解码并保存。

  • 涂鸦三明治直流供电电源板

    数量:1

    用于给涂鸦三明治其余相关的部件供电。

  • STM32F401RE

    数量:1

    Nulceo 系列的开发板套件。

步骤

搭建整体方案

整体方案

  • 涂鸦三明治兼容 Arduino 接口,与作者的核心板以及传感器板进行了快速对接。

  • 为了测量更多数据,传感器方面选用温度和湿度传感器。

  • 核心板采用 ST 的 F401RE 开发板。该开发板已经适配了温湿度的解析,作者只需要适配红外功能即可。通过串口通信,涂鸦三明治 Wi-Fi MCU 通信板(WB3S)可以直接连接到了电源板进行单独供电,再通过两根串口线与红外板相连,省去了很多对接步骤。

  • 三明治 Wi-Fi MCU 通信板(WB3S)采用的是 WB3S 模组,该模组直接通过串口通信就能实现通信。参考下图中的 TXD 和 RXD 接口。

连接完成后,请参考下图所示:

整体方案配置

  • 串口 2 当作调试口(Debug)。

  • 串口 6 对接涂鸦 WB3S 模组。

  • 红外接口为 PB4,需要产生 38KHZ 的载波才能通信,所以用上定时器 3。

  • 两个 I2C 接口中,一个手机传感器数据,另外一个连接 OLED 屏幕,您可以选择性连接。

创建产品并下载开发资料

本小节仅简单介绍如何在涂鸦 IoT 平台创建产品并获得 PID,详细步骤请参考 选品类创建产品

  1. 登录 涂鸦 IoT 平台

  2. 创建一款使用自定义方案开发的 Wi-Fi 温湿度传感器。

    自定义开发方案会涉及 MCU 低代码开发。

  3. 选择温湿度传感器的功能点,本文以下图所示的功能点为例进行介绍。

  4. 设备面板 页签中,选择一款适合产品风格的 App 面板。详细步骤请参考 配置 App 界面

  5. 硬件开发 页签中,选择 自研模组 SDK 开发 的方式,并填写相关信息。

  6. 下载资料 区域,下载对应的 SDK。

初始化 SDK

作者使用 HAL 库开发,简单方便。代码大多数通过 CUBE 生成,供参考。以下为 SDK 初始化,包含了传感器和串口6等。

int main (void)
/* USER CODE BEGIN 1 */
  unsigned char *dataPtr = NULL;
/* USER CODE END 1 */
/* MCU Configuration---------------------/
/* Reset of all peripherals, Initializes the Flash integrion./
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART6_UART_Init());
WX_MEMS Init();

接下来继续完成初始化,包括定时器和延时函数。同时根据涂鸦 IoT 平台的接入规范,初始化了 wifi_protocol_init(); 函数。

/* USER CODE BEGIN 2 */

MX_TIM3_Init();
delay_init (84);
OLED_Init();
Display_init();
delay_ms(1000);
wifi_protocol_init();

HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);
delay_ms(100);

// AirConditionerON();

// AirConditionerOFF();

/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */

主任务里面就是读取传感器值、涂鸦的 Wi-Fi 信号和状态、以及设置配网重置按键。

while (1)
{
    /* USER CODE END WHILE */
    MX_MEMS Process ();
// Display_Data();
    /* USER CODE BEGIN 3 */
    if (init_flag == 0)
    {
        time_cnt++;
        if (time_cnt % 8000 == 0)
        {
            time_ent = 0;
            cnt ++;
        }  
        wifi_stat_led(&cnt); // Wi-Fi 状态处理
    }
    wifi_uart_service();
    key_scan(); // 配网按键检测
}

云模组与涂鸦 IoT 的通信是无需自行配置的,您只需按照 MCU SDK Demo 代码修改相关注释即可。以下为串口发送函数的代码片段:

/********************************
2: 串口字节发送函数
请将MCU串口发送函数填入该函数内,并将接收到的数据作为参数传入串口发送函数
*********************************/
/**
 * @brief 串口发送数据
 * @param[in] [value] 串口要发送的 1 字节数据
 * @return Null
 */
 void uart_transmit_output(unsigned char value)
{
//  # error "请将 MCU 串口发送函数填入该函数,并删除该行"
    HAL_UART_Transmit(&huart, &value, 1, 100);
/*
    // Example:
    extern void Uart_PutChar(unsigned char value);   // 串口发送函数
*/
}
/********************************
第二步:实现具体用户函数
1:App下发数据处理
2:数据上报处理
*********************************/

接着是设置数据上传的函数。<!-- 温度数值需要扩大十倍上传,是因为上传数据也是可以自己设定的。 -->如果您没有温湿度计实物,则可以设定一个固定值进行调试测试,调试成功后即可以添加真实的传感器数据。

// 自动化生成数据上报函数
/**
 * @brief 系统所有 DP 信息上报,实现 App 和 MCU 数据同步
 * @param Null
 * @return Null
 * @note 此函数 SDK 内部需调用,MCU 必须实现该函数哪数据上报功能,包括只上报和可上报可下发型数据
 */
void all_data_update(void)
{
// #error "请在此处理可下发可上报数据,及只上报数据示例,处理完成后删除该行"
  /*
  // 此代码为平台自动生成,请按照实际数据修改每个可下发可上报函数,和只上报函数
  mcu_dp_value_update(DPID_TEMP_CURRENT, 当前温度); // VALUE 型数据上报;
  mcu_dp_value_update)DPID_HUMIDITY_VALUE, 当前湿度); // VALUE 型数据上报;
  mcu_dp_bool_update(DPID_ON, 空调开关); // 布尔型数据上报;
  
  */
  unsigned long temo = Temp*10;
  unsigned long humi = Humi;
  
  mcu_dp_value_update(DPID_TEMP_CURRENT,temp); // VALUE 型数据上报;
  mcu_dp_value_update)DPID_HUMIDITY_VALUE, humi); // VALUE 型数据上报;
  mcu_dp_bool_update(DPID_ON, 0);
}

嵌入式程序开发

解压从涂鸦 IoT 平台下载的开发资料,开始移植。MCU_SDK 里的代码会随着产品设置的功能点而变化。

产品信息

/********************************
用户相关信息配置
*********************************/
/********************************
1. 修改产品信息
*********************************/

# define PRODUCT_KEY "rb13f7onieg****" //涂鸦 IoT 平台创建产品后生成的16位字符,为产品的唯一标识
# define MCU_VER "1.0.0"  // 用户的软件版本,用户 MCU 固件升级,MCU 升级版本时需要修改该值

/* 模组工作方式选择,只能三选一,推荐选择防误触模式 */
//#define CONFIG_MODE CONFIG_MODE_DEFAULT // 默认工作模式
//#define CONFIG_MODE CONFIG_LOW_POWER // 安全模式(低功耗配网模式)
//#define CONFIG_MODE CONFIG_MODE_SPECIAL // 防误触模式(特殊配网方式)

/* 设置低功耗配网方式和特殊配网方式的配网模式打开时间,该宏处于注释状态将按照三分钟处理 */
//#define CONFIG_MODE_DELAY_TIME 10 // 配网模式打开时间,单位:分钟

PRODUCT_KEY 平台通过这个识别产品,一种固件可以通用其他的方案。如果替换其他值,则会在用户的 App 上显示不同的配置信息。

/* TMS init function */
void MX_TTM3_Init(void)
{
  TIM MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = [0};

  htim3.Instance = TIM3;
  htim3.Init.Presealer = 84;
  htim3.Init.CounterMode = TIW_COUNTERMODE_UP;
  htim3.Init.Period = 25;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_ALTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Initd(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler() ;
  }
  sConfigOC.OCMode = TIN_OCWODE_P¥w):
  sConfigOC.Pulse = 0:
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH:
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE.
  if (HAL_TIM_PWN_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

红外功能

作者并未使用开发资料推荐的红外使用方式,反而直接板载硬件上进行开发。

  • 开发板:TIM3
  • 单片机主频:84 MHz
  • 配置目标:生成 38KHZ 的方波
#define CARRIER_38KHz() _HAL_TIM_SetCompae(&htim3,TIM_CHANNEL_1,9) //产生方波
#define NO_CARRIER() _HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,0) //无形波

static u8 AUX_OFF[13]=[0XC3, 0x97, 0xE0, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00];
static u8 AUX_OFF1[5]=[0xEE, 0x00, 0x01, 0x26, 0x00];
static u8 AUX_ON[13]=[0xC3, 0x97, 0xE0, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x05, 0x00];
static u8 AUX_ON1[5]=[0xBB, 0x10, 0x01, 0x26, 0x00];

完成后,就可以调节占空比,让其产生方波和无波形。以下为奥克斯品牌空调的解码。

由于作者是自行开发红外功能,您也可以参考 红外能力功能集成,进行低代码开发。

void Infrared_Send(u8 *s, int n,u8 cnt)
{
  u8 i, j, temp;
  CARRIER_38KHz();
  delay_us(9000);
  NO_CARRIER();
  delay_us(4500);
  
  for(i=0; i<n; i++)
  {
    for(j=0,; j<8; j++)
    {
      temp=(s(i] >>j)&0x01;
      if(temp==0) //发射0
        {
          CARRIER_38KHz();
          delay_us(560); //延时0.5ms
          NO_CARRIER();
          delay_us(560); //延时0.5ms
        }
      if(temp==1) //发射1
        {
          CARRIER_38KHz();
          delay_us(560); //延时0.5ms
          NO_CARRIER();
          delay_us(1680); //延时1.68ms
        }
      
    }
  }
  CARRIER_38KHz(); // 结束
  delay_us(900); // 延时0.56ms
  NO_CARRIER();
}

最后通过红外发射函数,就能完成空调的控制。

/********************************
函数名称:dp_download_on_handle
功能描述:针对DPID_ON的处理函数
输入参数:
   value:数据源数据
   length:数据长度
返回参数:
  SUCCESS:成功返回
  ERROR:失败返回
使用说明:可下发可上报类型,需要在处理完数据后上报处理结果至 app
*********************************/
static unsigned char dp_download_on_handle(const unsigned char value[], unsigned short lenght)
{
  // 示例:当前 DP 类型为 BOOL
  unsigned char ret;
  // 0:关;1:开
  unsigned char on;
  
  on = mcu_get_dp_download_bool(value, length);
  if(on == 0) {
    // 关
    AirConditionerOFF();
    HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_PIN, GPIO_PIN_RESET);
  }else {
    // 开
    AirConditionerON();
    HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_PIN, GPIO_PIN_SET);
  }
  
  // 处理完 DP 数据后应有反馈
  
  ret = mcu_dp_bool_update(DPID_ON, on);
  if(ret == SUCCESS)
    return SUCCESS;
  else
    return ERROR;
}

小结

涂鸦物联网开发平台为开发者提供了便捷的 IoT 开发工具与服务,助力开发者更高效的完成设备接入,并为开发者提供物联网应用开发及场景服务能力。

您正在浏览的内容为涂鸦开发者平台注册用户自主发布,版权归原作者所有,涂鸦开发者平台不拥有其著作权,亦不承担相应法律责任,涂鸦开发者平台不对该等内容作出不违反、不侵权的陈述与保证。您应知晓并了解您对于该等内容的复制、改编、转发传播等任何其他使用行为应当符合法律法规并应取得相关权利人的许可,您的该等行为所造成的全部相应后果(包括但不限于侵权、违约、受损、与第三方的纠纷等)均应由您个人承担。内容知识产权相关条款可查看涂鸦开发者平台用户协议。如果您发现有涉嫌侵权的内容,请立即通过平台上的联系方式联系平台进行举报并发送有关证据,一经查实,平台将立刻删除涉嫌侵权内容。

喜欢举报