1500|1

235

帖子

5

TA的资源

纯净的硅(初级)

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

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

image-20220417225955-1.png  

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

image-20220417225955-2.png  

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

image-20220417225955-3.jpeg  

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

image-20220417225955-4.png  

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

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

image-20220417225955-6.png  

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

image-20220417225955-7.png  

编译里面的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代码,可以图形化显示内容。如下:

image-20220417225955-8.jpeg  

image-20220417225955-9.jpeg  

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

image-20220417225955-10.png  

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

image-20220417225955-11.png  

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

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

最新回复

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

回复
举报

6046

帖子

0

TA的资源

五彩晶圆(高级)

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


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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
男生在肯德基向女孩表白[转]

 昨天去吃肯德基,排在我后面的像是一对儿情侣,眼看他们点了一大堆吃的,然后坐到我旁边。   坐下后,那个女孩就开始埋头猛 ...

lpc1343之三:通过USB接口控制开发板LED闪烁速度并读取AD转换结果

一直想充分利用LP1343的USB Device接口作为初期开发时的人机接口。 如果有感兴趣的朋友可以下载原代码研究。所有程序基于:LP ...

发个好用的LCD1602最简程序

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 我的LCD1602是三个控制线的即:RS,RW,E 在论坛里本来有这个显示例程,但我下 ...

使用AD14创建异形PCB板

前段时间同事需要按照AutoCAD的尺寸做一个PCB板。AD14支持导入DWG文件,于是选择了直接导入文件的方式来获得PCB板的外形尺寸。Au ...

X-NUCLEO-IKS01A3测评——by dcexpert

收到X-NUCLEO-IKS01A3传感器套件了 更多传感器套件的图 使用 MicroPython 连接 X-NUCLEO-I ...

TMS320F28xx 和 TMS320F28xxx DSC 的硬件设计指南

TMS320F28xx 和 TMS320F28xxx DSC 的硬件设计指南 481204 481203

写的一段代码中,出现了一个奇怪的问题。

486802如图代码中,我用stp抓取信号,运行一段时间后正常,但是会出现 一个奇怪的现象。 flag_se = 1'b1和 full_se = 1' ...

如何使用 MSP430™ MCU 中的智能模拟组合

运算放大器广泛用于传感和测量 应用。 MSP430™微控制器 (MCU) 通过集成智能模拟组合 (SAC) 提供全号链实施方案以代替外部 ...

TI MSPM0L1306 LaunchPad体验07:循环冗余校验模块(CRC)探秘

循环冗余校验(Cyclic Redundancy Check,CRC)是一种常用的检测数据完整性的算法。相比MD5、SHA1等Hash算法,它的计算复杂 ...

很感谢平台提供了这么好的学习机会,作为电子小白的我真的学到好多东西在这

很感谢平台提供了这么好的学习机会,作为电子小白的我真的学到好多东西在这 平台对小白们很友好,资料库很齐全,感谢平台,感 ...

关闭
站长推荐上一条 1/10 下一条

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
快速回复 返回顶部 返回列表