迪文科技论坛

 找回密码
 立即注册
搜索
查看: 158|回复: 0

【开源】蓝牙MESH 智能家居 控灯

[复制链接]

9

主题

15

回帖

896

积分

高级会员

Rank: 4

积分
896
QQ
发表于 2024-9-27 22:07:29 | 显示全部楼层 |阅读模式
本帖最后由 大明哥 于 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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-23 00:35 , Processed in 0.093132 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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