ESP32 温湿度和气体传感器驱动
驱动原理iic
iic.h文件
#ifndef __APP_IIC_H__
#define __APP_IIC_H__
#include "esp_types.h"
#include "driver/uart.h"
#include "driver/gpio.h"
esp_err_t i2c_master_init(void);
uint8_t AHT20_Read_Status(void);
uint8_t AHT20_Read_Cal_Enable(void);
void AC_CMD(void);
uint8_t Calc_CRC8(uint8_t *message,uint8_t Num);
void AHT20_Read_CTdata(uint32_t *ct);
void AHT20_Read_CTdata_crc(uint16_t *ct);
void AHT20_Init(void);
void JH_Reset_REG(uint8_t addr);
void AHT20_Start_Init(void);
//#define SENSOR_PORT_TYPE unsigned char
typedef struct
{
// SENSOR_PORT_TYPE *pPORT;
// unsigned int Speed;
unsigned char Adrr; //通讯设备地址
unsigned char Status; //AGS02MA模块状态字节
unsigned short int timcnt; //时间计数器
unsigned char ErrFlag; //通讯错误次数
unsigned short int SetRTim; //设置读取间隔时间
unsigned char RegAddr; //寄存器地址
unsigned char ReadByte[10]; //存放读取的数据
unsigned int RSVal; //传感器阻值
unsigned int PPBVal; //TVOC ppb数值
unsigned char year; //年
unsigned char month;//月
unsigned char day; //日
unsigned char SoftVer; //版本号
}MYI2C_Struct;
extern MYI2C_Struct SENx;
void MYI2C_Init(MYI2C_Struct *pSENSOR,unsigned int ReadTim,unsigned char xAddr);
void MYI2C_Handle(MYI2C_Struct *pSENSOR);
#endif
dht20温湿度传感器
#include "app_iic.h"
#include "app_fan_light.h"
#include <stdio.h>
#include "string.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_log.h"
#include "sdkconfig.h"
#include "driver/i2c.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "app_param.h"
#include <stdio.h>
#include <string.h>
#include "app_wifi.h"
#include <string.h>
#include <stdio.h>
#include "esp_log.h"
#include "esp_wifi.h"
#include "nvs_flash.h"
#include "esp_flash.h"
#include "app_public.h"
#include "app_miio.h"
#include "app_sntp.h"
#include "app_time_task.h"
#include "app_miio.h"
#include "app_client.h"
#include "app_pwm_light.h"
#include <math.h>
#include "app_function.h"
#include "app_mqtt.h"
#include "app_raw.h"
#include "blu_gattc.h"
#include "app_com.h"
static const char *TAG = "app_iic";
#define _I2C_NUMBER(num) I2C_NUM_##num
#define I2C_NUMBER(num) _I2C_NUMBER(num)
#define I2C_MASTER_SCL_IO 6 /*!< gpio number for I2C master clock */
#define I2C_MASTER_SDA_IO 7 /*!< gpio number for I2C master data */
#define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */
#define I2C_MASTER_FREQ_HZ 20000 /*!< I2C master clock frequency */
#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
#define WRITE_BIT I2C_MASTER_WRITE /*!< I2C master write */
#define READ_BIT I2C_MASTER_READ /*!< I2C master read */
#define ACK_CHECK_EN ACK_VAL /*!< I2C master will check ack from slave*/
#define ACK_CHECK_DIS NACK_VAL /*!< I2C master will not check ack from slave */
#define ACK_VAL 0x0 /*!< I2C ack value */
#define NACK_VAL 0x1 /*!< I2C nack value */
/**
* @brief IIC初始化
*
* @return esp_err_t
*/
esp_err_t i2c_master_init(void)
{
int i2c_master_port = I2C_MASTER_NUM;
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = I2C_MASTER_SCL_IO,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
// .clk_flags = 0, /*!< Optional, you can use I2C_SCLK_SRC_FLAG_* flags to choose i2c source clock here. */
};
esp_err_t err = i2c_param_config(i2c_master_port, &conf);
if (err != ESP_OK) {
return err;
}
return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}
uint8_t AHT20_Read_Status(void)//读取AHT20的状态寄存器
{
uint8_t Byte_first[1]={0};
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x71, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_first[0],ACK_CHECK_DIS);
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
ESP_LOGE(TAG, "AHT20_Read_Status:%d ",Byte_first[0]);
return Byte_first[0];
}
uint8_t AHT20_Read_Cal_Enable(void) //查询cal enable位有没有使能
{
uint8_t val = 0;//ret = 0,
val = AHT20_Read_Status();
ESP_LOGW(TAG, "AHT20_Read_Cal_Enable():%d",val);
if((val & 0x68)==0x08)
return 1;
else
return 0;
}
void abc(void)
{
int i=0;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, 0x70, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0xAC, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x33, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
}
//CRC校验类型:CRC8/MAXIM
//多项式:X8+X5+X4+1
//Poly:0011 0001 0x31
//高位放到后面就变成 1000 1100 0x8c
//C现实代码:
uint8_t Calc_CRC8(uint8_t *message,uint8_t Num)
{
uint8_t i;
uint8_t byte;
uint8_t crc=0xFF;
for(byte=0; byte<Num; byte++)
{
crc^=(message[byte]);
for(i=8;i>0;--i)
{
if(crc&0x80) crc=(crc<<1)^0x31;
else crc=(crc<<1);
}
}
return crc;
}
void AHT20_Read_CTdata(uint32_t *ct) //没有CRC校验,直接读取AHT20的温度和湿度数据
{
uint8_t Byte_1th[1]={0};
uint8_t Byte_2th[1]={0};
uint8_t Byte_3th[1]={0};
uint8_t Byte_4th[1]={0};
uint8_t Byte_5th[1]={0};
uint8_t Byte_6th[1]={0};
uint32_t RetuData = 0 ,c1=0,c2=0;
uint8_t CTDATA[7]={0};//用于CRC传递数组
uint16_t cnt = 0;
abc();//向AHT10发送AC命令
vTaskDelay(80 / portTICK_RATE_MS);//延时80ms左右
cnt = 0;
while(((AHT20_Read_Status()&0x80)==0x80))//直到状态bit[7]为0,表示为空闲状态,若为1,表示忙状态
{
vTaskDelay(2 / portTICK_RATE_MS);
if(cnt++>=100)
{
break;
}
}
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x71, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_1th[0],ACK_CHECK_EN);//状态字,查询到状态为0x98,表示为忙状态,bit[7]为1;状态为0x1C,或者0x0C,或者0x08表示为空闲状态,bit[7]为0
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_2th[0],ACK_CHECK_EN);//湿度
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_3th[0],ACK_CHECK_EN);//湿度
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_4th[0],ACK_CHECK_EN);//湿度/温度
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_5th[0],ACK_CHECK_EN);//温度
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_6th[0],ACK_CHECK_DIS);//温度
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
RetuData = (RetuData|Byte_2th[0])<<8;
RetuData = (RetuData|Byte_3th[0])<<8;
RetuData = (RetuData|Byte_4th[0]);
RetuData =RetuData >>4;
c1 = RetuData;//湿度
RetuData = 0;
RetuData = (RetuData|Byte_4th[0])<<8;
RetuData = (RetuData|Byte_5th[0])<<8;
RetuData = (RetuData|Byte_6th[0]);
RetuData = RetuData&0xfffff;
c2 =RetuData; //温度
printf("%d-----%d\r\n",c1*100*10/1024/1024,c2*200*10/1024/1024-500);
}
void AHT20_Read_CTdata_crc(uint16_t *ct) //CRC校验后,读取AHT20的温度和湿度数据
{
uint8_t Byte_1th[1]={0};
uint8_t Byte_2th[1]={0};
uint8_t Byte_3th[1]={0};
uint8_t Byte_4th[1]={0};
uint8_t Byte_5th[1]={0};
uint8_t Byte_6th[1]={0};
uint8_t Byte_7th[1]={0};
uint16_t RetuData = 0;
uint16_t cnt = 0;
// uint8_t CRCDATA=0;
uint8_t CTDATA[7]={0};//用于CRC传递数组
abc();
vTaskDelay(80 / portTICK_RATE_MS);//延时80ms左右
cnt = 0;
while(((AHT20_Read_Status()&0x80)==0x80))//直到状态bit[7]为0,表示为空闲状态,若为1,表示忙状态
{
vTaskDelay(1 / portTICK_RATE_MS);
if(cnt++>=100)
{
break;
}
}
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x71, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_1th[0],ACK_CHECK_EN);//状态字,查询到状态为0x98,表示为忙状态,bit[7]为1;状态为0x1C,或者0x0C,或者0x08表示为空闲状态,bit[7]为0
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_2th[0],ACK_CHECK_EN);//湿度
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_3th[0],ACK_CHECK_EN);//湿度
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_4th[0],ACK_CHECK_EN);//湿度/温度
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_5th[0],ACK_CHECK_EN);//温度
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_6th[0],ACK_CHECK_EN);//温度
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&Byte_7th[0],ACK_CHECK_DIS);//CRC数据
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
CTDATA[0]=Byte_1th[0];
CTDATA[1]=Byte_2th[0];
CTDATA[2]=Byte_3th[0];
CTDATA[3]=Byte_4th[0];
CTDATA[4]=Byte_5th[0];
CTDATA[5]=Byte_6th[0];
if(Calc_CRC8(CTDATA,6)==Byte_7th[6])
{
RetuData = (RetuData|Byte_2th[0])<<8;
RetuData = (RetuData|Byte_3th[0])<<8;
RetuData = (RetuData|Byte_4th[0]);
RetuData =RetuData >>4;
ct[0] = RetuData;//湿度
RetuData = 0;
RetuData = (RetuData|Byte_4th[0])<<8;
RetuData = (RetuData|Byte_5th[0])<<8;
RetuData = (RetuData|Byte_6th[0]);
RetuData = RetuData&0xfffff;
ct[1] =RetuData; //温度
}
else
{
ct[0]=0x00;
ct[1]=0x00;//校验错误返回值,客户可以根据自己需要更改
}//CRC数据
}
void AHT20_Init(void) //初始化AHT20
{
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x70, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0xa8, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
vTaskDelay(10 / portTICK_RATE_MS);//延时10ms左右
cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x70, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0xbe, ACK_CHECK_EN);//0xBE初始化命令,AHT20的初始化命令是0xBE, AHT10的初始化命令是0xE1
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x08, ACK_CHECK_EN);//相关寄存器bit[3]置1,为校准输出
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
vTaskDelay(10 / portTICK_RATE_MS);//延时10ms左右
}
void JH_Reset_REG(uint8_t addr)
{
uint8_t CTDATA1[1]={0};
uint8_t CTDATA2[1]={0};
uint8_t CTDATA3[1]={0};
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x70, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, addr, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
vTaskDelay(10 / portTICK_RATE_MS); //延时5ms左右
cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x71, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&CTDATA1[0],ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&CTDATA2[0],ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_read_byte(cmd,&CTDATA3[0],ACK_CHECK_DIS);
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
vTaskDelay(10 / portTICK_RATE_MS);//延时10ms左右
cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0x70, ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, 0xB0|addr, ACK_CHECK_EN);
vTaskDelay(2 / 1000);//寄存器命令
i2c_master_write_byte(cmd, CTDATA2[0], ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_write_byte(cmd, CTDATA3[0], ACK_CHECK_EN);
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
}
void AHT20_Start_Init(void)
{
JH_Reset_REG(0x1b);
JH_Reset_REG(0x1c);
JH_Reset_REG(0x1e);
}
ags02ma气体传感器
MYI2C_Struct SENx;
/*******************************************************************************
* Function Name : MYI2C_Init
* Description : 初始化I2C引脚与ASG02MA结构体变量
* Input : ReadTim 每隔ms时间读取AGS02MA模块
xAddr AGS02MA模块通讯地址
* Output : None
* Return : None
*******************************************************************************/
//MYI2C_Init(&SENx,100,0x1A);
void MYI2C_Init(MYI2C_Struct *pSENSOR,unsigned int ReadTim,unsigned char xAddr)
{
pSENSOR->Adrr=xAddr;
pSENSOR->RegAddr=0x11;上电读版本
if(ReadTim<100)ReadTim=200;
pSENSOR->SetRTim=ReadTim;
}
/*******************************************************************************
* Function Name : MYI2C_READ_FUNC
* Description : IIC主机读取从机数据
* Input : pSENSOR存放读出数据
device_addr从机地址
register_addr寄存器地址
len读出数据的长度 单位:byte
* Output : None
* Return : 0:读取数据成功
1:读取数据失败
*******************************************************************************/
unsigned char MYI2C_READ_FUNC(MYI2C_Struct *pSENSOR,unsigned char device_addr,signed char register_addr, unsigned char len)
{
unsigned int TimeOut=9999;
unsigned char i=0;
if(register_addr>=0)
{
/* Send STRAT condition a second time */
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
/* Send slave address for Write Regsiter */
//MYI2C_Write_IIC_Byte( (device_addr<<1) + 0);
i2c_master_write_byte(cmd, (device_addr<<1) + 0, ACK_CHECK_EN);
/* ack */
//if(MYI2C_IIC_Wait_Ack(255)==0)TimeOut=0;
vTaskDelay(2 / 1000);
/* Send register_addr */
//MYI2C_Write_IIC_Byte( (register_addr));
i2c_master_write_byte(cmd, register_addr, ACK_CHECK_EN);
/* Test on EV6 and clear it */
//if(MYI2C_IIC_Wait_Ack(255)==0)TimeOut=0;
vTaskDelay(2 / 1000);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
vTaskDelay(10 / portTICK_RATE_MS);
}
/* Send STRAT condition a second time */
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
/* Send slave address for Read */
//MYI2C_Write_IIC_Byte( (device_addr<<1)+1 );
i2c_master_write_byte(cmd, (device_addr<<1)+1, ACK_CHECK_EN);
/* ack */
//if(MYI2C_IIC_Wait_Ack(255)==0)TimeOut=0;
vTaskDelay(2 / 1000);
/* While there is data to be read */
while(i<len/*&&TimeOut*/) //
{
//TimeOut--;
//pSENSOR->ReadByte[i]=MYI2C_Read_IIC_Byte();
if(i!=(len-1))i2c_master_read_byte(cmd,&pSENSOR->ReadByte[i],ACK_CHECK_EN);
else i2c_master_read_byte(cmd,&pSENSOR->ReadByte[i],ACK_CHECK_DIS);
/* Acknowledgement */
//MYI2C_IIC_Ack(len-1-i);//len = 1 NoAck
vTaskDelay(1 / 1000);
i++;
}
/* Send STOP Condition */
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
// I2C_ClearFlag(pSENSOR->pPORT,I2C_FLAG_TIMEOUT);
//if(TimeOut){pSENSOR->ErrFlag=0;return 0;}
//else {pSENSOR->ErrFlag++;return 1;}
return 1;
}
/*******************************************************************************
* Function Name : MYI2C_WRITE_FUNC
* Description : IIC主机向从机写入数据
* Input : pSENSOR主机需要发送给从机的数据
device_addr从机地址
register_addr寄存器地址
len读出数据的长度 单位:byte
* Return : 0:读取数据成功
1:读取数据失败
*******************************************************************************/
unsigned char MYI2C_WRITE_FUNC(MYI2C_Struct *pSENSOR,unsigned char device_addr,unsigned char register_addr, unsigned char *pDATA, unsigned char len)
{
unsigned int TimeOut=9999;
/* Send STRAT condition */
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
vTaskDelay(2 / 1000);
/* Send EEPROM address for write */
//MYI2C_Write_IIC_Byte( (device_addr<<1) + 0);
i2c_master_write_byte(cmd, (device_addr<<1) + 0, ACK_CHECK_EN);
/* Test on EV6 and clear it */
vTaskDelay(2 / 1000);
/* Send register_addr for read */
//MYI2C_Write_IIC_Byte( (register_addr));
i2c_master_write_byte(cmd, register_addr, ACK_CHECK_EN);
/* Test on EV6 and clear it */
vTaskDelay(2 / 1000);
while(/*TimeOut &&*/len)//
{
/* Send the byte to be written */
//MYI2C_Write_IIC_Byte( *pDATA);
i2c_master_write_byte(cmd, *pDATA, ACK_CHECK_EN);
/* Acknowledgement */
//MYI2C_IIC_Wait_Ack(9);
vTaskDelay(2 / 1000);
pDATA++;
len--;
//TimeOut--;
}
/* Send STOP condition */
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
//if(TimeOut){pSENSOR->ErrFlag=0;return 0;}
//else {pSENSOR->ErrFlag++;return 1;}
return 1;
}
/*******************************************************************************
* Function Name : CheckCrc
* Description : CRC校验
* Input : *pDAT需要进行CRC校验的数据
Lenth进行CRC校验的数据长度 单位:byte
* Output : None
* Return : CRC校验码
*******************************************************************************/
unsigned char CheckCrc8(unsigned char *pDAT,unsigned char Lenth)
{
unsigned char crc = 0xff, i, j;
for (i = 0; i < Lenth ; i++)
{
crc = crc ^ *pDAT;
for (j = 0; j < 8; j++)
{
if (crc & 0x80) crc = (crc << 1) ^ 0x31;
else crc <<= 1;
}
pDAT++;
}
return crc;
}
/*******************************************************************************
* Function Name : MYI2C_Handle
* Description : 读取AGS02MA的版本号与输出的TVOC数据
* Input : *pSENSOR存放与AGS02MA通讯的相关数据
* Output : None
* Return : None
*******************************************************************************/
void MYI2C_Handle(MYI2C_Struct *pSENSOR)
{
pSENSOR->timcnt+=1;
if(pSENSOR->timcnt > pSENSOR->SetRTim)
{
pSENSOR->timcnt=0;
MYI2C_READ_FUNC(pSENSOR,pSENSOR->Adrr,pSENSOR->RegAddr,5);
pSENSOR->ReadByte[5]=CheckCrc8(&pSENSOR->ReadByte[0],4);
ESP_LOGW(TAG, "check:%0.2X--%0.2X--%0.2X--%0.2X--%0.2X--%0.2X",
pSENSOR->ReadByte[0],pSENSOR->ReadByte[1], pSENSOR->ReadByte[2],pSENSOR->ReadByte[3], pSENSOR->ReadByte[4],pSENSOR->ReadByte[5]);
if(pSENSOR->ReadByte[5]==pSENSOR->ReadByte[4])
{
//ESP_LOGW(TAG, "pSENSOR->RegAddr:%d", pSENSOR->RegAddr);
if(pSENSOR->RegAddr==0x00)
{
pSENSOR->RegAddr=0x00;
pSENSOR->Status=pSENSOR->ReadByte[0];
pSENSOR->PPBVal=pSENSOR->ReadByte[1];//TVOC ppb数值
pSENSOR->PPBVal=pSENSOR->PPBVal<<8;
pSENSOR->PPBVal+=pSENSOR->ReadByte[2];
pSENSOR->PPBVal=pSENSOR->PPBVal<<8;
pSENSOR->PPBVal+=pSENSOR->ReadByte[3];
ESP_LOGW(TAG, "TVOC:%d--%d", pSENSOR->PPBVal, pSENSOR->Status);
}
else if(pSENSOR->RegAddr==0x11)
{
pSENSOR->RegAddr=0x00;
pSENSOR->year=pSENSOR->ReadByte[0];
pSENSOR->month=pSENSOR->ReadByte[1];
pSENSOR->day=pSENSOR->ReadByte[2];
pSENSOR->SoftVer=pSENSOR->ReadByte[3]; //版本号
pSENSOR->ReadByte[3]=0;
}
}
}
}
ESP32 温湿度和气体传感器驱动相关推荐
- 外设驱动库开发笔记31:S-Modlue远红外气体传感器驱动
在气体分析类产品中,我们经常会用到远红外气体传感器.我们就在碳氢类气体成分分析中使用了S-Modlue远红外气体传感器.接下来,我们将讨论S-Modlue远红外气体传感器驱动的设计与实现. 1.功 ...
- ESP32温湿度 DHT11 实验
这个实验是读取温湿度数据,并在 TFT 显示屏显示和串口输出. 这个实验的代码为工程"3_7_dht11"目录. 3.7.1. 实验内容 (1) 学习 ESP32 库函数对 IO ...
- ESP32设备驱动-土壤湿度传感器驱动
土壤湿度传感器驱动 1.土壤湿度传感器介绍 土壤湿度传感器由两个探头组成,用于测量水的体积含量. 两个探头让电流通过土壤,然后得到电阻值来测量水分值. 当有更多的水时,土壤会传导更多的电,这意味着电阻 ...
- 基于51单片机的温湿度光强二氧化碳气体家庭环境检测proteus仿真
硬件设计 仿真图1: 该设计是基于51单片机的温湿度光强二氧化碳检测系统,由LCD1602作为显示器,温湿度采用的SHT11传感器,ADC采用的TLC2543,光强就是光敏传感器,气体检测这里采用的是 ...
- 基于stm32单片机甲醛烟雾温湿度检测仪设计
目录 第1章 绪论 1.1 引言 1.1.1甲醛的特性及危害 1.1.2甲醛的来源 1.2甲醛检测仪的种类 第2章 概述 2.1系统总概述 2.2总体方案设计 2.3硬件设计 2.4软件设计 第3章 ...
- 12个监控方案,保障你生活的方方面面
监控处于我们生活的方方面面,视频监控,环境监控,心率监控等等,监控给了我们生活一定的保障,整理了电路城上一些监控方面的设计资料,包括温湿度监控.PM2.5监控.视频监控等等,一起学习吧. 1.ESP3 ...
- 养殖场猪舍智能巡检机器人方案
随着社会的不断发展,高效管理机制越来越受到重视,对养殖行业来说,养殖场大都建立在远离市区的地方,给集中管理带来不便,电科恒钛轨道智巡检机器人系统可以帮助管理人员即使不在现场也能实现对养殖场生产过程的移 ...
- 铁路牵引变电所无人化改造方案 辅助监控系统
摘要:既有高速铁路项目中牵引变电所.开闭所均采用无人值班有人值守的模式.结合国铁集团电力牵引供电节支降耗.改革创新的要求,牵引变电所.开闭所需全方位采用检测监测技术保障各型设备安全可靠运行,从而实现真 ...
- 天宫一号将在酒泉发射
昨天0时33分,我国在西昌卫星发射中心用"长征三号乙"运载火箭,成功将"中星1A"卫星送入太空预定转移轨道.据晨报记者了解,在"中星1A"卫 ...
最新文章
- Linux Exploit系列之三 Off-By-One 漏洞 (基于栈)
- Java中使用Jedis操作Redis
- 如何将网站数据导入服务器里,网站是无意识的将数据导入和导出Web客户端
- matlab绘图 excel,『在matlab上如何导入excel表格然后画图』excle表格如何使用绘图笔...
- 【Lucene4.8教程之五】Luke
- 如何用Python的pyecharts库绘制K线图
- Linux命令-防火墙命令:iptables
- Spark 报错 DROP TABLE IF EXISTS should not show AnalysisException
- python支持什么循环_Python的循环
- fastapi 基础使用
- 理解嵌入式开发中的一些硬件相关的概念
- arcgis python 教程-ArcGIS Python 入门到精通,视频教程下载
- 针对永恒之蓝Wannacry勒索病毒微软Windows操作系统 MS17-010 漏洞补丁资源共享
- Flink Window TOPN: The window can only be ordered in ASCENDING mode.
- 游戏音效制作初学者的福音—入门级软件介绍
- Limelight完成了对雅虎Edgecast的收购,合并后的公司更名为Edgio,成为全球边缘解决方案的领导者...
- 有趣的java编程题_java编程题 有趣的数
- 基于msm8916移植lcd流程--LK
- SQL语句(增删改查)
- 使用腾讯企业邮箱为什么强烈建议启用安全登录?怎么启用?