流行科技 发表于 2022-4-17 23:02

【米尔MYC-JX8MPQ评测】+完善QT端的sht20读取

<div class='showpostmsg'><p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">之前我在测评米尔MP157的时候就曾用过此传感器,今天继续使用这传感来测试我们的IMX8,中间的一些问题也记录下。</span></span></p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">根据其板子说明,我们可以用三个I2C接口,其中I2C2是触摸的,目前都接在屏幕的FPC上所以没法用,这里我使用了I2C4。其接在J25的排针上。</span></span></p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">原理图如上,实物接法如下:</span></span></p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">之后就是驱动了。同样如之前,修改Makefile。</span></span></p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">内核这里我使用了官方的独立的内核,git下载即可。注意修改下gcc。</span></span></p>

<p style="text-align:justify"> &nbsp;<span style="font-size:10.5pt"><span style="font-family:等线">注意此开发板的编译时,内核驱动需要修改一个返回参数,也就是这里的long,自己不是内核驱动开发人员,猜测是因为内核时arm64的原因。</span></span></p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">同样我们把.ko拷贝到板子上。</span></span></p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">编译里面的testapp同样把脚本下的gcc换我们的工具链即可。</span></span></p>

<pre>
<code>#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-&gt;setupUi(this);

    dataCustomPlotInit();

    sht20_Init();



    mainTimer  = new QTimer(this);



    /* 信号与槽函数连接 */

    connect(mainTimer, SIGNAL(timeout()), this, SLOT(read_Sht20_data()));



    /* 开启定时器 */

    mainTimer-&gt;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-&gt;widget);

        dataCustomPlot-&gt;setGeometry(0, 0, 550, 300);

        dataCustomPlot-&gt;setBackground(brush);

        dataCustomPlot-&gt;installEventFilter(this);



        /* x轴、Y轴相关配置 */

        QPen pen(Qt::white);



        font.setPointSize(8);

        dataCustomPlot-&gt;setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);      //可拖拽+可滚轮缩放

        dataCustomPlot-&gt;xAxis-&gt;setLabelColor(QColor(Qt::white)); // X轴上标识label字体颜色

        dataCustomPlot-&gt;yAxis-&gt;setLabelColor(QColor(Qt::white));

        dataCustomPlot-&gt;xAxis-&gt;setTickPen(pen);                  //  设置x轴上坐标点上对应的刻度线的颜色

        dataCustomPlot-&gt;xAxis-&gt;setTickLabelRotation(60);//设置标签角度旋转

        dataCustomPlot-&gt;yAxis-&gt;setTickPen(pen);

        dataCustomPlot-&gt;xAxis-&gt;setBasePen(pen);                  //  设置x轴 轴线本身的颜色

        dataCustomPlot-&gt;yAxis-&gt;setBasePen(pen);

        dataCustomPlot-&gt;xAxis-&gt;setTickLabelColor(QColor(Qt::white)); // 设置x轴刻度值文本的颜色

        dataCustomPlot-&gt;yAxis-&gt;setTickLabelColor(QColor(Qt::white));

        dataCustomPlot-&gt;xAxis-&gt;setSubTicks(false);  //  隐藏x轴刻度线

        dataCustomPlot-&gt;yAxis-&gt;setSubTicks(false);  //  隐藏y轴刻度线

        dataCustomPlot-&gt;xAxis-&gt;setLabelFont(font);  //  设置x轴标识label文本字体大小

        dataCustomPlot-&gt;yAxis-&gt;setLabelFont(font);  //  设置y轴标识label文本字体大小

        font.setPointSize(10);

        dataCustomPlot-&gt;xAxis-&gt;setTickLabelFont(font);

        dataCustomPlot-&gt;yAxis-&gt;setTickLabelFont(font);

        dataCustomPlot-&gt;xAxis-&gt;setLabel("时间");

        dataCustomPlot-&gt;yAxis-&gt;setLabel("温湿度");





         dataCustomPlot-&gt;legend-&gt;setVisible(true);



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

        pen.setColor(Qt::yellow);    // 设置画笔的颜色

        dataCustomPlot-&gt;addGraph();                // 增加曲线图

        dataCustomPlot-&gt;graph(0)-&gt;setName("温度"); // 设置曲线的名字

        dataCustomPlot-&gt;graph(0)-&gt;setPen(pen);     // 设置曲线画笔的颜色

        dataCustomPlot-&gt;graph(0)-&gt;setLineStyle(QCPGraph::lsLine); // 设置连接线的类型 两点直线连接





        dataCustomPlot-&gt;graph(0)-&gt;setScatterStyle(              //绘制打出来的点

            QCPScatterStyle(QCPScatterStyle::ssCircle,

                            QPen(Plot2_DotColor, LineWidth),

                            QBrush(Plot2_DotColor), DotWidth));

       

         dataCustomPlot-&gt;graph(0)-&gt;rescaleAxes(false);



        pen.setColor(Qt::red);    // 设置画笔的颜色

        dataCustomPlot-&gt;addGraph();                // 增加曲线图

        dataCustomPlot-&gt;graph(1)-&gt;setName("湿度"); // 设置曲线的名字

        dataCustomPlot-&gt;graph(1)-&gt;setPen(pen);     // 设置曲线画笔的颜色

        dataCustomPlot-&gt;graph(1)-&gt;setLineStyle(QCPGraph::lsLine); // 设置连接线的类型 两点直线连接



//        dataCustomPlot-&gt;graph(1)-&gt;setScatterStyle(              //绘制打出来的点

//            QCPScatterStyle(QCPScatterStyle::ssCircle,

//                            QPen(Plot2_DotColor, LineWidth),

//                            QBrush(Plot2_DotColor), DotWidth));



        dataCustomPlot-&gt;graph(1)-&gt;rescaleAxes(false);

}



void MainWindow::sht20_Init()

{





    fd=open("/dev/sht2x",O_RDWR);

    if(fd&lt;0)

    {

        printf("App:Open dev failed.\n");

//            goto END;

    }





}



void MainWindow::read_Sht20_data()

{

    char buf;

    static int now = 0;

    unsigned char tmp;

    unsigned short tempori,humiori;//温湿度原始数据

    float temp,humi;

    static float temp_max=0,humi_max=0;





        if(read(fd,tmp,5)&gt;0)

        {

            // for(int i=0;i&lt;4;i++)

            // {

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

            // }

            // printf("\n");



            tempori=(tmp&lt;&lt;8|tmp);

            humiori=(tmp&lt;&lt;8|tmp);



            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-&gt;label_4-&gt;setText(QString::number(temp,'f',2)+"℃");

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





            if(temp_max&lt;temp)

            {

                temp_max = temp;

            }

            if(humi_max&lt;humi)

            {

                humi_max = humi;

            }



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

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





            if(22.0&lt;temp &amp;&amp; temp&lt;26.0)

            {

                if(40.0&lt;humi &amp;&amp; humi&lt;70.0)

                {

                     ui-&gt;label_10-&gt;setStyleSheet("color:black");

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

                }

                else if(humi&lt;40.0)

                {

                    ui-&gt;label_10-&gt;setStyleSheet("color:red");

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

                }

                else if(humi&gt;70.0)

                {

                    ui-&gt;label_10-&gt;setStyleSheet("color:red");

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

                }

            }

            else if(temp&lt;22.0)

            {

                ui-&gt;label_10-&gt;setStyleSheet("color:red");

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

            }

            else if(temp&gt;26.0)

            {

                ui-&gt;label_10-&gt;setStyleSheet("color:red");

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

            }



//            qDebug() &lt;&lt; temp;

        }



        now++;

        dataCustomPlot-&gt;graph(0)-&gt;addData(now, temp);         //addData(double key, double value);原型

        dataCustomPlot-&gt;graph(1)-&gt;addData(now, humi);         //addData(double key, double value);原型



        dataCustomPlot-&gt;replot();



}</code></pre>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">我们主要是要让其显示出来的,所以上面是QT代码,可以图形化显示内容。如下:</span></span></p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">这里增加了label显示其温度值和湿度值,这样更加直观,曲线用于显示历史趋势。同时记录其最高的温度和湿度。QT编译的话要用release模式,不然出来的不能运行。</span></span></p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">内核还是先加载驱动。加载完成驱动后在设备下应该出现我们的设备。这样就是正确的,同时对应设备树也需要修改。</span></span></p>

<p style="text-align:justify"> &nbsp;</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">具体位置如上面,修改内容就是增加sht20节点,之后更新设备树即可。所有文件都在下面附件中。</span></span></p>

<p style="text-align:justify"><br />
<br />
&nbsp;</p>

<p style="text-align:justify">&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2022-4-18 07:07

<p>内核驱动需要修改一个返回参数,是这里的long的原因不知道为什么</p>
页: [1]
查看完整版本: 【米尔MYC-JX8MPQ评测】+完善QT端的sht20读取