分享一个无线测温传感器的设计资料,原理图+代码,经测试可以用。
单片机源程序如下:
- #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)
Sensor.pdf
(60.78 KB, 下载次数: 7)
Battery.pdf
(147.79 KB, 下载次数: 7)
|