久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 860|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

可燃?xì)怏w檢測(cè)傳感器的程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1120726 發(fā)表于 2024-5-15 01:14 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
基于stm32,使用SGP30 CO2和TVOC傳感器的初始化和數(shù)據(jù)讀取程序。SGP30是一款用于測(cè)量二氧化碳(CO2)和總揮發(fā)性有機(jī)化合物(TVOC)濃度的傳感器。程序中定義了相關(guān)的IIC通信函數(shù),如起始信號(hào)、停止信號(hào)、發(fā)送和接收字節(jié)等。此外,程序還包含了一個(gè)主函數(shù),用于初始化SGP30傳感器,并讀取CO2和TVOC的數(shù)據(jù)。


#include "sgp30_CO2_TVOC.h"
#include "user_peripheral.h"
#include "delay.h"
#include "usart.h"

#if SGP30_CO2_TVOC_Pre


void SGP30_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(SGP30_SCL_GPIO_CLK | SGP30_SDA_GPIO_SDA, ENABLE);

  GPIO_InitStructure.GPIO_Pin = SGP30_SCL_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(SGP30_SCL_GPIO_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = SGP30_SDA_GPIO_PIN;
  GPIO_Init(SGP30_SDA_GPIO_PORT, &GPIO_InitStructure);
}


void SGP30_SDA_OUT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = SGP30_SDA_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(SGP30_SDA_GPIO_PORT, &GPIO_InitStructure);
}

void SGP30_SDA_IN(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = SGP30_SDA_GPIO_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(SGP30_SDA_GPIO_PORT, &GPIO_InitStructure);
}


void SGP30_IIC_Start(void)
{
  SGP30_SDA_OUT();
  SGP30_SDA = 1;
  SGP30_SCL = 1;
  delay_us(20);

  SGP30_SDA = 0;        
  delay_us(20);
  SGP30_SCL = 0;         
}


void SGP30_IIC_Stop(void)
{
  SGP30_SDA_OUT();
  SGP30_SCL = 0;
  SGP30_SDA = 0;        
  delay_us(20);
  SGP30_SCL = 1;
  SGP30_SDA = 1;        
  delay_us(20);
}




u8 SGP30_IIC_Wait_Ack(void)
{
  u8 ucErrTime = 0;
  SGP30_SDA_IN();
  SGP30_SDA = 1;
  delay_us(10);
  SGP30_SCL = 1;
  delay_us(10);
  while(SGP30_SDA_READ())
  {
    ucErrTime++;
    if(ucErrTime > 250)
    {
      SGP30_IIC_Stop();
      return 1;
    }
  }
  SGP30_SCL = 0;                  
  return 0;
}


void SGP30_IIC_Ack(void)
{
  SGP30_SCL = 0;
  SGP30_SDA_OUT();
  SGP30_SDA = 0;
  delay_us(20);
  SGP30_SCL = 1;
  delay_us(20);
  SGP30_SCL = 0;
}


void SGP30_IIC_NAck(void)
{
  SGP30_SCL = 0;
  SGP30_SDA_OUT();
  SGP30_SDA = 1;
  delay_us(20);
  SGP30_SCL = 1;
  delay_us(20);
  SGP30_SCL = 0;
}





void SGP30_IIC_Send_Byte(u8 txd)
{
  u8 t;
  SGP30_SDA_OUT();
  SGP30_SCL = 0;                     
  for(t = 0; t < 8; t++)
  {
    if((txd & 0x80) >> 7)
      SGP30_SDA = 1;
    else
      SGP30_SDA = 0;
    txd <<= 1;
    delay_us(20);
    SGP30_SCL = 1;
    delay_us(20);
    SGP30_SCL = 0;
    delay_us(20);
  }
  delay_us(20);

}


u16 SGP30_IIC_Read_Byte(u8 ack)
{
  u8 i;
  u16 receive = 0;
  SGP30_SDA_IN();
  for(i = 0; i < 8; i++ )
  {
    SGP30_SCL = 0;
    delay_us(20);
    SGP30_SCL = 1;
    receive <<= 1;
    if(SGP30_SDA_READ())
      receive++;
    delay_us(20);
  }
  if (!ack)
    SGP30_IIC_NAck();
  else
    SGP30_IIC_Ack();
  return receive;
}



void SGP30_Init(void)
{
  SGP30_GPIO_Init();
  SGP30_Write(0x20, 0x03);


}


void SGP30_Write(u8 a, u8 b)
{
  SGP30_IIC_Start();
  SGP30_IIC_Send_Byte(SGP30_write);
  SGP30_IIC_Wait_Ack();
  SGP30_IIC_Send_Byte(a);               
  SGP30_IIC_Wait_Ack();
  SGP30_IIC_Send_Byte(b);
  SGP30_IIC_Wait_Ack();
  SGP30_IIC_Stop();
  delay_ms(100);
}

u32 SGP30_Read(void)
{
  u32 dat;
  u8 crc;
  SGP30_IIC_Start();
  SGP30_IIC_Send_Byte(SGP30_read);
  SGP30_IIC_Wait_Ack();
  dat = SGP30_IIC_Read_Byte(1);
  dat <<= 8;
  dat += SGP30_IIC_Read_Byte(1);
  crc = SGP30_IIC_Read_Byte(1);
  crc = crc;  
  dat <<= 8;
  dat += SGP30_IIC_Read_Byte(1);
  dat <<= 8;
  dat += SGP30_IIC_Read_Byte(0);
  SGP30_IIC_Stop();
  return(dat);
}

u32 sgp30_dat;
u32 CO2Data,TVOCData;
void SGP30_Init_ALL(void)
{
  SGP30_Init();   
        delay_ms(100);
        SGP30_Write(0x20,0x08);
        sgp30_dat = SGP30_Read();
        CO2Data = (sgp30_dat & 0xffff0000) >> 16;
        TVOCData = sgp30_dat & 0x0000ffff;      
        
        
        
        
        while(CO2Data == 400 && TVOCData == 0)
        {
                SGP30_Write(0x20,0x08);
                sgp30_dat = SGP30_Read();
                CO2Data = (sgp30_dat & 0xffff0000) >> 16;
                 TVOCData = sgp30_dat & 0x0000ffff;      
                printf("?y?ú?ì2a?D...\r\n");

                OLED_ShowString(0,4,(u8*)"co2 init wait...",16);
                delay_ms(249);


                delay_ms(251);
        }
        OLED_ShowString(0,4,(u8*)"co2 init ok...",16);
        delay_ms(500);
        OLED_Clear();
        printf("......OK.....\r\n");
}

#endif

這是一個(gè)什么程序
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人久久久 | 久久精品一| 九九九久久国产免费 | 精品综合久久久 | 亚洲色图插插插 | 国产激情视频在线免费观看 | 中文字幕一区二区三区在线视频 | 国产资源网 | 国产馆 | 欧美一级黄色免费看 | 成人免费视频网站在线观看 | 亚州精品天堂中文字幕 | 国产精品久久久久久久久久软件 | 91精品国产自产在线老师啪 | 日韩精品视频在线 | 国产精品久久久久aaaa樱花 | 伊人网在线播放 | 日韩精品在线观看一区二区 | 99精品在线免费观看 | 午夜爽爽爽男女免费观看 | 日韩1区 | 亚洲精品日韩视频 | 国产乱码精品一区二区三区忘忧草 | 日本三级线观看 视频 | 久久久久久久av | 精品国产欧美 | 久久99精品久久久久久国产越南 | 国产精品自拍视频网站 | 毛片av免费在线观看 | 成人av激情 | 久久国产精品免费视频 | 精品国产乱码久久久久久a丨 | 天天草视频| 精品在线播放 | 99热播放| 91亚洲精选 | 日韩精品免费 | 国产999精品久久久久久 | 成人av一区| 欧美成人一级视频 | 国产亚洲欧美在线 |