近日,气温逐渐上升~仿佛提前来到了夏天的感觉!
大家都喊着:“热热热”,回家找半天遥控器,半天才打开空调,热得直跳脚!
夏天也即将来到,要是能有个智能遥控,远程打开空调,回到家即刻享受清凉一夏,美滋滋~
在物联网领域,红外控制是构建智能家具控制系统的必备技术之一,例如空调、取暖器等。
遥控器是用来远程控制的机械装置,融合了现在的数字编码技术后,发展成为了可以通过红外线接收器,将接收到的红外信号转化为电信号,再经过遥控器内部的处理器解码、调出相应的指令,达成控制机顶盒等设备的远程指令操作。
本次 Demo 结合涂鸦三明治开发板和 MCU SDK,制作了一个具备温湿度检测和红外控制的智能空调的原型。
本Demo内容均为涂鸦开发者 @席梦然 提供,经其授权编辑发布。
物料清单硬件 (4)
- 涂鸦三明治 Wi-Fi MCU 通信板(WB3S)数量:1
适用于涂鸦 IoT 自定义方案中,照明、台灯、灯丝灯、调光器、照明遥控器、排插、开关、家电、运动健康、传感类产品原型。
一款无线发射与接收装置,能学习中心频率为 37.9KHz 的红外信号进行解码并保存。
用于给涂鸦三明治其余相关的部件供电。
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。
作者使用 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>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 开发工具与服务,助力开发者更高效的完成设备接入,并为开发者提供物联网应用开发及场景服务能力。
|