代码质量检测-SonarQube

这篇具有很好参考价值的文章主要介绍了代码质量检测-SonarQube。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

CI/CD流水线完善计划, 增加代码质量检查作业,在开发代码合入前提前发现不安全问题,因此引入代码质量检测-SonarQube服务。


一、SonarQube是什么?

Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。 此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。

二、SonarQube安装步骤

当前最新发布 SonarQube 社区版9.7,以下步骤以此为例。

1.docker安装

快速安装,仅限于测试或则体验:

docker run -d --name sonarqube --restart always -p 9000:9000 sonarqube

2.docker-compose安装

可用于持久化,私有化部署使用。
docker-compose.yml 配置:

version: "3"
services:
  sonarqube:
    image: sonarqube:9.7-community
    container_name: sonarqube
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
      - "9000:9000"
  db:
    image: postgres:12
    container_name: postgres
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data
volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:


如果是非volume安装,注意给本地文件权限
chmod 777 -R xxxx

修改系统资源:

sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192

在docker-compose.yml 文件更目录执行:

docker compose up -d

3. 访问SonarQube

URL: http://localhost:9000
用户名: admin
密码: admin

sonarqube,devops,软件构建,敏捷流程

4. 配置SonarQube

4.1 安装中文插件

  1. 在线安装:
    sonarqube,devops,软件构建,敏捷流程
    sonarqube,devops,软件构建,敏捷流程

    插件在GitHub,因为网络原因可能会安装失败,多试几次。

    
    Caused by: org.sonar.api.utils.SonarException: Fail to download: https://github.com/xuhuisheng/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-9.7/sonar-l10n-zh-plugin-9.7.jar (no proxy)
            at org.sonar.core.util.DefaultHttpDownloader.failToDownload(DefaultHttpDownloader.java:157)
            at org.sonar.core.util.DefaultHttpDownloader.download(DefaultHttpDownloader.java:152)
            at org.sonar.server.plugins.PluginDownloader.downloadRelease(PluginDownloader.java:145)
            at org.sonar.server.plugins.PluginDownloader.download(PluginDownloader.java:118)
            ... 131 common frames omitted
    Caused by: java.net.SocketTimeoutException: connect timed out
            at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
            at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)
            at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)
            at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
            at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
            at java.base/java.net.Socket.connect(Socket.java:609)
            at java.base/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:305)
            at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:177)
            at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474)
            at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:569)
            at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:266)
            at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:373)
            at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:203)
            at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1187)
            at java.base/sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1071)
            at java.base/sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1069)
            at java.base/java.security.AccessController.doPrivileged(Native Method)
            at java.base/java.security.AccessController.doPrivilegedWithCombiner(AccessController.java:795)
            at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1068)
            at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:189)
            at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:168)
            at org.sonar.core.util.DefaultHttpDownloader$BaseHttpDownloader$HttpInputSupplier.getInput(DefaultHttpDownloader.java:274)
            at org.sonar.core.util.DefaultHttpDownloader.download(DefaultHttpDownloader.java:149)
            ... 133 common frames omitted
    
    

    sonarqube,devops,软件构建,敏捷流程

    安装完成重启
    sonarqube,devops,软件构建,敏捷流程

    也可以通过docker 重启容器

    docker restart sonarqube
    

    其他插件也可在应用市场安装。

  2. 离线安装
    下载好的插件直接扔到 sonarqube安装目录下的 extensions/plugins
    重启sonarqube即可。

    如果是先查找对应sonarqube_extensions 卷路径,插件路径默认在
    /var/lib/docker/volumes/sonarqube_sonarqube_extensions/_data/plugins

4.2 导入规则集

目前国内ali-p3c-pmd规则集比较流行,适用于没有自己规则的中小企业。

  1. 下载ali-p3c-pmd插件 源码
    https://github.com/caowenliang/sonar-pmd-p3c

  2. 打包部署插件

    mvn clean install -Dmaven.test.skip=true
    

    将{仓库目录}\sonar-pmd-plugin\target\ 下生成的sonar-pmd-plugin-3.2.1.jar
    copy到 sonarqube的{安装目录}/extensions/plugins下.。

    如果是docker数据卷安装可以直接扔到对应数据卷目录下。

    /var/lib/docker/volumes/sonarqube_sonarqube_extensions/_data/plugins
    

    重启sonarqube容器

    docker restart sonarqube
    
  3. 重启完成可以在插件市场看到已安装的规则集插件
    sonarqube,devops,软件构建,敏捷流程

  4. 进入代码规则页面,过滤器输入p3c,在仓库下可以看到PMD规则一共56条,为ali-p3c-pmd全部规则
    sonarqube,devops,软件构建,敏捷流程

4.3 配置规则集

创建质量配置
sonarqube,devops,软件构建,敏捷流程
输入名称和代码语言
sonarqube,devops,软件构建,敏捷流程
为新创建的配置添加规则
sonarqube,devops,软件构建,敏捷流程
进入到规则页面,左侧过滤器显示当前选择的规则集,有系统自带e.g.:xxxx(内置)的规则集,和我们导入的外部规则集(ali-p3c-pmd)。
sonarqube,devops,软件构建,敏捷流程
这里选择我们导入的规则集PMD(过滤器输入p3c >>选择仓库下的PMD(56条))
sonarqube,devops,软件构建,敏捷流程
弹出框激活—选择我们的质量配置all-check----应用
sonarqube,devops,软件构建,敏捷流程
ali-p3c-pmd一共56条规则,排除了PMD默认规则(因为没有中文描述)

4.3 安装多分支检查插件

  1. 下载插件

    https://github.com/mc1arke/sonarqube-community-branch-plugin/releases

  2. 离线 安装到插件目录 extensions/plugins/

  3. 修改config
    进入docker容器内部

    docker exec -it sonarqube bash
    

    修改sonar.properties

    vi conf/sonar.properties
    

    在文件末尾加入两行:

    sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-${version}.jar=web
    
    sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-${version}.jar=ce
    

    ${version}:你所下载的jar包的版本,本文因SonarQube版本为9.7所以是填入1.12.0
    插件作者已更新:
    ${version}:你所下载的jar包的版本,本文因SonarQube版本为9.7所以是填入1.13.0

    保存文件,重启sonarqueb。

    9.7社区版安装1.12.0有问题:
    10:40:30.202 [main] INFO com.github.mc1arke.sonarqube.plugin.CommunityBranchAgent - Loading agent
    Exception in thread “main” java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
    at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
    Caused by: java.lang.ClassNotFoundException: org.sonar.server.almsettings.MultipleAlmFeatureProvider
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at com.github.mc1arke.sonarqube.plugin.CommunityBranchAgent.redefineEdition(CommunityBranchAgent.java:93)
    at com.github.mc1arke.sonarqube.plugin.CommunityBranchAgent.premain(CommunityBranchAgent.java:56)
    … 6 more
    *** java.lang.instrument ASSERTION FAILED ***: “result” with message agent load/premain call failed at src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 422
    FATAL ERROR in native method: processing of -javaagent failed, processJavaStart failed

    安装9.6社区版,或者等待插件升级
    sonarqube,devops,软件构建,敏捷流程

  4. 登录sonarqube,忽略风险提示
    sonarqube,devops,软件构建,敏捷流程

    修改maven 构建命令,添加:

    -Dsonar.branch.name=${CI_COMMIT_BRANCH}
    

    选择对应分支扫描后就能看到
    sonarqube,devops,软件构建,敏捷流程

三、SonarQube使用步骤

1. 创建项目

  1. 创建项目

    sonarqube,devops,软件构建,敏捷流程

    输入项目名称
    sonarqube,devops,软件构建,敏捷流程

    选择本地构建
    sonarqube,devops,软件构建,敏捷流程

    创建令牌,默认即可
    sonarqube,devops,软件构建,敏捷流程

    sonarqube,devops,软件构建,敏捷流程
    测试项目为java maven项目,选择maven
    sonarqube,devops,软件构建,敏捷流程

    复制maven执行命令
    sonarqube,devops,软件构建,敏捷流程

2. 启动本地扫描

  1. 进入IDEA maven构建菜单,copy命令回车执行(注意删除输入栏的mvn)
    sonarqube,devops,软件构建,敏捷流程

  2. 等待执行完成,登录sonarqube项目页面查看结果。
    sonarqube,devops,软件构建,敏捷流程
    点击问题个数进入详情

    p3c规则都属于异味,sonar 扫描代码后,在类型 “异味” 可以找到,分“阻断”、“严重”、“主要” 3个严重等级

    sonarqube,devops,软件构建,敏捷流程

  3. 注意事项

    org/sonar/batch/bootstrapper/EnvironmentInformation has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
    

    当前项目为JDK1.8,sonarqube 9.7 在jdk11上运行,所以本地编译会报错;
    解决方法:
    修改本地JDK环境为jdk11
    安装低版本sonarqube7.8(最后一个支持jdk1.8的版本)—不推荐
    我们目标是流水线构建,本地构建可以采用idea插件,这里暂不介绍。

四、GitLab流水线集成Sonarqube扫描

1. sonarqube创建关联gitlab仓库的项目

  1. 在sonarqube配置-ALM集成-gitlab 创建配置
    sonarqube,devops,软件构建,敏捷流程

    配置名称:gitlab
    GitLab网址: http://localhost/api/v4
    个人访问令牌: 在gitlab中设置

    sonarqube,devops,软件构建,敏捷流程

    Gitlab个人访问令牌创建:

    sonarqube,devops,软件构建,敏捷流程

    复制令牌

    sonarqube,devops,软件构建,敏捷流程

    配置成功

    sonarqube,devops,软件构建,敏捷流程

  2. 新建项目=>更多=>来自gitlab
    sonarqube,devops,软件构建,敏捷流程
    输入需要访问项目的仓库管理员用户令牌,需要read_api权限
    sonarqube,devops,软件构建,敏捷流程
    保存后可以看到该用户名下的gitlab仓库
    sonarqube,devops,软件构建,敏捷流程
    点击设置,配置对应仓库的代码检查项目

2. 配置gitlab流水线作业

2.1 选择设置好的项目,使用Gitlab CI来分析项目

sonarqube,devops,软件构建,敏捷流程
sonarqube,devops,软件构建,敏捷流程
sonarqube,devops,软件构建,敏捷流程

sonarqube,devops,软件构建,敏捷流程
sonarqube,devops,软件构建,敏捷流程

sonarqube,devops,软件构建,敏捷流程

2.2 配置gitlab-runner

  1. docker创建gitlab-runner的步骤

    docker run -d --name gitlab-runner --restart always \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v gitlab-runner-config:/etc/gitlab-runner \
        gitlab/gitlab-runner:latest
    
  2. gitlab注册runner
    sonarqube,devops,软件构建,敏捷流程
    点击注册一个实例runner=>显示runner安装与注册说明
    sonarqube,devops,软件构建,敏捷流程

    复制 注册runner的命令
    进入刚才启动好的runner 容器

    docker exec -it gitlab-runner bash
    

    执行命令,一路回车确定

    gitlab-runner register --url http://localhost/ --registration-token D8pXEqBH6nRrRsNCRSk_
    
  3. 配置gitlab-runner config.toml

    [[runners]]
    name = “”
    url = “http://localhost/”
    token = “D8pXEqBH6nRrRsNCRSk_”
    executor = “docker”
    [runners.custom_build_dir]
    [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]

    注意修改 executor = “docker”

2.3 maven镜像私有化配置

  1. gitlab添加变量引入自定义settings.xml

    键:MVN_SETTINGS_XML
    值:settings.xml文件内容复制进来
    类型:文件
    # MVN_SETTINGS_XML变量在GitLab的设置=>CI/CD=>变量中定义,值就是整个settings.xml的内容(文本),变量类型设置成了"文件"

    sonarqube,devops,软件构建,敏捷流程

  2. maven构建脚本引入变量

    -s ${MVN_SETTINGS_XML}

      script: 
        - mvn -s ${MVN_SETTINGS_XML}
    
  3. docker镜像配置本地仓库缓存
    配置gitlab-ci缓存

      script: 
        - mvn -s ${MVN_SETTINGS_XML} -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository 
      cache:
        key: "${CI_JOB_NAME}"
        paths:
          - .m2/repository
    

2.4 启动流水线

完整gitalab-ci.yml配置

sonarqube-check:
  stage: build  
  image: maven:3.6.3-jdk-11
  tags:
    - docker-runner  
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"  # Defines the location of the analysis task cache
    GIT_DEPTH: "0"  # Tells git to fetch all the branches of the project, required by the analysis task
  script: 
    - mvn -s ${MVN_SETTINGS_XML} -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository verify sonar:sonar -Dsonar.projectKey=test
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
      - .m2/repository
  allow_failure: true
  only:
    - master # or the name of your main branch

运行流水线完毕到sonarqube查看检测报告

注意事项
当前配置仅支持master分支检测,需要切分支,需要装插件
stage 和 tags值按照自己项目配置定义
目前缓存还不是很完美,每次需要从gitlab应用所在环境copy缓存到执行机,存在一些延迟。
如果放到runner执行机本地更好,但不灵活。

效率分析:
sonarqube,devops,软件构建,敏捷流程

TODO 总用时59s
Analysis total time: 9.997
Total time: 29.079 s
pull images 59-29~= 20s
docker镜像下载还有必要优化

2.5 流水线门禁设置

我们期望当代码质量不满足sonarqube设置的门禁时,流水线运行阻塞,不进行后续作业。

  1. 创建sonarqube质量阀
    sonarqube,devops,软件构建,敏捷流程

  2. 如果没有创建,sonarque有默认值,如果需要自定义门禁值,创建规则后按需添加条件
    sonarqube,devops,软件构建,敏捷流程

  3. gitlab流水线如果需要sonarqube检查成功后才可执行下阶段作业,需要修改gitlab-ci.yml

    allow_failure: false    
    

    sonarqube,devops,软件构建,敏捷流程

  4. 当流水线未通过代码检查时
    sonarqube,devops,软件构建,敏捷流程

    点击sonarqueb-check job查看详情
    sonarqube,devops,软件构建,敏捷流程
    点击链接跳转sonarqube查看代码质量详情
    sonarqube,devops,软件构建,敏捷流程

2.6 Gitlab查看SonarQube报告

  1. SonarQube配置
    盗的图sonarqube,devops,软件构建,敏捷流程
  2. 即可从GITLAB MR跳转

五、代码质量

sonarqube,devops,软件构建,敏捷流程

异味

ali-p3c-pmd问题都归属异味

点击数量进入
sonarqube,devops,软件构建,敏捷流程

严重程度细分为: 阻断=>严重=>主要=>次要=>提示
其中阻断、严重需要解决

覆盖率

单元测试覆盖率,行覆盖率

pom.xml引入jacoco插件,注意版本不行就换

	<build>
		<plugins>
			<plugin>
				<groupId>org.jacoco</groupId>
				<artifactId>jacoco-maven-plugin</artifactId>
				<version>0.8.8</version>
				<executions>
					<execution>
						<goals>
							<goal>prepare-agent</goal>
							<goal>report</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

重复率

新增代码质量

本次推送或者MR的新增部分代码质量

全部代码质量

仓库全部代码当前质量

质量阀

sonarqube,devops,软件构建,敏捷流程

质量阀俗称门禁值,根据项目要求设置各类指标,如不了解,用默认值。
超过门禁值,检测失败


总结

本文介绍了sonarqube的docker安装及使用,结合gitlab-ci完成自动化代码质量检测。文章来源地址https://www.toymoban.com/news/detail-820456.html

到了这里,关于代码质量检测-SonarQube的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高质量椭圆检测库

    目录 前言 效果展示 检测库 简介 安装库 用法 测试 论文算法步骤简读 1. lsd 检测 2. lsd group 3. 生成初始 ellipse 4. 聚类 椭圆检测是工业中比较常用的一种检测需求。目前常用的基于传统图像处理的椭圆检测方法是霍夫变换,但是霍变换的检测率比较低,很难满足工业场景。而基

    2024年02月07日
    浏览(124)
  • 测试开源C#人脸识别模块ViewFaceCore(5:质量检测和眼睛状态检测)

       ViewFaceCore模块中的FaceQuality支持预测人脸质量 ,最初以为是预测人体体重,实际测试过程中才发现是评估人脸图片质量,主要调用Detect函数执行图片质量检测操作,其函数原型如下所示:   调用FaceQuality进行人脸质量检测主要包括以下步骤:   1)调用faceDetector类获

    2024年02月15日
    浏览(32)
  • 基于K近邻的葡萄酒质量检测项目

    💥 项目专栏:【机器学习项目实战案例目录】项目详解 + 完整源码 🌠 『精品学习专栏导航帖』 🐳

    2024年02月03日
    浏览(40)
  • 特定场景小众领域数据集之——焊缝质量检测数据集

    写这篇文章最大的初衷就是最近频繁的有很多人私信问我相关的数据集的问题,基本上都是从我前面的目标检测专栏里面的这篇文章过来的,感兴趣的话可以看下: 《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 保姆级的教程,小白即可

    2024年02月14日
    浏览(29)
  • 基于单片机的空气质量检测系统

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式   本设计使用STC89C52单片机作为主控单元,由夏普GP2Y1010AU粉尘传感器采集周围环境的粉尘浓度值,再经过ADC0832模数转换器对测量到的信号进行模数转

    2024年02月07日
    浏览(34)
  • 【计算机视觉 | 目标检测】Objects365 :最新大规模高质量目标检测数据集

    2019 年 4 月,在北京举行的智源学者计划启动暨联合实验室发布会上,北京旷视科技有限公司与北京智源人工智能研究院共同发布了全球最大的目标检测数据集 : Objects365。 该数据集总共包含63万张图像,覆盖365个类别,高达1000万框数,具有规模大、质量高、泛化能力强的特

    2024年02月05日
    浏览(50)
  • stm32毕业设计 空气质量检测系统

    Hi,大家好,学长今天向大家介绍一个 单片机项目 基于STM32的空气质量检测仪 大家可用于 课程设计 或 毕业设计 选题指导,项目分享: https://gitee.com/yaa-dc/warehouse-1/blob/master/iot/README.md 如今人们大约 80%的时间是在室内度过的, 室内空气质量与我们每个人的工作和生活都息息

    2024年02月02日
    浏览(43)
  • 【数据挖掘】葡萄酒质量分析及异常值检测

    葡萄酒在人类历史中扮演着非常重要的角色,它能舒缓疲劳、减轻病痛、消毒杀菌、美容养颜等等直到19世纪晚期,葡萄酒都是西方医学中不可缺少的用品,适量饮用对人的身体会有益处。无论是用于交际会谈,还是滋身养颜,优良的葡萄酒因其独特的风味与绝佳的品质往往

    2024年02月04日
    浏览(47)
  • 【STM32外设系列】JW01三合一空气质量检测模块

    🎀 文章作者:二土电子 🌸 关注公众号获取更多资料! 🐸 期待大家一起学习交流!   首先我们看一下JW01的样子   值得注意的是,本文介绍的是三合一空气质量检测模块,能够检测空气中有机气态物质的浓度,同时也能检测甲醛和二氧化碳的浓度,该模块通过串口输

    2024年02月04日
    浏览(52)
  • STM32CubMX_MQ135检测空气质量

    MQ135 是测量空气污染情况常用的一个传感器,具有代表性,价格低,寿命长,敏感度也OK,主要用于测量空气中二氧化碳,氮氧化物,氨气,酒精,苯类等。这几样气体可以说都属于家用空气污染测定中的重要成份,因此用这个传感器刚刚好。 MQ135 气体传感器所使用的气敏材

    2023年04月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包