发 帖  
原厂入驻New
[经验]

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

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

王栋春 2021-2-22 21:52:44
围观一下 对软件方面不太了解
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表