標(biāo)題:
STM32 TMP101無(wú)線測(cè)溫傳感器低功耗+RF源程序
[打印本頁(yè)]
作者:
路世英
時(shí)間:
2019-8-6 16:58
標(biāo)題:
STM32 TMP101無(wú)線測(cè)溫傳感器低功耗+RF源程序
分享一個(gè)無(wú)線測(cè)溫傳感器的設(shè)計(jì)資料,原理圖+代碼,經(jīng)測(cè)試可以用。
0.png
(10.23 KB, 下載次數(shù): 49)
下載附件
2019-8-8 02:14 上傳
單片機(jī)源程序如下:
/*
******************************************************************************
* 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時(shí)是低功耗模式,為非零時(shí)我延時(shí)模式
void _Error_Handler(char * file, int line);
int main(void)
{
int timer = 0;
HAL_Init();
SystemClock_Config();
WirelessInit();//配置通信
RTC_Config();
HAL_Delay(100);
SensorCheck(); //識(shí)別硬件版本
SensorInit(); //初始化各個(gè)設(shè)備
while(1)
{
SystemClock_Config(); //系統(tǒng)時(shí)鐘配置,回復(fù)后重新配置
SensorUpload(); //傳感器數(shù)據(jù)處理
WirelessTaskLowPower(); //nrf數(shù)據(jù)發(fā)送處理
if(WirelessTxIsNotEmpyt()) //如果nrf還要要發(fā)送的數(shù)據(jù)
{
SleepTime(10,SLEEP_MODE);//延時(shí)方式
SensorTimerDec(9); //傳感器內(nèi)部計(jì)時(shí)器減10s
}
else
{
SleepTime(SensorTimerGet(),SLEEP_MODE); //等待延時(shí)
SensorTimerSet(-1); //延時(shí)完成一個(gè)周器,觸發(fā)一次測(cè)量
}
}
}
/* USER CODE BEGIN 4 */
/**
* @brief RTC Wake Up callback
* @param None
* @retval None
* RTC喚醒中斷的處理函數(shù)中斷的處理內(nèi)容可以在此處執(zhí)行
*/
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****/
復(fù)制代碼
#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 //定義傳感器的數(shù)量
#define SENSOR_BUF_NUM 7
enum {
BATTERY,
TEMP101,
SI1702,
};
static int sensorState[SENSOR_NUM] ={0,0,0}; //用來(lái)表示對(duì)應(yīng)的傳感器是否在線,如果不在線為0,用來(lái)識(shí)別硬件
static uint8_t sensorBuf[SENSOR_BUF_NUM]; //傳感器數(shù)據(jù)緩存的buf
//檢測(cè)設(shè)備已獲取硬件版本
//適用硬件版本如下: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}; //定義每個(gè)硬件產(chǎn)品的循環(huán)周期
static int sampleCountMax[HARD_NUM] = {6,6,6,6}; //定義最遲幾個(gè)采樣周期,發(fā)送一次數(shù)據(jù),為了防止數(shù)據(jù)不變的時(shí)候一致不發(fā)送,定一個(gè)最低的周期
static int timer=0; //需要外部一個(gè)以s為單位的,石基單元驅(qū)動(dòng)
static int sampleCount = 0;
//計(jì)時(shí)器為遞減模式
int SensorTimerGet(void)
{
return timer;
}
void SensorTimerSet(int inc)
{
timer = inc;
}
void SensorTimerDec(int dec)
{
timer = timer - dec;
}
//檢查硬件已獲得硬件版本號(hào)
//#define SET_DEV OVE350S_C //如果指定硬件版本
void SensorCheck(void)
{
#ifdef SET_DEV
hardVersion = SET_DEV; //硬件版本為指定
#else //否則,自動(dòng)檢測(cè)
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: //都不是,上報(bào)硬件錯(cuò)誤,led等常亮
{
while(1)
{
LedOn();
}
break;
}
case OVE350S_AA:
{
while(1)
{
LedOn();
}
break;
}
default:
{
while(1)
{
LedOn();
HAL_Delay(300);
LedOff();
HAL_Delay(300);
}
break;
}
}
}
//獲取溫度,濕度,和電壓值,每個(gè)數(shù)據(jù)緩存在兩個(gè)字節(jié)的空間中
//第0-1字節(jié):溫度
//第2-3字節(jié):濕度
//第4-5字節(jié):電壓
//第6字節(jié): 空閑
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個(gè)字節(jié)
{
ret = 1;
}
if(BatteryGetLowPower(&sensorBuf[4]))
{
ret = 1;
}
sensorBuf[6] =0 ;//空閑位為零
break;
}
case OVE350S_AA:
{
break;
}
case HARD_ERROR:
{
break;
}
default:
{
break;
}
}
return ret;
}
//上傳傳感器數(shù)據(jù)
void SensorUpload(void)
{
if(SensorTimerGet()<=0) //如果計(jì)時(shí)器時(shí)間到
{
sampleCount ++;
if(SensorGet()) //如果需要發(fā)送信息,則將數(shù)據(jù)給fifo
{
sampleCount = 0;
FIFO_Insert(&sensorBuf[0],SENSOR_BUF_NUM);
}
else
{
if(sampleCount>=sampleCountMax[hardVersion])
{
sampleCount = 0;
FIFO_Insert(&sensorBuf[0],SENSOR_BUF_NUM);
}
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
OVE350S_v1.1.7z
(1.23 MB, 下載次數(shù): 20)
2019-8-8 02:16 上傳
點(diǎn)擊文件名下載附件
傳感器源代碼
下載積分: 黑幣 -5
Sensor.pdf
(60.78 KB, 下載次數(shù): 7)
2019-8-6 16:56 上傳
點(diǎn)擊文件名下載附件
原理圖
下載積分: 黑幣 -5
Battery.pdf
(147.79 KB, 下載次數(shù): 7)
2019-8-6 16:56 上傳
點(diǎn)擊文件名下載附件
原理圖
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1