内容
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的说明):

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