之前我在测评米尔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)