Can not write to cache files, please check directory ./data/ and ./data/sysdata/ .

本文介绍了解决PHP-FPM无法写入缓存文件的问题,原因是data目录及sysdata子目录的属主和属组配置不当。通过调整这些目录的属主和属组为php-fpm:php-fpm,可以有效解决该问题。
Can not write to cache files, please check directory ./data/ and ./data/sysdata/ .
原因很简单,就是data目录以及data/sysdata没有权限,或者属主属组不对。
解决方法:

以上排查可见是因为属主和属组不对。

#chmod -R php-fpm:php-fpm data/ 【在网站根目录下执行,否则更改的不是data目录】

#include "SHT30.h" #define SHT30I2C_SCL GPIO_PIN_2 #define SHT30I2C_SDA GPIO_PIN_3 #define GPIO_I2C GPIOC #define I2C_SCL_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SCL) #define I2C_SCL_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SCL) #define I2C_SDA_H GPIO_SetBits(GPIO_I2C,SHT30I2C_SDA) #define I2C_SDA_L GPIO_ResetBits(GPIO_I2C,SHT30I2C_SDA) #define SDA_IN GPIO_ReadInputDataBit(GPIO_I2C,SHT30I2C_SDA) #define write 0 //第8位是写命令 #define read 1 //第8位是读命令 //定义温湿度存储变量 u8 humiture_buff1[20]; float Temperature = 0.000000; float Humidity = 0.000000; //初始化IIC void SHT30_Init(void) { GPIO_InitType GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出 GPIO_InitStructure.GPIO_Current = GPIO_DC_2mA; GPIO_InitStructure.Pin = SHT30I2C_SCL | SHT30I2C_SDA; GPIO_InitPeripheral(GPIO_I2C, &GPIO_InitStructure); I2C_SCL_H; I2C_SDA_H; } //设置为输出模式 static void I2C_SDA_OUT(void) { GPIO_InitType GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出 GPIO_InitStructure.GPIO_Current = GPIO_DC_2mA; GPIO_InitStructure.Pin = SHT30I2C_SDA; GPIO_InitPeripheral(GPIO_I2C, &GPIO_InitStructure); } //设置为输入模式 static void I2C_SDA_IN(void) { GPIO_InitType GPIO_InitStructure; GPIO_InitStruct(&GPIO_InitStructure); GPIO_InitStructure.Pin = SHT30I2C_SDA; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input; GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up; GPIO_InitPeripheral(GPIO_I2C, &GPIO_InitStructure); } //主机发送确认字符ACK void IIC_ACK(void) { I2C_SDA_OUT(); I2C_SCL_L; Delayus(2); I2C_SDA_L; Delayus(2); I2C_SCL_H; Delayus(2); I2C_SCL_L; Delayus(1); } //主机不发送确认字符ACK void IIC_NACK(void) { I2C_SDA_OUT();//输出模式 I2C_SCL_L; Delayus(2); I2C_SDA_H; Delayus(2); I2C_SCL_H; Delayus(2); I2C_SCL_L; Delayus(1); } //主机等待从机的确认字符ACK u8 IIC_wait_ACK(void) { u8 t = 200; I2C_SDA_OUT(); I2C_SDA_H; Delayus(1); I2C_SCL_L; Delayus(1); I2C_SDA_IN(); Delayus(1); while(SDA_IN)//等待SHT30应答 { t--; Delayus(1); if(t == 0) { I2C_SCL_L; return 1; } Delayus(1); } Delayus(1); I2C_SCL_H; Delayus(1); I2C_SCL_L; Delayus(1); return 0; } //启动IIC通讯 void IIC_Start(void) { I2C_SDA_OUT(); I2C_SDA_H; I2C_SCL_H; Delayus(4); I2C_SDA_L; Delayus(4); I2C_SCL_L; } //结束IIC总线通讯 void IIC_Stop(void) { I2C_SDA_OUT(); I2C_SCL_L; I2C_SDA_L; Delayus(4); I2C_SCL_H; Delayus(4); I2C_SDA_H; Delayus(4); } //将byte数据发送出去 void IIC_SendByte(u8 byte) { u8 Count; I2C_SDA_OUT(); I2C_SCL_L; for(Count = 0; Count < 8; Count++) //要传送的数据长度为8位 { if(byte & 0x80) { I2C_SDA_H; } else { I2C_SDA_L; } byte <<= 1; Delayus(2); I2C_SCL_H; Delayus(2); I2C_SCL_L; Delayus(2); } } //用来接收从器件传来的数据 u8 IIC_RcvByte(void) { u8 retc; u8 Count; retc = 0; I2C_SDA_IN();//配置数据线为输入方式 Delayus(1); for(Count = 0; Count < 8; Count++) { I2C_SCL_L; Delayus(2); I2C_SCL_H; retc = retc << 1; if(SDA_IN) retc |= 1; Delayus(1); } I2C_SCL_L; return(retc); } //读取系列号 u8 ReadHumitureSensorType(u8 addr) { u32 SerialNumber = 0; u8 type = TYPE_SHT40;//默认是TYPE_SHT30 // u8 type = TYPE_SHT30;//默认是TYPE_SHT30 #if 0 u8 buff[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; IIC_Start(); IIC_SendByte(addr << 1 | write); IIC_wait_ACK(); IIC_SendByte(0x89); IIC_wait_ACK(); IIC_Stop(); Delayms(50); IIC_Start(); IIC_SendByte(addr << 1 | read); //写7位I2C设备地址加1作为读取位,1为读取位 if(!IIC_wait_ACK()) { Delayus(1); buff[0] = IIC_RcvByte(); //返回系列号的高8位 IIC_ACK(); buff[1] = IIC_RcvByte(); //返回系列号的高8位 IIC_ACK(); buff[2] = IIC_RcvByte(); //温度crc校验位 IIC_ACK(); buff[3] = IIC_RcvByte(); //返回湿度高8位 IIC_ACK(); buff[4] = IIC_RcvByte(); //返回湿度低8位 IIC_ACK(); buff[5] = IIC_RcvByte(); //湿度crc校验位 IIC_NACK(); IIC_Stop(); } else { SerialNumber = 0; IIC_Stop(); Delayms(50); } SerialNumber = buff[0]; SerialNumber <<= 8; SerialNumber |= buff[1]; SerialNumber <<= 8; SerialNumber |= buff[3]; SerialNumber <<= 8; SerialNumber |= buff[4]; if(SerialNumber > 0) { type = TYPE_SHT40; } #endif return type; } //读出温湿度 void SHT30_read_result(u8 addr, u8 type) { int ret = 0; u16 tem, hum; u16 buff[6]; //发送指令为0x2C06(默认) IIC_Start(); IIC_SendByte(addr << 1 | write); //写7位I2C设备地址加0作为写取位,1为写取位 IIC_wait_ACK(); if(type == TYPE_SHT40) { //SHT40 IIC_SendByte(0xFD); IIC_wait_ACK(); } else { //SHT30 IIC_SendByte(0x2c); IIC_wait_ACK(); IIC_SendByte(0x06); IIC_wait_ACK(); } IIC_Stop(); Delayms(50); IIC_Start(); IIC_SendByte(addr << 1 | read); //写7位I2C设备地址加1作为读取位,1为读取位 ret = IIC_wait_ACK(); if(!ret) { Delayus(1); buff[0] = IIC_RcvByte(); //返回温度高8位 IIC_ACK(); buff[1] = IIC_RcvByte(); //返回温度低8位 IIC_ACK(); buff[2] = IIC_RcvByte(); //温度crc校验位 IIC_ACK(); buff[3] = IIC_RcvByte(); //返回湿度高8位 IIC_ACK(); buff[4] = IIC_RcvByte(); //返回湿度低8位 IIC_ACK(); buff[5] = IIC_RcvByte(); //湿度crc校验位 IIC_NACK(); IIC_Stop(); } tem = ((buff[0] << 8) | buff[1]); hum = ((buff[3] << 8) | buff[4]); if(type == TYPE_SHT40) { //温湿度的计算方法如下 Temperature = 175.0 * (float)tem / 65535.0 - 45.0 ; Humidity = 125.0 * (float)hum / 65535.0 - 6; } else { //温湿度的计算方法如下 Temperature = 175.0 * (float)tem / 65535.0 - 45.0 ; Humidity = 100.0 * (float)hum / 65535.0; } hum = 0; tem = 0; } #ifndef __TYPE_H #define __TYPE_H #include "main.h" typedef enum { RANG_70DB = 0x00, RANG_100DB = 0x01, RANG_130DB = 0x02 } MEA_RANGE_TypeDef; //typedef enum //{ // POINT_100DB = 0x00, // POINT_70DB = 0x01, // POINT_40DB = 0x02 //} CAL_POINT_TypeDef; typedef enum { SHORT_PRESS = 0x00, LONG_PRESS = 0x01, } PRESS_MODE_TypeDef; typedef enum { A_WEIGHT = 0x00, C_WEIGHT = 0x01, } FREQ_WEIGHT_TypeDef; typedef enum { FAST_RESP = 0x00, SLOW_RESP = 0x01, } FREQ_RESP_TypeDef; typedef enum { MAIN_STATE = 0x00, SET_STATE = 0x01, } SYS_STATE_TypeDef; typedef enum { SET_ALM = 0x00 ,//原噪音,现在作为温度使用 SET_ALM2 ,//新增:作为湿度使用 SET_ALM_TIME , SET_ALM_Type , SET_YEAR , SET_MONTH , SET_DAY , SET_HOUR , SET_MINUTE , SET_SECOND , SET_ALM_CLOCK_HOUR , SET_ALM_CLOCK_MINUTE , SET_ALM_CLOCK_EN , } SET_STATE_TypeDef; typedef enum { NO_OUT_RANGE = 0x00, OVER_RANGE = 0x01, UNDER_RANGE = 0x02, } OUT_RANGE_TypeDef; typedef struct { u8 KeyAge : 8; u8 KeyPress : 4; u8 KeyProcessed : 4; GPIO_Module *KeyPort; uint16_t KeyPin; void (*fun) (PRESS_MODE_TypeDef); } SysKey; typedef struct { u8 First_Press; u8 Mea_OK; u8 EEPROM_ERR; u8 SPIFlashErr; u8 Cal_Finish; // u8 Cal_DB_Finish; u8 Cal_En; u8 DispSetEn; u8 LCDFlick; u8 FlickEn; u8 RecFull; u8 Alarms; u8 UpOver; u8 ClockSoundEn; u8 GetRec; u8 BiBiBi; u8 Nop; u8 GetDate; u8 Test; u8 PWD, PWDErr; u8 EraseDoing; u8 UsbCmdLen; u8 SensorType; //温湿度传感器类型 u8 DMA_OK; u8 shutdown; u8 showLcd; u8 Negative; } FLAG_TYPE; typedef struct { double ADC_VALUE[3]; double ADC_Sum_Value; u32 ADC_INT_Value; u16 ADC_CNT; // u16 DB_Disp; u16 TEMP_Disp; u16 HUMI_Disp; u32 ADC_INT_Value_TAB[8]; u32 CAL_INT_Value; u16 Disp_ALM; //CAL u8 ADC_TAB_CNT; u8 Cal_Mode; //系统状态 // CAL_POINT_TypeDef Cal_DB_Point; FREQ_WEIGHT_TypeDef Freq_Weight; FREQ_RESP_TypeDef Freq_Resp; SYS_STATE_TypeDef Sys_State; OUT_RANGE_TypeDef Mea_Range; MEA_RANGE_TypeDef Adc_Range; SET_STATE_TypeDef Set_State; FunctionalState ALM_EN; u8 SaveCnt_2s; u16 Wait; // u8 DispDB_Cnt; u8 DispTEMP_Cnt; u8 DispHUMI_Cnt; u8 CalEn; s16 SET_Value; u16 Save_2s_Data[14]; u32 Start_Rec;//1开始 但是程序中所有的变量 统一从0开始 所以在使用时要-1 u32 End_Rec;//1开始 但是程序中所有的变量 统一从0开始 所以在使用时要-1 u8 Cal_Step; u8 Save_Cnt; u8 FlashNum; u8 WaitReleaseKey; u32 OverCntt[3]; u8 Alm_Time; u8 Alm_Type; int16_t Alm; int16_t Alm2; // u16 MaxDB_Save; u16 MaxTEMP_Save; u16 MaxHUMI_Save; u8 SaveTime2s; u8 DMA_Group; u8 BattCnt; u16 BattBuff[64]; u32 Batt; u8 Units; // 0:摄氏度, 1:华氏度 } DATA_TYPE; typedef struct { unsigned char year ; unsigned char month ; unsigned char day ; unsigned char hour ; unsigned char minute ; unsigned char second ; } DATE_TIME; typedef struct { unsigned char hour ; unsigned char minute ; unsigned char second ; unsigned char enabled ; } TIME_INFO; typedef union { u32 Mem[2]; struct { int16_t Alm_Value : 16; int16_t Alm2_Value : 16; u8 Alm_Switch : 4; u8 Alm_Type : 4; u8 Alm_Time : 8; } Struct_Para; } UNION_PARA; typedef struct { u16 ID; u16 ChipStart; u32 REC_HalfPages;//从0开始 0至MAX_REC_Pages-1 int16_t Cal_Adc[3]; // int16_t Cal_DB[3]; int32_t Cal_Adc_Squ[3]; UNION_PARA AlmPara; u8 PWRON_Erase; u8 AlarmClockOk;//产生报警 TIME_INFO AlarmClockInfo; } SYS_INFO; //128 typedef struct { u8 Header; u8 Machine_State; u8 Year ; u8 Month ; u8 Day ; u8 Hour ; u8 Minute ; u8 Second ; u16 Result[60]; //Noise_Result: Freq_Weight + Freq_Respon + DB_Value 存储用 } STORAGE; #endif #include <stdio.h> #include "main.h" FLAG_TYPE SysFlag; DATA_TYPE SysData; double Phasea; u32 Phaseb; SYS_INFO SysInfo; STORAGE Storage, Rec_Data; uint8_t Report_buf[MY_DEF_PACKET]; //usb接收BUFF uint8_t Send_Buffer[MY_DEF_PACKET]; //usb发射BUFF u8 SysClock, Clock_150, Clock_500, Clock_750, test; u8 USB_Device_dev; uint16_t TEMP = 0, TEMP2 = 0, TEMP3 = 0, TEMP4 = 0; uint16_t DMA_Test_Value[5], DMA_Test_Value1[5]; uint16_t ADC1ConvertedValue1[5]; #define HUMIMAX 32 float humi_bak[HUMIMAX]; unsigned char humi_pt=0; //const u32 CAL_DB[3] = {10000, 7000, 4000}; RCC_ClocksType RCC_Clocks_;//获得时钟频率 u8 RedLelOnFlag; void timeTempCompensation(void) { static u16 powerOnTime = 0; static u8 second = 0; if(Time_Dec.second != second) { if(powerOnTime < 900) //10分钟 { powerOnTime++; } } second = Time_Dec.second; if(powerOnTime < 600) { Temperature = Temperature - powerOnTime * (2.0 / 600.0f); } else { Temperature = Temperature - (2.0 + (powerOnTime - 600) * (0.5 / 300.0f)); } } u8 TwinkleControl(void) { static unsigned char second = 0; static unsigned char showFlag = 0; static s16 SET_Value = 0; static unsigned char enabled = 0; if(second != Time_Dec.second) { second = Time_Dec.second; if((SET_Value != SysData.SET_Value) || (SysInfo.AlarmClockInfo.enabled != enabled)) { showFlag = 1; SET_Value = SysData.SET_Value; enabled = SysInfo.AlarmClockInfo.enabled; } else { if(showFlag) { showFlag = 0; } else { showFlag = 1; } } } return showFlag; } # //温湿度时间处理 void humitureTaskPro() { unsigned char showFlag = 0,loopi; float tmp[HUMIMAX]; Get_Time(); if((SysData.Sys_State != SET_STATE) || ((SysData.Sys_State == SET_STATE) && (SysData.Set_State < SET_ALM_CLOCK_HOUR))) { SHT30_read_result(0x44, SysFlag.SensorType); for(loopi=1;loopi<(HUMIMAX);loopi++) { humi_bak[loopi-1]=humi_bak[loopi]; tmp[loopi-1]=humi_bak[loopi-1]; } humi_bak[HUMIMAX-1]=Humidity; tmp[HUMIMAX-1]=Humidity; bubble_float(tmp,HUMIMAX); Humidity=(tmp[HUMIMAX>>1]+tmp[(HUMIMAX>>1)+1])/2.0f; timeTempCompensation(); } } void AlarmSettingTaskPro() { unsigned char showFlag = 0; if((SysData.Sys_State == SET_STATE) && (SysData.Set_State > SET_SECOND)) { showFlag = TwinkleControl(); switch(SysData.Set_State) { case SET_ALM_CLOCK_HOUR: Disp_AL(); if(!showFlag) { ClearHour(); } break; case SET_ALM_CLOCK_MINUTE: Disp_AL(); if(!showFlag) { ClearMinute(); } break; case SET_ALM_CLOCK_EN: if(showFlag) { if(SysInfo.AlarmClockInfo.enabled) { Disp_ON(); } else { Disp_OFF(); } } else { Disp_Clear(); } break; default: break; } // ClearTemp(); // ClearHumi(); if(showFlag) { displayAlarmClockTime(SysInfo.AlarmClockInfo.hour, SysInfo.AlarmClockInfo.minute); SysFlag.showLcd = 0; } RefreshDisplay(); } } void GreenLedOn(void)//电量指示灯 { LED_Green_ON; } void GreenLedOff(void) { LED_Green_OFF; } void RedLedOn(void) { LED_Red_ON; } void RedLedOff(void) { LED_Red_OFF; } void Led_2_On(void)//报警指示灯 { LED_2_ON; } void Led_2_Off(void) { LED_2_OFF; } void Led_3_On(void)//摄氏度指示灯 { LED_3_ON; } void Led_3_Off(void) { LED_3_OFF; } void Led_4_On(void)//华氏度指示灯 { LED_4_ON; } void Led_4_Off(void) { LED_4_OFF; } void RedLedTwinkleOnce(u16 period) { static u16 count = 0; static u8 LedOnFlag = 0; count++; if(count > period) { LED_Green_OFF; RedLedOn(); RedLelOnFlag = 1; } if(count > (period + 1)) { RedLedOff(); count = 0; RedLelOnFlag = 0; } } void RedLedTwinkle(u16 period) { static u16 count = 0; static u8 LedOnFlag = 0; count++; if(count > period) { if(LedOnFlag) { LED_Green_OFF; Led_2_On(); SysFlag.LCDFlick = 1; LedOnFlag = 0; } else { LED_Green_OFF; Led_2_Off(); SysFlag.LCDFlick = 0; LedOnFlag = 1; } count = 0; } } void GreenLedTwinkle(u16 period) { static u16 count = 0; static u8 LedOnFlag = 0; count++; if(count > period) { if(LedOnFlag) { GreenLedOn(); LedOnFlag = 0; } else { GreenLedOff(); LedOnFlag = 1; } count = 0; } } void GreenLedTwinkle_USBCHECK_ON(u16 period)//debug { static u16 count = 0; static u8 LedOnFlag = 0; count++; if(count > period) { if(LedOnFlag) { RedLedOff(); GreenLedOn(); SysFlag.LCDFlick = 1; LedOnFlag = 0; } else { RedLedOff(); GreenLedOff(); SysFlag.LCDFlick = 0; LedOnFlag = 1; } count = 0; } } void RedGreenLedTwinkle(u16 period) { static u16 count = 0; static u8 GreenLedOnFlag = 0; static u8 RedLedOnFlag = 0; static u16 periodCnt = 0; periodCnt++; if(periodCnt > period) { if(RedLedOnFlag) { GreenLedOff(); RedLedOff(); RedLedOnFlag = 0; } else { count++; if(count == 3) { RedLedOn(); RedLedOnFlag = 1; count = 0; } else { GreenLedOn(); RedLedOnFlag = 1; } } periodCnt = 0; } } void alarmLedEvent(void) { if(SysData.ALM_EN == ENABLE) { if(SysFlag.Alarms) { RedLedTwinkle(0); } else { // RedLedTwinkleOnce(7); Led_2_On(); } } else { Led_2_Off(); } } //LED控制 500ms调用一次 void LedControl(void) { if(VUSB_CHECK) { RedLedOff(); if(CHARGE_FULL) // if(1) //test { //充满 GreenLedOn(); // if(!SysFlag.shutdown) // { // alarmLedEvent(); // } } else { //未充满 /* if((SysData.ALM_EN==ENABLE)&&(SysFlag.Alarms)&&(!SysFlag.shutdown)) { alarmLedEvent(); } else { GreenLedTwinkle(1); } */ if(SysData.ALM_EN == ENABLE) { if(SysFlag.Alarms) { // alarmLedEvent(); GreenLedTwinkle_USBCHECK_ON(0); } else { #ifdef NO_RED_LED GreenLedTwinkle(0);//debug #else RedGreenLedTwinkle(1); #endif } } else { GreenLedTwinkle(0); } } } else { GreenLedOff(); if((SysData.ALM_EN == ENABLE) && (SysFlag.Alarms)) { alarmLedEvent(); } else { if(SysData.Batt < BattLOW) { RedLedOn(); if(SysData.Batt < BattSHUT) { Shut_Down(); } } else { alarmLedEvent(); } } } } //报警任务 void AlarmClockTask(void) { if((SysInfo.AlarmClockInfo.hour == Time_Dec.hour) && (SysInfo.AlarmClockInfo.minute == Time_Dec.minute) && (SysInfo.AlarmClockInfo.second == Time_Dec.second) && (SysInfo.AlarmClockInfo.enabled)) { if(!SysInfo.AlarmClockOk) { SysInfo.AlarmClockOk = 1; SysFlag.ClockSoundEn = 1; } } } void AlarmClockControl(void) { static unsigned char second = 0; static unsigned char AlarmClocksecond = 0; static unsigned char AlarmClockcvt = 0; if(SysInfo.AlarmClockOk) { if(second != Time_Dec.second) { AlarmClocksecond++; second = Time_Dec.second; } if(AlarmClocksecond < 30) { SysFlag.ClockSoundEn = 1; } else { SysFlag.ClockSoundEn = 0; if(AlarmClocksecond > 35) { AlarmClocksecond = 0; AlarmClockcvt++; if(AlarmClockcvt > 2) { SysInfo.AlarmClockOk = 0; SysFlag.ClockSoundEn = 0; } } } } else { second = 0; AlarmClocksecond = 0; AlarmClockcvt = 0; SysFlag.ClockSoundEn = 0; } } void ResetAlarmClockTime(void) { if((SysInfo.AlarmClockInfo.hour > 23) || (SysInfo.AlarmClockInfo.minute > 59) || (SysInfo.AlarmClockInfo.second > 59)) { SysInfo.AlarmClockInfo.hour = Time_Dec.hour; SysInfo.AlarmClockInfo.minute = Time_Dec.minute; SysInfo.AlarmClockInfo.second = 0; } } int main(void) { uint8_t ret = 0; uint8_t keyUpFlag = 0; Init_Pro(); Init_Var(); LED_Red_OFF; LED_Green_OFF; ResetAlarmClockTime(); while (1) { if(!SysFlag.shutdown) { if(SysFlag.UsbCmdLen) { USB_Decode(); SysFlag.UsbCmdLen = 0; USB_Pro(); } if(SysClock) { SysClock = 0; Key_Pro(); AlarmSettingTaskPro(); } if(Clock_150 > 2) { Clock_150 = 0; humitureTaskPro(); AlarmClockTask(); Data_Pro(); Disp_Set(); AlarmClockControl(); if(Clock_750 > 14) { Clock_750 = 0; if(((SysFlag.UpOver==1)||(SysFlag.ClockSoundEn))&&(Turn_On_Wait>=5))//开机等待一段时间再报警 { switch(SysInfo.AlmPara.Struct_Para.Alm_Type) { case 1: bi(2); break; case 2: bi(3); break; case 3: bi(4); break; } } if((SysData.Sys_State==SET_STATE)&&(SysData.Set_State==SET_ALM_Type)&&(SysFlag.FlickEn)) { switch(SysData.SET_Value) { case 1: bi(2); break; case 2: bi(3); break; case 3: bi(4); break; } } } } else { if(VUSB_CHECK) { Disp_Clear(); ClearTimeDisplay(); // ClearTempDisplay(); } else { Shut_Down(); } } if(Clock_500 > 9) { Clock_500 = 0; if(!SysFlag.shutdown) { if(SysFlag.PWD == 1) { SysFlag.PWDErr++; //隔了1s还是处于低电 未关机状态 认为判断失败 //重新归零 恢复正常 if(SysFlag.PWDErr > 1) { SysFlag.PWDErr = 0; SysFlag.PWD = 0; } } LCD_Disp(); Clock_500_Pro(); } else { //如果充电的情况下关机,在按电源键正常开机 if(GPIO_ReadInputDataBit(KEy[Num_Power].KeyPort, KEy[Num_Power].KeyPin) == 0) { KEy[Num_Power].KeyAge++; if(KEy[Num_Power].KeyAge > 0) { if(keyUpFlag) { SysFlag.shutdown = 0; KEy[Num_Power].KeyAge = 0; keyUpFlag = 0; SysData.Sys_State = MAIN_STATE; SysFlag.First_Press = 1; Disp_All(); Delayms(500); } } } else { KEy[Num_Power].KeyAge = 0; keyUpFlag = 1; } } LedControl(); } } } } void Delayms(u32 Cnt) { u32 i, j; for(j = 0; j < Cnt; j++) { for(i = 0; i < 29760; i++); } } void Delayus(u32 Cnt) { u32 i, j; for(j = 0; j < Cnt; j++) { for(i = 0; i < 35; i++); } } void Init_Var(void) { SysFlag.First_Press = 1; SysFlag.Mea_OK = 0; SysData.ALM_EN = ENABLE; SysData.ADC_CNT = 0; SysData.Freq_Weight = A_WEIGHT; SysData.Freq_Resp = FAST_RESP; SysData.Sys_State = MAIN_STATE; switch(SysData.Freq_Weight) { case A_WEIGHT: FREQ_WEIGHT_A; break; case C_WEIGHT: FREQ_WEIGHT_C; break; } SysData.DispTEMP_Cnt = 0; SysData.DispHUMI_Cnt = 0; SysData.TEMP_Disp = 0; SysData.ADC_CNT = 0; SysData.Wait = 0; SysData.Save_Cnt = 0; SysFlag.EEPROM_ERR = 0; Init_Para(); SysData.Alm = SysInfo.AlmPara.Struct_Para.Alm_Value; SysData.ALM_EN = SysInfo.AlmPara.Struct_Para.Alm_Switch; SysData.Alm_Type = SysInfo.AlmPara.Struct_Para.Alm_Type; SysData.Alm_Time = SysInfo.AlmPara.Struct_Para.Alm_Time; if(SysData.ALM_EN) //yanggj { LED_2_ON; } else { LED_2_OFF; } SPI_FLASH_Dec(); if(SysInfo.PWRON_Erase) { SysInfo.PWRON_Erase = 0; Save_Param(&SysInfo.PWRON_Erase, sizeof(SysInfo.PWRON_Erase)); SysData.FlashNum = 1; SPI_Flash_EraseChip(); if(SysInfo.ChipStart == 0) SysInfo.ChipStart = 1; //FLASH2为起始 else SysInfo.ChipStart = 0; //FLASH1为起始 Save_Param(&SysInfo.ChipStart, sizeof(SysInfo.ChipStart)); } Buzzer_Init(); Buzzer_Setup(0); SysData.FlashNum = 1; if(SysInfo.REC_HalfPages > W25X_MAX_PAGE * 2) { SysData.FlashNum = 2; } Check_REC_Valid(); SysFlag.RecFull = 0; Clock_150 = 0; Clock_500 = 0; SysClock = 0; SysData.Cal_Mode = 0; SysFlag.Cal_En = 0; Delayms(500); if((SysFlag.EEPROM_ERR) || (SysFlag.SPIFlashErr)) { Disp_Err(); Delayms(500); } //获取温湿度传感器类型 SysFlag.SensorType = ReadHumitureSensorType(0x44); SysInfo.AlarmClockOk = 0; } void LCD_Disp(void) { switch(SysData.Sys_State) { case MAIN_STATE: displayTime(Time_Dec.hour, Time_Dec.minute, Time_Dec.second); Disp_TempHumi(); Disp_Date(); break; case SET_STATE: break; } RefreshDisplay(); } void Get_AD_SUM(void) { uint64_t Sum[3] = {0, 0, 0}; //这里有3种计算,分别是sum[0],sum[1],sum[2] u8 Ratio; u16 loopi, *Data; u32 Temp; Data = Noise_Data.Buff1;//将DMA移过来的地址给Data if(SysData.DMA_Group != 0) Data = Noise_Data.Buff0;//将DMA移过来的地址给Data SysData.BattCnt = 0; //sum[0] for(loopi = 0; loopi < DMA_CAL_BUFF_SIZE; loopi += 4) //循环480/3=150次 { Temp = (u32)(*Data); //将Noise_Data.Buff1的值给Temp Data++;//地址++ if(Temp > ADC_HLimit) SysData.OverCntt[0]++; //如果Temp>2482,数据溢出的标志位++,这个数据溢出的标志位也有3种,用数组来表示 Temp = Temp + (s32)SysInfo.Cal_Adc[0];// 这个应该是存放校准后的ADC if(Temp > 0x80000000)Temp = 0; Temp = Temp * Temp; //不知道平方一次是用来干啥的 Sum[0] += (uint64_t)Temp; //计算总和,存到sum[0] //sum[1] Temp = (u32)(*Data); Data++; if(Temp > ADC_HLimit_H) SysData.OverCntt[1]++; Temp = Temp + (s32)SysInfo.Cal_Adc[1]; if(Temp > 0x80000000)Temp = 0; Temp = Temp * Temp; Sum[1] += (uint64_t)Temp; //计算总和,存到sum[1] //sum[2] Temp = (u32)(*Data); Data++; Temp = Temp + (s32)SysInfo.Cal_Adc[2]; if(Temp > 0x80000000) Temp = 0; Temp = Temp * Temp; Sum[2] += (uint64_t)Temp; //计算总和,存到sum[2] if(SysData.BattCnt < 64) { SysData.BattBuff[SysData.BattCnt++] = *Data; } Data++; } SysData.Batt = 0; for(loopi = 0; loopi < 64; loopi++) { SysData.Batt += SysData.BattBuff[loopi]; } SysData.Batt = SysData.Batt / 64; //报警时低于3.3V不关机问题,电源检测这里添加关机 if(SysData.Batt < BattSHUT) { Shut_Down(); } //将计算的总和,存到SysData.ADC_VALUE SysData.ADC_VALUE[0] += (double)Sum[0]; SysData.ADC_VALUE[1] += (double)Sum[1]; SysData.ADC_VALUE[2] += (double)Sum[2]; SysData.ADC_CNT++; Ratio = SysData.Freq_Resp * 7 + 1; //不知道这2句是干嘛的 if(SysData.ADC_CNT >= (SMP_DMA_CNT * Ratio)) { SysData.ADC_CNT = 0; // if(SysData.Cal_Mode == 0) // { // if(SysData.OverCntt[0] < MIN_OVER_CNT) //溢出计数判断 // { // SysData.Adc_Range = RANG_70DB; // } // else if(SysData.OverCntt[1] < MIN_OVER_CNT) // { // SysData.Adc_Range = RANG_100DB; // } // else // { // SysData.Adc_Range = RANG_130DB; // } // } SysData.ADC_Sum_Value = (SysData.ADC_VALUE[SysData.Adc_Range] / (float)Ratio) + SysInfo.Cal_Adc_Squ[SysData.Adc_Range]; if(SysData.ADC_Sum_Value < 0) { ; } else { // Get_Noise_Data(); } SysData.ADC_VALUE[0] = 0; SysData.ADC_VALUE[1] = 0; SysData.ADC_VALUE[2] = 0; SysData.OverCntt[0] = 0; SysData.OverCntt[1] = 0; SysData.OverCntt[2] = 0; } } //void Get_Noise_Data(void) //{ // Phasea = SysData.ADC_Sum_Value; // /* // 523公式:10*log10(SysData.ADC_Sum_Value) *10 //是为了扩大10倍 用于获取小数部分,来显示 // */ // Phasea = log10(Phasea); // Phasea = Phasea * 1000; // Phaseb = (u32)Phasea; // SysData.CAL_INT_Value = Phaseb + SysInfo.Cal_DB[SysData.Adc_Range]; // SysData.ADC_INT_Value = SysData.CAL_INT_Value / 10; // if(SysData.Cal_Mode == 0) // { // if(SysData.ADC_TAB_CNT == 0) // { // SysData.ADC_TAB_CNT = 1; // SysData.ADC_INT_Value_TAB[1] = SysData.ADC_INT_Value; // SysData.ADC_INT_Value_TAB[2] = SysData.ADC_INT_Value; // SysData.ADC_INT_Value_TAB[3] = SysData.ADC_INT_Value; // } // else // { // SysData.ADC_INT_Value_TAB[3] = SysData.ADC_INT_Value_TAB[2]; // SysData.ADC_INT_Value_TAB[2] = SysData.ADC_INT_Value_TAB[1]; // SysData.ADC_INT_Value_TAB[1] = SysData.ADC_INT_Value_TAB[0]; // } // SysData.ADC_INT_Value_TAB[0] = SysData.ADC_INT_Value; // } // else // { // SysData.CalEn = 1; // if(SysData.Adc_Range == RANG_130DB) // { // if(SysData.ADC_INT_Value == 1300) // { // SysFlag.FlickEn = 1; // } // else // { // SysFlag.FlickEn = 0; // } // } // } //} void HexToBcd(int32_t Data) { if (Data < 0) { HexData[0] = 0x0b; u32 absData = -Data; if (absData >= 10) { HexData[1] = absData / 10 % 10; HexData[2] = absData % 10; } else { HexData[1] = 0x0a; HexData[2] = absData; } } else { HexData[0] = Data / 100 % 10; HexData[1] = Data / 10 % 10; HexData[2] = Data % 10; } } void Copy_Data(u8 *Src, u8 *Des, u8 Num) { u8 loopi; u8 *S = Src, *D = Des; for(loopi = 0; loopi < Num; loopi++) { *D = *S; D ++; S ++; } } void Fill_Data(void) { Copy_Data(HexData, MainData, 3);//这里改为3进入设置模式只有前三位显示 } u32 MAX(u32 *src, u8 Num) { u8 loopi; u32 MaxValue; MaxValue = 0; for(loopi = 0; loopi < Num; loopi++) { if(MaxValue < (*src)) { MaxValue = *src; } src++; } return MaxValue; } u16 MAX_HalfWorld(u16 *src, u8 Num) { u8 loopi; u16 MaxValue; MaxValue = 0; for(loopi = 0; loopi < Num; loopi++) { if(MaxValue < (*src)) { MaxValue = *src; } src++; } return MaxValue; } void Get_DispData(void) { static u8 AlarmClockOver = 0; if(SysData.Sys_State == SET_STATE) return;//设置时不存储 //校准模式直接送显 if(SysData.Cal_Mode) { SysData.TEMP_Disp = SysData.ADC_INT_Value; return; } //获取一次结果 if(SysData.Freq_Resp == FAST_RESP) { //450ms获取一次数据送显示 SysData.TEMP_Disp = MAX(SysData.ADC_INT_Value_TAB, 4); //求最大 } else { //1s获取一次 SysData.DispTEMP_Cnt = 0; SysData.TEMP_Disp = SysData.ADC_INT_Value_TAB[0]; } if(SysFlag.UpOver == 0) { if(SysData.Wait > 0) //这是测量时间 { SysData.Wait--; if(!SysInfo.AlarmClockOk) { SysData.TEMP_Disp = SysData.Disp_ALM; } } else if((SysData.TEMP_Disp > SysData.Alm) && (SysData.ALM_EN == ENABLE)) { SysData.Disp_ALM = SysData.TEMP_Disp; SysInfo.AlarmClockOk = 0; SysFlag.UpOver = 1; SysFlag.Alarms = 1; } else { ALM_OUT_EN(DISABLE); SysFlag.Alarms = 0; } } else { //报警显示 SysData.TEMP_Disp = SysData.Disp_ALM; } //每两秒存储一次 if(SysData.MaxTEMP_Save < SysData.TEMP_Disp) { SysData.MaxTEMP_Save = SysData.TEMP_Disp; } } void Data_Pro(void) { Get_DispData(); } void bubble(unsigned int a[], unsigned char n) { unsigned char i, j; unsigned int k; for(i = 1; i < n; i++) for(j = 0; j < n - i; j++) if(a[j] > a[j + 1]) { k = a[j]; a[j] = a[j + 1]; a[j + 1] = k; } } void bubble_float( float a[], unsigned char n) { unsigned char i, j; float k; for(i = 1; i < n; i++) for(j = 0; j < n - i; j++) if(a[j] > a[j + 1]) { k = a[j]; a[j] = a[j + 1]; a[j + 1] = k; } } void Cal_Pro(void)//校准 { // u32 Limit, Tmp; // Limit = CAL_DB[SysData.Cal_DB_Point]; //这个是校准点,有4000,7000,10000 // if(SysData.CAL_INT_Value == Limit) //如果 SysData.CAL_INT_Value==4000/7000/10000 // { // SysFlag.Cal_Finish = 1; //校准完成标志=1 // SysData.CalEn = 0; // if(SysFlag.Cal_DB_Finish == 0) // { // //这里要采集下一通道的差值 // switch(SysData.Cal_DB_Point)//通过按键,会对SysData.Cal_DB_Point++,从而来判断当前校准哪个点 // { // case POINT_100DB: // SysData.Adc_Range = RANG_100DB; //将这个范围给到SysData.Adc_Range // Delayms(300); // break; // case POINT_70DB: // SysData.Adc_Range = RANG_70DB; // Delayms(300); // break; // case POINT_40DB: // Para_Save(); // Delayms(300); // Shut_Down(); // break; // } // SysFlag.Cal_DB_Finish = 1; // } // } // if((SysData.CalEn) && (SysFlag.Cal_Finish == 0)) // { // SysFlag.FlickEn = 0; // SysData.CalEn = 0; // if(SysData.CAL_INT_Value > Limit) // { // Tmp = SysData.CAL_INT_Value - Limit; // if(Tmp < 10) // { // SysData.Cal_Step = 2; // } // switch(SysData.Cal_Step) // { // case 0: // SysData.Cal_Step = 1; // SysInfo.Cal_Adc[SysData.Adc_Range]--; // break; // case 1: // SysInfo.Cal_Adc[SysData.Adc_Range]--; // break; // case 2: // case 3: // SysData.Cal_Step = 2; // SysInfo.Cal_Adc_Squ[SysData.Adc_Range] -= 20000; // break; // } // } // if(SysData.CAL_INT_Value < Limit) // { // Tmp = Limit - SysData.CAL_INT_Value ; // if(Tmp < 10) // { // SysData.Cal_Step = 2; // } // switch(SysData.Cal_Step) // { // case 0: // SysData.Cal_Step = 3; // SysInfo.Cal_Adc[SysData.Adc_Range]++; // break; // case 3: // SysInfo.Cal_Adc[SysData.Adc_Range]++; // break; // case 1: // case 2: // SysData.Cal_Step = 2; // SysInfo.Cal_Adc_Squ[SysData.Adc_Range] += 40000; // break; // } // } // } // if((SysFlag.Cal_DB_Finish) && (SysData.CalEn) && (SysFlag.FlickEn == 0)) // { // SysData.CalEn = 0; // SysData.ADC_INT_Value_TAB[SysData.ADC_TAB_CNT] = SysData.CAL_INT_Value; // SysData.ADC_TAB_CNT++; // if(SysData.ADC_TAB_CNT >= MAX_CAL_NUM) // { // SysData.ADC_TAB_CNT = 0; // bubble(SysData.ADC_INT_Value_TAB, MAX_CAL_NUM); // Tmp = SysData.ADC_INT_Value_TAB[MAX_CAL_NUM / 2]; // SysInfo.Cal_DB[SysData.Adc_Range] = CAL_DB[SysData.Cal_DB_Point] - Tmp; // SysFlag.FlickEn = 1; // if(SysData.Adc_Range == RANG_70DB) // { // Para_Save(); // Disp_All(); // Delayms(1000); // SysData.Cal_Mode = 0; // KEy[Num_Alm].KeyProcessed = 1; // SysData.Freq_Weight = A_WEIGHT; // SysData.Freq_Resp = FAST_RESP; // switch(SysData.Freq_Weight) // { // case A_WEIGHT: // FREQ_WEIGHT_A; // break; // case C_WEIGHT: // FREQ_WEIGHT_C; // break; // } // return; // } // } // } KEy[Num_Alm].KeyProcessed = 0; } void Shut_Down(void) { // LED_Red_OFF; // Disp_Clear(); // ClearTimeDisplay(); // POWER_OFF; // Delayms(200); // POWER_OFF; // Delayms(200); // POWER_OFF; // Delayms(200); // while(1) // { // ; // } } //时间检查 void Check_Date(void) { unsigned char month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if(Time_Dec.year > 99) Time_Dec.year = 0; if(Time_Dec.year < 0) Time_Dec.year = 99; if(Time_Dec.month < 1) Time_Dec.month = 12; if(Time_Dec.month > 12) Time_Dec.month = 1; if(Time_Dec.day < 1) Time_Dec.day = 31; if(Time_Dec.day > 31) Time_Dec.day = 1; if(Time_Dec.hour > 23) Time_Dec.hour = 0; if(Time_Dec.hour < 0) Time_Dec.hour = 23; if(Time_Dec.minute > 59) Time_Dec.minute = 0; if(Time_Dec.minute < 0) Time_Dec.minute = 59; if(Time_Dec.second > 59) Time_Dec.second = 0; if(Time_Dec.second < 0) Time_Dec.second = 59; month[2] = 28; if (Time_Dec.year % 4 == 0 || Time_Dec.year % 100 == 0 || Time_Dec.year % 400 == 0) //???ūìˇ?ū???29?c month[2] = 29; if(Time_Dec.day > month[Time_Dec.month]) Time_Dec.day = 1; Time_Hex.year = (Time_Dec.year / 10) << 4 | (Time_Dec.year % 10); Time_Hex.month = (Time_Dec.month / 10) << 4 | (Time_Dec.month % 10); Time_Hex.day = (Time_Dec.day / 10) << 4 | (Time_Dec.day % 10); Time_Hex.hour = (Time_Dec.hour / 10) << 4 | (Time_Dec.hour % 10); Time_Hex.minute = (Time_Dec.minute / 10) << 4 | (Time_Dec.minute % 10); Time_Hex.second = (Time_Dec.second / 10) << 4 | (Time_Dec.second % 10); } void Clock_500_Pro(void) { if(!SysFlag.UpOver) { SysFlag.LCDFlick = !SysFlag.LCDFlick; } if((SysData.Sys_State == SET_STATE) && (SysData.Set_State == SET_ALM) && (SysData.Set_State == SET_ALM2)) { } Get_Time(); if(Turn_On_Wait < 5) { Turn_On_Wait++; } if(SysData.Sys_State == SET_STATE)return; if((SysFlag.UpOver == 1) && (Turn_On_Wait >= 5)) //开机等待一段时间再报警 { if(((SysData.Wait == 0) && (SysFlag.BiBiBi == 0)) || (SysInfo.AlarmClockOk)) { ALM_OUT_EN(ENABLE); SysFlag.BiBiBi = 1; SysData.Wait = SysData.Alm_Time * 2; } else { if(SysData.Wait) { SysData.Wait--; } } } Save_Data(); } void Check_Set(void) { unsigned char month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; switch(SysData.Set_State) { case SET_ALM: if(SysData.SET_Value > MAX_ALM_TEMP) SysData.SET_Value = MAX_ALM_TEMP;//55 if(SysData.SET_Value < MIN_ALM_TEMP) SysData.SET_Value = MIN_ALM_TEMP;//-10 break; case SET_ALM2: if(SysData.SET_Value > MAX_ALM_HUMI) SysData.SET_Value = MAX_ALM_HUMI; if(SysData.SET_Value < 0) SysData.SET_Value = 0; break; case SET_ALM_TIME: if(SysData.SET_Value > MAX_ALM_TIME) SysData.SET_Value = MAX_ALM_TIME; if(SysData.SET_Value < MIN_ALM_TIME) SysData.SET_Value = MIN_ALM_TIME; break; case SET_ALM_Type: if(SysData.SET_Value > MAX_ALM_Type) SysData.SET_Value = MAX_ALM_Type; if(SysData.SET_Value < MIN_ALM_Type) SysData.SET_Value = MIN_ALM_Type; break; case SET_YEAR: if(SysData.SET_Value > 99) SysData.SET_Value = 0; if(SysData.SET_Value < 0) SysData.SET_Value = 99; break; case SET_MONTH: if(SysData.SET_Value < 1) SysData.SET_Value = 12; if(SysData.SET_Value > 12) SysData.SET_Value = 1; break; case SET_DAY: month[2] = 28; if ((Time_Set.year % 4 == 0 && Time_Set.year % 100 != 0) || (Time_Set.year % 400 == 0) ) month[2] = 29; if(SysData.SET_Value > month[Time_Set.month]) SysData.SET_Value = 1; if(SysData.SET_Value < 1) SysData.SET_Value = month[Time_Dec.month]; break; case SET_ALM_CLOCK_HOUR: case SET_HOUR: if(SysData.SET_Value > 23) SysData.SET_Value = 0; if(SysData.SET_Value < 0) SysData.SET_Value = 23; break; case SET_ALM_CLOCK_MINUTE: case SET_MINUTE: if(SysData.SET_Value > 59)SysData.SET_Value = 0; if(SysData.SET_Value < 0) SysData.SET_Value = 59; break; case SET_SECOND: if(SysData.SET_Value > 59) SysData.SET_Value = 0; if(SysData.SET_Value < 0) SysData.SET_Value = 59; break; case SET_ALM_CLOCK_EN: break; } } u32 HacedSendRec; void USB_Correspondence(void) //USB通信部份 { u16 Max_Sector = 23; //一天24个扇区 u16 Max_Read; u32 Read_Num; u8 *usb_p, Max_SendNum = 64, loopi; HacedSendRec = 0; //读取记录,把记录发送到PC if(SysFlag.GetRec == 1) { SysFlag.GetRec = 0; USB_Busy = 1; while(Max_Sector) { Max_SendNum = 64; Max_Read = 32; //一个扇区32组记录 Read_Num = SysData.Start_Rec ; SysData.Start_Rec += 32; usb_p = SPI_Rec_BUFF; if(SysData.Start_Rec > SysData.End_Rec) { Max_Read = (SysData.End_Rec - (SysData.Start_Rec - 32) + 1); Max_SendNum = Max_Read * 2; Max_Sector = 0;//下一步跳出while } while(Max_Read--)//读完32组 { SPI_Flash_ReadHalfPage(usb_p, Read_Num - 1); Read_Num++; usb_p += 128; } usb_p = SPI_Rec_BUFF; //一次把一个扇区 发送完 while(Max_SendNum--) { //发送64组数据 USBD_HID_SendReport(&USB_Device_dev, usb_p, MY_DEF_PACKET); usb_p += 64; HacedSendRec++; } } for(loopi = 0; loopi < 64; loopi++)SPI_Rec_BUFF[loopi] = 0xff; USBD_HID_SendReport(&USB_Device_dev, SPI_Rec_BUFF, MY_DEF_PACKET); USB_Busy = 0; Delayms(1500); } else if (SysFlag.GetDate == 1) //193 { SysFlag.GetDate = 0; USB_Busy = 1; Max_Sector = 193; SysData.Start_Rec = 1; usb_p = SPI_Rec_BUFF; while(Max_Sector--) { Max_SendNum = 64; Max_Read = 1365; Read_Num = SysData.Start_Rec; SysData.Start_Rec += 1365; if(SysData.Start_Rec > SysInfo.REC_HalfPages) { Max_Read = SysInfo.REC_HalfPages - (SysData.Start_Rec - 1365) + 1; Max_SendNum = (Max_Read * 3 - 1) / 64 + 1; Max_Sector = 0;//下一步跳出while } //1365 while(Max_Read--) { SPI_Flash_ReadDate(usb_p, Read_Num - 1); Read_Num++; usb_p += 3; } usb_p = SPI_Rec_BUFF; while(Max_SendNum--) { USBD_HID_SendReport(&USB_Device_dev, usb_p, MY_DEF_PACKET); usb_p += 64; } usb_p = SPI_Rec_BUFF; } while(SysData.Start_Rec <= SysInfo.REC_HalfPages) { SPI_Flash_ReadDate((u8 *)&SPI_Rec_BUFF, SysData.Start_Rec - 1); SysData.Start_Rec++; USBD_HID_SendReport(&USB_Device_dev, usb_p, 3); } for(loopi = 0; loopi < 64; loopi++)SPI_Rec_BUFF[loopi] = 0xff; USBD_HID_SendReport(&USB_Device_dev, SPI_Rec_BUFF, MY_DEF_PACKET);//选择日期框 USB_Busy = 0; Delayms(1500); } } void USB_Pro(void) { USB_Correspondence(); } void Save_Rec(void) { SysInfo.REC_HalfPages++; if(SysInfo.REC_HalfPages > MAX_REC_Pages) { //擦除前半个芯片 SysData.FlashNum = 1; SysFlag.EraseDoing = 1; SPI_Flash_EraseChip(); SysFlag.EraseDoing = 0; if(SysFlag.PWD) { SysInfo.PWRON_Erase = 1; Save_Param(&SysInfo.PWRON_Erase, sizeof(SysInfo.PWRON_Erase)); return; } if(SysInfo.ChipStart == 0) SysInfo.ChipStart = 1; //FLASH2为起始 else SysInfo.ChipStart = 0; //FLASH1为起始 Save_Param(&SysInfo.ChipStart, sizeof(SysInfo.ChipStart)); SysInfo.REC_HalfPages = MAX_PAGE + 1; } //一定要先保存页数,这样在写的时候断电,下次开机会自动跳到新的一页写,不会去覆盖未写完的那一页 Save_Param(&SysInfo.REC_HalfPages, sizeof(SysInfo.REC_HalfPages)); SPI_Flash_WriteHalfPage((u8 *)&Storage.Header, SysInfo.REC_HalfPages - 1); } void Check_Time(void) { if((Time_Bak.second == 59) && (Time_Dec.second == 0)) { if(Time_Bak.minute == Time_Dec.minute) { Get_Time(); return; } else if((Time_Bak.minute == 59) && (Time_Dec.minute == 0)) { if(Time_Bak.hour == Time_Dec.hour) { Get_Time(); return; } } } } void Save_Data(void) { Get_Time(); if(Time_Bak.second != Time_Dec.second) { Check_Time(); Time_Bak.year = Time_Dec.year ; Time_Bak.month = Time_Dec.month; Time_Bak.day = Time_Dec.day ; Time_Bak.hour = Time_Dec.hour ; Time_Bak.minute = Time_Dec.minute ; Time_Bak.second = Time_Dec.second ; SysData.SaveTime2s++; } else return; if(SysData.SaveTime2s < 2) { return; } SysData.SaveTime2s = 0; Storage.Result[SysData.Save_Cnt] = SysData.MaxTEMP_Save; SysData.MaxTEMP_Save = 0; if(SysData.Save_Cnt == 0) { //先获取时间 Storage.Header = 0XFD; Storage.Machine_State = 0; if(SysData.Freq_Weight == C_WEIGHT) { Storage.Machine_State |= 0X10; } if(SysData.Freq_Resp == FAST_RESP) { Storage.Machine_State |= 0X40; } Storage.Year = Time_Hex.year; Storage.Month = Time_Hex.month; Storage.Day = Time_Hex.day; Storage.Hour = Time_Hex.hour; Storage.Minute = Time_Hex.minute; Storage.Second = Time_Hex.second; } SysData.Save_Cnt++; if(SysData.Save_Cnt >= 60) { SysData.Save_Cnt = 0; if(SysFlag.PWD == 0) { Save_Rec(); } } } void USB_Decode(void) { uint8_t test_x1 = 0; uint8_t Buff_Test1[64]; switch(Report_buf[0]) { case 0xb4: SysFlag.GetDate = 1; break; case 0xA3: //读时间 Get_Time(); Send_Buffer[5] = Time_Hex.second; Send_Buffer[4] = Time_Hex.minute; Send_Buffer[3] = Time_Hex.hour; Send_Buffer[2] = Time_Hex.day; Send_Buffer[1] = Time_Hex.month; Send_Buffer[0] = Time_Hex.year; USBD_HID_SendReport (&USB_Device_dev, Send_Buffer, MY_DEF_PACKET); break; case 0xb3: Send_Buffer[0] = SysData.TEMP_Disp >> 8; Send_Buffer[1] = SysData.TEMP_Disp & 0x00ff; Send_Buffer[2] = 0;//这部分应改为温度 Send_Buffer[3] = SysData.HUMI_Disp >> 8; Send_Buffer[4] = SysData.HUMI_Disp & 0x00ff; Send_Buffer[5] = 0;//添加这部分为湿度 if(SysData.Freq_Resp == FAST_RESP) { Send_Buffer[2] |= 0x40; } Send_Buffer[2] |= 0x00;//默认范围30-130 Send_Buffer[3] = 0; USBD_HID_SendReport (&USB_Device_dev, Send_Buffer, MY_DEF_PACKET); break; case 0xb5://点击导入弹出的选项 Send_Buffer[0] = 0xfe; if(SysInfo.REC_HalfPages) { Send_Buffer[0] = 0xef; Send_Buffer[1] = SysInfo.REC_HalfPages >> 24; Send_Buffer[2] = (SysInfo.REC_HalfPages >> 16) & 0xff; Send_Buffer[3] = (SysInfo.REC_HalfPages >> 8) & 0xff; Send_Buffer[4] = SysInfo.REC_HalfPages & 0xff; } USBD_HID_SendReport (&USB_Device_dev, Send_Buffer, MY_DEF_PACKET); break; case 0xc4: //导入记录就等于0xc4 SysFlag.GetRec = 1; SysData.Start_Rec = (Report_buf[1] << 24) | (Report_buf[2] << 16) | (Report_buf[3] << 8 ) | Report_buf[4]; SysData.End_Rec = (Report_buf[5] << 24) | (Report_buf[6] << 16) | (Report_buf[7] << 8 ) | Report_buf[8]; if((SysData.End_Rec - SysData.Start_Rec) >= 720) { SysData.End_Rec = SysData.Start_Rec + 720 - 1; } Delayms(500); break; case 0x7c: Time_Hex.second = Report_buf[1]; Time_Hex.minute = Report_buf[2]; Time_Hex.hour = Report_buf[3]; Time_Hex.day = Report_buf[4]; Time_Hex.month = Report_buf[5]; Time_Hex.year = Report_buf[6]; Save_TimeDate(); break; case 0x56: break; } } void USBD_HID_SendReport (u8 *NoUse, u8 *Buff, u8 Num) { u32 loopi = 0; PrevXferComplete = 0; USB_SilWrite(EP1_IN, Buff, Num); _SetEPTxStatus(ENDP1, EP_TX_VALID); while(PrevXferComplete != 1 && loopi < 100) //10ms超时等待 { loopi++; Delayus(100); } } 现在要做的是把原来有关噪音的部分替换成温湿度的,还有usb部分
最新发布
06-24
这是一个按键的代码 void ALM_Key_Pro(PRESS_MODE_TypeDef Press_Mode) { if(SysData.Cal_Mode) { if(SysData.Freq_Weight == C_WEIGHT) { SysData.Freq_Weight = A_WEIGHT; FREQ_WEIGHT_A; Disp_All(); Delayms(2000); } else { SysFlag.Cal_En = 1; Cal_Pro(); } return; } switch(SysData.Sys_State) { case MAIN_STATE: switch(Press_Mode) { case SHORT_PRESS: if(Press_Mode != SHORT_PRESS)break; //报警开关 if(SysData.ALM_EN == ENABLE) { Close_Alm(); SysData.ALM_EN = DISABLE; LED_2_OFF; //yanggj } else { SysData.ALM_EN = ENABLE; } SysInfo.AlmPara.Struct_Para.Alm_Switch = SysData.ALM_EN; Save_Param(&SysInfo.AlmPara, sizeof(SysInfo.AlmPara)); break; case LONG_PRESS: Close_Alm(); SysData.WaitReleaseKey = 0; SysData.Save_Cnt = 0; SysData.Sys_State = SET_STATE; SysData.Set_State = SET_ALM; SysData.SET_Value = SysData.Alm / 10; SysFlag.DispSetEn = 1; Time_Set.year = Time_Dec.year; Time_Set.month = Time_Dec.month; Time_Set.day = Time_Dec.day; Time_Set.hour = Time_Dec.hour; Time_Set.minute = Time_Dec.minute; Time_Set.second = Time_Dec.second; break; } break; case SET_STATE://设置状态 switch(SysData.Set_State) { case SET_ALM: SysData.Alm = SysData.SET_Value * 10; SysInfo.AlmPara.Struct_Para.Alm_Value = SysData.Alm; SysData.SET_Value = SysInfo.AlmPara.Struct_Para.Alm_Time; SysData.Set_State = SET_ALM_TIME; LED_2_OFF; Save_Param(&SysInfo.AlmPara, sizeof(SysInfo.AlmPara)); break; case SET_ALM_TIME: SysData.Alm_Time = SysData.SET_Value; SysInfo.AlmPara.Struct_Para.Alm_Time = SysData.Alm_Time; SysData.Set_State = SET_ALM_Type; SysData.SET_Value = SysInfo.AlmPara.Struct_Para.Alm_Type; Save_Param(&SysInfo.AlmPara, sizeof(SysInfo.AlmPara)); break; case SET_ALM_Type: SysData.Alm_Type = SysData.SET_Value; SysInfo.AlmPara.Struct_Para.Alm_Type = SysData.Alm_Type; switch(SysData.Alm_Type) { case 1: Set_Buzz_Pluse(BUZZ_0_LEVEL); break; case 2: Set_Buzz_Pluse(BUZZ_1_LEVEL); break; case 3: Set_Buzz_Pluse(BUZZ_2_LEVEL); break; } SysData.Set_State = SET_YEAR; SysData.SET_Value = Time_Set.year; Save_Param(&SysInfo.AlmPara, sizeof(SysInfo.AlmPara)); break; case SET_YEAR: Time_Set.year = SysData.SET_Value; Time_Hex.year = ((Time_Set.year / 10) << 4) | (Time_Set.year % 10); Save_TimeDate(); SysData.SET_Value = Time_Set.month; SysData.Set_State = SET_MONTH; break; case SET_MONTH: Time_Set.month = SysData.SET_Value; Time_Hex.month = ((Time_Set.month / 10) << 4) | (Time_Set.month % 10); Save_TimeDate(); SysData.SET_Value = Time_Set.day; SysData.Set_State = SET_DAY; break; case SET_DAY: Time_Set.day = SysData.SET_Value; Time_Hex.day = ((Time_Set.day / 10) << 4) | (Time_Set.day % 10); Save_TimeDate(); SysData.SET_Value = Time_Set.hour; SysData.Set_State = SET_HOUR; break; case SET_HOUR: Time_Set.hour = SysData.SET_Value; Time_Hex.hour = ((Time_Set.hour / 10) << 4) | (Time_Set.hour % 10); Save_TimeDate(); SysData.SET_Value = Time_Set.minute; SysData.Set_State = SET_MINUTE; break; case SET_MINUTE: Time_Set.minute = SysData.SET_Value; Time_Hex.minute = ((Time_Set.minute / 10) << 4) | (Time_Set.minute % 10); Save_TimeDate(); SysData.SET_Value = Time_Set.second; SysData.Set_State = SET_SECOND; break; case SET_SECOND: Time_Set.second = SysData.SET_Value; Time_Hex.second = ((Time_Set.second / 10) << 4) | (Time_Set.second % 10); Save_TimeDate(); //保存时间日期 if(SysData.ALM_EN == ENABLE) //yanggj { LED_2_ON; } else { LED_2_OFF; } Close_Alm(); SysData.Save_Cnt = 0; SysData.Sys_State = MAIN_STATE; SysData.Set_State = SET_ALM; SysData.WaitReleaseKey = 0; break; case SET_ALM_CLOCK_HOUR: SysData.Set_State = SET_ALM_CLOCK_MINUTE; SysData.SET_Value = SysInfo.AlarmClockInfo.minute; break; case SET_ALM_CLOCK_MINUTE: SysData.Set_State = SET_ALM_CLOCK_EN; //SysData.SET_Value = SysInfo.AlarmClockInfo.enabled; break; case SET_ALM_CLOCK_EN: //SysInfo.AlarmClockInfo.enabled = SysData.SET_Value; SysData.Set_State = SET_ALM; SysData.Sys_State = MAIN_STATE; Para_Save(); break; } break; } } void Disp_Set(void) { u32 Tmp; if((SysData.Sys_State != SET_STATE) || ((SysData.Sys_State == SET_STATE) && (SysData.Set_State > SET_SECOND))) return; if((SysFlag.FlickEn) && (SysFlag.LCDFlick == 0) && ((SysData.Set_State == SET_ALM_TIME) || (SysData.Set_State == SET_ALM_Type) || (SysData.Set_State == SET_ALM))) { Disp_Clear(); return; } SysFlag.DispSetEn = 0; Tmp = SysData.SET_Value; HexToBcd(Tmp); Fill_Data(); if(MainData[0] == 0) { MainData[0] = 10;//空 if((SysData.Set_State == SET_ALM_TIME) || (SysData.Set_State == SET_ALM_Type) || (SysData.Set_State == SET_ALM)) { if(MainData[1] == 0) MainData[1] = 10; } if(SysFlag.LCDFlick) { switch(SysData.Set_State) { case SET_YEAR: MainData[0] = 18;//年 break; case SET_MONTH: MainData[0] = 19;//月 break; case SET_DAY: MainData[0] = 20;//日 break; case SET_HOUR: MainData[0] = 21;//时 break; case SET_MINUTE: MainData[0] = 22;//分 break; case SET_SECOND: MainData[0] = 23;//秒 break; } } } // MainData[2]=Font_TAB_10_8_6[MainData[0]]; // MainData[1]=Font_TAB_11_9_7[MainData[1]]; // MainData[0]=Font_TAB_10_8_6[MainData[2]]; Disp_LCD(); } 这个是对应的显示的代码 #ifndef __TYPE_H #define __TYPE_H #include "main.h" typedef enum { RANG_70DB = 0x00, RANG_100DB = 0x01, RANG_130DB = 0x02 } MEA_RANGE_TypeDef; //typedef enum //{ // POINT_100DB = 0x00, // POINT_70DB = 0x01, // POINT_40DB = 0x02 //} CAL_POINT_TypeDef; typedef enum { SHORT_PRESS = 0x00, LONG_PRESS = 0x01, } PRESS_MODE_TypeDef; typedef enum { A_WEIGHT = 0x00, C_WEIGHT = 0x01, } FREQ_WEIGHT_TypeDef; typedef enum { FAST_RESP = 0x00, SLOW_RESP = 0x01, } FREQ_RESP_TypeDef; typedef enum { MAIN_STATE = 0x00, SET_STATE = 0x01, } SYS_STATE_TypeDef; typedef enum { SET_ALM = 0x00 , SET_ALM_TIME , SET_ALM_Type , SET_YEAR , SET_MONTH , SET_DAY , SET_HOUR , SET_MINUTE , SET_SECOND , SET_ALM_CLOCK_HOUR , SET_ALM_CLOCK_MINUTE , SET_ALM_CLOCK_EN , } SET_STATE_TypeDef; typedef enum { NO_OUT_RANGE = 0x00, OVER_RANGE = 0x01, UNDER_RANGE = 0x02, } OUT_RANGE_TypeDef; typedef struct { u8 KeyAge : 8; u8 KeyPress : 4; u8 KeyProcessed : 4; GPIO_Module *KeyPort; uint16_t KeyPin; void (*fun) (PRESS_MODE_TypeDef); } SysKey; typedef struct { u8 First_Press; u8 Mea_OK; u8 EEPROM_ERR; u8 SPIFlashErr; u8 Cal_Finish; // u8 Cal_DB_Finish; u8 Cal_En; u8 DispSetEn; u8 LCDFlick; u8 FlickEn; u8 RecFull; u8 Alarms; u8 UpOver; u8 ClockSoundEn; u8 GetRec; u8 BiBiBi; u8 Nop; u8 GetDate; u8 Test; u8 PWD, PWDErr; u8 EraseDoing; u8 UsbCmdLen; u8 SensorType; //温湿度传感器类型 u8 DMA_OK; u8 shutdown; u8 showLcd; } FLAG_TYPE; typedef struct { double ADC_VALUE[3]; double ADC_Sum_Value; u32 ADC_INT_Value; u16 ADC_CNT; u16 DB_Disp; u32 ADC_INT_Value_TAB[8]; u32 CAL_INT_Value; u16 Disp_ALM; //CAL u8 ADC_TAB_CNT; u8 Cal_Mode; //系统状态 // CAL_POINT_TypeDef Cal_DB_Point; FREQ_WEIGHT_TypeDef Freq_Weight; FREQ_RESP_TypeDef Freq_Resp; SYS_STATE_TypeDef Sys_State; OUT_RANGE_TypeDef Mea_Range; MEA_RANGE_TypeDef Adc_Range; SET_STATE_TypeDef Set_State; FunctionalState ALM_EN; u8 SaveCnt_2s; u16 Wait; u8 DispDB_Cnt; u8 CalEn; s16 SET_Value; u16 Save_2s_Data[14]; u32 Start_Rec;//1开始 但是程序中所有的变量 统一从0开始 所以在使用时要-1 u32 End_Rec;//1开始 但是程序中所有的变量 统一从0开始 所以在使用时要-1 u8 Cal_Step; u8 Save_Cnt; u8 FlashNum; u8 WaitReleaseKey; u32 OverCntt[3]; u8 Alm_Time; u8 Alm_Type; u16 Alm; u16 MaxDB_Save; u8 SaveTime2s; u8 DMA_Group; u8 BattCnt; u16 BattBuff[64]; u32 Batt; u8 Units; // 0: 摄氏度, 1: 华氏度 } DATA_TYPE; typedef struct { unsigned char year ; unsigned char month ; unsigned char day ; unsigned char hour ; unsigned char minute ; unsigned char second ; } DATE_TIME; typedef struct { unsigned char hour ; unsigned char minute ; unsigned char second ; unsigned char enabled ; } TIME_INFO; typedef union { u32 Mem; struct { u16 Alm_Value : 16; u8 Alm_Switch : 4; u8 Alm_Type : 4; u8 Alm_Time : 8; } Struct_Para; } UNION_PARA; typedef struct { u16 ID; u16 ChipStart; u32 REC_HalfPages;//从0开始 0至MAX_REC_Pages-1 int16_t Cal_Adc[3]; // int16_t Cal_DB[3]; int32_t Cal_Adc_Squ[3]; UNION_PARA AlmPara; u8 PWRON_Erase; u8 AlarmClockOk;//产生报警 TIME_INFO AlarmClockInfo; } SYS_INFO; //128 typedef struct { u8 Header; u8 Machine_State; u8 Year ; u8 Month ; u8 Day ; u8 Hour ; u8 Minute ; u8 Second ; u16 Result[60]; //Noise_Result: Freq_Weight + Freq_Respon + DB_Value 存储用 } STORAGE; #endif 这个是定义的结构和变量 void UP_Key_Pro(PRESS_MODE_TypeDef Press_Mode) { u16 Tmp; switch(SysData.Sys_State) { case MAIN_STATE: // if(SysData.Cal_Mode) break; // if(Press_Mode!=SHORT_PRESS)break; // // switch(SysData.Freq_Weight) // { // case A_WEIGHT: // SysData.Freq_Weight = C_WEIGHT; // FREQ_WEIGHT_C; // break; // // case C_WEIGHT: // SysData.Freq_Weight = A_WEIGHT; // FREQ_WEIGHT_A; // break; // } // SysData.Save_Cnt=0; // Disp_State(DISP_FREQ_WEIGHT); break; case SET_STATE: if(Press_Mode == LONG_PRESS) { KEy[Num_Up].KeyProcessed = 0; Tmp = KeyOffset; } else { Tmp = 1; } // if(SysFlag.DispSetEn) // { // break; // } SysFlag.FlickEn = 0; SysData.SET_Value += Tmp; SysData.WaitReleaseKey = 0; Check_Set(); Disp_AlarmClockSet(); SysFlag.DispSetEn = 1; break; } } void DOWN_Key_Pro(PRESS_MODE_TypeDef Press_Mode) { u16 Tmp; switch(SysData.Sys_State) { case MAIN_STATE: //主界面温度切换 if(Press_Mode==LONG_PRESS) { SysData.Units = !SysData.Units; Tmp = KeyOffset; } break; case SET_STATE: if(Press_Mode==LONG_PRESS) { KEy[Num_Down].KeyProcessed=0; Tmp = KeyOffset; } else { Tmp=1; } SysFlag.FlickEn=0;//长按不允许闪烁 SysData.SET_Value-=Tmp; SysData.WaitReleaseKey=0; Check_Set(); Disp_AlarmClockSet(); SysFlag.DispSetEn=1; break; } } 这个是上下键的代码 现在的要求是,原来进入到设置页面时,第一个调整的值是噪音的报警值,第二个是报警时长,第三个是报警模式,现在要把第一个调整的值改成温湿度的报警值设置,其它不变,怎么修改
06-20
void Get_AD_SUM(void) { uint64_t Sum[3] = {0, 0, 0}; //这里有3种计算,分别是sum[0],sum[1],sum[2] u8 Ratio; u16 loopi, *Data; u32 Temp; Data = Noise_Data.Buff1;//将DMA移过来的地址给Data if(SysData.DMA_Group != 0) Data = Noise_Data.Buff0;//将DMA移过来的地址给Data SysData.BattCnt = 0; //sum[0] for(loopi = 0; loopi < DMA_CAL_BUFF_SIZE; loopi += 4) //循环480/3=150次 { Temp = (u32)(*Data); //将Noise_Data.Buff1的值给Temp Data++;//地址++ if(Temp > ADC_HLimit) SysData.OverCntt[0]++; //如果Temp>2482,数据溢出的标志位++,这个数据溢出的标志位也有3种,用数组来表示 Temp = Temp + (s32)SysInfo.Cal_Adc[0];// 这个应该是存放校准后的ADC if(Temp > 0x80000000)Temp = 0; Temp = Temp * Temp; //不知道平方一次是用来干啥的 Sum[0] += (uint64_t)Temp; //计算总和,存到sum[0] //sum[1] Temp = (u32)(*Data); Data++; if(Temp > ADC_HLimit_H) SysData.OverCntt[1]++; Temp = Temp + (s32)SysInfo.Cal_Adc[1]; if(Temp > 0x80000000)Temp = 0; Temp = Temp * Temp; Sum[1] += (uint64_t)Temp; //计算总和,存到sum[1] //sum[2] Temp = (u32)(*Data); Data++; Temp = Temp + (s32)SysInfo.Cal_Adc[2]; if(Temp > 0x80000000) Temp = 0; Temp = Temp * Temp; Sum[2] += (uint64_t)Temp; //计算总和,存到sum[2] if(SysData.BattCnt < 64) { SysData.BattBuff[SysData.BattCnt++] = *Data; } Data++; } SysData.Batt = 0; for(loopi = 0; loopi < 64; loopi++) { SysData.Batt += SysData.BattBuff[loopi]; } SysData.Batt = SysData.Batt / 64; //报警时低于3.3V不关机问题,电源检测这里添加关机 if(SysData.Batt < BattSHUT) { Shut_Down(); } //将计算的总和,存到SysData.ADC_VALUE SysData.ADC_VALUE[0] += (double)Sum[0]; SysData.ADC_VALUE[1] += (double)Sum[1]; SysData.ADC_VALUE[2] += (double)Sum[2]; SysData.ADC_CNT++; Ratio = SysData.Freq_Resp * 7 + 1; //不知道这2句是干嘛的 if(SysData.ADC_CNT >= (SMP_DMA_CNT * Ratio)) { SysData.ADC_CNT = 0; // if(SysData.Cal_Mode == 0) // { // if(SysData.OverCntt[0] < MIN_OVER_CNT) //溢出计数判断 // { // SysData.Adc_Range = RANG_70DB; // } // else if(SysData.OverCntt[1] < MIN_OVER_CNT) // { // SysData.Adc_Range = RANG_100DB; // } // else // { // SysData.Adc_Range = RANG_130DB; // } // } SysData.ADC_Sum_Value = (SysData.ADC_VALUE[SysData.Adc_Range] / (float)Ratio) + SysInfo.Cal_Adc_Squ[SysData.Adc_Range]; if(SysData.ADC_Sum_Value < 0) { ; } else { // Get_Noise_Data(); } SysData.ADC_VALUE[0] = 0; SysData.ADC_VALUE[1] = 0; SysData.ADC_VALUE[2] = 0; SysData.OverCntt[0] = 0; SysData.OverCntt[1] = 0; SysData.OverCntt[2] = 0; } } 这是获取adc值的函数 //读出温湿度 void SHT30_read_result(u8 addr, u8 type) { int ret = 0; u16 tem, hum; u16 buff[6]; //发送指令为0x2C06(默认) IIC_Start(); IIC_SendByte(addr << 1 | write); //写7位I2C设备地址加0作为写取位,1为写取位 IIC_wait_ACK(); if(type == TYPE_SHT40) { //SHT40 IIC_SendByte(0xFD); IIC_wait_ACK(); } else { //SHT30 IIC_SendByte(0x2c); IIC_wait_ACK(); IIC_SendByte(0x06); IIC_wait_ACK(); } IIC_Stop(); Delayms(50); IIC_Start(); IIC_SendByte(addr << 1 | read); //写7位I2C设备地址加1作为读取位,1为读取位 ret = IIC_wait_ACK(); if(!ret) { Delayus(1); buff[0] = IIC_RcvByte(); //返回温度高8位 IIC_ACK(); buff[1] = IIC_RcvByte(); //返回温度低8位 IIC_ACK(); buff[2] = IIC_RcvByte(); //温度crc校验位 IIC_ACK(); buff[3] = IIC_RcvByte(); //返回湿度高8位 IIC_ACK(); buff[4] = IIC_RcvByte(); //返回湿度低8位 IIC_ACK(); buff[5] = IIC_RcvByte(); //湿度crc校验位 IIC_NACK(); IIC_Stop(); } tem = ((buff[0] << 8) | buff[1]); hum = ((buff[3] << 8) | buff[4]); if(type == TYPE_SHT40) { //温湿度的计算方法如下 Temperature = 175.0 * (float)tem / 65535.0 - 45.0 ; Humidity = 125.0 * (float)hum / 65535.0 - 6; } else { //温湿度的计算方法如下 Temperature = 175.0 * (float)tem / 65535.0 - 45.0 ; Humidity = 100.0 * (float)hum / 65535.0; } hum = 0; tem = 0; } 这是有关温湿度传感器的一些,现在要做的是把获取的adc值换成温湿度
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值