无线电子温度仪 - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

专业版 无线电子温度仪

简介:目的:解决儿童生病时不愿意配合量体温,以及腋下量体温时,不能实时了解发烧情况。 功能:1-精度0.1度;2-可液晶显示;3-支持蓝牙双模传输;4-可运行12h以上;5-可DIY报警功能。

开源协议: CERN Open Hardware License

(未经作者授权,禁止转载)

已参加:“暖冬造物迎新年”征集令

创建时间: 2023-12-28 16:50:05
更新时间: 2024-04-01 11:09:48
描述

Idea

缘起孩子生病时,总是不愿意去量体温。传统的水银温度计测量温度慢,孩子总是问好了没?好了没?好了没?等的着急了就把温度计拿出来了,功亏一篑,我更是崩溃!!!市面上的耳温计、额温计,买了之后发现测量精度,实在偏差太大,还不如水银温度计。所以就想有一个便宜好用、测量温度精准、速度快的温度计。一直没有找到,因此我决定自己做一款,也让广大的家长的更快更准的知道孩子的温度情况。

你的温度,我来守护,这是我的初心。

项目目的

解决儿童生病时不愿意配合量体温,以及腋下量体温时,不能实时了解发烧情况。

产品功能

1-精度高,小于0.1度;

2-带有显示屏,方便老人不会用手机的使用;

3-最重要的是支持蓝牙传输,支持BLE和SPP,既可以连接手机,也可以连接电脑;

4-运行时间长,可以连续使用12个小时以上。

5-使用便捷,不需要时时拿出来看温度,直接手机或电脑接收数据,可以DIY设置报警功能等,方便看护儿童时,不知道什么时候又温度升高了,都不敢打个盹。

 

历经多次迭代如下:

做个产品真的好累啊,各种坑,熬夜都爬不出来啊。

 

 

 

产品设计及验证

分为四个部分进行介绍。这中间踩坑无数啊,做好一款产品真的不容易啊。

硬件设计

系统框图

电源部分

通过Type-C给产品充电,充放电芯片采用TP4057,该芯片便宜,支持升压确保系统供电稳定。

系统采用3.3V供电,因此采用LDO进行电压转换。

锂电池,采用200ma容量,规格如下

连接方式采用焊接方式,预留的2.54排针,方便调试哦。

Type-C为了节约成本,选择了6PIN的,其实microUSB更便宜,第二版中已经进行替换了。

主控部分

系统主控采用stm32f030c8t6,以下是该芯片的介绍,我选择的原因就是合适:1-功耗低,M0内核;2-便宜,降低成本;3-外设丰富,足够使用了。欢迎大家推荐更合适的主控哦。

STM32F030x4/x6/x8/xC 系列微控制器集成了以 48 MHz 频率运行的高性能 Arm ® Cortex ® -M0 32 位 RISC 内核、高速嵌入式存储器(高达 256 KB 的闪存和高达 32 KB 的 SRAM)以及广泛的增强型外设和 I/O。所有器件均提供标准通信接口(最多 2 个 I2C、最多 2 个 SPI 和 6 个 USART)、1 个 12 位 ADC、7 个通用 16 位定时器和 1 个高级控制 PWM 定时器。STM32F030x4/x6/x8/xC 系列微控制器工作在-40至+85°C温度范围,电源电压为2.4V至3.6V。一整套省电模式允许设计低功耗应用。STM32F030x4/x6/x8/xC 系列微控制器包括四种不同封装的器件,从 20 引脚到 64 引脚不等。根据所选的设备,包括不同的外围设备集。这些特性使STM32F030x4/x6/x8/xC 系列微控制器适用于广泛的应用,如应用控制和用户界面、手持设备、A/V接收器和数字电视、PC外设、游戏和GPS平台、工业应用、PLC、逆变器、打印机、扫描仪、报警系统、可视对讲机和AC。

该主控实现以下个功能:

1-ADC采集,也就是检测锂电池电量;

2-串口通信,控制蓝牙芯片,进行数据发送;

3-IIC通信,控制温度传感器,配置以及初始化,最重要的是读取温度;

4-IIC通信,显示电量、蓝牙连接状、实时温度、测量时长等。

5-其它可扩展功能

蓝牙部分

采用KT6368A,该芯片支持双模,具体规格如下,为了降低功耗建议使用KT6328A,但是只支持BLE哦。

相关原理图如下所示:

显示部分

自己采用了0.91寸的OLED模块,只有4个管脚,如下所示,

立创采购很便宜,是白光的,我试了蓝光的也挺好的,这个看个人喜好了,我在淘宝买的。

温度传感器

为了验证效果,我选择了2种哦,具体大家可以自己去立创看手册。

这是我能找到的精度高且便宜的,最具性价比的也就这两颗了,大家放心在立创商城采购吧

焊接比较麻烦哦,大家要选择好点的电烙铁,比如立创的黄花牌电烙铁,立创商城记得给我广告费哦。

T117

超低温至-103℃测温!测温精度±0.1℃@+28~+43℃,I2C/单总线数字输出,分辨率16位/0.004℃,测温最快2.2ms可配置,支持4路I2C通信地址;超低功耗2μA@1HZ,1.8V~5.5V宽电压供电,2*2*0.75mm小尺寸,DFN6L封装,内置112bit EEPROM用户空间。广泛应用于智能穿戴、体温计、动物体温检测、医疗电子、热表气表水表等行业。

MTS4

I2C协议数字输出,可同时兼容数字单总线,测温精度±0.1℃@+28℃~+43℃,16位输出0.004℃,测温速度15.3ms/8.5ms/5.2ms/2.2ms可配置,超低功耗3.1μA(AVG=16,1次测量/s),1.6x1.2x0.55mm超小尺寸,DFN4L封装,内置112bit EEPROM用户空间,广泛应用于表贴小尺寸的智能穿戴、电子体温计、动物体温检测、医疗电子、冷链物流、热表气表水表等。

对应原理图

PCB设计

 

整体采用了4层板设计,板厚1.6mm,主要考虑传感器职称部分,只有几个mm宽,实际确实有点软了,后续考虑做宽和加厚,但是收费贵很多哦。为了免费,长度也在10cm以内。

这里的装配孔是m3,个人感觉大了,其实m2感觉就可以。

 

外壳设计

3D设计方面我是个新手,所以设计的比较简单,也是在一步步犯错中成长,一共做两版,第二版还没有回来。

设计软件采用立创的EDA哦,确实好用,现在教程也慢慢多了起来,这里非常感谢他们的技术支持,非常给力哦,反馈非常及时,这个叶总很认真,立创记得给加奖金哦,至少加个鸡腿哦。我感觉立创会发展的越来越好,大家记得买他们的股票,估计会大涨。

外壳设计非常简单,就是各种尺寸需要自己算好哦,立创的3D模型可能不准哦。

比如我这个开关,我设计的居中,实际上有误差:如下图所示,拨动的太靠上了哦。

不管如何,成品还是非常满意的,大家多使用多摸索吧。现在有券,给我们试错的机会。

做了几个如下,真的有了外壳,产品的档次很大的提升了。

面板设计

这个也是采用立创EDA设计的,为了省钱啊。这个没有3D设计好用,很多位置需要计算,这里有个技巧,可以先导出PCB的DXF,这里定位就方便很多了。

走了不少弯路,做了两次,一次是亚克力,一次是PET模的,真的太好看了,做了很多颜色,可以随便换壳子和面板了哦。

设计如下:

 

 

 

 

实物如下所示

两个版本区如下:

1-材质不同,第一版亚克力,第二版PET

2-第二版有背胶

3-第一版带安装孔,可以独立装配无需外壳

4-大小不同,第二版外扩1mm。

两个版本各有各的好处,我都试了一下。感觉都不错。

程序设计

开发工具和环境

采用CubeMX与Keil5结合的方式,使用C语言进行开发。

设计思路

1-电量采样,通过timer+DMA+DAC进行数据采集,timer定时2S,为啥2秒,降低功耗。之前1s感觉刷新有点快。

2-检测蓝牙是否连接,读取PA1管脚状态,若连接显示器显示OK,否则是NO。

3-每两秒读取一次温度,根据状态寄存器进行判别是否温度转换完成。

4-OLED显示2更新一次。

效果下图数所示:

蓝牙驱动

关于KT6368A的驱动实现,可以去梁山派的模块移植手册查看详情,具体实现我这里就不再赘述。如下链接

模块移植手册-第一部

OLED驱动

这个0.91寸显示屏,网上有很多移植好的,这里也不再赘述,可以去梁山派的模块移植手册查看详情,如下链接:

模块移植手册-第一部

温度传感器驱动

由于手感焊接目前只焊接成功了T117芯片,这里给大家展示一下这个驱动的编写,如下所示。

这里是头文件

C++

#ifndef __SENSER_H
#define __SENSER_H

#include "stm32f0xx_hal.h"

typedef enum
{
//Temp_Cmd
//测温模式
CONTI_CONVERT = 0x00, //连续测量温度
STOP_CONVERT = 0x40, //停止测量温度
SINGLE_CONVERT = 0xc0, //单次测量温度
//加热模式
OFF_HEATING = 0xf0, //低位清0,加热关闭
ON_HEATING = 0x0A, //加热开启

//Temp_Cfg
//测温频率
FRE_8times = 0x00, //每秒8次
FRE_4times = 0x20, //每秒4次
FRE_2times = 0x40, //每秒2次
FRE_1times = 0x60, //每秒1次

FRE_2s = 0x80, //每2秒1次
FRE_4s = 0xa0, //每4秒1次
FRE_8s = 0xc0, //每8秒1次
FRE_16s = 0xe0, //每16秒1次
//平均次数
AVG_1 = 0xe7, //位清0,转换时间2.1ms
AVG_8 = 0x08, //转换时间5.2ms
AVG_16 = 0x10, //转换时间8.5ms
AVG_32 = 0x18, //转换时间15.3ms
//低功耗模式
OFF_PD = 0xfe, //位清0,不进入低功耗模式
ON_PD = 0x01, //进入低功耗模式

//EE_Cmd
EE_DOWN = 0xb6, //装载EE值到寄存器
EE_COPY = 0x08, //将寄存器中数值保存到EE中
EE_RESET = 0x6a, //软复位,装载EE值到寄存器,与EE对应的部分,寄存器值恢复到EE保存值,不与EE对应的部分,寄存器值恢复到默认值

//Alert_Mode
//报警开关
OFF_ALERT = 0x00, //清0,报警关
ON_ALERT = 0x80, //报警开
//Mode
TL_CLEAR = 0xbf, //位清0,TL为报警清除门限阈值
TL_ALERT = 0x40, //TL为报警门限下阈值
//极性
ALERT_LO = 0xdf, //位清0,低电平有效
ALERT_HI = 0x20, //高电平有效
//报警端口模式选择
ALERT_IO = 0xef, //位清0,用作温度报警
CONVERT_FINI = 0x10, //用作测温完成标志
} I2C_CMD;


typedef enum
{
Temp_lsb = 0x00, //
Temp_msb = 0x01, //
Crc_temp = 0x02, //
Status = 0x03, //
Temp_Cmd = 0x04, //默认值0x40:停止测量,不加热
Temp_Cfg = 0x05, //默认值0x69:每秒1次,AVG_8,进入低功耗
Alert_Mode = 0x06, //默认值0x00:报警关,报警模式为TL解除报警,报警低电平有效,标志位表示温度报警
Th_lsb = 0x07,
Th_msb = 0x08,
Tl_lsb = 0x09,
Tl_msb = 0x0A,
Crc_scratch = 0x0B,
EE_Cmd = 0x17, //默认值0x00:无操作
Romcode1 = 0x18,
Romcode2 = 0x19,
Romcode3 = 0x1A,
Romcode4 = 0x1B,
Romcode5 = 0x1C,
Romcode6 = 0x1D,
Romcode7 = 0x1E,
crc_romcode = 0x1F,
} REG;

void T117_Init(void);
uint8_t T117_ID(void);//获取ID
uint8_t T117_R_REG(uint8_t REG,uint8_t *DAT);//读寄存器
uint8_t T117_W_REG(uint8_t REG,uint8_t DAT);//写寄存器
uint8_t T117_R_TEMP(float *DAT); //读温度
#endif

这里是C文件

C++

#include "SENSOR.h"
#include "myiic.h"

#define T117_WADD 0x80
#define T117_RADD 0x81

//测温指令寄存器(Temp_Cmd),地址 0x04
//#define Temp_Cmd 0x04

//配置寄存器(Temp_Cfg),地址 0x05
//#define Temp_Cfg 0x05

//状态寄存器(Status),地址 0x03
//#define Status 0x03
/*
位 内容描述 默认数值
7 温度高线报警跟踪 0:温度报警未触发 1:温度报警触发 ‘0’
6 温度低线报警跟踪 0:温度报警未触发 1:温度报警触发 ‘0’
5 温度转换状态 0:温度转换完成 1:温度转换过程中 ‘0’
4 E2PROM 状态 0:未处于读写状态 1:处于读写状态 ‘0’
3 加热状态 0:未处于加热状态 1:处于加热状态 ‘0’
2 温度报警错误提示 0:TH 大于 TL 1:TH 小于等于 TL ‘0’
1:0 预留 ‘00’
*/

//报警模式寄存器(Alert_Mode),地址 0x06
//#define Alert_Mode 0x06

/*
位 内容描述 默认数值
7 报警功能开关(Alert_en)
0:关闭
1:开启 ‘0’
6 报警模式(IM)选择
0:高于 TH 报警+低于 TL 解除报警
1:高于 TH 报警+低于 TL 报警 ‘0’
5 报警极性(POL)选择
0:低有效
1:高有效 ‘0’
4 报警端口输出模式(FUNC)选择
0:输出温度报警标志位
1:输出测温完成标志位 ‘0’
3:0 预留 ‘0000’

*/


void T117_Init(void)
{

T117_W_REG(Temp_Cmd,0x00);//连续测温不加热

T117_W_REG(Temp_Cfg,0x99);//每秒0.5次,32次平均,进入低功耗

T117_W_REG(Alert_Mode,0x10);//不报警,输出测温完成标志位
}


uint8_t T117_ID(void) //获取ID
{
uint8_t temp=0;
IIC2_Start();
IIC2_Send_Byte(T117_WADD);
temp=IIC2_Wait_Ack();
if(temp) {IIC2_Stop();return 1;}
IIC2_Send_Byte(0x19);
temp=IIC2_Wait_Ack();
if(temp) {IIC2_Stop();return 2;}

IIC2_ReStart();
IIC2_Send_Byte(T117_RADD);
temp=IIC2_Wait_Ack();
if(temp) {IIC2_Stop();return 3;}
temp=IIC2_Read_Byte();
IIC2_NAck();
IIC2_Stop();
return temp;
}

uint8_t T117_R_REG(uint8_t REG,uint8_t *DAT) //读寄存器
{
uint8_t temp=0;
IIC2_Start();
IIC2_Send_Byte(T117_WADD);
temp=IIC2_Wait_Ack();
if(temp) {IIC2_Stop();return 1;}
IIC2_Send_Byte(REG);
temp=IIC2_Wait_Ack();
if(temp) {IIC2_Stop();return 2;}

IIC2_ReStart();
IIC2_Send_Byte(T117_RADD);
temp=IIC2_Wait_Ack();
if(temp) {IIC2_Stop();return 3;}
*DAT=IIC2_Read_Byte();
IIC2_NAck();
IIC2_Stop();
return 0;
}

uint8_t T117_W_REG(uint8_t REG,uint8_t DAT) //写寄存器
{
uint8_t temp=0;
IIC2_Start();
IIC2_Send_Byte(T117_WADD);
temp=IIC2_Wait_Ack();
if(temp) {IIC2_Stop();return 1;}

IIC2_Send_Byte(REG);
temp=IIC2_Wait_Ack();
if(temp) {IIC2_Stop();return 2;}

IIC2_Send_Byte(DAT);
temp=IIC2_Wait_Ack();
if(temp) {IIC2_Stop();return 3;}
IIC2_Stop();
return 0;

}

uint8_t T117_R_TEMP(float *DAT) //读寄存器
{
uint16_t rx=0;
uint8_t data=0;

if(T117_R_REG(0x01,&data)) return 1;
//rx = data<<8;
rx = data;
rx <<=8;
if(T117_R_REG(0x00,&data)) return 2;
rx += data;
*DAT=(int16_t)rx;
*DAT=25.0+(*DAT)/256.0;
return 0;

}





其它串口IIC驱动

这个是老生常谈,串口使用的是USART2,支持printf,IIC采用IO模拟方式,这样不受IO位置控制了。具体啰嗦的代码就不这里贴了,节省空间哦。

main函数实现

这里是整个实现方式,对应前面的设计思路,这里包含一些中断和回调函数的实现

C++
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include "bsp_KT6368A.h"
#include "myiic.h"
#include "SENSOR.h"
#include "usart.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define VOT 3.287
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint16_t adc_value[4]={0};
uint8_t Flag=0;
float temp=0,x,y,z;
uint32_t second=0;
uint8_t hh,mm,ss;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t DAT;
uint16_t len;
uint8_t i=0;
/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC_Init();
MX_TIM1_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */

T117_Init();
OLED_Init();

HAL_Delay(2000);

//Set_SppName();HAL_Delay(1000);
//Set_BLEName();HAL_Delay(1000);
//Set_Power();
HAL_ADC_Start_DMA(&hadc,(uint32_t *)(&(adc_value[0])),4);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);





/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
char s[20];
if(Flag)
{
Flag=0;
x=adc_value[0]/4095.0*VOT*2;
if(x>=4.2)
{sprintf(s,"99%%");}else if(x>=4.06)
{sprintf(s,"90%%");}else if(x>=3.98)
{sprintf(s,"80%%");}else if(x>=3.92)
{sprintf(s,"70%%");}else if(x>=3.87)
{sprintf(s,"60%%");}else if(x>=3.82)
{sprintf(s,"50%%");}else if(x>=3.79)
{sprintf(s,"40%%");}else if(x>=3.77)
{sprintf(s,"30%%");}else if(x>=3.74)
{sprintf(s,"20%%");}else if(x>=3.68)
{sprintf(s,"10%%");}else if(x>=3.45)
{sprintf(s," 5%%");}else if(x>=3.33)
{sprintf(s," 1%%");}else{sprintf(s," 0%%");}

OLED_ShowString(0,0,s,8,1);//6*8

hh=second/3600;
mm=(second%3600)/60;
ss=second%60;

sprintf(s,"%02d:%02d:%02d",hh,mm,ss);
OLED_ShowString(0,24,s,8,1);//6*8

// temp=adc_value[2]/4095.0*VOT;
// y=25+(1.43-temp)/0.0043;
// sprintf(s,"%6.3f",y);
// OLED_ShowString(0,18,s,12,1);//6*8
}
if(T117_R_REG(0x03,&DAT)==0)
{
if((DAT&0x20)==0)
{
// DAT=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4);
// printf("A4:%d\r\n",DAT);
// if(!(T117_R_REG(0x00,&DAT))){printf("LSB:%x\r\n",DAT);}
// if(!(T117_R_REG(0x01,&DAT))){printf("MSB:%x\r\n",DAT);}
DAT=T117_R_TEMP(&z);
sprintf(s,"%5.2fC",z);
OLED_ShowString(0,7,s,16,1);

}
}

if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
HAL_UART_Transmit(&huart2,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据
while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //等待发送结束
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
printf("\r\nLEN:%d\r\n",len);
}
if(DAT==0){printf("T=%5.2fC\r\n",z);}
sprintf(s,"BT:OK");
OLED_ShowString(18,0,s,8,1);//6*8
printf("V=%6.3fV\r\n",x);
printf("%02d:%02d:%02d\r\n",hh,mm,ss);


}else{
sprintf(s,"BT:NO");
OLED_ShowString(18,0,s,8,1);//6*8
}

OLED_ShowChinese(48,0,0,16,1);
OLED_ShowChinese(64,0,1,16,1);
OLED_ShowChinese(80,0,2,16,1);
OLED_ShowChinese(96,0,3,16,1);
OLED_ShowChinese(112,0,4,16,1);
//
OLED_ShowChinese(48,16,5,16,1);
OLED_ShowChinese(64,16,6,16,1);
OLED_ShowChinese(80,16,7,16,1);
OLED_ShowChinese(96,16,8,16,1);
OLED_ShowChinese(112,16,9,16,1);

OLED_Refresh();
HAL_Delay(2000);
}
/* USER CODE END 3 */
}

/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}

/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}

/* USER CODE BEGIN 4 */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
//HAL_ADC_Stop(&hadc1);
//HAL_ADC_Stop_DMA(&hadc1);
//HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
Flag=1;
second += 2;
HAL_ADC_Start_DMA(hadc,(uint32_t *)(&(adc_value[0])),4);

}

/* USER CODE END 4 */

/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}

#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

效果验证

具体视频可以看B站链接哦

【立创暖冬造物征集令】-无线电子温度仪-整体展示及温度显示

https://www.bilibili.com/video/BV1Xk4y1U7pM/?spm_id_from=333.1365.list.card_archive.click&vd_source=e36622a05269c0356d6cd566056a2488

 

【立创暖冬造物征集令】-无线电子温度仪-蓝牙传输展示

https://www.bilibili.com/video/BV125411y7jC/?spm_id_from=333.1365.list.card_archive.click&vd_source=e36622a05269c0356d6cd566056a2488

 

补充

第二版正在进行中,希望立创商城在支持点券吧。

第二版做了无屏幕的,这样降低功耗,整体厚度降低了,也就更好看了。

PCB、面板、外壳都做了第二版,耗费巨资啊,全力支持这个活动哦。

插播的立创广告,可否换点券啊啥的呢?

 

关于APP

能力有限,目前还不会开发APP,后续慢慢摸索。

大家可以采用电脑蓝牙串口接收,也可以使用手机BLE调试工具哦。

 

关于手机端APP如下载

我的红米,打开应用商店,搜e调试,这是我试了好多,才觉得这个最好用。大家不要下载错误。
这是电脑下载链接:
附件是我自己下载的安装文件,大家谨慎使用,若有问题概不负责,尤其钱财、诈骗等。强烈建议大家从安全的应用商店下载。实在找不到,可以再考虑下面这个。

 

 

设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
工程成员
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP