新闻  |   论坛  |   博客  |   在线研讨会
热热热!近日为女友DIY一款红外线遥控器,在家智能降温
智能物联研习社 | 2021-02-22 18:05:53    阅读:9497   发布文章

近日,气温逐渐上升~仿佛提前来到了夏天的感觉!

大家都喊着:“热热热”,回家找半天遥控器,半天才打开空调,热得直跳脚!

夏天也即将来到,要是能有个智能遥控,远程打开空调,回到家即刻享受清凉一夏,美滋滋~

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

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

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

本Demo内容均为涂鸦开发者 @席梦然 提供,经其授权编辑发布。

物料清单

硬件 (4)

  • 涂鸦三明治 Wi-Fi MCU 通信板(WB3S)数量:1

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

  • 涂鸦三明治红外遥控功能板 数量:1

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

  • 涂鸦三明治直流供电电源板 数量:1

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

  • STM32F401RE 数量:1

Nulceo 系列的开发板套件。

步骤

第 1 步:搭建整体方案

整体方案

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

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

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

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


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


整体方案配置

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

串口 6 对接涂鸦 WB3S 模组。

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

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


第 2 步:创建产品并下载开发资料

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

1、登录 涂鸦 IoT 平台。

2、创建一款使用自定义方案开发的 Wi-Fi 温湿度传感器。自定义开发方案会涉及 MCU 低代码开发。


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


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

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

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


  • 第 3 步:初始化 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);
}
第 4 步:嵌入式程序开发

解压从涂鸦 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;
}

更多详情:

auth.tuya.com/?from=https%3A%2F%2Fiot.tuya.com%2F&_source=5da300e50745947aec50c44f209c5367


为女友、男友DIY一款红外线遥控器,不管是夏天、冬天,回家即刻享受适宜温度,立享智能生活!心动不如行动吧~

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


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客