首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于小熊派光强传感器BH1750状态机驱动项目再度升级(带上位机曲线显示)

基于小熊派光强传感器BH1750状态机驱动项目再度升级(带上位机曲线显示)

作者头像
杨源鑫
发布于 2020-05-21 07:57:52
发布于 2020-05-21 07:57:52
80700
代码可运行
举报
文章被收录于专栏:嵌入式开发圈嵌入式开发圈
运行总次数:0
代码可运行

上次我们基于小熊派光强传感器项目实现了光强读取并在LCD上显示,文章链接如下:

基于小熊派光强传感器BH1750状态机驱动项目升级(带LCD屏显示)

这一节,我们再次对这个项目升级下,配个带可缩放曲线的上位机读取光强进行显示吧!

本节,你将了解工作中上位机和MCU的是如何来配合使用的。

在工作中,我们常常需要对一些传感器的某些数值进行长时间的测试和观察,以了解传感器的性能,在电子工程里,我们经常听到的测试曲线莫过于电池充放电曲线了,通过电池充放电曲线,我们很容易可以知道电池在实际使用过程中满电和馈电的状态以及电池的使用周期等等,今晚,我们就让光强通过曲线显示出来,用QT+QCustomPlot来实现,最终效果如下视频操作所示:

一、QCustomPlot简介

以下是QCustomPlot的官网:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.qcustomplot.com/

QCustomPlot是一个小型的Qt画图标类,支持绘制静态曲线、动态曲线、多重坐标曲线,柱状图,蜡烛图等。只需要在项目中加入头文件qcustomplot.h和qcustomplot.cpp文件,然后使一个widget提升为QCustomPlot类,即可使用。

二、更改上节的MCU端程序

这次,我们选用串口和上位机进行通信,所以我们需要设计一个传感器和上位机通信的协议,协议如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
序号 光强值 \r\n

当序号大于等于65535时,自动清0。

修改上节的main函数为如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    /* USER CODE BEGIN 1 */
    /*流水号*/
    int serial_number = 0;
    char display_buf[20] = {0};
    char procol_buf[20] = {0};
    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_I2C1_Init();
    MX_USART1_UART_Init();
    MX_SPI2_Init();
    /* USER CODE BEGIN 2 */
    /*串口初始化后加这个延时,防止后面的printf打印乱码*/
    HAL_Delay(200);
    LCD_Init();
    LCD_Clear(BLACK);//清屏为黑色
    LCD_ShowString(5, 10, 240, 32, 32, "BearPi LuxTest");//显示字符串,字体大小32*32
    Init_BH750();
    timer_init(&lsensor.timer1, lsensor.timeout_cb, 1, 1);
    timer_start(&lsensor.timer1);
    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        ReadBH1750(LUX_1_MODE);

        if(1 == lsensor.Conver_completed)
        {
            ++serial_number ;

            if(65535 == serial_number)
                serial_number = 0 ;

            sprintf(display_buf, "%d%d%d%dLux", lsensor.Lux / 1000 % 100, lsensor.Lux / 100 % 10, lsensor.Lux / 10 % 10, lsensor.Lux % 10);
            LCD_ShowString(80, 50 + 24 + 32, 240, 32, 32, display_buf); //显示字符串,字体大小32*32

            if(lsensor.Lux > LIGHT_SENSOR_THREHOLD)
            {
                HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
            }
            else
            {
                HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
            }

            sprintf(procol_buf, "%d%d%d%d%d %d%d%d%d%d",
                    serial_number / 10000,
                    serial_number / 1000 % 100 % 10,
                    serial_number / 100 % 10,
                    serial_number / 10 % 10,
                    serial_number % 10,
                    lsensor.Lux / 10000,
                    lsensor.Lux / 1000 % 100 % 10,
                    lsensor.Lux / 100 % 10,
                    lsensor.Lux / 10 % 10,
                    lsensor.Lux % 10
                   );
            printf("%s \r\n", procol_buf);
        }

        timer_loop();

    }

    /* USER CODE END 3 */
}

下载后,打开串口调试助手可以看到:

三、光强曲线显示上位机应用开发

下面我先用QT画出一个简单的界面(已经将QCustomPlot用上了),如下:

这里我们需要使用QT5的串口库,还有QCustomPlot库,所以在.pro中需要添加对应的库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#-------------------------------------------------
#
# Project created by QtCreator 2020-04-13T20:46:41
#
#-------------------------------------------------

QT       += core gui serialport

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport

TARGET = BearPi_QT
TEMPLATE = app
RC_FILE += app.rc

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp \
    qcustomplot.cpp

HEADERS += \
        mainwindow.h \
    qcustomplot.h

FORMS += \
        mainwindow.ui

在mainwindow.h中,需要添加头文件及变量还有相关的普通函数和槽函数的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QDebug>
#include <QMainWindow>
#include <QSerialPort>        //提供访问串口的功能
#include <QSerialPortInfo>    //提供系统中存在的串口的信息
#include "qcustomplot.h"      //包含Qcustomplot库

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    /*初始化串口参数*/
    void Init_Serial_Para();
    /*传感器数据画图前的处理*/
    void sensor_data_preprocess(int x, int y) ;
    /*画曲线函数*/
    void Sensor_Draw_Plot(QCustomPlot *customPlot, QVector<double> x, QVector<double> y);

private:
    Ui::MainWindow *ui;
    QSerialPort *Serial ;
    long last_index ;
    QVector<double> display_x;
    QVector<double> display_y;
    QString Serial_Port , Serial_Bauardate,Serial_PariteyBit,Serial_DataBit,Serial_StopBit ;

private slots:
    void Update_Serial_Port(QString Currnet_Select);
    void Update_Serial_Baurdrate(QString Currnet_Select);
    void Update_Serial_ParityBit(QString Currnet_Select);
    void Update_Serial_DataBit(QString Currnet_Select);
    void Update_Serial_StopBit(QString Currnet_Select);
    void on_Connect_Device_clicked();
    void on_Disconnect_Device_clicked();

    void cmd_recv_process();
};

#endif // MAINWINDOW_H

在mainwindow.cpp太长我就不全贴出来了,解读一下核心的实现思路:

1、用户配置完串口参数,然后 连接信号与槽:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
connect(this->Serial,SIGNAL(readyRead()),this,SLOT(cmd_recv_process()));

2、当上位机接受到MCU端发来的数据时,会触发readyRead()信号,进而调用cmd_recv_process()槽函数,实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*数据接收*/
void MainWindow::cmd_recv_process()
{
    QString data ;
    QStringList list    ;
    /*光强传感器序号*/
    QString Sensor_Serial_Number ;
    /*光强传感器光强值*/
    QString Sensor_light_Value ;
    long int s1 = 0, v1 = 0;
    last_index =0;
    if(Serial->canReadLine())
    {
        QByteArray temp = Serial->readAll();

        if(!temp.isEmpty())
        {
            data = temp ;
            list = data.split(" ");
            if(3 == list.length())
            {
                Sensor_Serial_Number = list[0];
                Sensor_light_Value   = list[1];
                /*取到对应参数后立刻开始画图*/
                s1 = Sensor_Serial_Number.toInt();
                v1 = Sensor_light_Value.toInt();
                ui->light_sensor_value->setText(QString::number(v1));
                if (last_index == 0  || (last_index < s1 &&  s1 - last_index >=1 && s1 - last_index <= 10 ))
                {
                    last_index = s1;
                    sensor_data_preprocess(s1,v1);
                }
            }
        }
    }
}

这里会判断是否满足读取一行数据的条件,如果满足则会读取一行数据,接下来对数据进行分割,取出传感器上报的序号、光强两个字段,序号作为曲线图的横坐标,光强作为曲线图的纵坐标进行显示。

例程下载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
链接:https://pan.baidu.com/s/1ujo0TE3pS-1RFVvylnCyKQ
提取码:48jp
复制这段内容后打开百度网盘手机App,操作更方便哦
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式云IOT技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TensorFlow之CNN
CNN 就是convolutional neural network, 也就是卷积神经网络,是一种类似于人类或动物视觉系统结构的人工神经网络,包含一个或多个卷积层(convolutional layer)、池化层(pooling layer)和全连接层(fully-connected layer),总之,这些年他很火。
Ed_Frey
2020/12/30
4250
TensorFlow 2.0 - 自定义模型、训练过程
文章目录 1. 自定义模型 2. 学习流程 学习于:简单粗暴 TensorFlow 2 1. 自定义模型 重载 call() 方法,pytorch 是重载 forward() 方法 import tensorflow as tf X = tf.constant([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0]]) y = tf.constant([[10.0],[20.0]]) class Linear(tf.keras.Model): def __init__(self):
Michael阿明
2021/02/19
1K0
『带你学AI』开发环境配置之Windows10篇:一步步带你在Windows10平台开发深度学习
1. 章节一:初探AI(《带你学AI与TensorFlow2实战一之深度学习初探》):(已完成)
小宋是呢
2021/01/06
1.8K0
TensorFlow 2.0 - CNN / 预训练 / RNN
文章目录 1. CNN 卷积神经网络 2. 预训练模型 3. RNN 循环神经网络 学习于:简单粗暴 TensorFlow 2 1. CNN 卷积神经网络 卷积神经网络,卷积后尺寸计算 tf.keras.layers.Conv2D, tf.keras.layers.MaxPool2D # CNN 模型 class myCNN(tf.keras.Model): def __init__(self): super().__init__() self.conv1 = tf
Michael阿明
2021/02/19
5780
TensorFlow 2.0 - Checkpoint 保存变量、TensorBoard 训练可视化
文章目录 1. Checkpoint 保存变量 2. TensorBoard 训练过程可视化 学习于:简单粗暴 TensorFlow 2 1. Checkpoint 保存变量 tf.train.Checkpoint 可以保存 tf.keras.optimizer 、 tf.Variable 、 tf.keras.Layer 、 tf.keras.Model path = "./checkp.ckpt" # 建立一个 checkpoint mycheckpoint = tf.train.Checkpoin
Michael阿明
2021/02/19
1.1K0
TensorFlow 2.0 - Checkpoint 保存变量、TensorBoard 训练可视化
TensorFlow 2.0 - Keras Pipeline、自定义Layer、Loss、Metric
文章目录 1. Keras Sequential / Functional API 2. 自定义 layer 3. 自定义 loss 4. 自定义 评估方法 学习于:简单粗暴 TensorFlow 2 1. Keras Sequential / Functional API tf.keras.models.Sequential([layers...]),但是它不能表示更复杂的模型 mymodel = tf.keras.models.Sequential([ tf.keras.layers.Flat
Michael阿明
2021/02/19
1.1K0
TensorFlow | 自己动手写深度学习模型之全连接神经网络
前半个多月总共写了三篇深度学习相关的理论介绍文章,另外两个月前,我们使用逻辑回归算法对sklearn里面的moons数据集进行了分类实验,最终准确率和召回率都达到了97.9%,详情参看这篇文章:一文打尽:线性回归和逻辑斯蒂线性回归(https://zhuanlan.zhihu.com/p/31075733),今天我们尝试使用神经网络来进行分类。全连接神经网络的搭建本身没什么难度,几句代码就够了,但是本文的真正目的是: 让大家了解Tensorflow 的基本使用方法; 使用 tensorboard 可视化你的
AI研习社
2018/03/16
1.6K0
TensorFlow | 自己动手写深度学习模型之全连接神经网络
Python编程任务 | 斯坦福CS231n-深度学习与计算机视觉课程
Assignment 3 04 Python编程任务(2-layer神经网络) · Assignment1的神经网络部分,我们需要完成neural_net.py,完成后可以用two_layer_net.ipynb里的代码(部分代码需要自己完成)来调试你的模型,优化超参数,获得最优模型,最后在测试集上测试分类水平。 · 这里用的图像库还是CIFAR-10。 neural_net.py 代码如下: __coauthor__ = 'Deeplayer' # 6.14.2016 #import numpy
用户1332428
2018/03/08
1.5K0
Python编程任务 | 斯坦福CS231n-深度学习与计算机视觉课程
Python从0到100(八十四):神经网络-卷积神经网络训练CIFAR-10数据集
CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成,每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。
是Dream呀
2025/03/05
2460
Python从0到100(八十四):神经网络-卷积神经网络训练CIFAR-10数据集
基于深度学习的图像生成(Deep Learning-based Image Generation)
随着深度学习技术的快速发展,图像生成成为了一个备受关注的研究领域。深度学习模型在图像生成任务上取得了令人瞩目的成果,例如生成逼真的图像、图像风格转换等。本文将介绍基于深度学习的图像生成方法以及应用领域,并探讨其未来的发展方向。
大盘鸡拌面
2023/09/28
3.1K0
从锅炉工到AI专家(10)
RNN循环神经网络(Recurrent Neural Network) 如同word2vec中提到的,很多数据的原型,前后之间是存在关联性的。关联性的打破必然造成关键指征的丢失,从而在后续的训练和预测流程中降低准确率。 除了提过的自然语言处理(NLP)领域,自动驾驶前一时间点的雷达扫描数据跟后一时间点的扫描数据、音乐旋律的时间性、股票前一天跟后一天的数据,都属于这类的典型案例。 因此在传统的神经网络中,每一个节点,如果把上一次的运算结果记录下来,在下一次数据处理的时候,跟上一次的运算结果结合在一起混合运
俺踏月色而来
2018/06/20
7450
基于Tensorflow的DCNN实现(A Convolutional Neural Network for Modelling Sentences)「建议收藏」
本文我写了一个基于tensorflow的DCNN的实现,原文是A Convolutional Neural Network for Modelling Sentences,地址如下:
全栈程序员站长
2022/08/31
3180
基于pytorch_pytorch handbook
代码来源 少量中文注解 纯学习https://github.com/joosthub/PyTorchNLPBook/blob/master/chapters/chapter_5/5_2_CBOW/5_2_Continuous_Bag_of_Words_CBOW.ipynb
全栈程序员站长
2022/10/02
6240
深度学习框架Keras深入理解
Python深度学习-深入理解Keras:Keras标准工作流程、回调函数使用、自定义训练循环和评估循环。
皮大大
2023/09/06
5970
Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集) 更多内容请见👇 Python sklearn实现SVM鸢尾花分类 Python sklearn实现K-means鸢尾花聚类 Pytorch 基于LeNet的手写数字识别 ---- 本文目录 介绍 1.导入相关库 2.定义 Al
小嗷犬
2022/11/15
8770
Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集)
Pytorch 基于ResNet-18的物体分类(使用CIFAR-10数据集)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Pytorch 基于ResNet-18的物体分类(使用CIFAR-10数据集) 更多内容请见👇 Pytorch 基于VGG-16的服饰识别(使用Fashion-MNIST数据集) Pytorch 基于NiN的服饰识别(使用Fashion-MNIST数据集) Pytorch 基于ResNet-18的服饰识别(使用
小嗷犬
2022/11/15
8490
Pytorch 基于ResNet-18的物体分类(使用CIFAR-10数据集)
【深度学习】Keras vs PyTorch vs Caffe:CNN实现对比
在当今世界,人工智能已被大多数商业运作所应用,而且由于先进的深度学习框架,它非常容易部署。这些深度学习框架提供了高级编程接口,帮助我们设计深度学习模型。使用深度学习框架,它通过提供内置的库函数来减少开发人员的工作,从而使我们能够更快更容易地构建模型。
黄博的机器学习圈子
2020/09/22
1K0
【深度学习】Keras vs PyTorch vs Caffe:CNN实现对比
Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集) 更多内容请见👇 Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集) Pytorch 基于VGG-16的服饰识别(使用Fashion-MNIST数据集) Pytorch 基于NiN的服饰识别
小嗷犬
2022/11/15
1.1K0
Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集)
理工男的文科梦 —— LSTM深度学习写春联
笔者作为一名根正苗红的理工男,内心却常常有很多文艺青年才会有的想法,例如写首诗、做首词,甚至包括春节写副对联,空有一番愿望却胸无点墨。随着对机器学习和深度学习的了解,逐渐萌生了使用机器帮助笔者完成文艺
用户1332428
2018/03/09
1.1K2
理工男的文科梦 —— LSTM深度学习写春联
深入解析EfficientNet:高效深度学习网络与ResNet的对比(使用keras进行代码复现,并使用cifar10数据集进行实战)
在深度学习领域,卷积神经网络(CNN)是解决图像分类、目标检测等问题的关键技术之一。近年来,随着深度学习的不断发展,新的网络架构不断涌现。在众多网络架构中,EfficientNet和ResNet都成为了深度学习模型的佼佼者,分别在高效性和深度特性上得到了广泛应用。本文将详细介绍EfficientNet,并与经典的ResNet进行对比,分析它的架构、使用场景、适用问题及实例。
机器学习司猫白
2025/03/05
9070
深入解析EfficientNet:高效深度学习网络与ResNet的对比(使用keras进行代码复现,并使用cifar10数据集进行实战)
推荐阅读
相关推荐
TensorFlow之CNN
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档