我接了個(gè)項(xiàng)目溫濕度傳感器(DHT20型號(hào))要導(dǎo)線80CM線長(zhǎng)IIC通訊 普通程序通訊有干擾。
希望沁恒微給我一個(gè)低速4k通訊速率程序,模擬的程序發(fā)我謝謝了。
dht20產(chǎn)品規(guī)格書(shū)(中文版) a2.pdf
郵箱個(gè)人信息保護(hù),已隱藏
我接了個(gè)項(xiàng)目溫濕度傳感器(DHT20型號(hào))要導(dǎo)線80CM線長(zhǎng)IIC通訊 普通程序通訊有干擾。
希望沁恒微給我一個(gè)低速4k通訊速率程序,模擬的程序發(fā)我謝謝了。
dht20產(chǎn)品規(guī)格書(shū)(中文版) a2.pdf
郵箱個(gè)人信息保護(hù),已隱藏
IIC通訊 4K速率 再慢一點(diǎn)也行 發(fā)我程序哦? 謝謝
一定要發(fā)我哦。
搞好給你100塊買(mǎi)咖啡喝
你們這個(gè)IO確實(shí)不好操作 請(qǐng)賜教 iic
51 iic 程序我移植不了哦?? 操作不一樣哦
網(wǎng)上一搜一大把, 這都不會(huì)移植, 兄弟別干嵌入式了吧
這傻逼IIC是板內(nèi)通信,飛線搞能不干擾才怪
#ifdefIS_7P
// #include "nvs.h"
// #include "nvs_flash.h"
#defineCLK_PINGPIO_Pin_12
#defineDATA_PINGPIO_Pin_13
#defineMCU_HAVE_DATAGPIOB_ReadPortPin(DATA_PIN)
void Delay_N10us(uint32_tt)//延時(shí)函數(shù)
{
? ? // volatile uint32_t k;
? ? // while (t--)
? ? // {
? ? // ? ? for (k = 0; k < 2; k++)//110
? ? // ? ? ? ? ;
? ? // }
}
void SensorDelay_us(uint32_tt)//延時(shí)函數(shù)
{
? ? mDelayuS(t);
? ? // t = t - 2;
? ? // for (; t > 0; t--)
? ? // {
? ? // ? ? Delay_N10us(1);
? ? // }
}
void Delay_3us(void)//延時(shí)函數(shù)
{
? ? mDelayuS(3);
? ? // Delay_N10us(1);
? ? // Delay_N10us(1);
? ? // Delay_N10us(1);
? ? // Delay_N10us(1);
}
void Delay_1us(void)//延時(shí)函數(shù)
{
? ? mDelayuS(1);
? ? // Delay_N10us(1);
? ? // Delay_N10us(1);
? ? // Delay_N10us(1);
? ? // Delay_N10us(1);
? ? // Delay_N10us(1);
}
void SDA_Pin_Output_High(void)//將P15配置為輸出 , 并設(shè)置為低電平, P15作為I2C的SDA
{
? ? GPIOB_ModeCfg(DATA_PIN,GPIO_ModeOut_PP_5mA);
? ? GPIOB_SetBits(DATA_PIN);
? ? // gpio_pad_select_gpio(DATA_PIN);
? ? // gpio_set_direction(DATA_PIN, GPIO_MODE_OUTPUT);
? ? // gpio_set_level(DATA_PIN, 1);
? ? // ?Gpio_InitIOExt(1,5,GpioDirOut,TRUE, FALSE, TRUE, FALSE);//config P15 to output
? ? // ?Gpio_SetIO(1,5,1);
}
void SDA_Pin_Output_Low(void)//將P15配置為輸出 ?并設(shè)置為高電平
{
? ? GPIOB_ModeCfg(DATA_PIN,GPIO_ModeOut_PP_5mA);
? ? GPIOB_ResetBits(DATA_PIN);
? ? // gpio_pad_select_gpio(DATA_PIN);
? ? // gpio_set_direction(DATA_PIN, GPIO_MODE_OUTPUT);
? ? // gpio_set_level(DATA_PIN, 0);
? ? // ?Gpio_InitIOExt(1,5,GpioDirOut,TRUE, FALSE, TRUE, FALSE);//config P15 to output
? ? // ?Gpio_SetIO(1,5,0);
}
void SDA_Pin_IN_FLOATING(void)// SDA配置為懸浮輸入
{
? ? GPIOB_ModeCfg(DATA_PIN,GPIO_ModeIN_Floating);
? ? // gpio_pad_select_gpio(DATA_PIN);
? ? // gpio_set_direction(DATA_PIN, GPIO_MODE_INPUT);
? ? // gpio_set_pull_mode(DATA_PIN, GPIO_PULLUP_ONLY);
? ? // ? Gpio_InitIO(1, 5, GpioDirIn);
}
void SCL_Pin_Output_High(void)// SCL輸出高電平,P14作為I2C的SCL
{
? ? GPIOB_SetBits(CLK_PIN);
? ? // gpio_set_level(CLK_PIN, 1);
}
void SCL_Pin_Output_Low(void)// SCL輸出低電平
{
? ? GPIOB_ResetBits(CLK_PIN);
? ? // gpio_set_level(CLK_PIN, 0);
}
void Init_I2C_Sensor_Port(void)//初始化I2C接口
{
? ? GPIOB_ModeCfg(CLK_PIN,GPIO_ModeOut_PP_5mA);
? ? GPIOB_ModeCfg(DATA_PIN,GPIO_ModeOut_PP_5mA);
? ? GPIOB_SetBits(CLK_PIN);
? ? GPIOB_SetBits(DATA_PIN);
? ? // gpio_pad_select_gpio(DATA_PIN);
? ? // gpio_set_direction(DATA_PIN, GPIO_MODE_OUTPUT);
? ? // gpio_set_level(DATA_PIN, 1);
? ? // gpio_pad_select_gpio(CLK_PIN);
? ? // gpio_set_direction(CLK_PIN, GPIO_MODE_OUTPUT);
? ? // gpio_set_level(CLK_PIN, 1);
}
void I2C_Start(void)// I2C主機(jī)發(fā)送START信號(hào)
{
? ? SDA_Pin_Output_High();
? ? SensorDelay_us(8);
? ? SCL_Pin_Output_High();
? ? SensorDelay_us(8);
? ? SDA_Pin_Output_Low();
? ? SensorDelay_us(8);
? ? SCL_Pin_Output_Low();
? ? SensorDelay_us(8);
}
void ZSSC_I2C_WR_Byte(uint8_tByte)//往AHT10寫(xiě)一個(gè)字節(jié)
{
? ? uint8_tData,N,i;
? ? Data=Byte;
? ? i=0x80;
? ? for (N=0;N<8;N++)
? ? {
? ? ? ? SCL_Pin_Output_Low();
? ? ? ? Delay_3us();
? ? ? ? if (i&Data)
? ? ? ? {
? ? ? ? ? ? SDA_Pin_Output_High();
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? SDA_Pin_Output_Low();
? ? ? ? }
? ? ? ? SCL_Pin_Output_High();
? ? ? ? Delay_3us();
? ? ? ? Data<<=1;
? ? }
? ? SCL_Pin_Output_Low();
? ? SensorDelay_us(8);
? ? SDA_Pin_IN_FLOATING();
? ? SensorDelay_us(8);
}
uint8_t ZSSC_I2C_RD_Byte(void)//從AHT10讀取一個(gè)字節(jié)
{
? ? uint8_tByte,i,a;
? ? Byte=0;
? ? SCL_Pin_Output_Low();
? ? SDA_Pin_IN_FLOATING();
? ? SensorDelay_us(8);
? ? for (i=0;i<8;i++)
? ? {
? ? ? ? SCL_Pin_Output_High();
? ? ? ? Delay_1us();
? ? ? ? a=0;
? ? ? ? if (MCU_HAVE_DATA)
? ? ? ? ? ? a=1;
? ? ? ? Byte= (Byte<<1) |a;
? ? ? ? SCL_Pin_Output_Low();
? ? ? ? Delay_1us();
? ? }
? ? SDA_Pin_IN_FLOATING();
? ? SensorDelay_us(8);
? ? returnByte;
}
uint8_t Receive_ACK(void)//看AHT20是否有回復(fù)ACK
{
? ? uint16_tCNT;
? ? CNT=0;
? ? SCL_Pin_Output_Low();
? ? SDA_Pin_IN_FLOATING();
? ? SensorDelay_us(8);
? ? SCL_Pin_Output_High();
? ? SensorDelay_us(8);
? ? while ((MCU_HAVE_DATA) &&CNT<100)
? ? ? ? CNT++;
? ? if (CNT==100)
? ? {
? ? ? ? return0;
? ? }
? ? SCL_Pin_Output_Low();
? ? SensorDelay_us(8);
? ? return1;
}
void Send_ACK(void)//主機(jī)回復(fù)ACK信號(hào)
{
? ? SCL_Pin_Output_Low();
? ? SensorDelay_us(8);
? ? SDA_Pin_Output_Low();
? ? SensorDelay_us(8);
? ? SCL_Pin_Output_High();
? ? SensorDelay_us(8);
? ? SCL_Pin_Output_Low();
? ? SensorDelay_us(8);
? ? SDA_Pin_IN_FLOATING();
? ? SensorDelay_us(8);
}
void Send_NOT_ACK(void)//主機(jī)不回復(fù)ACK
{
? ? SCL_Pin_Output_Low();
? ? SensorDelay_us(8);
? ? SDA_Pin_Output_High();
? ? SensorDelay_us(8);
? ? SCL_Pin_Output_High();
? ? SensorDelay_us(8);
? ? SCL_Pin_Output_Low();
? ? SensorDelay_us(8);
? ? SDA_Pin_Output_Low();
? ? SensorDelay_us(8);
}
void Stop_I2C(void)//一條協(xié)議結(jié)束
{
? ? SDA_Pin_Output_Low();
? ? SensorDelay_us(8);
? ? SCL_Pin_Output_High();
? ? SensorDelay_us(8);
? ? SDA_Pin_Output_High();
? ? SensorDelay_us(8);
}
uint8_t JH_Read_Status(void)//讀取AHT10的狀態(tài)寄存器
{
? ? uint8_tByte_first;
? ? I2C_Start();
? ? ZSSC_I2C_WR_Byte(0x71);
? ? Receive_ACK();
? ? Byte_first=ZSSC_I2C_RD_Byte();
? ? Send_NOT_ACK();
? ? Stop_I2C();
? ? // printf("\n變量Byte_first = %d\n",Byte_first);
? ? returnByte_first;
}
uint8_t JH_Read_Cal_Enable(void)//查詢(xún)cal enable位有沒(méi)有使能?
{
? ? uint8_tval=0;// ret = 0,
? ? val=JH_Read_Status();
? ? if ((val&0x68) ==0x08)
? ? ? ? return1;
? ? else
? ? ? ? return0;
}
void JH_SendAC(void)//向AHT10發(fā)送AC命令
{
? ? I2C_Start();
? ? ZSSC_I2C_WR_Byte(0x70);
? ? Receive_ACK();
? ? ZSSC_I2C_WR_Byte(0xac);// 0xAC采集命令
? ? Receive_ACK();
? ? ZSSC_I2C_WR_Byte(0x33);
? ? Receive_ACK();
? ? ZSSC_I2C_WR_Byte(0x00);
? ? Receive_ACK();
? ? Stop_I2C();
}
// CRC校驗(yàn)類(lèi)型:CRC8/MAXIM
//多項(xiàng)式:X8+X5+X4+1
// Poly:0011 0001 ?0x31
//高位放到后面就變成 1000 1100 0x8c
// C現(xiàn)實(shí)代碼:
uint8_t Calc_CRC8(uint8_t*message,uint8_tNum)
{
? ? uint8_ti;
? ? uint8_tbyte;
? ? uint8_tcrc=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);
? ? ? ? }
? ? }
? ? returncrc;
}
bool JH_Read_CTdata(uint32_t*ct)//沒(méi)有CRC校驗(yàn),直接讀取AHT10的溫度和濕度數(shù)據(jù)
{
? ? // ? ?volatile uint8_t ?Byte_1th = 0;
? ? volatileuint8_tByte_2th=0;
? ? volatileuint8_tByte_3th=0;
? ? volatileuint8_tByte_4th=0;
? ? volatileuint8_tByte_5th=0;
? ? volatileuint8_tByte_6th=0;
? ? uint32_tRetuData=0;
? ? uint16_tcnt=0;
? ? staticboolonce=false;
? ? if (once==false)
? ? {
? ? ? ? once=true;
? ? ? ? JH_SendAC();//向AHT10發(fā)送AC命令
? ? ? ? returnfalse;
? ? }
? ? else
? ? {
? ? ? ? once=false;
? ? ? ? // mDelaymS(80); ? ?//大約延時(shí)80ms
? ? ? ? cnt=0;
? ? ? ? while (((JH_Read_Status()&0x80) ==0x80))//直到狀態(tài)bit[7]為0,表示為空閑狀態(tài),若為1,表示忙狀態(tài)
? ? ? ? {
? ? ? ? ? ? mDelaymS(1);
? ? ? ? ? ? // vTaskDelay(10 / portTICK_RATE_MS);
? ? ? ? ? ? // ? ? ? ?SensorDelay_us(1508);
? ? ? ? ? ? if (cnt++>=100)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? I2C_Start();
? ? ? ? ZSSC_I2C_WR_Byte(0x71);
? ? ? ? Receive_ACK();
? ? ? ? // ? ?Byte_1th =
? ? ? ? ZSSC_I2C_RD_Byte();//狀態(tài)字
? ? ? ? Send_ACK();
? ? ? ? Byte_2th=ZSSC_I2C_RD_Byte();//濕度
? ? ? ? Send_ACK();
? ? ? ? Byte_3th=ZSSC_I2C_RD_Byte();//濕度
? ? ? ? Send_ACK();
? ? ? ? Byte_4th=ZSSC_I2C_RD_Byte();//濕度/溫度
? ? ? ? Send_ACK();
? ? ? ? Byte_5th=ZSSC_I2C_RD_Byte();//溫度
? ? ? ? Send_ACK();
? ? ? ? Byte_6th=ZSSC_I2C_RD_Byte();//溫度
? ? ? ? Send_NOT_ACK();
? ? ? ? Stop_I2C();
? ? ? ? RetuData= (RetuData|Byte_2th) <<8;
? ? ? ? RetuData= (RetuData|Byte_3th) <<8;
? ? ? ? RetuData= (RetuData|Byte_4th);
? ? ? ? RetuData=RetuData>>4;
? ? ? ? ct[0] =RetuData;//濕度
? ? ? ? RetuData=0;
? ? ? ? RetuData= (RetuData|Byte_4th) <<8;
? ? ? ? RetuData= (RetuData|Byte_5th) <<8;
? ? ? ? RetuData= (RetuData|Byte_6th);
? ? ? ? RetuData=RetuData&0xfffff;
? ? ? ? ct[1] =RetuData;//溫度
? ? ? ? returntrue;
? ? }
}
// void JH_Read_CTdata_crc(uint32_t *ct) // CRC校驗(yàn)后,讀取AHT10的溫度和濕度數(shù)據(jù)
// {
// ? ? volatile uint8_t Byte_1th = 0;
// ? ? volatile uint8_t Byte_2th = 0;
// ? ? volatile uint8_t Byte_3th = 0;
// ? ? volatile uint8_t Byte_4th = 0;
// ? ? volatile uint8_t Byte_5th = 0;
// ? ? volatile uint8_t Byte_6th = 0;
// ? ? volatile uint8_t Byte_7th = 0;
// ? ? uint32_t RetuData = 0;
// ? ? uint16_t cnt = 0;
// ? ? // uint8_t ?CRCDATA=0;
// ? ? uint8_t CTDATA[6] = {0}; //用于CRC傳遞數(shù)組
// ? ? JH_SendAC(); //向AHT10發(fā)送AC命令
// ? ? vTaskDelay(100 / portTICK_RATE_MS);
// ? ? // ? ?SensorDelay_us(80000); //大約延時(shí)80ms
// ? ? cnt = 0;
// ? ? while (((JH_Read_Status() & 0x80) == 0x80)) //直到狀態(tài)bit[7]為0,表示為空閑狀態(tài),若為1,表示忙狀態(tài)
// ? ? {
// ? ? ? ? vTaskDelay(10 / portTICK_RATE_MS);
// ? ? ? ? // ? ? ? ?SensorDelay_us(1508);
// ? ? ? ? if (cnt++ >= 100)
// ? ? ? ? {
// ? ? ? ? ? ? break;
// ? ? ? ? }
// ? ? }
// ? ? I2C_Start();
// ? ? ZSSC_I2C_WR_Byte(0x71);
// ? ? Receive_ACK();
// ? ? CTDATA[0] = Byte_1th = ZSSC_I2C_RD_Byte(); //狀態(tài)字
// ? ? Send_ACK();
// ? ? CTDATA[1] = Byte_2th = ZSSC_I2C_RD_Byte(); //濕度
// ? ? Send_ACK();
// ? ? CTDATA[2] = Byte_3th = ZSSC_I2C_RD_Byte(); //濕度
// ? ? Send_ACK();
// ? ? CTDATA[3] = Byte_4th = ZSSC_I2C_RD_Byte(); //濕度/溫度
// ? ? Send_ACK();
// ? ? CTDATA[4] = Byte_5th = ZSSC_I2C_RD_Byte(); //溫度
// ? ? Send_ACK();
// ? ? CTDATA[5] = Byte_6th = ZSSC_I2C_RD_Byte(); //溫度
// ? ? Send_ACK();
// ? ? Byte_7th = ZSSC_I2C_RD_Byte(); // CRC數(shù)據(jù)
// ? ? Send_NOT_ACK();
// ? ? Stop_I2C();
// ? ? if (Calc_CRC8(CTDATA, 6) == Byte_7th)
// ? ? {
// ? ? ? ? RetuData = (RetuData | Byte_2th) << 8;
// ? ? ? ? RetuData = (RetuData | Byte_3th) << 8;
// ? ? ? ? RetuData = (RetuData | Byte_4th);
// ? ? ? ? RetuData = RetuData >> 4;
// ? ? ? ? ct[0] = RetuData; //濕度
// ? ? ? ? RetuData = 0;
// ? ? ? ? RetuData = (RetuData | Byte_4th) << 8;
// ? ? ? ? RetuData = (RetuData | Byte_5th) << 8;
// ? ? ? ? RetuData = (RetuData | Byte_6th);
// ? ? ? ? RetuData = RetuData & 0xfffff;
// ? ? ? ? ct[1] = RetuData; //溫度
// ? ? ? ? ? ? ? ? ? ? ? ? ? // ? ? ? ?LED_GUZHANG_0();
// ? ? }
// ? ? else
// ? ? {
// ? ? ? ? ct[0] = 0x00;
// ? ? ? ? ct[1] = 0x00; //校驗(yàn)錯(cuò)誤返回00
// ? ? } ? ? ? ? ? ? ? ? // CRC數(shù)據(jù)
// }
void JH_Init(void)//初始化AHT10
{
? ? Init_I2C_Sensor_Port();
? ? I2C_Start();
? ? ZSSC_I2C_WR_Byte(0x70);
? ? Receive_ACK();
? ? ZSSC_I2C_WR_Byte(0xa8);// 0xA8進(jìn)入NOR工作模式
? ? Receive_ACK();
? ? ZSSC_I2C_WR_Byte(0x00);
? ? Receive_ACK();
? ? ZSSC_I2C_WR_Byte(0x00);
? ? Receive_ACK();
? ? Stop_I2C();
? ? SensorDelay_us(11038);//延時(shí)10ms左右
? ? I2C_Start();
? ? ZSSC_I2C_WR_Byte(0x70);
? ? Receive_ACK();
? ? ZSSC_I2C_WR_Byte(0xbe);// 0xBE初始化命令,AHT20的初始化命令是0xBE, ? AHT10的初始化命令是0xE1
? ? Receive_ACK();
? ? ZSSC_I2C_WR_Byte(0x08);//相關(guān)寄存器bit[3]置1,為校準(zhǔn)輸出
? ? Receive_ACK();
? ? ZSSC_I2C_WR_Byte(0x00);
? ? Receive_ACK();
? ? Stop_I2C();
}
float tps = 0, humidity = 0;
void aht20_read()
{
? ? // ?int i = 0;
? ? volatileintc1,t1;
? ? uint32_tCT_data[2];
? ? staticbooljust_once=false;
? ? if (just_once==false)
? ? {
? ? ? ? just_once=true;
? ? ? ? Init_I2C_Sensor_Port();
? ? ? ? mDelaymS(40);
? ? ? ? // vTaskDelay(500 / portTICK_RATE_MS);//剛上電,延時(shí)40ms才可以讀取狀態(tài)
? ? ? ? if (!((JH_Read_Status()&0x0C) ==
? ? ? ? ? ? ? 0x0C))//首先讀取狀態(tài)字bit[3:2],如果=1,為校準(zhǔn)輸出,無(wú)須初始化;正常情況下讀回來(lái)的狀態(tài)是1C,忙狀態(tài)是讀回來(lái)是0x80,其他狀態(tài)都是異常狀態(tài)
? ? ? ? {
? ? ? ? ? ? JH_Init();//初始化
? ? ? ? }
? ? ? ? mDelaymS(500);
? ? }
? ? // vTaskDelay(500 / portTICK_RATE_MS);
? ? // AHT20初始化完成后等待500mS后去讀狀態(tài)字status,需要等待狀態(tài)字status的Bit[3]=1時(shí)才去讀數(shù)據(jù)。如果Bit[3]不等于1 ,發(fā)軟件復(fù)位0xBA給AHT10,再重新初始化AHT20,直至Bit[3]=1
? ? // while (1)
? ? {
? ? ? ? if (JH_Read_CTdata(
? ? ? ? ? ? ? ? CT_data))
? ? ? ? {
? ? ? ? ? ? c1=CT_data[0] *1000/1024/1024; ? ? ? ? ? //計(jì)算得到濕度值(放大了10倍)
? ? ? ? ? ? t1=CT_data[1] *200*10/1024/1024-500;//計(jì)算得到溫度值(放大了10倍)
? ? ? ? ? ? tps=t1/10.0f;
? ? ? ? ? ? humidity=c1/10.0f;
? ? ? ? }
? ? }
? ? return;
}
void AHT20_date_to_ble(char*send_buf,intlen)
{
? ? staticinti=0;
? ? memset(send_buf,0,len);
? ? snprintf(send_buf,len,"TPS%d@HUM%d@", (int)tps, (int)humidity);
}
#endif
溫濕度的版本給你參考下