智慧种植无人管护项目需要对环境温度、湿度、光照等数据进行采集,利用B91开发板可以逐步实现各种传感器数据的采集、运算、远端传输、决策执行。这次获得的泰凌微电子 B91物联网应用开发套件,是Telink最新一代TLSR9系列芯片的通用开发平台,该套件的核心是一块B91开发板,其上搭载了一颗TLSR9系列的旗舰型号芯片。应用领域包括无线音频设备,可穿戴设备,Apple Find My网络配件,智能医疗设备,智能遥控器,PC外设及众多其他低功耗物联网设备。
这块开发板的评测不太顺利,原因是一些坑,好在评测群里有大牛逐个破解了,终于可以在群策群力中可以让开发过程顺畅起来。归结一下主要有二:一是配来的杜邦线是有线头不通的,导致下载器插上开发板毫无反应,后来大牛发现问题后换了杜邦线解决了。高大上的开发板居然让杜邦线厂家坑了,奇葩。现在这设备条件下还能生产出断路的杜邦线也是奇了。二是下载器DBT需要升级固件才能连通,下面是实际固件升级前后的对比截图。估计这个泰林威以后提供的套件,会有很大的改进,这是评测活动,也让厂家能够收获颇丰。
我们可以看到在升固件升级之前,点击sws,显示的是连接错误。固件升级,并且重新插电启动后,就显示连接已成功。固件升级方法: 选取“Help”菜单下的“upgrade”选项;然后点击“Load”;
2) 固件位于D:\telink\BDT\config\fw目录下,可选取Firmware_v3.5.bin,提示升级完成还要拔插一下BDT,才能连接成功。
言归正传,开始开发BH7510光照传感器的数据读取。BH1750是16位数字输出型,环境光强度传感器集成电路,其测量范围在0~65535lx.
BH7510的引脚说明:
ADDR为传感器地址引脚,如前图ADDR接 低电平,器件地址则为0x23 ,改接高电平则为:0x5C 。
BH7510的读取光强数据操作方法:
初始化:模块上电 ——> 发送指令使模块进入单次测量模式 正常工作流程:发送指令使模块进入上电模式 ——> 发送测量命令 ——> 模块测量完成会会自动进入掉电模式(单次测量模式)
具体操作流程: 发送上电命令:通过指令集可以知道只是发送了0x01指令即可改为了上电状态。 发送测量命令:通常都是使用的连续H分频率模式,注意这里H/L代表着ADDR口接的电平,选择连续H分频率模式就需要接低电平如图。选择好合适的模式通过指令集就可以配置好工作方式了。等待测量结束:就是延时等待数据测量完,不同模式下需要的时间不同,可看指令集图片,建议延时稍微比标准值大些。基本使用的180ms就好。计算结果:测出的数据为2个字节,所以需要先合成一个数,在乘以分辨率在除以1.2就能得到测量的光照值。
光照强度=(寄存器值分辨率)/1.2(单位:勒克斯lx)
BH7510的的操作指令集:
连接 :
BH7510 Telink B91
SCL ------ PB2
SDA ------ PB3
USB-TTL Telink B91
RX ------ PC6
TX ------ PC7
读取数据:
i2c初始化:
- /*
- @hehung
- 2023-7-8
- email: 1398660197@qq.com
- wechat: hehung95
- reproduced and please indicate the source @hehung
- */
- #include "app_hw_i2c.h"
- #include "app_config.h"
- #define I2C_CLK_SPEED 400000 //i2c clock 400K.
- void I2c_Init(void)
- {
- // Initialize the pins for I2C
- i2c_set_pin(I2C_GPIO_SDA_PIN,I2C_GPIO_SCL_PIN);
- i2c_master_init();
- i2c_set_master_clk((unsigned char)(sys_clk.pclk*1000*1000/(4*I2C_CLK_SPEED)));
- }
BH7510.h
- #ifndef __BH1750_H_
- #define __BH1750_H_
- #include "stdint.h"
- /*外部函数区*/
- /*通过指针获取光照强度值*/
- uint16_t Get_BH1750_Value(void);
- /* //用法
- uint16_t bh1750_lux;
- bh1750_lux = Get_BH1750_Value();
- printf("current: %5d lux\r\n", bh1750_lux);
- */
- /*bh1750地址*/
- #define BH1750_ADDR_WRITE 0x46 //01000110
- #define BH1750_ADDR_READ 0x47 //01000111
- typedef enum
- {
- POWER_OFF_CMD = 0x00, //断电:无激活状态
- POWER_ON_CMD = 0x01, //通电:等待测量指令
- RESET_REGISTER = 0x07, //重置数字寄存器(在断电状态下不起作用)
- CONT_H_MODE = 0x10, //连续H分辨率模式:在11x分辨率下开始测量,测量时间120ms
- CONT_H_MODE2 = 0x11, //连续H分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms
- CONT_L_MODE = 0x13, //连续L分辨率模式:在411分辨率下开始测量,测量时间16ms
- ONCE_H_MODE = 0x20, //一次高分辨率模式:在11x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
- ONCE_H_MODE2 = 0x21, //一次高分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
- ONCE_L_MODE = 0x23 //一次低分辨率模式:在411x分辨率下开始测量,测量时间16ms,测量后自动设置为断电模式
- } BH1750_MODE;
- #endif /*__BH1750_H_*/
- #include "bh1750.h"
- #include "main.h"
- /*i2c句柄*/
- extern I2C_HandleTypeDef hi2c1;
- #define bh1750_i2c hi2c1
- /*内部函数声明区*/
- static uint8_t BH1750_Send_Cmd(BH1750_MODE cmd);
- static uint8_t BH1750_Read_Dat(uint8_t* dat);
- static uint16_t BH1750_Dat_To_Lux(uint8_t* dat);
- /**
- * @brief 向BH1750发送一条指令
- * @param cmd —— BH1750工作模式指令(在BH1750_MODE中枚举定义)
- * @retval 成功返回HAL_OK
- */
- static uint8_t BH1750_Send_Cmd(BH1750_MODE cmd)
- {
- return HAL_I2C_Master_Transmit(&bh1750_i2c, BH1750_ADDR_WRITE, (uint8_t*)&cmd, 1, 0xFFFF);
- }
- /**
- * @brief 从BH1750接收一次光强数据
- * @param dat —— 存储光照强度的地址(两个字节数组)
- * @retval 成功 —— 返回HAL_OK
- */
- static uint8_t BH1750_Read_Dat(uint8_t* dat)
- {
- return HAL_I2C_Master_Receive(&bh1750_i2c, BH1750_ADDR_READ, dat, 2, 0xFFFF);
- }
- /**
- * @brief 将BH1750的两个字节数据转换为光照强度值(0-65535)
- * @param dat —— 存储光照强度的地址(两个字节数组)
- * @retval 成功 —— 返回光照强度值
- */
- static uint16_t BH1750_Dat_To_Lux(uint8_t* dat)
- {
- uint16_t lux = 0;
- lux = dat[0];
- lux <<= 8;
- lux |= dat[1];
- lux = (int)(lux / 1.2);
- return lux;
- }
- /**
- * @brief 返回光照强度值
- * @param 无
- * @retval 成功 —— 返回光照强度值
- */
- uint16_t Get_BH1750_Value(void)
- {
- uint8_t dat[2] = {0}; //dat[0]是高字节,dat[1]是低字节
- uint16_t lux;
- if(HAL_OK != BH1750_Send_Cmd(ONCE_H_MODE))
- {
- return 0;
- }
- HAL_Delay(120);
- if(HAL_OK != BH1750_Read_Dat(dat))
- {
- return 0;
- }
- lux = BH1750_Dat_To_Lux(dat);
- return lux;
- }