标题:
STM32 TMP101无线测温传感器低功耗+RF源程序
[打印本页]
作者:
路世英
时间:
2019-8-6 16:58
标题:
STM32 TMP101无线测温传感器低功耗+RF源程序
分享一个无线测温传感器的设计资料,原理图+代码,经测试可以用。
0.png
(10.23 KB, 下载次数: 49)
下载附件
2019-8-8 02:14 上传
单片机源程序如下:
/*
******************************************************************************
* File Name : main.c
* Description : Main program body
*/
#include "stm32l0xx_hal.h"
#include "rtc.h"
#include "rcc.h"
#include "communication.h"
#include "LowPower.h"
#include "sensor.h"
#define SLEEP_MODE 0 //为0时是低功耗模式,为非零时我延时模式
void _Error_Handler(char * file, int line);
int main(void)
{
int timer = 0;
HAL_Init();
SystemClock_Config();
WirelessInit();//配置通信
RTC_Config();
HAL_Delay(100);
SensorCheck(); //识别硬件版本
SensorInit(); //初始化各个设备
while(1)
{
SystemClock_Config(); //系统时钟配置,回复后重新配置
SensorUpload(); //传感器数据处理
WirelessTaskLowPower(); //nrf数据发送处理
if(WirelessTxIsNotEmpyt()) //如果nrf还要要发送的数据
{
SleepTime(10,SLEEP_MODE);//延时方式
SensorTimerDec(9); //传感器内部计时器减10s
}
else
{
SleepTime(SensorTimerGet(),SLEEP_MODE); //等待延时
SensorTimerSet(-1); //延时完成一个周器,触发一次测量
}
}
}
/* USER CODE BEGIN 4 */
/**
* @brief RTC Wake Up callback
* @param None
* @retval None
* RTC唤醒中断的处理函数中断的处理内容可以在此处执行
*/
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
/* Clear Wake Up Flag */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @param None
* @retval None
*/
void _Error_Handler(char * file, int line)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
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
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码
#include "SI7021.h"
#include "Battery.h"
#include "temperature.h"
#include "fifo.h"
#include "led.h"
#include "sensor.h"
#define HARD_NUM 4
#define SENSOR_NUM 3 //定义传感器的数量
#define SENSOR_BUF_NUM 7
enum {
BATTERY,
TEMP101,
SI1702,
};
static int sensorState[SENSOR_NUM] ={0,0,0}; //用来表示对应的传感器是否在线,如果不在线为0,用来识别硬件
static uint8_t sensorBuf[SENSOR_BUF_NUM]; //传感器数据缓存的buf
//检测设备已获取硬件版本
//适用硬件版本如下:OVE350S取电,OVE350S,OVE350S-C,OVE350S-B,和硬件故障
static enum{
OVE350S_A = 0,
OVE350S_B,
OVE350S_C,
OVE350S_AA,
HARD_ERROR,
}hardVersion;
static int sampleCycle[HARD_NUM] ={20,20,20,20}; //定义每个硬件产品的循环周期
static int sampleCountMax[HARD_NUM] = {6,6,6,6}; //定义最迟几个采样周期,发送一次数据,为了防止数据不变的时候一致不发送,定一个最低的周期
static int timer=0; //需要外部一个以s为单位的,石基单元驱动
static int sampleCount = 0;
//计时器为递减模式
int SensorTimerGet(void)
{
return timer;
}
void SensorTimerSet(int inc)
{
timer = inc;
}
void SensorTimerDec(int dec)
{
timer = timer - dec;
}
//检查硬件已获得硬件版本号
//#define SET_DEV OVE350S_C //如果指定硬件版本
void SensorCheck(void)
{
#ifdef SET_DEV
hardVersion = SET_DEV; //硬件版本为指定
#else //否则,自动检测
sensorState[0] = 0;
sensorState[1] = 0;
sensorState[2] = 0;
sensorState[TEMP101] = TempCheck(0);
sensorState[SI1702] = SI70XX_Check(0);
sensorState[BATTERY] = BatteryCheck();
if((sensorState[BATTERY]!=0)&&(sensorState[TEMP101]!=0)&&(sensorState[SI1702]==0))
{
hardVersion = OVE350S_B;
}
else if((sensorState[BATTERY]!=0)&&(sensorState[SI1702]!=0)&&(sensorState[TEMP101]==0))
{
hardVersion = OVE350S_C;
}
else if((sensorState[BATTERY]==0)&&(sensorState[TEMP101]!=0)&&(sensorState[SI1702]==0))
{
hardVersion = OVE350S_A;
}
else
{
hardVersion = HARD_ERROR;
}
#endif
}
void SensorInit(void)
{
switch(hardVersion)
{
case OVE350S_A: //通用版硬件取电模式
{
TempInit(0);
break;
}
case OVE350S_B: //通用版硬件电池模式
{
BatteryMeasereInit();
TempInit(0);
break;
}
case OVE350S_C: //通用版硬件,温湿度模式
{
BatteryMeasereInit();
SI70XX_Init(0);
break;
}
case HARD_ERROR: //都不是,上报硬件错误,led等常亮
{
while(1)
{
LedOn();
}
break;
}
case OVE350S_AA:
{
while(1)
{
LedOn();
}
break;
}
default:
{
while(1)
{
LedOn();
HAL_Delay(300);
LedOff();
HAL_Delay(300);
}
break;
}
}
}
//获取温度,湿度,和电压值,每个数据缓存在两个字节的空间中
//第0-1字节:温度
//第2-3字节:湿度
//第4-5字节:电压
//第6字节: 空闲
int SensorGet(void)
{
int ret = 0;
switch(hardVersion)
{
case OVE350S_A:
{
SensorTimerSet(sampleCycle[OVE350S_A]); //填入采用周期
if(TempGetLowPower(&sensorBuf[0]))
{
ret = 1;
}
*(uint16_t *)&sensorBuf[2] = 0;//湿度为零
*(uint16_t *)&sensorBuf[4] = 0;//电压为零
sensorBuf[6] =0 ;//空闲位为零
break;
}
case OVE350S_B:
{
SensorTimerSet(sampleCycle[OVE350S_B]);
if(TempGetLowPower(&sensorBuf[0]))
{
ret = 1;
}
*(uint16_t *)&sensorBuf[2] = 0;//湿度为零
if(BatteryGetLowPower(&sensorBuf[4]))
{
ret = 1;
}
sensorBuf[6] =0 ;//空闲位为零
break;
}
case OVE350S_C:
{
SensorTimerSet(sampleCycle[OVE350S_C]);
if(TempAndHumiGetLowPower(&sensorBuf[0]))//温度湿度一起处理,4个字节
{
ret = 1;
}
if(BatteryGetLowPower(&sensorBuf[4]))
{
ret = 1;
}
sensorBuf[6] =0 ;//空闲位为零
break;
}
case OVE350S_AA:
{
break;
}
case HARD_ERROR:
{
break;
}
default:
{
break;
}
}
return ret;
}
//上传传感器数据
void SensorUpload(void)
{
if(SensorTimerGet()<=0) //如果计时器时间到
{
sampleCount ++;
if(SensorGet()) //如果需要发送信息,则将数据给fifo
{
sampleCount = 0;
FIFO_Insert(&sensorBuf[0],SENSOR_BUF_NUM);
}
else
{
if(sampleCount>=sampleCountMax[hardVersion])
{
sampleCount = 0;
FIFO_Insert(&sensorBuf[0],SENSOR_BUF_NUM);
}
}
}
}
复制代码
所有资料51hei提供下载:
OVE350S_v1.1.7z
(1.23 MB, 下载次数: 20)
2019-8-8 02:16 上传
点击文件名下载附件
传感器源代码
下载积分: 黑币 -5
Sensor.pdf
(60.78 KB, 下载次数: 7)
2019-8-6 16:56 上传
点击文件名下载附件
原理图
下载积分: 黑币 -5
Battery.pdf
(147.79 KB, 下载次数: 7)
2019-8-6 16:56 上传
点击文件名下载附件
原理图
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1