分享一個無線測溫傳感器的設計資料,原理圖+代碼,經測試可以用。
0.png (10.23 KB, 下載次數: 49)
下載附件
2019-8-8 02:14 上傳
單片機源程序如下:
- #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
|