Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于小熊派气体传感器MQ-2综合实践
前面,我们用光强传感器做了很多实践小项目,那么今天我们把项目稍微变一下,把光强传感器换成气体传感器吧!原来光强传感器相关文章链接如下:
杨源鑫
2020/05/21
1.2K0
基于STM32的心率计(3):Qt上位机设计
前两篇文章介绍了AD采集传感器数据和数据的滤波处理获取心率值。这篇文章主要是介绍Qt上位机如何实现波形的显示,串口数据的解析,以及一些小细节实现。这篇文章写完,uFUN心率计这个小项目就算结束了。
单片机点灯小能手
2024/07/02
6750
基于STM32的心率计(3):Qt上位机设计
基于小熊派光强传感器BH1750状态机驱动项目升级(带LCD屏显示)
今天我们再小小的进阶一步,把它和小熊派上的OLED结合起来吧!所谓所见即所得,这才是开发最大的乐趣,在实现这个小项目之前,我们先来了解下小熊派开发板上的这个屏吧,先看下原理图是怎么接的:
杨源鑫
2020/05/21
1.3K0
开源项目-十六进制协议传感器自适应缩放曲线显示终端(百问网imx6ull & 小熊派结合)
周末两天深圳由于疫情开启了静默模式,因此没办法出去玩耍啦!既然没法出去,躺平是不可能的,那么,肝起来!此次给大家带来的一个开源项目:自适应曲线缩放传感器显示终端,废话不多说,上视频:
杨源鑫
2022/11/28
6840
开源项目-十六进制协议传感器自适应缩放曲线显示终端(百问网imx6ull & 小熊派结合)
RT-Thread I2C总线设备学习笔记
I2C的基本原理之前在公众号就有相应的文章了,很早之前发的,接下来我们来学习RT-Thread I2C总线设备的使用!这是RTT官方设计的一个软件框架,学习一个新东西,还是一样,我个人主张带着需求去学习,而不是漫无目的的去学,有了需求驱动,并且是一个努力付出就可以拥有的成果,那么这还不容易嘛!
杨源鑫
2020/05/21
1.8K0
基于uFUN开发板的心率计(三)Qt上位机的实现
上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值。这篇文章主要是介绍Qt上位机如何实现波形的显示,串口数据的解析,以及一些小细节实现。这篇文章写完,uFUN心率计这个小项目就算结束了,最近又做了个uFUN开发板的扩展板,在微信群里的朋友都已经看到了,后面会做一些好玩的东西,大家要保持关注哈!
单片机点灯小能手
2020/07/16
1.8K0
如何打造属于自己的3D打印机上位机?这篇文章带你了解一下!
建议不是本行又感兴趣的小伙伴们先看下面两篇了解一下Marlin: 开源Marlin2.x源代码架构学习笔记 3D打印机marlin固件框架与GCode命令总结
杨源鑫
2022/03/24
5.1K1
如何打造属于自己的3D打印机上位机?这篇文章带你了解一下!
让传感器数据更直观之LCD曲线显示
前阵子公司有一个基于毒品检测的项目需要做一个曲线显示的功能,由于这块是我的技能短板,因为我之前搞软件的应用,逻辑,框架,架构设计这块比较多,而我师弟在底层方面非常精通,所以把这一块核心的功能交给了我师弟,让他帮忙来实现基本的库,然后我基于他的库完成产品所需要的功能。
杨源鑫
2020/11/25
1.7K0
让传感器数据更直观之LCD曲线显示
基于小熊派WIFI-ESP8266实践(中)-多功能处理显示等大杂烩
上节,我们了解了小熊派上的ESP8266模块,这节,我们实现一个程序,让手机发指令来控制开发板上LED灯的亮灭吧,上节的文章链接如下:
杨源鑫
2020/05/21
2.5K2
基于小熊派光强传感器BH1750实践(multi_timer+状态机工程应用)
实践光强传感器的开发,我们需要带上一个扩展模块:E53_SC1,如下图所示,最终连接的效果:
杨源鑫
2020/05/21
1.5K0
教你动手写TCP上位机与小熊派通信
背景 关于上位机的文章,作者在之前就分享过好几个上位机的开发流程分享。如下表: 序号内容语言1《如何定制自己的HID调试助手》C#2《C# 串口上位机开发》C#3《Qt 串口上位机开发》QT4《教你动手写UDP协议栈 - OTA上位机》python5《基于RT-THREAD nano的平衡车--上位机软件》QT6《R-Plan上位机》QT 上位机开发不限于语言,找我之前开发中,初衷就是那种方便就使用那种语言开发,如:C#, QT, python, VB等。 本篇文章分享是采用QT开发的TCP上位机,功能:通
Rice加饭
2022/05/10
9000
教你动手写TCP上位机与小熊派通信
米家蓝牙温湿度计2-拆解报告,固件重定制
米家温湿度传感器支持蓝牙连接,可以通过米家蓝牙网关或手机接入到米家app,实时查看温湿度,适宜度分析数据,也可以通过米家app实现设备联动
iot-me.club
2022/02/11
12.2K2
米家蓝牙温湿度计2-拆解报告,固件重定制
基于RT-Thread Studio 和小熊派 实现智慧农业
摘要:如何从零开发一个“智慧农业”案例?小伙伴们有福了,孙教授手把手的带大家基于小熊派+RT-Thread开发一个智慧农业案例。
杨源鑫
2021/07/07
1.7K0
基于RT-Thread Studio 和小熊派 实现智慧农业
基于STM32设计的实时心率检测仪
与上位机的传输协议: 支持串口传输、WIFI网络传输两种。 如果是PC就可以直接连接串口传输数据,如果不方便可以直接通过WIFI---TCP协议传输。
DS小龙哥
2022/01/12
2.2K0
基于STM32设计的实时心率检测仪
STM32Cube-12 | 使用硬件I2C读写环境光强度传感器
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)。
Mculover666
2020/07/16
1.7K0
STM32Cube-12 | 使用硬件I2C读写环境光强度传感器
RT-Thread ADC设备学习笔记
上一节我们学习了RTT的PIN设备的使用,从PIN设备的例程再一次体会到RTT编程的灵活和简单,最重要的是让开发者专注于应用开发,文章链接:
杨源鑫
2020/05/21
1.7K0
STM32读取BH1750光照强度数据打印到串口
BH1750是一种数字式环境光强度传感器(Digital Light Sensor),也称为其他名称,例如GY-302传感器、BH1750FVI传感器等。它的工作原理是通过收集光线照射到传感器上的量来测量环境亮度。
DS小龙哥
2023/07/08
8850
STM32读取BH1750光照强度数据打印到串口
搞嵌入式开发却不会写上位机?来了解下小白的福音Micro-Lab(多个案例带你快速入门)
Micro-Lab可以称得上是迄今为止最棒的嵌入式调试工具,在调试过程中遇到的所有痛点,在这里都得以解决,并引入了很多新的功能,如串口/网络示波器,串口/网络指令编程,革命性的事件驱动型上位机生成器——组态画布等数十个功能,无论是在使用手感上还是功能实用方面都是绝对一流,可以说Micro-Lab重新定义了嵌入式调试工具,同时也成为行业工具的标杆。(当前介绍引自码云:https://gitee.com/fengmeitech/Micro-Lab),来看看具体长什么样吧:
杨源鑫
2020/07/02
1.6K0
搞嵌入式开发却不会写上位机?来了解下小白的福音Micro-Lab(多个案例带你快速入门)
BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了)
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了),希望能够帮助大家进步!!!
Java架构师必看
2022/08/09
2.1K0
BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了)
基于STM32L431设计的云端绿化管理系统(ESP8266+腾讯物联网云平台)
工程完整源代码与配套资料下载地址:https://download.csdn.net/download/xiaolong1126626497/19246016
DS小龙哥
2022/01/12
1K0
基于STM32L431设计的云端绿化管理系统(ESP8266+腾讯物联网云平台)
推荐阅读
相关推荐
基于小熊派气体传感器MQ-2综合实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验