[STM32F1] STM32F103C8T6+SGP30检测CO2与TVOC

[复制链接]
7059|12
 楼主| KellyFoo 发表于 2019-4-8 15:05 | 显示全部楼层 |阅读模式
我使用STM32F103C8T6开发板加SGP30传感器检测CO2与TVOC的浓度,只实现最简单的数据读取,但是读出来的数据各位全为1,不是有效数据,代码如下:
sgp30.h
  1. #ifndef __SGP30_H
  2. #define __SGP30_H

  3. #include "myiic.h"

  4. void Read_Air_Quality(u16 *co2, u16 *tvoc);

  5. void        SGP30_Init(void);

  6. #endif
sgp30.c
  1. #include "sgp30.h"
  2. #include "delay.h"

  3. #include "OLED_IIC.h"

  4. void SGP30_Init(void)
  5. {        
  6.         IIC_Init();
  7.                
  8.         IIC_Start();
  9.         IIC_Send_Byte(0x58);
  10.         IIC_Wait_Ack();
  11.         IIC_Send_Byte(0x20);
  12.         IIC_Wait_Ack();
  13.         IIC_Send_Byte(0x03);
  14.         IIC_Wait_Ack();
  15.         IIC_Stop();
  16.         
  17.         IIC_Start();
  18.         IIC_Send_Byte(0x58);
  19.         IIC_Wait_Ack();
  20.         IIC_Send_Byte(0x20);
  21.         IIC_Wait_Ack();
  22.         IIC_Send_Byte(0x08);
  23.         IIC_Wait_Ack();
  24.         IIC_Stop();
  25. }

  26. void Read_Air_Quality(u16 *co2, u16 *tvoc)
  27. {
  28.         u8 co2_high = 0;
  29.         u8 co2_low = 0;
  30.         u8 tvoc_high = 0;
  31.         u8 tvoc_low = 0;
  32.         
  33.         delay_ms(15000);
  34.         
  35.         IIC_Start();
  36.         IIC_Send_Byte(0x59);
  37.         IIC_Wait_Ack();
  38.         co2_high = IIC_Read_Byte(0);
  39.         co2_low = IIC_Read_Byte(0);
  40.         IIC_Read_Byte(0);
  41.         tvoc_high = IIC_Read_Byte(0);
  42.         tvoc_low = IIC_Read_Byte(0);
  43.         IIC_Read_Byte(0);
  44.         IIC_Stop();
  45.         
  46.         *co2 = (co2_high<<8)|co2_low;
  47.         *tvoc = (tvoc_high<<8)|tvoc_low;
  48. }
main.c
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "OLED_IIC.h"
  7. #include "dht11.h"
  8. #include "usart.h"
  9. #include "sgp30.h"

  10. /************************************************   
  11. STM32F103C8T6     
  12. 12864_IIC_OLED_STM32驱动
  13. OLED显示驱动模块: SSD1306
  14. SGP30传感器
  15. IIC: SCL, SDA
  16. 对应接口: PB0, PB1
  17. SGP30:VCC, SCL, SDA, GND
  18. 对应接口: 3V, PB6, PB7, GND
  19. CH340:TXD, RXD, GND
  20. 对应接口: PA10, PA9, GND
  21. ************************************************/

  22. int main(void)
  23. {
  24.         u16 co2;
  25.         u16 tvoc;

  26.         delay_init();                           //延时初始化
  27.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  28.         
  29.         uart_init(9600);
  30.         SGP30_Init();

  31.         OLED_Init();                    //初始化OLED
  32.   initial_olcd();                  //初始化
  33.         clear_screen();                        //清屏
  34.         
  35.         delay_ms(50000);
  36.         delay_ms(50000);
  37.         delay_ms(50000);

  38.         while(1)
  39.         {
  40.                 Read_Air_Quality(&co2, &tvoc);
  41.                
  42.                 USART_SendData(USART1, 1);
  43.                 delay_ms(12);
  44.                 USART_SendData(USART1, co2>>8);
  45.                 delay_ms(12);
  46.                 USART_SendData(USART1, 2);
  47.                 delay_ms(12);
  48.                 USART_SendData(USART1, co2&0x00ff);
  49.                 delay_ms(12);
  50.                 USART_SendData(USART1, 3);
  51.                 delay_ms(12);
  52.                 USART_SendData(USART1, tvoc>>8);
  53.                 delay_ms(12);
  54.                 USART_SendData(USART1, 4);
  55.                 delay_ms(12);
  56.                 USART_SendData(USART1, tvoc&0x00ff);
  57.                 delay_ms(12);
  58.                 while(USART_GetFlagStatus(USART1, USART_FLAG_TC)!=SET);
  59.                 USART_RX_STA = 0;
  60.                
  61.                 display_number_16x8(1,1,co2);
  62.                 display_number_16x8(3,1,tvoc);
  63.         }
  64. }


请问有大神可以指点一下我这个小渣渣吗~

请叫我树人 发表于 2019-4-9 10:59 | 显示全部楼层
真是不错的啊! 可以的啊!
八层楼 发表于 2019-5-5 13:17 | 显示全部楼层
楼主是不是用的simulator的模式啊
guanjiaer 发表于 2019-5-5 13:56 | 显示全部楼层
那估计是时序的问题
heimaojingzhang 发表于 2019-5-5 14:09 | 显示全部楼层
楼主的时序对不对  
罗黛心言 发表于 2019-5-29 20:05 | 显示全部楼层
您好请问之前那个sgp30传感器得问题解决了吗 可以跟我分享下吗
hello丶酷狗 发表于 2019-6-21 16:01 | 显示全部楼层
sgp3测的CO2,TVOC准不准
zjnlnl 发表于 2019-11-19 08:55 来自手机 | 显示全部楼层
大佬,你这个问题解决了吗,能不能把这个代码分享下
lin130 发表于 2019-11-27 16:07 | 显示全部楼层
请问你的问题解决了吗?我也急需呢,方便的话加下QQ1305174379,联系一下呢,拜托啦
lin130 发表于 2019-11-27 16:07 | 显示全部楼层
zjnlnl 发表于 2019-11-19 08:55
大佬,你这个问题解决了吗,能不能把这个代码分享下

你的解决了吗?
琉璃苣 发表于 2019-11-27 17:05 | 显示全部楼层
lin130 发表于 2019-11-27 16:07
请问你的问题解决了吗?我也急需呢,方便的话加下QQ1305174379,联系一下呢,拜托啦 ...

有加
爱国道人 发表于 2020-5-14 11:32 | 显示全部楼层
首先确定I2C工作正不正常:硬件、软件
550963434 发表于 2020-6-9 15:02 | 显示全部楼层
SGP30的读地址是0xB1,写地址是0xB0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部