本帖最后由 流行科技 于 2021-12-21 08:50 编辑
米尔MYC151使用报告+温湿度
本次在之前oled的基础上在测试下linux下的温湿度传感器,并通过QT界面实时显示读取数据,显示在曲线中,当然项目中也有很多不完善的地方,所以先发一个demo上来,后续可以继续增加新内容。
首先还是需要增加一下驱动的编译,这个网上也有许多的驱动源码,可以自己下载下来编译,和之前的编译过程一致,还是把Makeflie修改下。然后就能编译出。Ko文件了。
想要使用这个,还需要修改下内核设备树,如下,在oled下增加sht20温湿度传感器的节点。
之后我们关闭原有的桌面显示,和之前一致。
查看下内核中的模块,这里说下,我们的QT是运行在SD卡中的,所以更新内核和设备树,以及把模块放入到文件系统中,都很方便,直接把卡拔下,插入虚拟机中即可看到所有文件,然后拷贝即可。
现在目录中有文件了,只需执行加载驱动即可,如下:
之后就可以开工编写qt端程序了,这里放出主要的函数代码,提供参考,需要我也可以打包上传。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#define Plot2_DotColor QColor(236,110,0)
#define Plot2_LineColor QColor(246,98,0)
#define LineWidth 2
#define DotWidth 10
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
dataCustomPlotInit();
sht20_Init();
mainTimer = new QTimer(this);
/* 信号与槽函数连接 */
connect(mainTimer, SIGNAL(timeout()), this, SLOT(read_Sht20_data()));
/* 开启定时器 */
mainTimer->start(1000); // 1ms秒更新一次
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::dataCustomPlotInit()
{
QFont font;
// font.setPointSize(12);
/* 实例化,设置位置、背景颜色 */
QBrush brush(QColor(50, 50, 50));
dataCustomPlot = new QCustomPlot(ui->widget);
dataCustomPlot->setGeometry(0, 0, 550, 300);
dataCustomPlot->setBackground(brush);
dataCustomPlot->installEventFilter(this);
/* x轴、Y轴相关配置 */
QPen pen(Qt::white);
font.setPointSize(8);
dataCustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); //可拖拽+可滚轮缩放
dataCustomPlot->xAxis->setLabelColor(QColor(Qt::white)); // X轴上标识label字体颜色
dataCustomPlot->yAxis->setLabelColor(QColor(Qt::white));
dataCustomPlot->xAxis->setTickPen(pen); // 设置x轴上坐标点上对应的刻度线的颜色
dataCustomPlot->xAxis->setTickLabelRotation(60);//设置标签角度旋转
dataCustomPlot->yAxis->setTickPen(pen);
dataCustomPlot->xAxis->setBasePen(pen); // 设置x轴 轴线本身的颜色
dataCustomPlot->yAxis->setBasePen(pen);
dataCustomPlot->xAxis->setTickLabelColor(QColor(Qt::white)); // 设置x轴刻度值文本的颜色
dataCustomPlot->yAxis->setTickLabelColor(QColor(Qt::white));
dataCustomPlot->xAxis->setSubTicks(false); // 隐藏x轴刻度线
dataCustomPlot->yAxis->setSubTicks(false); // 隐藏y轴刻度线
dataCustomPlot->xAxis->setLabelFont(font); // 设置x轴标识label文本字体大小
dataCustomPlot->yAxis->setLabelFont(font); // 设置y轴标识label文本字体大小
font.setPointSize(10);
dataCustomPlot->xAxis->setTickLabelFont(font);
dataCustomPlot->yAxis->setTickLabelFont(font);
dataCustomPlot->xAxis->setLabel("时间");
dataCustomPlot->yAxis->setLabel("温湿度");
/* 增加一个数据曲线 */
pen.setColor(Qt::yellow); // 设置画笔的颜色
dataCustomPlot->addGraph(); // 增加曲线图
dataCustomPlot->graph(0)->setName("温度"); // 设置曲线的名字
dataCustomPlot->graph(0)->setPen(pen); // 设置曲线画笔的颜色
dataCustomPlot->graph(0)->setLineStyle(QCPGraph::lsLine); // 设置连接线的类型 两点直线连接
dataCustomPlot->graph(0)->setScatterStyle( //绘制打出来的点
QCPScatterStyle(QCPScatterStyle::ssCircle,
QPen(Plot2_DotColor, LineWidth),
QBrush(Plot2_DotColor), DotWidth));
dataCustomPlot->graph(0)->rescaleAxes(false);
pen.setColor(Qt::red); // 设置画笔的颜色
dataCustomPlot->addGraph(); // 增加曲线图
dataCustomPlot->graph(1)->setName("湿度"); // 设置曲线的名字
dataCustomPlot->graph(1)->setPen(pen); // 设置曲线画笔的颜色
dataCustomPlot->graph(1)->setLineStyle(QCPGraph::lsLine); // 设置连接线的类型 两点直线连接
// dataCustomPlot->graph(1)->setScatterStyle( //绘制打出来的点
// QCPScatterStyle(QCPScatterStyle::ssCircle,
// QPen(Plot2_DotColor, LineWidth),
// QBrush(Plot2_DotColor), DotWidth));
dataCustomPlot->graph(1)->rescaleAxes(false);
}
void MainWindow::sht20_Init()
{
fd=open("/dev/sht2x",O_RDWR);
if(fd<0)
{
printf("App:Open dev failed.\n");
// goto END;
}
}
void MainWindow::read_Sht20_data()
{
char buf[50];
static int now = 0;
unsigned char tmp[5];
unsigned short tempori,humiori;//温湿度原始数据
float temp,humi;
if(read(fd,tmp,5)>0)
{
// for(int i=0;i<4;i++)
// {
// printf("%.2x ",tmp);//打印收到的数据
// }
// printf("\n");
tempori=(tmp[0]<<8|tmp[1]);
humiori=(tmp[2]<<8|tmp[3]);
temp=-46.85+175.72/65536*(float)tempori;
humi=-6.0 +125.0 /65536*(float)humiori;
printf("SHT2x-T:%f RH:%f%%\n",temp,humi);
// qDebug() << temp;
}
now++;
dataCustomPlot->graph(0)->addData(now, temp); //addData(double key, double value);原型
dataCustomPlot->graph(1)->addData(now, humi); //addData(double key, double value);原型
dataCustomPlot->replot();
}
这里面主要是使用了定时器,以及数据曲线显示的qcustomplot。
新拉出一个widget用于显示曲线。
文档大致目录。这个还是基于之前的hello world做的。
最后效果如下: