硬件发烧友 · 2021年02月22日

热热热!近日为女友DIY一款红外线遥控器,在家智能降温~

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

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

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

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

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

本次 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/register?from=http%3A%2F%2Fiot.tuya.com%2F&_source=e74d60a1928993e1892f7e5efbaa5467

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

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

推荐阅读
关注数
4
文章数
7
这个硬件发烧友,不太冷。欢迎各路英雄好汉来交流~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息