1813|1

250

帖子

5

TA的资源

纯净的硅(初级)

楼主
 

【米尔MYC-JX8MPQ评测】+完善QT端的sht20读取 [复制链接]

 

之前我在测评米尔MP157的时候就曾用过此传感器,今天继续使用这传感来测试我们的IMX8,中间的一些问题也记录下。

 

根据其板子说明,我们可以用三个I2C接口,其中I2C2是触摸的,目前都接在屏幕的FPC上所以没法用,这里我使用了I2C4。其接在J25的排针上。

 

原理图如上,实物接法如下:

 

之后就是驱动了。同样如之前,修改Makefile。

 

内核这里我使用了官方的独立的内核,git下载即可。注意修改下gcc。

 注意此开发板的编译时,内核驱动需要修改一个返回参数,也就是这里的long,自己不是内核驱动开发人员,猜测是因为内核时arm64的原因。

 

同样我们把.ko拷贝到板子上。

 

编译里面的testapp同样把脚本下的gcc换我们的工具链即可。

#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("温湿度");





         dataCustomPlot->legend->setVisible(true);



        /* 增加一个数据曲线 */

        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;

    static float temp_max=0,humi_max=0;





        if(read(fd,tmp,5)>0)

        {

            // for(int i=0;i<4;i++)

            // {

            // printf("%.2x ",tmp[i]);//打印收到的数据

            // }

            // 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);



            ui->label_4->setText(QString::number(temp,'f',2)+"℃");

            ui->label_5->setText(QString::number(humi,'f',2)+"%");





            if(temp_max<temp)

            {

                temp_max = temp;

            }

            if(humi_max<humi)

            {

                humi_max = humi;

            }



            ui->label_7->setText(QString::number(temp_max,'f',2)+"℃");

            ui->label_9->setText(QString::number(humi_max,'f',2)+"%");





            if(22.0<temp && temp<26.0)

            {

                if(40.0<humi && humi<70.0)

                {

                     ui->label_10->setStyleSheet("color:black");

                    ui->label_10->setText("环境舒适");

                }

                else if(humi<40.0)

                {

                    ui->label_10->setStyleSheet("color:red");

                    ui->label_10->setText("环境干燥");

                }

                else if(humi>70.0)

                {

                    ui->label_10->setStyleSheet("color:red");

                    ui->label_10->setText("环境潮湿");

                }

            }

            else if(temp<22.0)

            {

                ui->label_10->setStyleSheet("color:red");

                ui->label_10->setText("环境温度低");

            }

            else if(temp>26.0)

            {

                ui->label_10->setStyleSheet("color:red");

                ui->label_10->setText("环境温度高");

            }



//            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();



}

我们主要是要让其显示出来的,所以上面是QT代码,可以图形化显示内容。如下:

 

 

这里增加了label显示其温度值和湿度值,这样更加直观,曲线用于显示历史趋势。同时记录其最高的温度和湿度。QT编译的话要用release模式,不然出来的不能运行。

 

内核还是先加载驱动。加载完成驱动后在设备下应该出现我们的设备。这样就是正确的,同时对应设备树也需要修改。

 

具体位置如上面,修改内容就是增加sht20节点,之后更新设备树即可。所有文件都在下面附件中。

sht20.zip (550.12 KB, 下载次数: 4)



 

 

最新回复

内核驱动需要修改一个返回参数,是这里的long的原因不知道为什么   详情 回复 发表于 2022-4-18 07:07
点赞 关注
 
 

回复
举报

6609

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

内核驱动需要修改一个返回参数,是这里的long的原因不知道为什么

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表