欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
SHT30溫濕度傳感器 STM32F103 IIC程序源碼
[打印本頁]
作者:
cetcnav
時間:
2018-12-26 16:33
標題:
SHT30溫濕度傳感器 STM32F103 IIC程序源碼
1、程序功能
程序成功讀取到SHT30的溫濕度數據后,通過單片機的 串口1 將測得的溫濕度數據打印出來。(注:程序中有4個warning,無需理會)
2、硬件連接
單片機 SHT30模塊
PB14 ---------- SDA
PB13 ---------- SCL
聲明:程序是在 原子哥的例程--實驗4 串口實驗 基礎上修改的,感謝原子哥為大家提供了諸多stm32教程和例程。
單片機源程序如下:
//=============================================================================
// S E N S I R I O N AG, Laubisruetistr. 50, CH-8712 Staefa, Switzerland
//=============================================================================
// Project : SHT3x Sample Code (V1.1)
// File : sht3x.c (V1.1)
// Author : RFU
// Date : 6-Mai-2015
// Controller: STM32F100RB
// IDE : 礦ision V5.12.0.0
// Compiler : Armcc
// Brief : Sensor Layer: Implementation of functions for sensor access.
//=============================================================================
//-- Includes -----------------------------------------------------------------
#include "sht3x.h"
#include "i2c_hal.h"
//-- Defines ------------------------------------------------------------------
// Generator polynomial for CRC
#define POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
//=============================================================================
// IO-Pins /* -- adapt the defines for your uC -- */
//-----------------------------------------------------------------------------
// Reset on port B, bit 12
#define RESET_LOW() (GPIOB->BSRR = 0x10000000) // set Reset to low
#define RESET_HIGH() (GPIOB->BSRR = 0x00001000) // set Reset to high
// Alert on port B, bit 10
#define ALERT_READ (GPIOB->IDR & 0x0400) // read Alert
//=============================================================================
//-- Global variables ---------------------------------------------------------
static u8t _i2cAddress; // I2C Address
//-- Static function prototypes -----------------------------------------------
static etError SHT3X_WriteAlertLimitData(ft humidity, ft temperature);
static etError SHT3X_ReadAlertLimitData(ft* humidity, ft* temperature);
static etError SHT3X_StartWriteAccess(void);
static etError SHT3X_StartReadAccess(void);
static void SHT3X_StopAccess(void);
static etError SHT3X_WriteCommand(etCommands command);
static etError SHT3X_Read2BytesAndCrc(u16t* data, etI2cAck finaleAckNack,
u8t timeout);
static etError SHT3X_Write2BytesAndCrc(u16t data);
static u8t SHT3X_CalcCrc(u8t data[], u8t nbrOfBytes);
static etError SHT3X_CheckCrc(u8t data[], u8t nbrOfBytes, u8t checksum);
static ft SHT3X_CalcTemperature(u16t rawValue);
static ft SHT3X_CalcHumidity(u16t rawValue);
static u16t SHT3X_CalcRawTemperature(ft temperature);
static u16t SHT3X_CalcRawHumidity(ft humidity);
//-----------------------------------------------------------------------------
void SHT3X_Init(u8t i2cAddress) /* -- adapt the init for your uC -- */
{
// init I/O-pins
RCC->APB2ENR |= 0x00000008; // I/O port B clock enabled
// Alert on port B, bit 10
GPIOB->CRH &= 0xFFFFF0FF; // set floating input for Alert-Pin
GPIOB->CRH |= 0x00000400; //
// Reset on port B, bit 12
GPIOB->CRH &= 0xFFF0FFFF; // set push-pull output for Reset pin
GPIOB->CRH |= 0x00010000; //
RESET_LOW();
I2c_Init(); // init I2C
SHT3X_SetI2cAdr(i2cAddress);
// release reset
RESET_HIGH();
}
//-----------------------------------------------------------------------------
void SHT3X_SetI2cAdr(u8t i2cAddress)
{
_i2cAddress = i2cAddress;
}
//-----------------------------------------------------------------------------
etError SHT3x_ReadSerialNumber(u32t* serialNumber)
{
etError error; // error code
u16t serialNumWords[2];
error = SHT3X_StartWriteAccess();
// write "read serial number" command
error |= SHT3X_WriteCommand(CMD_READ_SERIALNBR);
// if no error, start read access
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
// if no error, read first serial number word
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&serialNumWords[0], ACK, 100);
// if no error, read second serial number word
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&serialNumWords[1], NACK, 0);
SHT3X_StopAccess();
// if no error, calc serial number as 32-bit integer
if(error == NO_ERROR)
{
*serialNumber = (serialNumWords[0] << 16) | serialNumWords[1];
}
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_ReadStatus(u16t* status)
{
etError error; // error code
error = SHT3X_StartWriteAccess();
// if no error, write "read status" command
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_READ_STATUS);
// if no error, start read access
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
// if no error, read status
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(status, NACK, 0);
SHT3X_StopAccess();
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_ClearAllAlertFlags(void)
{
etError error; // error code
error = SHT3X_StartWriteAccess();
// if no error, write clear status register command
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_CLEAR_STATUS);
SHT3X_StopAccess();
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_GetTempAndHumi(ft* temperature, ft* humidity,
etRepeatability repeatability, etMode mode,
u8t timeout)
{
etError error;
switch(mode)
{
case MODE_CLKSTRETCH: // get temperature with clock stretching mode
error = SHT3X_GetTempAndHumiClkStretch(temperature, humidity,
repeatability, timeout);
break;
case MODE_POLLING: // get temperature with polling mode
error = SHT3X_GetTempAndHumiPolling(temperature, humidity,
repeatability, timeout);
break;
default:
error = PARM_ERROR;
break;
}
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_GetTempAndHumiClkStretch(ft* temperature, ft* humidity,
etRepeatability repeatability,
u8t timeout)
{
etError error; // error code
u16t rawValueTemp; // temperature raw value from sensor
u16t rawValueHumi; // humidity raw value from sensor
error = SHT3X_StartWriteAccess();
// if no error ...
if(error == NO_ERROR)
{
// start measurement in clock stretching mode
// use depending on the required repeatability, the corresponding command
switch(repeatability)
{
case REPEATAB_LOW:
error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_L);
break;
case REPEATAB_MEDIUM:
error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_M);
break;
case REPEATAB_HIGH:
error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_H);
break;
default:
error = PARM_ERROR;
break;
}
}
// if no error, start read access
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
// if no error, read temperature raw values
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&rawValueTemp, ACK, timeout);
// if no error, read humidity raw values
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&rawValueHumi, NACK, 0);
SHT3X_StopAccess();
// if no error, calculate temperature in 癈 and humidity in %RH
if(error == NO_ERROR)
{
*temperature = SHT3X_CalcTemperature(rawValueTemp);
*humidity = SHT3X_CalcHumidity(rawValueHumi);
}
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_GetTempAndHumiPolling(ft* temperature, ft* humidity,
etRepeatability repeatability,
u8t timeout)
{
etError error; // error code
u16t rawValueTemp; // temperature raw value from sensor
u16t rawValueHumi; // humidity raw value from sensor
error = SHT3X_StartWriteAccess();
// if no error ...
if(error == NO_ERROR)
{
// start measurement in polling mode
// use depending on the required repeatability, the corresponding command
switch(repeatability)
{
case REPEATAB_LOW:
error = SHT3X_WriteCommand(CMD_MEAS_POLLING_L);
break;
case REPEATAB_MEDIUM:
error = SHT3X_WriteCommand(CMD_MEAS_POLLING_M);
break;
case REPEATAB_HIGH:
error = SHT3X_WriteCommand(CMD_MEAS_POLLING_H);
break;
default:
error = PARM_ERROR;
break;
}
}
// if no error, wait until measurement ready
if(error == NO_ERROR)
{
// poll every 1ms for measurement ready until timeout
while(timeout--)
{
// check if the measurement has finished
error = SHT3X_StartReadAccess();
// if measurement has finished -> exit loop
if(error == NO_ERROR) break;
// delay 1ms
DelayMicroSeconds(1000);
}
// check for timeout error
if(timeout == 0) error = TIMEOUT_ERROR;
}
// if no error, read temperature and humidity raw values
if(error == NO_ERROR)
{
error |= SHT3X_Read2BytesAndCrc(&rawValueTemp, ACK, 0);
error |= SHT3X_Read2BytesAndCrc(&rawValueHumi, NACK, 0);
}
SHT3X_StopAccess();
// if no error, calculate temperature in 癈 and humidity in %RH
if(error == NO_ERROR)
{
*temperature = SHT3X_CalcTemperature(rawValueTemp);
*humidity = SHT3X_CalcHumidity(rawValueHumi);
}
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_StartPeriodicMeasurment(etRepeatability repeatability,
etFrequency frequency)
{
etError error; // error code
error = SHT3X_StartWriteAccess();
// if no error, start periodic measurement
if(error == NO_ERROR)
{
// use depending on the required repeatability and frequency,
// the corresponding command
switch(repeatability)
{
case REPEATAB_LOW: // low repeatability
switch(frequency)
{
case FREQUENCY_HZ5: // low repeatability, 0.5 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_05_L);
break;
case FREQUENCY_1HZ: // low repeatability, 1.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_1_L);
break;
case FREQUENCY_2HZ: // low repeatability, 2.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_2_L);
break;
case FREQUENCY_4HZ: // low repeatability, 4.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_4_L);
break;
case FREQUENCY_10HZ: // low repeatability, 10.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_10_L);
break;
default:
error |= PARM_ERROR;
break;
}
break;
case REPEATAB_MEDIUM: // medium repeatability
switch(frequency)
{
case FREQUENCY_HZ5: // medium repeatability, 0.5 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_05_M);
break;
case FREQUENCY_1HZ: // medium repeatability, 1.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_1_M);
break;
case FREQUENCY_2HZ: // medium repeatability, 2.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_2_M);
break;
case FREQUENCY_4HZ: // medium repeatability, 4.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_4_M);
break;
case FREQUENCY_10HZ: // medium repeatability, 10.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_10_M);
break;
default:
error |= PARM_ERROR;
break;
}
break;
case REPEATAB_HIGH: // high repeatability
switch(frequency)
{
case FREQUENCY_HZ5: // high repeatability, 0.5 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_05_H);
break;
case FREQUENCY_1HZ: // high repeatability, 1.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_1_H);
break;
case FREQUENCY_2HZ: // high repeatability, 2.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_2_H);
break;
case FREQUENCY_4HZ: // high repeatability, 4.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_4_H);
break;
case FREQUENCY_10HZ: // high repeatability, 10.0 Hz
error |= SHT3X_WriteCommand(CMD_MEAS_PERI_10_H);
break;
default:
error |= PARM_ERROR;
break;
}
break;
default:
error |= PARM_ERROR;
break;
}
}
SHT3X_StopAccess();
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_ReadMeasurementBuffer(ft* temperature, ft* humidity)
{
etError error; // error code
u16t rawValueTemp; // temperature raw value from sensor
u16t rawValueHumi; // humidity raw value from sensor
error = SHT3X_StartWriteAccess();
// if no error, read measurements
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_FETCH_DATA);
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&rawValueTemp, ACK, 0);
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&rawValueHumi, NACK, 0);
// if no error, calculate temperature in 癈 and humidity in %RH
if(error == NO_ERROR)
{
*temperature = SHT3X_CalcTemperature(rawValueTemp);
*humidity = SHT3X_CalcHumidity(rawValueHumi);
}
SHT3X_StopAccess();
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_EnableHeater(void)
{
etError error; // error code
error = SHT3X_StartWriteAccess();
// if no error, write heater enable command
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_HEATER_ENABLE);
SHT3X_StopAccess();
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_DisableHeater(void)
{
etError error; // error code
error = SHT3X_StartWriteAccess();
// if no error, write heater disable command
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_HEATER_DISABLE);
SHT3X_StopAccess();
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_SetAlertLimits(ft humidityHighSet, ft temperatureHighSet,
ft humidityHighClear, ft temperatureHighClear,
ft humidityLowClear, ft temperatureLowClear,
ft humidityLowSet, ft temperatureLowSet)
{
etError error; // error code
// write humidity & temperature alter limits, high set
error = SHT3X_StartWriteAccess();
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_W_AL_LIM_HS);
if(error == NO_ERROR) error = SHT3X_WriteAlertLimitData(humidityHighSet,
temperatureHighSet);
SHT3X_StopAccess();
if(error == NO_ERROR)
{
// write humidity & temperature alter limits, high clear
error = SHT3X_StartWriteAccess();
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_W_AL_LIM_HC);
if(error == NO_ERROR) error = SHT3X_WriteAlertLimitData(humidityHighClear,
temperatureHighClear);
SHT3X_StopAccess();
}
if(error == NO_ERROR)
{
// write humidity & temperature alter limits, low clear
error = SHT3X_StartWriteAccess();
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_W_AL_LIM_LC);
if(error == NO_ERROR) error = SHT3X_WriteAlertLimitData(humidityLowClear,
temperatureLowClear);
SHT3X_StopAccess();
}
if(error == NO_ERROR)
{
// write humidity & temperature alter limits, low set
error = SHT3X_StartWriteAccess();
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_W_AL_LIM_LS);
if(error == NO_ERROR) error = SHT3X_WriteAlertLimitData(humidityLowSet,
temperatureLowSet);
SHT3X_StopAccess();
}
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_GetAlertLimits(ft* humidityHighSet, ft* temperatureHighSet,
ft* humidityHighClear, ft* temperatureHighClear,
ft* humidityLowClear, ft* temperatureLowClear,
ft* humidityLowSet, ft* temperatureLowSet)
{
etError error; // error code
// read humidity & temperature alter limits, high set
error = SHT3X_StartWriteAccess();
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_R_AL_LIM_HS);
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
if(error == NO_ERROR) error = SHT3X_ReadAlertLimitData(humidityHighSet,
temperatureHighSet);
SHT3X_StopAccess();
if(error == NO_ERROR)
{
// read humidity & temperature alter limits, high clear
error = SHT3X_StartWriteAccess();
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_R_AL_LIM_HC);
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
if(error == NO_ERROR) error = SHT3X_ReadAlertLimitData(humidityHighClear,
temperatureHighClear);
SHT3X_StopAccess();
}
if(error == NO_ERROR)
{
// read humidity & temperature alter limits, low clear
error = SHT3X_StartWriteAccess();
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_R_AL_LIM_LC);
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
if(error == NO_ERROR) error = SHT3X_ReadAlertLimitData(humidityLowClear,
temperatureLowClear);
SHT3X_StopAccess();
}
if(error == NO_ERROR)
{
// read humidity & temperature alter limits, low set
error = SHT3X_StartWriteAccess();
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_R_AL_LIM_LS);
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
if(error == NO_ERROR) error = SHT3X_ReadAlertLimitData(humidityLowSet,
temperatureLowSet);
SHT3X_StopAccess();
}
return error;
}
//-----------------------------------------------------------------------------
bt SHT3X_ReadAlert(void)
{
// read alert pin
return (ALERT_READ != 0) ? TRUE : FALSE;
}
//-----------------------------------------------------------------------------
etError SHT3X_SoftReset(void)
{
etError error; // error code
error = SHT3X_StartWriteAccess();
// write reset command
error |= SHT3X_WriteCommand(CMD_SOFT_RESET);
SHT3X_StopAccess();
// if no error, wait 50 ms after reset
if(error == NO_ERROR) DelayMicroSeconds(50000);
return error;
}
//-----------------------------------------------------------------------------
void SHT3X_HardReset(void)
{
// set reset low
RESET_LOW();
// wait 100 ms
DelayMicroSeconds(100000);
// release reset
RESET_HIGH();
// wait 50 ms after reset
DelayMicroSeconds(50000);
}
//-----------------------------------------------------------------------------
static etError SHT3X_WriteAlertLimitData(ft humidity, ft temperature)
{
etError error; // error code
i16t rawHumidity;
i16t rawTemperature;
if((humidity < 0.0f) || (humidity > 100.0f)
|| (temperature < -45.0f) || (temperature > 130.0f))
{
error = PARM_ERROR;
}
else
{
rawHumidity = SHT3X_CalcRawHumidity(humidity);
rawTemperature = SHT3X_CalcRawTemperature(temperature);
error = SHT3X_Write2BytesAndCrc((rawHumidity & 0xFE00) | ((rawTemperature >> 7) & 0x001FF));
}
return error;
}
//-----------------------------------------------------------------------------
static etError SHT3X_ReadAlertLimitData(ft* humidity, ft* temperature)
{
etError error; // error code
u16t data;
error = SHT3X_Read2BytesAndCrc(&data, NACK, 0);
if(error == NO_ERROR)
{
*humidity = SHT3X_CalcHumidity(data & 0xFE00);
*temperature = SHT3X_CalcTemperature(data << 7);
}
return error;
}
//-----------------------------------------------------------------------------
static etError SHT3X_StartWriteAccess(void)
{
etError error; // error code
// write a start condition
I2c_StartCondition();
// write the sensor I2C address with the write flag
error = I2c_WriteByte(_i2cAddress << 1);
return error;
}
//-----------------------------------------------------------------------------
static etError SHT3X_StartReadAccess(void)
{
etError error; // error code
// write a start condition
I2c_StartCondition();
// write the sensor I2C address with the read flag
error = I2c_WriteByte(_i2cAddress << 1 | 0x01);
return error;
}
//-----------------------------------------------------------------------------
static void SHT3X_StopAccess(void)
{
// write a stop condition
I2c_StopCondition();
}
//-----------------------------------------------------------------------------
static etError SHT3X_WriteCommand(etCommands command)
{
etError error; // error code
// write the upper 8 bits of the command to the sensor
error = I2c_WriteByte(command >> 8);
// write the lower 8 bits of the command to the sensor
error |= I2c_WriteByte(command & 0xFF);
return error;
}
//-----------------------------------------------------------------------------
static etError SHT3X_Read2BytesAndCrc(u16t* data, etI2cAck finaleAckNack,
u8t timeout)
{
etError error; // error code
u8t bytes[2]; // read data array
u8t checksum; // checksum byte
// read two data bytes and one checksum byte
error = I2c_ReadByte(&bytes[0], ACK, timeout);
if(error == NO_ERROR) error = I2c_ReadByte(&bytes[1], ACK, 0);
if(error == NO_ERROR) error = I2c_ReadByte(&checksum, finaleAckNack, 0);
// verify checksum
if(error == NO_ERROR) error = SHT3X_CheckCrc(bytes, 2, checksum);
// combine the two bytes to a 16-bit value
*data = (bytes[0] << 8) | bytes[1];
return error;
}
//-----------------------------------------------------------------------------
static etError SHT3X_Write2BytesAndCrc(u16t data)
{
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
SHT3x STM32F103.rar
(300.74 KB, 下載次數: 182)
2018-12-26 16:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
qq876947610
時間:
2021-4-6 15:27
請問你看過傳感的手冊嗎?
不用等待ACK嗎?
不用配置IIC的方向嗎
作者:
luong5490spkt
時間:
2021-5-11 00:42
這篇文章很詳細,很容易理解
謝謝!
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1