2025年树莓派3B Qt+dht11读取温湿度并写入数据库202005(8)

树莓派3B Qt+dht11读取温湿度并写入数据库202005(8)内容 本文介绍 使用树莓派 3B Qt dht11 读取温湿度 以一定时间间隔更新数据 显示于界面 并写入数据库 硬件 树莓派 3B 温湿度传感器 dht11 杜邦线 1 建工程 建立工程后点击 mainwindow ui 设计界面 5 个 label 和 1 个 button

大家好,我是讯享网,很高兴认识大家。

内容

1、建工程

建立工程后点击mainwindow.ui设计界面
5个label和1个button,红框里的5个控件均是label:
在这里插入图片描述
讯享网
接着为Getdata按钮添加点击响应函数
建立工程、使用控件有问题请挪步:
树莓派3B使用Qt+MySQL创建、写入、修改、显示数据(7).

2、配置

1、pro文件加代码

QT += core gui sql //SQL 

讯享网

在这里插入图片描述

讯享网LIBS += -lwiringPi //GPIO库函数 

在这里插入图片描述

2、添加自己的类

在项目上点击右键,add new
在这里插入图片描述
添加一个c++类
在这里插入图片描述
输名字(自己随意取)
在这里插入图片描述
接着项目里生成dht11_lx3.h和dht11_lx3.cpp
在这里插入图片描述

3、上代码

#------------------------------------------------- # # Project created by QtCreator 2020-05-13T19:56:28 # #------------------------------------------------- QT += core gui QT += core gui sql greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = qt_dht11_mysql_lx TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 CONFIG += c++11 SOURCES += \ main.cpp \ mainwindow.cpp \ dht11_lx3.cpp HEADERS += \ mainwindow.h \ dht11_lx3.h FORMS += \ mainwindow.ui LIBS += -lwiringPi # Default rules for deployment. qnx: target.path = /tmp/$${ 
   TARGET}/bin else: unix:!android: target.path = /opt/$${ 
   TARGET}/bin !isEmpty(target.path): INSTALLS += target 

dht11_lx3.h

讯享网#ifndef DHT11_LX3_H #define DHT11_LX3_H #include "mainwindow.h" #include "ui_mainwindow.h" #include <iostream> #include <wiringPi.h> #define uchar unsigned char #define dht11_pin 7 //wiringPi方式的引脚,dht11信号线接引脚7 class dht11_lx3 { 
    public: dht11_lx3(); // ~dht11_lx3(); void pininit(); void dht11_reset(void); uint dht11_read_bit(void); uint dht11_read_byte(void); uint dht11_read_data(uchar buffer[5]); }; #endif // DHT11_LX3_H 

dht11_lx3.cpp
更正:之前上传代码的时候,为了好看清晰,删掉了一些调试的代码和不必要的注释,不小心把红框这里的分号删掉了。结果这次用dht11的时候直接来博客复制代码,发现用不了,找半天到这个问题,自己把自己坑惨。下面的代码已经加上了,并且加了几句代码,基本解决dht11在这里经常死掉的问题。
在这里插入图片描述

#include "dht11_lx3.h" #include "mainwindow.h" #include "ui_mainwindow.h" dht11_lx3::dht11_lx3() { 
    } //dht11_lx3::~dht11_lx3() //{ 
    //} void dht11_lx3::pininit() { 
    wiringPiSetup(); pinMode(dht11_pin,OUTPUT);//设置Pin 0为输出模式,若为’INPUT‘则为输入模式,编码格式为wiringpi digitalWrite( dht11_pin, HIGH );//拉高 } void dht11_lx3::dht11_reset(void) { 
    digitalWrite( dht11_pin, LOW ); delay(20); digitalWrite( dht11_pin, HIGH ); delayMicroseconds(30); pinMode(dht11_pin,INPUT);//设为输入在这里插入代码片 pullUpDnControl(dht11_pin,PUD_UP);//上拉 } uint dht11_lx3::dht11_read_bit(void) { 
    while (digitalRead( dht11_pin ) == 0); delayMicroseconds(35); if (digitalRead( dht11_pin ) == 1) { 
    // while (digitalRead( dht11_pin ) == 1); while (digitalRead( dht11_pin ) == 1) { 
    delayMicroseconds(1); count1++; if(count1>50) break; } return 1; } else { 
    return 0; } } uint dht11_lx3::dht11_read_byte(void) { 
    uint i; uint data = 0; for (i = 0; i < 8; i++) { 
    data <<= 1; data |= dht11_read_bit(); } return data; } uint dht11_lx3::dht11_read_data(uchar buffer[5]) { 
    uint i = 0; uchar checksum; dht11_reset(); if (digitalRead( dht11_pin ) == 0) { 
    while (digitalRead( dht11_pin ) == 0); while (digitalRead( dht11_pin ) == 1); for (i = 0; i < 5; i++) { 
    buffer[i] = dht11_read_byte();//温湿度数据进数组 } while (digitalRead( dht11_pin ) == 0); pinMode( dht11_pin, OUTPUT ); digitalWrite( dht11_pin, HIGH ); checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];//校验 if (checksum != buffer[4]) { 
    // checksum error return 1; } } return 0; } 

mainwindow.h

讯享网#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { 
    class MainWindow; } class MainWindow : public QMainWindow { 
    Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_pushButton_clicked(); void writedata(double tem,double hum); protected: void timerEvent( QTimerEvent *event ); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H 

main.cpp

#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { 
    QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 

mainwindow.cpp

讯享网#include "mainwindow.h" #include "ui_mainwindow.h" #include "dht11_lx3.h" #include <QSqlDatabase> #include <QDebug> #include <QMessageBox> #include <QSqlError> #include <QSqlQuery> #include <QVariantList> #include <wiringPi.h> int a=0,b=0;//调试用 int m_nTimerId;//定时器id double hum=0;//湿度 double tem=0;//温度 dht11_lx3 dht11;//用dht11_lx3 类定义一个变量dht11 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { 
    ui->setupUi(this); //数据库配置 qDebug()<<QSqlDatabase::drivers(); qDebug()<<QCoreApplication::libraryPaths();//数据库驱动的文件位置 QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");//QMYSQL是采用QMYSQL数据库驱动 db.setHostName("127.0.0.1"); db.setUserName("noel"); //数据库账号 db.setPassword("");//数据库密码 db.setDatabaseName("noeldb"); //你的数据库名 if(!db.open()){ 
    qDebug()<<"连接数据库失败"; return; }else{ 
    qDebug()<<"连接数据库成功"; } dht11.pininit();//引脚初始化 delay(2500);//dht11上电需等待2秒 } MainWindow::~MainWindow() { 
    delete ui; if ( m_nTimerId != 0 ) { 
    killTimer(m_nTimerId);//kill定时器 } } void MainWindow::timerEvent( QTimerEvent *event ) { 
    b++;//读取次数 QString btmp = QString::number(b); ui->label_3->setText(btmp);//显示次数 uchar buffer[5]; if (dht11.dht11_read_data(buffer) == 0) { 
    hum = buffer[0] + buffer[1] / 10.0;//整数位+小数位 tem = buffer[2] + buffer[3] / 10.0; } else { 
    ui->label_3->setText("checksum error:");//dht11校验和错误 dht11.pininit();//重新初始化引脚 return; } QString humtmp = QString::number(hum); ui->humlabel->setText(humtmp);//显示湿度 QString temtmp = QString::number(tem); ui->temlabel->setText(temtmp);//显示温度 writedata(tem,hum);//写数据进数据库 pinMode(dht11_pin,OUTPUT);//设置Pin 0为输出模式,若为’INPUT‘则为输入模式,编码格式为wiringpi digitalWrite( dht11_pin, HIGH );//拉高引脚备下次用 } //点击按钮开始获取数据 void MainWindow::on_pushButton_clicked() { 
    ui->label_3->setText("Initializing:"); dht11.pininit();//引脚初始化 m_nTimerId=startTimer(3000);//设置3秒的定时器,每次时间一到就去timerEvent函数执行 } void MainWindow::writedata(double tem,double hum) { 
    QSqlQuery query; // query.exec("drop table dht11data_lx;");//数据太多了就打开,删除表单dht11data_lx,下一条指令会新建 query.exec("create table dht11data_lx(Time datetime, Temperature double, Humidity double);");//新建表单dht11data_lx QString sqlquery = QObject::tr("insert into dht11data_lx(Time,Temperature,Humidity) values(now(),'%1','%2')").arg(tem).arg(hum);//插入一个数据 query.exec(sqlquery); } 

4、上结果

在这里插入图片描述
有时候会checksum错误(不清楚的挪步百度dht11的说明):
在这里插入图片描述

小讯
上一篇 2025-03-01 11:20
下一篇 2025-04-03 10:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/41751.html