嵌入式人工智能(23-基于树莓派4B的温湿度传感器DHT11)

news2024/11/23 7:59:14

1、湿度传感器

目前市面上,仅测量湿度的传感器很少,普遍使用的都是温/湿度传感器,即以温/湿度一体式的探
头作为测温元件,将温度和湿度信号采集出来,再经过稳压滤波、运算放大、非线性校正、V转换、恒流及反向保护等电路处理后,转换成与温度和湿度成线性关系的电流或电压信号输出,也可以直接通过主控芯片输出。本文将以一款比较普遍的温/湿度传感器DHT1模块为例,测量温度和湿度。

2、DHT11

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。

DHTI1其采用3.3~5V的工作电压,其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。该传感器设本身有4个引脚,但其中一个引脚在使用时经常悬空,所以可以购买已完成数字模块和传感器焊接的3针模块。

3、与树莓派的连接

该模块与DS18B20类似,都是单总线结构,只需要3个引脚连接到树莓派:VCC、DATA和GND。分别连接在树莓派的3.3V引脚、GPIO4引脚(或其他 GPIO 引脚)和 GND引脚上。具体接线方式如上图,在开始接线前应先切断树派的电源。这里是接GPIO4,修改启动配置文件sudo nano /boot/firmware/config.txt 。添加dtoverlay=dht11,gpiopin=4

sudo cat /sys/devices/platform/dht11@4/iio\:device0/in_humidityrelative_input 
这里会报错:

我初步判断与DHT11传感器的读取时间太短有关,多试几次虽然不报错,但是显示0。先不管这个,我们到程序中调用相关函数进行读取,看看能不能读取到温湿度值。

4、温湿度C程序

我先上网找了个C语言版本的DHT11温湿度读取程序,确定传感器连接配置没有问题。

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
 
typedef unsigned char uint8;
typedef unsigned int  uint16;
typedef unsigned long uint32;
 
#define HIGH_TIME 32
 
int pinNumber = 7;    //wiringPi编码的PIN 7,即为BCM编码的PIN 4
uint32 databuf;
  
uint8 readSensorData(void)
{
    uint8 crc; 
    uint8 i;
  
    pinMode(pinNumber, OUTPUT); // set mode to output
    digitalWrite(pinNumber, 0); // output a high level 
    delay(25);
    digitalWrite(pinNumber, 1); // output a low level 
    pinMode(pinNumber, INPUT); // set mode to input
    pullUpDnControl(pinNumber, PUD_UP);
 
    delayMicroseconds(27);
    if (digitalRead(pinNumber) == 0) //SENSOR ANS
    {
        while (!digitalRead(pinNumber))
            ; //wait to high
 
        for (i = 0; i < 32; i++)
        {
            while (digitalRead(pinNumber))
                ; //data clock start
            while (!digitalRead(pinNumber))
                ; //data start
            delayMicroseconds(HIGH_TIME);
            databuf *= 2;
            if (digitalRead(pinNumber) == 1) //1
            {
                databuf++;
            }
        }
 
        for (i = 0; i < 8; i++)
        {
            while (digitalRead(pinNumber))
                ; //data clock start
            while (!digitalRead(pinNumber))
                ; //data start
            delayMicroseconds(HIGH_TIME);
            crc *= 2;  
            if (digitalRead(pinNumber) == 1) //1
            {
                crc++;
            }
        }
        return 1;
    }
    else
    {
        return 0;
    }
}
  
int main(void)
{
    printf("PIN:%d\n", pinNumber);
 
    if (-1 == wiringPiSetup()) {
        printf("Setup wiringPi failed!");
        return 1;
    }
  
    pinMode(pinNumber, OUTPUT); // set mode to output
    digitalWrite(pinNumber, 1); // output a high level 
 
    printf("Starting...\n");
    while (1) 
    {
        pinMode(pinNumber, OUTPUT); // set mode to output
        digitalWrite(pinNumber, 1); // output a high level 
        delay(3000);
        if (readSensorData())
        {
            printf("Sensor data read ok!\n");
            printf("RH:%d.%d\n", (databuf >> 24) & 0xff, (databuf >> 16) & 0xff); 
            printf("TMP:%d.%d\n", (databuf >> 8) & 0xff, databuf & 0xff);
            databuf = 0;
        }
        else
        {
            printf("Sensor dosent ans!\n");
            databuf = 0;
        }
    }
    return 0;
}

编译 gcc -Wall -o dht11 dht11.c -lwiringPi

运行 ./dht11  这样看来能正常的读取温湿度数据。可以放心的搞Python代码了 

5、Python实验代码

首先安装CircuitPython-DHT库

pip install adafruit-circuitpython-dht

pip install adafruit-blinka

sudo apt-get install libgpiod2

import time
import board
import adafruit_dht


# 设置传感器类型,可以为DHT11、DHT22或AM2302
# 设置连接的GPIO引脚board.D21
dht_device = adafruit_dht.DHT11(board.D21)

while True:
    try:
        # 将值打印到串行端口
        tem_c = dht_device.temperature
        tem_f = tem_c * (9 / 5) + 32
        hum = dht_device.humidity
        # 打印读取到的信息
        print("温度: {:.1f} °F / {:.1f} °C    湿度: {}% ".format(tem_f, tem_c, hum))
    except RuntimeError as error:
        # 打印出错误信息
        print(error.args[0])
    time.sleep(2.0)

 这里有一个报错,我估计和GPIO4引脚有关,只能换一个引脚试试,这个Python的库函数毕竟不如C库,不稳定,我换了GPIO21.(之前的adafruit-DHT库被弃用了,现在用circuitpython库,弃用一个可以工作的库而代之以一个有bug的库,这让我(几乎)无话可说

6、将温湿度数据插入数据库

这次已经获得温湿度数据了,针对上次的程序稍微修改下即可。

        humidity  = dhtDevice.humidity
        temperature = dhtDevice.temperature
        print("温度: {:.1f} °C    湿度: {}% ".format(temperature, humidity))
        time_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        tabelname = 'Environment_table'
        data={'device_id':'0823334e0c43','datetime':time_str,'tenperature':str(temperature),'humidity':str(humidity)}
        Mysql_func.Sql_Insert_Table(data, tabelname)

我们用命令行的方式直接在树莓派系统查询表数据use Embedded_myDB

select * from Environment_table;

树莓派毕竟只是一个口袋型微型计算机,存储容量有限,如果是大规模的传感器数据还是要上传远程数据库服务器或者云服务器。只要把mysql的相关连接信息改下即可。

这样嵌入式的硬件与软件紧密结合,物联网和大数据相互辉映,人工智能与云计算共同发展(后期会有图像采集到图像处理、推理的项目再详细介绍)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1951641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Meachines] Lame smbd3.0-RCE

信息收集 IP AddressOpening Ports10.10.10.3TCP:21,22,139,445,3632 $ nmap -p- 10.10.10.3 --min-rate 1000 -sC -sV 21/tcp open ftp vsftpd 2.3.4 |_ftp-anon: Anonymous FTP login allowed (FTP code 230) | ftp-syst: | STAT: | FTP server status: | …

【Stable Diffusion】(基础篇五)—— 使用SD提升分辨率

使用SD提升分辨率 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 在前期作画的…

【NoSQL数据库】Redis知识小册

一、缓存穿透 缓存穿透是先查Redis&#xff0c;发现缓存中没有数据&#xff0c;再查数据库。然而&#xff0c;如果查询的数据在数据库中也不存在&#xff0c;那么每次查询都会绕过缓存&#xff0c;直接落到数据库上。 解决方案一、缓存空数据 查询Redis缓存&#xff1a;首先查…

独立开发者系列(34)——node项目部署

本节梳理node项目的部署&#xff0c;搭建一个外部能正常访问的node网站。将开发好的项目搭建到系统里面。Node的部署比PHP版本要复杂一些。部署项目前要理解几个概念。Nodejs版本管理器概念。 NVM概念&#xff0c;我们平时开发是在本地电脑上开发&#xff0c;开发的时候&#x…

计算机毕业设计:基于SSM的宠物领养系统

私信获取完整代码 一、选题背景介绍 &#x1f4d6;☕️&#x1f30a;&#x1f4dd;&#x1f4da;&#x1f3a9;&#x1f680;&#x1f4e3; &#x1f3a9; 宠物领养系统&#xff1a;帮助爱宠人士更好的去查看可以领养的宠物&#xff0c;帮助宣传相关保护宠物相关知识 &…

PHP家政系统自营+多商户独立端口系统源码小程序

家政行业的新篇章 引言&#xff1a;家政行业的数字化转型 近年来&#xff0c;随着科技的飞速发展和人们生活节奏的加快&#xff0c;家政服务行业也迎来了数字化转型的浪潮。为了提升服务效率、优化用户体验&#xff0c;越来越多的家政公司开始探索“家政系统自营多商户小程序…

Qt Designer的父子部件样式表设置学习

在Qt Designer中新建图像界面&#xff0c;放置两个QWidget&#xff0c;命名为widget_1和widget_2&#xff1b;两个QPushButton&#xff0c;pushButton_1和pushButton_2。 它们的父子从属关系如下&#xff1a; 设置widget_1的样式表&#xff1a; QWidget{ background-color: r…

lua 游戏架构 之 游戏 AI (八)ai_tbl 行为和优先级

定义一系列的AI行为类型和它们的优先级&#xff0c;以及一个映射表ai_tbl来关联每种AI行为类型与对应的脚本文件和优先级。以下是对代码的详细解释&#xff1a; lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客https://blog.csdn.net/heyuchang666/artic…

构建现代化农业产业服务平台的系统架构

随着全球农业产业的发展和技术的进步&#xff0c;农业生产管理面临着越来越复杂的挑战和机遇。建立一个现代化的农业产业服务平台系统架构&#xff0c;不仅能够提高农业生产效率和管理水平&#xff0c;还能促进农民收入增长和可持续发展。本文将探讨如何设计和实施这样一个系统…

git配置环境变量

一.找到git安装目录 打开此git安装目录下的bin文件&#xff0c;复制此文件路径 二.配置环境变量 2.1 右键点击此电脑的属性栏 2.2 点击高级系统配置 2.3 点击环境变量 2.4 按图中步骤进行配置 三.配置完成 win r 输入cmd打开终端 终端页面中输入 git --version 如图所示…

PySide(PyQt)的QPropertyAnimation(属性动画)

学不完&#xff0c;根本学不完:(&#xff0c;感觉逐渐陷入了学习深渊。。。 QPropertyAnimation 是 PySide(PyQt) 中一个用于在时间轴上平滑地改变对象属性的类。它常用于制作动画效果&#xff0c;比如移动、缩放或改变透明度等。 基本概念 QPropertyAnimation 是 Qt …

文件包含漏洞--pyload

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.PHP伪协议利用 php://协议 php://filter &#xff1a;用于在读取作用和写入文件时进行过滤和转换操作。 作用1&#xff1a;利用base64编码过滤器读取源码 通常利用文件包含执行php://filte…

17.5【C语言】static的补充说明

static &#xff08;静态的) 作用&#xff1a;修饰局部变量&#xff0c;修饰全局变量&#xff0c;修饰函数 对比两段代码 #include <stdio.h> void test() {int a 5;a;printf("%d ", a); } int main() {int i 0;for(i0; i<5; i){test();}return 0; } …

ElasticSearch(三)—文档字段参数设置以及元字段

一、 字段参数设置 analyzer&#xff1a; 指定分词器。elasticsearch 是一款支持全文检索的分布式存储系统&#xff0c;对于 text类型的字段&#xff0c;首先会使用分词器进行分词&#xff0c;然后将分词后的词根一个一个存储在倒排索引中&#xff0c;后续查询主要是针对词根…

【H.264】H.264详解(二)—— H264视频码流解析示例源码

文章目录 一、前言二、示例源码【1】目录结构【2】Makefile源码【3】h264parser.c源码【4】编译运行【5】源码下载地址 声明&#xff1a;此篇示例源码非原创&#xff0c;原作者雷霄骅。雷霄骅&#xff0c;中国传媒大学通信与信息系统专业博士生&#xff0c;在此向雷霄骅雷神致敬…

SEO与数据中心代理IP的结合能带来哪些便利?

本文将探讨将SEO与数据中心代理IP结合所带来的好处&#xff0c;以及如何利用这种组合来提升网站在搜索引擎中的排名和可见性。 1. 数据中心代理IP的作用和优势 数据中心代理IP指的是由数据中心提供的IP地址&#xff0c;用于隐藏真实服务器的位置和身份。与其他类型的代理IP相…

FFmpeg解复用器如何从封装格式中解析出不同的音视频数据

目录 1、ffmpeg介绍 2、FFMPEG的目录结构 3、FFmpeg的格式封装与分离 3.1、数据结构 3.2、封装和分离(muxer和demuxer) 3.2.1、Demuxer流程 3.2.2、Muxer流程 4、总结 4.1、播放器 4.2、转码器 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续…

【CN】Argo 持续集成和交付(一)

1.简介 Argo 英 [ˈɑ:ɡəu] 美 [ˈɑrˌɡo] Kubernetes 原生工具&#xff0c;用于运行工作流程、管理集群以及正确执行 GitOps。 Argo 于 2020 年 3 月 26 日被 CNCF 接受为孵化成熟度级别&#xff0c;然后于 2022 年 12 月 6 日转移到毕业成熟度级别。 argoproj.github.i…

活动预告|8月3日 Streaming Lakehouse Meetup · Online 与你相约!

随着大数据分析技术的发展&#xff0c;越来越多的企业采用了数据湖架构。基于 Lakehouse 的架构优势&#xff0c;结合 Flink 的 Streaming 实时流处理能力&#xff0c;Flink 推出了新一代的“Streaming Lakehouse”技术。这一技术旨在能够让数据在湖上自由流动&#xff0c;为用…

03.C++类和对象(上)

1.类的定义 1.1类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。 …