JW01二氧化碳传感器(串行通信 STM32)

目录

一、介绍

二、传感器原理

1.工作原理介绍

2.串口数据流格式

三、程序设计

main.c文件

usart3.h文件

usart3.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        JW01-CO2检测模块是一种用于检测空气中二氧化碳浓度的传感器模块。它可以广泛应用于室内空气质量检测、智能家居、温室气体监测等领域。模块采用非分散红外(NDIR)技术进行测量,可以测量空气中的CO2浓度范围从3502000ppm,具有高精度和快速响应的特点。模块采用串口通信方式,可以与单片机或其他设备进行通信。

以下是JW01二氧化碳传感器的参数:

型号

JW01-CO2-V2.2

工作电压

 5.0±0.2VDC

工作电流

80mA

量程

 350-2000PPM

工作温度

-10~40

探测气体

二氧化碳

预热时间

60s

哔哩哔哩视频链接:

JW01二氧化碳传感器(串行通信 STM32)

(资料分享见文末) 

二、传感器原理

1.工作原理介绍

特别说明:

本模块是用TVOC类型传感器经过软件换算的二氧化碳模拟数值,对于其它气体不具有抗干扰性,选择使用时,请留意本说明事项。

2.串口数据流格式

B1的内容2Ch是模块定地址

校验和(B6)=unit_8(B1+B2+B3+B4+B5)

C02气体浓度值(PPM)=(C0z浓度高(B2)*256+C0z浓度低(B3))

数据范例:

例如读到值是2Ch,0lh,90h,03h,0FFh,BFh,则得出如下结果:

校验和:BFh=2Ch+01h+90h+03h+0FFh

C02数值:B2*256+B3=01h*256+90h=400ppm

三、程序设计

1.使用STM32F103C8T6读取JW01二氧化碳传感器采集的数据,通过串口发送至电脑

2.将读取得到信息数据同时在OLED上显示

JW01_A

PB10

JW01_B

PB11

OLED_SCL

PB1

OLED_SDA

PB0

串口

串口1

注意:初次上电使用建议需预热 5-10 分钟以上进行测试

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "usart3.h"

/*****************辰哥单片机设计******************
											STM32
 * 项目			:	JW01二氧化碳传感器实验                     
 * 版本			: V1.0
 * 日期			: 2024.9.14
 * MCU			:	STM32F103C8T6
 * 接口			:	参看usart3.h							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

uint16_t co2;

u8 buff[30];

int main(void)
{ 
	
  SystemInit();//配置系统时钟为72M	
	delay_init(72);
	LED_Init();
	LED_On();
	USART1_Config();
	USART3_Config();
	
	OLED_Init();
	printf("Start \n");
	delay_ms(1000);
	//显示“二氧化碳:”
	OLED_ShowChinese(0,0,0,16,1);
	OLED_ShowChinese(16,0,1,16,1);
	OLED_ShowChinese(32,0,2,16,1);
	OLED_ShowChinese(48,0,3,16,1);
	OLED_ShowChar(64,0,':',16,1);
	

  while (1)
  {
		LED_Toggle();
		CO2GetData(&co2);
		
		sprintf((char*)buff,"%dppm  ",co2);
//		
		printf("二氧化碳浓度: %dppm\r\n",co2);
		
		OLED_ShowString(50,30,buff,16,1);

		delay_ms(500);
  }
}

usart3.h文件

#ifndef __USART1_H
#define	__USART1_H

#include "stm32f10x.h"
#include <stdio.h>

void USART1_Config(void);
int fputc(int ch, FILE *f);
void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...);

#endif /* __USART1_H */

usart3.c文件

#include "usart3.h"	

/*****************辰哥单片机设计******************
											STM32
 * 项目			:	JW01二氧化碳传感器实验                     
 * 版本			: V1.0
 * 日期			: 2024.9.14
 * MCU			:	STM32F103C8T6
 * 接口			:	串口3						
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

uint8_t Usart3_RxPacket[6];				//定义接收数据包数组
uint8_t Usart3_RxFlag;					//定义接收数据包标志位

void USART3_Config(void){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);	//使能USART3,GPIOA时钟
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//使能GPIOB时钟
	
	//USART3_TX   GPIOB.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10
   
    //USART3_RX	  GPIOB.11初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11  

  //Usart3 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;		//子优先级4
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = 9600;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

    USART_Init(USART3, &USART_InitStructure); //初始化串口3
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
    USART_Cmd(USART3, ENABLE);                    //使能串口3 

}

void USART3_IRQHandler(void)                	//串口3中断服务程序
{
		uint8_t Res;
		static uint8_t RxState = 0;		//当前状态机状态
		static uint8_t pRxPacket = 0;	//当前接收数据位置

		if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
			Res =USART_ReceiveData(USART3);	//读取接收到的数据	
			switch (RxState)
			{
				case 0: 
					if (Res == 0x2C)
					{
						Usart3_RxPacket[pRxPacket] = Res;	//将数据存入数组
						pRxPacket++;
						RxState = 1;

					}
					else
					{
						pRxPacket = 0;
						RxState = 0;
					}
					break;
				case 1: 
						Usart3_RxPacket[pRxPacket] = Res;	//将数据存入数组
						pRxPacket++;
						if(pRxPacket >= 6)
						{
							pRxPacket = 0;
							RxState = 2;
						}
					break;
				case 2:
					if (Usart3_RxPacket[5] == (uint8_t)(Usart3_RxPacket[0] + Usart3_RxPacket[1]	//验证接收到的数据是否正确
						+ Usart3_RxPacket[2] + Usart3_RxPacket[3] + Usart3_RxPacket[4]))
					{
						
						RxState = 0;
						pRxPacket = 0;
						Usart3_RxFlag = 1;		//接收数据包标志位置1,成功接收一个数据包
					}
					else
					{
						pRxPacket = 0;
						RxState = 0;
					}
					break;
			}
			
			USART_ClearITPendingBit(USART3, USART_IT_RXNE);		//清除标志位
		} 
} 


void CO2GetData(uint16_t *data)
{
	if (Usart3_RxFlag == 1)
	{
		Usart3_RxFlag = 0;
		*data = Usart3_RxPacket[1] * 256 + Usart3_RxPacket[2];
	}
}

四、实验效果 

五、资料获取

项目分享

<think>嗯,用户问的是关于“jw01电路图”的介绍。首先,我需要确定“jw01”具体指的是什么。可能是一个型号或者某个特定设备中的电路模块。由于没有更多上下文,可能需要做一些假设。 首先,检查是否有常见的电路板或模块以JW01为型号。比如,JW01可能是一款电源管理芯片、传感器模块,或者是某种控制器的电路图。例如,JW01可能用于充电控制、温度检测或电机驱动等应用。 接下来,考虑用户可能的背景。如果用户是电子爱好者或工程师,他们可能需要了解电路的结构、元件组成和工作原理。因此,回答需要包括功能模块、关键元件分析,比如可能的微控制器、传感器接口、电源部分等。 另外,用户可能遇到的问题是无法找到JW01的详细资料,所以需要建议他们查找具体型号的datasheet或应用手册。同时,提醒他们注意元件的参数和电路设计的注意事项,比如电压、电流限制,或者信号处理部分的设计。 需要确保回答结构清晰,分点说明可能的组成部分,并给出实用的建议,比如如何获取更多信息或测试电路的方法。同时,考虑到用户可能对电路设计不熟悉,避免使用过于专业的术语,保持解释通俗易懂。 最后,确保遵循系统级指令,正确使用LaTeX格式,比如在提到数学表达式或公式时使用$...$,但在这个问题中可能涉及较少数学内容,不过如果有涉及参数计算,如电阻分压公式$V_{out} = V_{in} \times \frac{R2}{R1 + R2}$,则需要正确应用格式。</think>由于“jw01电路图”的表述存在信息模糊性(未明确所属设备类型或功能模块),我将按照通用电路图分析方法为您梳理关键信息: ### 一、电路图基础推测 1. **命名规则分析** JW01可能是: - **芯片型号**(如电源管理IC、传感器) - **模块编号**(如某设备的电源/控制单元) - **开发板代号**(如实验电路板) 2. **典型应用场景** 常见于以下领域: - 📌 锂电池充电管理(如JW01作为充电控制IC) - 📌 温度/湿度传感器信号调理 - 📌 电机驱动控制电路 ### 二、核心模块组成(假设为控制类电路) ```plaintext +---------------+ | 电源输入 | → 滤波电容配置(如:$C_1=100\mu F$) | (9-12V DC) | +---------------+ ↓ +---------------+ | JW01主控芯片 | → 典型引脚功能: | | VCC/GND | PWM_OUT | ADC_IN | EN +---------------+ ↓ +---------------+ | 外设接口 | → 可能包含MOSFET驱动、传感器连接器 | (电机/传感器) | 保护电路设计(TVS管、自恢复保险丝) +---------------+ ``` ### 三、关键元件选型建议 1. **电源部分** - 输入滤波:$C_{bulk} \geq \frac{I_{max}}{2\pi f \Delta V}$ ($f$为纹波频率,$\Delta V$为允许纹波) - 线性稳压器:需满足$P_d = (V_{in}-V_{out})I_{load} < P_{max}$ 2. **信号链设计** - 模拟采样:建议添加RC低通滤波器 截止频率:$f_c = \frac{1}{2\pi R C}$ - 数字接口:上拉电阻值计算$R_{pull-up} < \frac{V_{OH}}{I_{IH}}$ ### 四、调试要点 1. **上电检测流程**: - 测量各节点电压(建议公差±5%) - 信号完整性检查(示波器观测PWM波形) - 热成像检测异常发热元件 2. **常见故障处理**: - 芯片无输出 → 检查使能引脚电平 - 输出振荡 → 优化反馈网络相位裕度 ### 五、资料获取建议 1. 通过芯片丝印查询datasheet(如JW01对应具体型号) 2. 在开源硬件平台(GitHub、OSHWHub)搜索项目实例 3. 使用电路仿真工具(如LTspice)搭建测试模型 如需更精准的分析,请提供: - 电路图照片(关键区域特写) - 芯片/模块实物标识信息 - 目标功能描述(如输入输出参数要求) 注:实际设计中请严格遵循$$P_{dissipated} = I^2R$$的功耗计算原则,确保元件可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值