在物联网领域,红外控制是构建智能家具控制系统的必备技术之一,例如空调、取暖器等。
遥控器是用来远程控制的机械装置,融合了现在的数字编码技术后,发展成为了可以通过红外线接收器,将接收到的红外信号转化为电信号,再经过遥控器内部的处理器解码、调出相应的指令,达成控制机顶盒等设备的远程指令操作。
本次 Demo 结合涂鸦三明治开发板和 MCU SDK,制作了一个具备温湿度检测和红外控制的智能空调的原型。
适用于涂鸦 IoT 自定义方案中,照明、台灯、灯丝灯、调光器、照明遥控器、排插、开关、家电、运动健康、传感类产品原型。
一款无线发射与接收装置,能学习中心频率为 37.9KHz 的红外信号进行解码并保存。
用于给涂鸦三明治其余相关的部件供电。
Nulceo 系列的开发板套件。
整体方案
涂鸦三明治兼容 Arduino 接口,与作者的核心板以及传感器板进行了快速对接。
为了测量更多数据,传感器方面选用温度和湿度传感器。
核心板采用 ST 的 F401RE 开发板。该开发板已经适配了温湿度的解析,作者只需要适配红外功能即可。通过串口通信,涂鸦三明治 Wi-Fi MCU 通信板(WB3S)可以直接连接到了电源板进行单独供电,再通过两根串口线与红外板相连,省去了很多对接步骤。
三明治 Wi-Fi MCU 通信板(WB3S)采用的是 WB3S 模组,该模组直接通过串口通信就能实现通信。参考下图中的 TXD 和 RXD 接口。
连接完成后,请参考下图所示:
整体方案配置
串口 2 当作调试口(Debug)。
串口 6 对接涂鸦 WB3S 模组。
红外接口为 PB4,需要产生 38KHZ 的载波才能通信,所以用上定时器 3。
两个 I2C 接口中,一个手机传感器数据,另外一个连接 OLED 屏幕,您可以选择性连接。
本小节仅简单介绍如何在涂鸦 IoT 平台创建产品并获得 PID,详细步骤请参考 选品类创建产品。
登录 涂鸦 IoT 平台。
创建一款使用自定义方案开发的 Wi-Fi 温湿度传感器。
自定义开发方案会涉及 MCU 低代码开发。
选择温湿度传感器的功能点,本文以下图所示的功能点为例进行介绍。
在 设备面板 页签中,选择一款适合产品风格的 App 面板。详细步骤请参考 配置 App 界面。
在 硬件开发 页签中,选择 自研模组 SDK 开发 的方式,并填写相关信息。
在 下载资料 区域,下载对应的 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);
}
解压从涂鸦 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)
红外功能:
作者并未使用开发资料推荐的红外使用方式,反而直接板载硬件上进行开发。
#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;
}
涂鸦物联网开发平台为开发者提供了便捷的 IoT 开发工具与服务,助力开发者更高效的完成设备接入,并为开发者提供物联网应用开发及场景服务能力。