本帖最后由 lyyinhe_xi 于 2023-7-13 11:11 编辑

        智慧种植无人管护项目需要对环境温度、湿度、光照等数据进行采集,利用B91开发板可以逐步实现各种传感器数据的采集、运算、远端传输、决策执行。这次获得的泰凌微电子 B91物联网应用开发套件,是Telink最新一代TLSR9系列芯片的通用开发平台,该套件的核心是一块B91开发板,其上搭载了一颗TLSR9系列的旗舰型号芯片。应用领域包括无线音频设备,可穿戴设备,Apple Find My网络配件,智能医疗设备,智能遥控器,PC外设及众多其他低功耗物联网设备。
       360截图20230713080445948.jpg
       这块开发板的评测不太顺利,原因是一些坑,好在评测群里有大牛逐个破解了,终于可以在群策群力中可以让开发过程顺畅起来。归结一下主要有二:一是配来的杜邦线是有线头不通的,导致下载器插上开发板毫无反应,后来大牛发现问题后换了杜邦线解决了。高大上的开发板居然让杜邦线厂家坑了,奇葩。现在这设备条件下还能生产出断路的杜邦线也是奇了。二是下载器DBT需要升级固件才能连通,下面是实际固件升级前后的对比截图。估计这个泰林威以后提供的套件,会有很大的改进,这是评测活动,也让厂家能够收获颇丰。
         360软件小助手截图20230713080737.jpg
         360软件小助手截图20230713080954.jpg
       我们可以看到在升固件升级之前,点击sws,显示的是连接错误。固件升级,并且重新插电启动后,就显示连接已成功。固件升级方法: 选取“Help”菜单下的“upgrade”选项;然后点击“Load”;
2)  固件位于D:\telink\BDT\config\fw目录下,可选取Firmware_v3.5.bin,提示升级完成还要拔插一下BDT,才能连接成功。

       言归正传,开始开发BH7510光照传感器的数据读取。BH1750是16位数字输出型,环境光强度传感器集成电路,其测量范围在0~65535lx.
       360截图20230713091648728.jpg
        BH7510的引脚说明:
         360软件小助手截图20230713092635.jpg
      ADDR为传感器地址引脚,如前图ADDR接 低电平,器件地址则为0x23 ,改接高电平则为:0x5C 。
      BH7510的读取光强数据操作方法:
      初始化:模块上电 ——> 发送指令使模块进入单次测量模式      正常工作流程:发送指令使模块进入上电模式 ——> 发送测量命令 ——> 模块测量完成会会自动进入掉电模式(单次测量模式)
     具体操作流程: 发送上电命令:通过指令集可以知道只是发送了0x01指令即可改为了上电状态。 发送测量命令:通常都是使用的连续H分频率模式,注意这里H/L代表着ADDR口接的电平,选择连续H分频率模式就需要接低电平如图。选择好合适的模式通过指令集就可以配置好工作方式了。等待测量结束:就是延时等待数据测量完,不同模式下需要的时间不同,可看指令集图片,建议延时稍微比标准值大些。基本使用的180ms就好。计算结果:测出的数据为2个字节,所以需要先合成一个数,在乘以分辨率在除以1.2就能得到测量的光照值。
      光照强度=(寄存器值分辨率)/1.2(单位:勒克斯lx)
      BH7510的的操作指令集:
       360截图20230713094210894.jpg
        连接 :   
        BH7510      Telink B91
          SCL   ------   PB2
         SDA   ------   PB3
        USB-TTL    Telink B91
         RX   ------   PC6
         TX   ------   PC7

         读取数据:
         i2c初始化:
  1. /*
  2. @hehung
  3. 2023-7-8
  4. email: 1398660197@qq.com
  5. wechat: hehung95
  6. reproduced and please indicate the source @hehung
  7. */
  8. #include "app_hw_i2c.h"
  9. #include "app_config.h"
  10. #define     I2C_CLK_SPEED               400000 //i2c clock 400K.
  11. void I2c_Init(void)
  12. {
  13.     // Initialize the pins for I2C
  14.     i2c_set_pin(I2C_GPIO_SDA_PIN,I2C_GPIO_SCL_PIN);
  15.     i2c_master_init();
  16.     i2c_set_master_clk((unsigned char)(sys_clk.pclk*1000*1000/(4*I2C_CLK_SPEED)));
  17. }

         BH7510.h
  1. #ifndef __BH1750_H_
  2. #define __BH1750_H_
  3. #include "stdint.h"
  4. /*外部函数区*/
  5. /*通过指针获取光照强度值*/
  6. uint16_t Get_BH1750_Value(void);
  7. /*        //用法
  8.         uint16_t bh1750_lux;
  9.         bh1750_lux = Get_BH1750_Value();
  10.         printf("current: %5d lux\r\n", bh1750_lux);
  11. */
  12. /*bh1750地址*/
  13. #define        BH1750_ADDR_WRITE        0x46        //01000110
  14. #define        BH1750_ADDR_READ        0x47        //01000111
  15. typedef enum
  16. {
  17.         POWER_OFF_CMD        =        0x00,        //断电:无激活状态
  18.         POWER_ON_CMD        =        0x01,        //通电:等待测量指令
  19.         RESET_REGISTER        =        0x07,        //重置数字寄存器(在断电状态下不起作用)
  20.         CONT_H_MODE                =        0x10,        //连续H分辨率模式:在11x分辨率下开始测量,测量时间120ms
  21.         CONT_H_MODE2        =        0x11,        //连续H分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms
  22.         CONT_L_MODE                =        0x13,        //连续L分辨率模式:在411分辨率下开始测量,测量时间16ms
  23.         ONCE_H_MODE                =        0x20,        //一次高分辨率模式:在11x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
  24.         ONCE_H_MODE2        =        0x21,        //一次高分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
  25.         ONCE_L_MODE                =        0x23        //一次低分辨率模式:在411x分辨率下开始测量,测量时间16ms,测量后自动设置为断电模式
  26. } BH1750_MODE;
  27. #endif /*__BH1750_H_*/
        bh7510.c
  1. #include "bh1750.h"
  2. #include "main.h"
  3. /*i2c句柄*/
  4. extern I2C_HandleTypeDef hi2c1;
  5. #define bh1750_i2c hi2c1
  6. /*内部函数声明区*/
  7. static uint8_t        BH1750_Send_Cmd(BH1750_MODE cmd);
  8. static uint8_t BH1750_Read_Dat(uint8_t* dat);
  9. static uint16_t BH1750_Dat_To_Lux(uint8_t* dat);
  10. /**
  11. * @brief        向BH1750发送一条指令
  12. * @param        cmd —— BH1750工作模式指令(在BH1750_MODE中枚举定义)
  13. * @retval        成功返回HAL_OK
  14. */
  15. static uint8_t        BH1750_Send_Cmd(BH1750_MODE cmd)
  16. {
  17.         return HAL_I2C_Master_Transmit(&bh1750_i2c, BH1750_ADDR_WRITE, (uint8_t*)&cmd, 1, 0xFFFF);
  18. }
  19. /**
  20. * @brief        从BH1750接收一次光强数据
  21. * @param        dat —— 存储光照强度的地址(两个字节数组)
  22. * @retval        成功 —— 返回HAL_OK
  23. */
  24. static uint8_t BH1750_Read_Dat(uint8_t* dat)
  25. {
  26.         return HAL_I2C_Master_Receive(&bh1750_i2c, BH1750_ADDR_READ, dat, 2, 0xFFFF);
  27. }
  28. /**
  29. * @brief        将BH1750的两个字节数据转换为光照强度值(0-65535)
  30. * @param        dat  —— 存储光照强度的地址(两个字节数组)
  31. * @retval        成功 —— 返回光照强度值
  32. */
  33. static uint16_t BH1750_Dat_To_Lux(uint8_t* dat)
  34. {
  35.         uint16_t lux = 0;
  36.         lux = dat[0];
  37.         lux <<= 8;
  38.         lux |= dat[1];
  39.         lux = (int)(lux / 1.2);
  40.         return lux;
  41. }
  42. /**
  43. * @brief        返回光照强度值
  44. * @param        无
  45. * @retval        成功 —— 返回光照强度值
  46. */
  47. uint16_t Get_BH1750_Value(void)
  48. {
  49.         uint8_t dat[2] = {0};                //dat[0]是高字节,dat[1]是低字节
  50.         uint16_t lux;
  51.         if(HAL_OK != BH1750_Send_Cmd(ONCE_H_MODE))
  52.         {
  53.                 return 0;
  54.         }
  55.         HAL_Delay(120);
  56.         if(HAL_OK != BH1750_Read_Dat(dat))
  57.         {
  58.                 return 0;
  59.         }
  60.         lux = BH1750_Dat_To_Lux(dat);
  61.         return lux;
  62. }