本帖最后由 大明哥 于 2024-9-28 09:30 编辑
这个是用智能家居常用的场景,特别是现在用流行的技术 蓝牙 sig-mesh 去控制灯的开关 我们用迪文屏幕和蓝牙MESH相结合 屏幕作为显示控制端,用一个蓝牙模块作为client ,去发射mesh 控制开关,然后用一个蓝牙模块作为server 接收数据,分析数据,这样就可以控制灯的开关。 用手机对mesh 蓝牙的设备进行配置,配置完成后,就可以实现灯的控制
控制效果如下:
屏幕的部分代码如下:
void main(){ INIT_CPU(); //系统初始化 PORT_Init();//IO口初始化
T0_Init();//定时器0初始化 // T1_Init(); T2_Init();//定时器2初始化 // WDT_ON(); //打开开门狗 喂狗在定时器T2中 my_UART4_Init(115200); uart_init();//串口初始化
ws2812_writ_byte(8); //LED初始化 // data_save_init();//数据改变自动保存初始化 // BeiDouInit(); ChangePage(1);
while(1){ Uart_Handle_all(); OneMsHandle();//1Ms一次 TenMsHandle();
Read_0xF00();//数据自动上传 // data_change_sava();//数据改变自动保存
} }
void Led_CtrIO(void) { staticu16 ledst=0; u16readst=0; bitledbit1=0,ledbit2=0;
readst=Read_Dgus(0x2000); if(readst==ledst) return;
ledbit1=readst&0x01; ledbit2=ledst&0x01; if(ledbit1!=ledbit2) UartSendLEDst(0,ledbit1);
ledbit1=readst&0x02; ledbit2=ledst&0x02; if(ledbit1!=ledbit2) UartSendLEDst(1,ledbit1);
ledbit1=readst&0x04; ledbit2=ledst&0x04; if(ledbit1!=ledbit2) UartSendLEDst(2,ledbit1);
ledbit1=readst&0x08; ledbit2=ledst&0x08; if(ledbit1!=ledbit2) UartSendLEDst(3,ledbit1);
ledst=readst; }
SIG-mesh 部分协议如下:
/************************** LOW POWERconfig ****************************/ const struct low_power_param power_param ={ .config =TCFG_LOWPOWER_LOWPOWER_SEL, //0:sniff时芯片不进入低功耗 1:sniff时芯片进入powerdown .btosc_hz =TCFG_CLOCK_OSC_HZ, //外接晶振频率 .delay_us =TCFG_CLOCK_SYS_HZ / 1000000L, //提供给低功耗模块的延时(不需要需修改) .btosc_disable =TCFG_LOWPOWER_BTOSC_DISABLE, //进入低功耗时BTOSC是否保持 .vddiom_lev =TCFG_LOWPOWER_VDDIOM_LEVEL, //强VDDIO等级,可选:2.0V 2.2V 2.4V 2.6V 2.8V 3.0V 3.2V 3.6V .vddiow_lev =TCFG_LOWPOWER_VDDIOW_LEVEL, //弱VDDIO等级,可选:2.1V 2.4V 2.8V 3.2V .osc_type =TCFG_LOWPOWER_OSC_TYPE, .vd13_cap_en =TCFG_VD13_CAP_EN, };
/************************** KEYMSG****************************/ /*各个按键的消息设置,如果USER_CFG中设置了USE_CONFIG_KEY_SETTING为1,则会从配置文件读取对应的配置来填充改结构体*/ /* u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX]= { */ // SHORT LONG HOLD UP DOUBLE TRIPLE /* }; */
// *INDENT-OFF* /************************** UARTconfig****************************/ #if TCFG_UART0_ENABLE UART0_PLATFORM_DATA_BEGIN(uart0_data) .tx_pin = TCFG_UART0_TX_PORT, //串口打印TX引脚选择 .rx_pin = TCFG_UART0_RX_PORT, //串口打印RX引脚选择 .baudrate = TCFG_UART0_BAUDRATE, //串口波特率
.flags = UART_DEBUG, //串口用来打印需要把改参数设置为UART_DEBUG UART0_PLATFORM_DATA_END() #endif //TCFG_UART0_ENABLE
/************************** AD KEY ****************************/ #if TCFG_ADKEY_ENABLE const struct adkey_platform_data adkey_data= { .enable = TCFG_ADKEY_ENABLE, //AD按键使能 .adkey_pin = TCFG_ADKEY_PORT, //AD按键对应引脚 .ad_channel = TCFG_ADKEY_AD_CHANNEL, //AD通道值 .extern_up_en = TCFG_ADKEY_EXTERN_UP_ENABLE, //是否使用外接上拉电阻 .ad_value = { //根据电阻算出来的电压值 TCFG_ADKEY_VOLTAGE0, TCFG_ADKEY_VOLTAGE1, TCFG_ADKEY_VOLTAGE2, TCFG_ADKEY_VOLTAGE3, TCFG_ADKEY_VOLTAGE4, TCFG_ADKEY_VOLTAGE5, TCFG_ADKEY_VOLTAGE6, TCFG_ADKEY_VOLTAGE7, TCFG_ADKEY_VOLTAGE8, TCFG_ADKEY_VOLTAGE9, }, .key_value = { //AD按键各个按键的键值 TCFG_ADKEY_VALUE0, TCFG_ADKEY_VALUE1, TCFG_ADKEY_VALUE2, TCFG_ADKEY_VALUE3, TCFG_ADKEY_VALUE4, TCFG_ADKEY_VALUE5, TCFG_ADKEY_VALUE6, TCFG_ADKEY_VALUE7, TCFG_ADKEY_VALUE8, TCFG_ADKEY_VALUE9, }, }; #endif
#if TCFG_IRKEY_ENABLE const struct irkey_platform_data irkey_data= { .enable = TCFG_IRKEY_ENABLE, //IR按键使能 .port = TCFG_IRKEY_PORT, //IR按键口 }; #endif
/************************** IO KEY****************************/ #if TCFG_IOKEY_ENABLE const struct iokey_port iokey_list[] = { { .connect_way= TCFG_IOKEY_POWER_CONNECT_WAY, //IO按键的连接方式 .key_type.one_io.port= TCFG_IOKEY_POWER_ONE_PORT, //IO按键对应的引脚 .key_value= 0, //按键值 },
{ .connect_way= TCFG_IOKEY_PREV_CONNECT_WAY, .key_type.one_io.port= TCFG_IOKEY_PREV_ONE_PORT, .key_value= 1, },
{ .connect_way= TCFG_IOKEY_NEXT_CONNECT_WAY, .key_type.one_io.port= TCFG_IOKEY_NEXT_ONE_PORT, .key_value= 2, }, }; const struct iokey_platform_data iokey_data= { .enable= TCFG_IOKEY_ENABLE, //是否使能IO按键 .num= ARRAY_SIZE(iokey_list), //IO按键的个数 .port= iokey_list, //IO按键参数表 };
#if MULT_KEY_ENABLE //组合按键消息映射表 //配置注意事项:单个按键按键值需要按照顺序编号,如power:0, prev:1, next:2 //bit_value = BIT(0) | BIT(1) 指按键值为0和按键值为1的两个按键被同时按下, //remap_value = 3指当这两个按键被同时按下后重新映射的按键值; const struct key_remap iokey_remap_table[]= { {.bit_value= BIT(0) | BIT(1), .remap_value = 3}, {.bit_value= BIT(0) | BIT(2), .remap_value = 4}, {.bit_value= BIT(1) | BIT(2), .remap_value = 5}, };
const struct key_remap_dataiokey_remap_data = { .remap_num= ARRAY_SIZE(iokey_remap_table), .table= iokey_remap_table, }; #endif
#endif
/************************** PWM_LED****************************/ #if TCFG_PWMLED_ENABLE LED_PLATFORM_DATA_BEGIN(pwm_led_data) .io_mode= TCFG_PWMLED_IOMODE, //推灯模式设置:支持单个IO推两个灯和两个IO推两个灯 .io_cfg.one_io.pin= TCFG_PWMLED_PIN, //单个IO推两个灯的IO口配置 LED_PLATFORM_DATA_END() #endif
/************************** norflash****************************/ NORFLASH_DEV_PLATFORM_DATA_BEGIN(norflash_fat_dev_data) .spi_hw_num =TCFG_FLASH_DEV_SPI_HW_NUM, .spi_cs_port =TCFG_FLASH_DEV_SPI_CS_PORT, .spi_read_width = 4, #if (TCFG_FLASH_DEV_SPI_HW_NUM == 1) .spi_pdata = &spi1_p_data, #elif (TCFG_FLASH_DEV_SPI_HW_NUM == 2) .spi_pdata =&spi2_p_data, #endif .start_addr = 0, .size = 16*1024*1024, NORFLASH_DEV_PLATFORM_DATA_END()
/************************** otgdata****************************/ #if TCFG_OTG_MODE struct otg_dev_data otg_data = { .usb_dev_en = TCFG_OTG_USB_DEV_EN, .slave_online_cnt= TCFG_OTG_SLAVE_ONLINE_CNT, .slave_offline_cnt= TCFG_OTG_SLAVE_OFFLINE_CNT, .host_online_cnt= TCFG_OTG_HOST_ONLINE_CNT, .host_offline_cnt= TCFG_OTG_HOST_OFFLINE_CNT, .detect_mode= TCFG_OTG_MODE, .detect_time_interval= TCFG_OTG_DET_INTERVAL, }; #endif
|