"); //-->
近日,气温逐渐上升~仿佛提前来到了夏天的感觉!
大家都喊着:“热热热”,回家找半天遥控器,半天才打开空调,热得直跳脚!
夏天也即将来到,要是能有个智能遥控,远程打开空调,回到家即刻享受清凉一夏,美滋滋~
在物联网领域,红外控制是构建智能家具控制系统的必备技术之一,例如空调、取暖器等。
遥控器是用来远程控制的机械装置,融合了现在的数字编码技术后,发展成为了可以通过红外线接收器,将接收到的红外信号转化为电信号,再经过遥控器内部的处理器解码、调出相应的指令,达成控制机顶盒等设备的远程指令操作。
本次 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 开发工具与服务,助力开发者更高效的完成设备接入,并为开发者提供物联网应用开发及场景服务能力。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。