代码生成一个基于LINUX的QT项目,要求实现环境温湿度的采集并用折线图显示
时间: 2024-02-09 17:13:27 浏览: 178
好的,以下是代码实现:
1. 首先,需要安装QT开发环境和linux操作系统,并在QT中选择创建一个QT Widgets应用程序项目。
2. 在工程目录下新建一个.h文件,命名为temp_humi.h,用于定义温湿度采集的函数和结构体:
```c++
#ifndef TEMP_HUMI_H
#define TEMP_HUMI_H
#include <wiringPi.h>
#include <stdint.h>
typedef struct
{
float temperature;
float humidity;
} TempHumiData;
class TempHumi
{
public:
TempHumi();
int read(TempHumiData *data);
private:
int read_dht11_dat();
int pin;
};
#endif // TEMP_HUMI_H
```
3. 在工程目录下新建一个.cpp文件,命名为temp_humi.cpp,用于实现温湿度采集的函数:
```c++
#include "temp_humi.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define MAXTIMINGS 85
#define DHTPIN 7
TempHumi::TempHumi()
{
wiringPiSetup();
pin = DHTPIN;
}
int TempHumi::read(TempHumiData *data)
{
int dht11_dat[5] = {0, 0, 0, 0, 0};
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
float f;
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(18);
digitalWrite(pin, HIGH);
delayMicroseconds(40);
pinMode(pin, INPUT);
for (i = 0; i < MAXTIMINGS; i++)
{
counter = 0;
while (digitalRead(pin) == laststate)
{
counter++;
delayMicroseconds(1);
if (counter == 255)
{
break;
}
}
laststate = digitalRead(pin);
if (counter == 255)
break;
if ((i >= 4) && (i % 2 == 0))
{
dht11_dat[j / 8] <<= 1;
if (counter > 16)
dht11_dat[j / 8] |= 1;
j++;
}
}
if ((j >= 40) && (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF)))
{
f = dht11_dat[2] * 9.0 / 5.0 + 32;
data->temperature = f;
data->humidity = dht11_dat[0];
return 0;
}
else
{
return -1;
}
}
int TempHumi::read_dht11_dat()
{
return 0;
}
```
4. 在QT的主窗口中,添加一个QChart控件和一个QPushButton控件。
5. 在主窗口的.h文件中,声明需要用到的头文件和类:
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include <QDateTime>
#include <QtCharts>
#include "temp_humi.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void update_chart();
private:
Ui::MainWindow *ui;
TempHumi *temp_humi;
QTimer *timer;
QDateTime *datetime;
QLineSeries *series_temperature;
QLineSeries *series_humidity;
QChart *chart;
QChartView *chartView;
int count;
};
#endif // MAINWINDOW_H
```
6. 在主窗口的.cpp文件中,实现需要用到的函数:
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
temp_humi = new TempHumi();
timer = new QTimer(this);
datetime = new QDateTime();
series_temperature = new QLineSeries();
series_humidity = new QLineSeries();
chart = new QChart();
chartView = new QChartView(chart, this);
chart->setTitle("Temperature and Humidity");
chart->addSeries(series_temperature);
chart->addSeries(series_humidity);
chart->createDefaultAxes();
chart->axisX()->setRange(0, 10);
chart->axisY()->setRange(0, 100);
ui->verticalLayout->addWidget(chartView);
count = 0;
connect(timer, SIGNAL(timeout()), this, SLOT(update_chart()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
if (!timer->isActive())
{
timer->start(1000);
}
}
void MainWindow::update_chart()
{
TempHumiData data;
if (temp_humi->read(&data) == 0)
{
series_temperature->append(count, data.temperature);
series_humidity->append(count, data.humidity);
chart->axisX()->setRange(count, count + 10);
count++;
}
}
```
7. 最后,在.pro文件中添加需要用到的库文件和头文件:
```
QT += charts
LIBS += -lwiringPi
HEADERS += temp_humi.h
SOURCES += temp_humi.cpp \
main.cpp \
mainwindow.cpp
```
完成以上步骤后,编译并运行程序,即可实现环境温湿度的采集并用折线图显示。
阅读全文