概述

米家温湿度传感器支持蓝牙连接,可以通过米家蓝牙网关或手机接入到米家app,实时查看温湿度,适宜度分析数据,也可以通过米家app实现设备联动
image.png

外部拆解过程

  • 打开后盖,使用T5螺丝刀拧掉顶部两颗螺丝
    调试线为后来重焊
  • 拿掉外壳,取出电路板
    image.png
    image.png
  • 电路板背面为SHTV3与电池座
  • 正面焊两颗芯片,一颗TLSR8251 F512ET24,一颗显示屏幕驱动IST3055NAO,以及相关晶振天线电路等。
  • 电路板下边用导电片连接一块屏幕,屏幕固定显示内容,//码表如下,image.png来源见水印

硬件

该产品硬件部分由TLSR8251蓝牙主控,IST3055NAO显示驱动,shtv3温湿度传感器,定制液晶屏,以及相关电路构成。通过观察电路板可以得出以下硬件框图image.png
TLSR8251通过一个I2C总线,分别连接一颗shtv3,IST3055模块。TLSR8251模块读取温湿度传感器的温湿度数据后,将数据通过蓝牙发送至上端设备同时通过i2c协议将数据写入IST3055显示驱动中进而显示数据。

TLSR8251主控

IMG_20210102_234423
该产品可在telink官网可查,参考文档Datasheet for Telink TLSR8251

简介

TLSR8251集成了功率平衡的32位MCU,BLE / 802.15.4 / 2.4GHz无线电,32kBSRAM,512kB内部闪存,带PGA的14位ADC,模拟和数字麦克风输入,立体声音频输出,6通道PWM(1通道IR / IR FIFO / IR DMA FIFO),一个正交解码器(QDEC),丰富而灵活的GPIO接口,以及IoT(Internet of物联网)和HID(人机接口设备)应用程序开发(例如低功耗蓝牙和IEEE 802.15.4)。TLSR8251还包括多级电源管理设计,可实现低功耗运行,使其成为可穿戴和低功耗的理想选择应用程序。凭借TLSR8251的高集成度,只需很少的外部组件即可满足客户的超低成本要求。

功能

该芯片支持以下功能:
BLE; BLE Mesh; 2.4GHz; Features; Package; Pin layout;
Memory; MCU; Working modes; Wakeup sources; RF
Transceiver; Clock; Timers; Interrupt; Interface; PWM;
Audio; QDEC; ADC; PGA; Temperature sensor; Low power
comparator; AES; Electrical specification
image.png
支持硬件i2C:温度传感器,液晶显示屏都是挂在这条i2c总线上的。
14位ADC:电池电量由该adc检测后显示
支持蓝牙相关协议嵌入式BLE / 802.15.4 / 2.4GHz射频收发器,在全球2.4GHz ISM频段工作
The TLSR8251 integrates one SAR ADC module, which can be used to sample analog input
signals such as battery voltage, temperature sensor, mono or stereo audio signals.
时钟,内部提供时钟源但仍焊接了一颗四脚无源晶振及起振电路
32k ram 512k flash 采用蓝牙双备份OTA升级方式所以只有256kflash能够供我们使用。
引脚图image.png

shtv3温湿度传感器

image
SHT3xA-DIS是Sensirion的下一代温度和湿度传感器。它建立在新的CMOSens®传感器芯片上Sensirion新湿度和温度的核心平台。SHT3xA-DIS增加了智能,可靠性和改进的精度规格与其前身相比。其功能包括增强的信号处理功能,两个独特之处在于用户可选择的I2C地址和通讯速度高达1 MHz。DFN封装的面积为2.5 x2.5 m^2,同时保持0.9 mm的高度。这允许用于将SHT3xA-DIS集成到各种应用。此外,宽电源电压范围2.4 V至5.5 V的电压范围保证了广泛的兼容性应用范围。
接入电源,将SDA,SCL接入总线即可使用。

IST3055NAO显示驱动

IMG_20210102_234735
该芯片应该为产品定制元件,没有找到相关参考文档,但基本作用已经明确:是一颗是液晶显示屏驱动。该芯片作为从机连接到TLSR8251的I2C总线上,从机地址为0x78。
TLSR8251将温湿度数据通过总线发送到该驱动即可驱动液晶屏显示。

定制液晶屏

液晶为定制液晶,20个引脚,可以显示温湿度,电源状态,蓝牙连接状态等信息。
屏幕固定显示内容,码表如下,image.png
电路板上有20触点的接触片,通过导电条与屏幕连接。如下图:
image.png

原理图反推

电源

该产品采用一颗3v的纽扣电池供电,直接为电路板供电即可。

时钟电路

TLSR8251由外部晶振提供24Mhz时钟源即可。根据电路板可以推理出该时钟电路采用一颗4脚晶振与两个电容组成。电路如下图

image.png

2.4GHz射频电路

根据参考设计电路可以看出该电路的大体结构。

image.png

具体电路见电路图附件。

软件

仅展示部分关键代码

主程序

完成各类初始化,开中断,随后进入main_loop程序。

#include <stdint.h>
#include "tl_common.h"
#include "drivers.h"
#include "stack/ble/ble.h"
#include "vendor/common/user_config.h"
#include "i2c.h"
extern void user_init_normal();
extern void user_init_deepRetn();
extern void main_loop (void);
_attribute_ram_code_ void irq_handler(void)
{
	irq_blt_sdk_handler();
}

_attribute_ram_code_ int main (void)    //must run in ramcode
{
	blc_pm_select_internal_32k_crystal();
	cpu_wakeup_init();
	int deepRetWakeUp = pm_is_MCU_deepRetentionWakeup();  //MCU deep retention wakeUp
	rf_drv_init(RF_MODE_BLE_1M);
	gpio_init( !deepRetWakeUp );  //analog resistance will keep available in deepSleep mode, so no need initialize again
#if (CLOCK_SYS_CLOCK_HZ == 16000000)
	clock_init(SYS_CLK_16M_Crystal);
#elif (CLOCK_SYS_CLOCK_HZ == 24000000)
	clock_init(SYS_CLK_24M_Crystal);
#endif
	blc_app_loadCustomizedParameters();
	
	init_i2c();
	if( deepRetWakeUp ){
		user_init_deepRetn ();
	}
	else{
		user_init_normal ();
	}	
    irq_enable();
	while (1) {
		main_loop ();
	}
}

显示模块

完成显示功能。读取传感器值后,分别显示温湿度等信息。

read_sensor(&temp,&humi,true);		
		temp += temp_offset;
		humi += humi_offset;	
		if(temp_C_or_F){
			show_temp_symbol(2);
			show_big_number(((((temp*10)/5)*9)+3200)/10,1);//convert C to F
		}else{
			show_temp_symbol(1);
			show_big_number(temp,1);
		}
        
		if(!show_batt_enabled)show_batt_or_humi = true;
		if(show_batt_or_humi){//Change between Humidity displaying and battery level
			show_small_number(humi,1);	
			show_battery_symbol(0);
		}else{
			show_small_number((battery_level==100)?99:battery_level,1);
			show_battery_symbol(1);
		}
·······
		
		if(comfort_smiley) {
			if(is_comfort(temp * 10, humi * 100)){
				show_smiley(1);
			} else {
				show_smiley(2);
			}
		}

		if(blinking_smiley){//If Smiley should blink do it
		last_smiley=!last_smiley;
		show_smiley(last_smiley);
		}
		update_lcd();
	}

测温模块

通过i2c总线向地址为0xE0的温湿度传感器发送读取指令,后读取总线中的数据。


const uint8_t sens_wakeup[] = {0x35,0x17};
const uint8_t sens_sleep[] = {0xB0,0x98};
const uint8_t sens_reset[] = {0x80,0x5D};
void read_sensor(int16_t *temp, uint16_t *humi){
	send_i2c(0xE0,sens_wakeup, sizeof(sens_wakeup));	
	sleep_us(240);
	uint8_t read_buff[5];
	i2c_set_id(0xE0);
	i2c_read_series(0x7CA2, 2, (uint8_t*)read_buff,  5);
	send_i2c(0xE0,sens_sleep, sizeof(sens_sleep));
	
    *temp = ((1750*(read_buff[0]<<8 | read_buff[1]))>>16)-450;
    *humi =  (100 *(read_buff[3] << 8 | read_buff[4]))>>16;
}

电源电量检测单元

初始化ADC单元,读取 ADC的值,转换为mv


_attribute_ram_code_ uint16_t get_battery_mv()
{
	uint16_t temp;
	int i,j;
	if(!adc_hw_initialized){
		adc_hw_initialized = 1;
		adc_bat_init();
	}
	adc_reset_adc_module();
	u32 t0 = clock_time();

	uint16_t adc_sample[8] = {0};
	u32 adc_result;
	for(i=0;i<8;i++){
		adc_dat_buf[i] = 0;
	}
	while(!clock_time_exceed(t0, 25));
	adc_config_misc_channel_buf((uint16_t *)adc_dat_buf, 8<<2);
	dfifo_enable_dfifo2();
	
	for(i=0;i<8;i++){
		while(!adc_dat_buf[i]);
		if(adc_dat_buf[i] & BIT(13)){
			adc_sample[i] = 0;
		}
		else{
			adc_sample[i] = ((uint16_t)adc_dat_buf[i] & 0x1FFF);
		}
		if(i){
			if(adc_sample[i] < adc_sample[i-1]){
				temp = adc_sample[i];
				adc_sample[i] = adc_sample[i-1];
				for(j=i-1;j>=0 && adc_sample[j] > temp;j--){
					adc_sample[j+1] = adc_sample[j];
				}
				adc_sample[j+1] = temp;
			}
		}
	}
	dfifo_disable_dfifo2();
	u32 adc_average = (adc_sample[2] + adc_sample[3] + adc_sample[4] + adc_sample[5])/4;
	adc_result = adc_average;
	batt_vol_mv  = (adc_result * adc_vref_cfg.adc_vref)>>10;
	
	
return batt_vol_mv;
}

固件重写与功能定制

对TLSR8251编程,增加“温度超过30°C时闪烁LED报警”功能。保持原有显示、数据上传功能不变。

开发环境搭建

硬件改造

  • 在SWS/UART_RTS/PA<7>口上,连接USB转串口,通过sws协议进行程序下载,烧写。
  • 在PD7上焊接一个红色LED灯。
    image.png

软件开发环境搭建

windows平台下需要安装git,python,已安装了的无需重复安装。

  • 命令行输入 pip install pyserial,安装pyserial 模块。

  • 下载编译器

从如下地址下载泰凌微的编译器:

http://shyboy.oss-cn-shenzhen.aliyuncs.com/readonly/tc32_win.rar

下载完成后解压出来,建议解压到 D:\TB 文件夹,下面设置环境变量的操作将以此文件夹为示例。

  • 设置环境变量
    我的电脑 点击右键 依次进入 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量,找到Path变量,点击编辑,将编译器的路径添加到环境变量里面。

以解压到D:\TB为例,win10操作页面如下图,具体操作是新建一个值,输入D:\TB\tc32_win\bin,并通过 上移按钮将其移动到最上方:

win7操作页面如下,具体操作是在变量值输入框的最前面添加D:\TB\tc32_win\bin;

注意:以上操作都是以编译器解压到D:\TB为示例,实际操作中可根据你要解压的路径做相应的更改。路径中不能带有中文。

  • 测试编译器

设置好环境变量后,在任意位置点击鼠标左键,进入 Git Bash Here,在打开的命令行中输入 tc32-elf-gcc -v,如果出现如下信息,说明编译器及环境变量设置成功。

blink程序调试

程序编写

  • 引入函数库
#include "tl_common.h"
#include "drivers.h"
#include "vendor/common/user_config.h"
#include "app_config.h"

#include "drivers/8258/gpio_8258.h"
  • 设置引脚功能
gpio_set_func(GPIO_PD7, AS_GPIO);
  • 输出使能
gpio_set_output_en(GPIO_PD7, 1);
  • 电平拉高点亮led
	gpio_write(GPIO_PD7, 1);
	sleep_ms(100);
	gpio_write(GPIO_PD7, 0);
	sleep_ms(100);

程序烧写

  • 编译程序
    使用make命令编译生成blink.bin文件,如下:
    image.png
  • 烧录程序
    使用python ATCtelink.py blink.bin命令下载程序,效果如下:
    image.png

添加高温报警功能

判断温度高于30°闪灯报警

在app.c中添加以下代码:

		if (last_temp>30)
		{
			gpio_write(GPIO_PD7, 1);
			sleep_ms(10);
			gpio_write(GPIO_PD7, 0);
		}

参考文档

  1. http://wiki.telink-semi.cn/doc/ds/DS_TLSR8251-E_Datasheet%20for%20Telink%20BLE+IEEE802.15.4%20Multi-Standard%20Wireless%20SoC%20TLSR8251.pdf
  2. https://github.com/Ai-Thinker-Open/Telink_825X_SDK
  3. https://github.com/atc1441/ATC_MiThermometer
  4. http://ww1.microchip.com/downloads/en/appnotes/01199a.pdf

附录:电路图

点击下载