【问题标题】:adjust brightness of led using QSlider and PWM in arduino在 arduino 中使用 QSlider 和 PWM 调整 LED 的亮度
【发布时间】:2021-11-22 10:00:06
【问题描述】:

我尝试使用 QSlider qt ui.i 控制 LED 的亮度。我遇到的问题是 LED 无法使用滑块值打开。我认为它的值类似于 123456... 然后我尝试了添加一些分隔符的解决方案.. parseInt() 停止在任何非数字字符上。现在我面临的问题是,led 使用从滑块传递的 pwm 值正确打开,但它在一秒钟后自动关闭。

这是我的 qt 代码。

ma​​inwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <string>
#include <QDebug>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>
#include <QRegularExpression>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    arduino = new QSerialPort(this);
    bool is_arduino_avilable = false;
    QString portNmae;
    databuf = "";

    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        if(info.hasProductIdentifier() && info.hasVendorIdentifier())
        {
            if(info.productIdentifier() == arduino_productId && info.vendorIdentifier() == arduino_vendorId)
            {
                is_arduino_avilable = true;
                portNmae = info.portName();
            }
        }
    }

    if(is_arduino_avilable)
    {
        qDebug() << "Arduino port is found " + portNmae;
        arduino->setPortName(portNmae);
        arduino->open(QSerialPort::ReadWrite);
        arduino->setBaudRate(QSerialPort::Baud9600);
        arduino->setDataBits(QSerialPort::Data8);
        arduino->setFlowControl(QSerialPort::NoFlowControl);
        arduino->setParity(QSerialPort::NoParity);
        arduino->setStopBits(QSerialPort::OneStop);
        QObject::connect(arduino,SIGNAL(readyRead()),this,SLOT(readSerialdata()));
    }
    else
    {
        qDebug() << "Couldn't find the correct port for the arduino.\n";
        QMessageBox::information(this,"Serial Port Error","Couldn't open serial port to arduino");
    }
}

MainWindow::~MainWindow()
{
    if(arduino->isOpen())
    {
        arduino->close();
    }
    delete ui;
}

void MainWindow::on_pluse_slider_valueChanged(int value)
{
    ui->slider_value->setText(QString("<span style=\"font-size:14pt; font-weight:600;\">%1</span>").arg(value));
    qDebug()<<value;
    arduino->write(QString("%1").arg(value).toStdString().c_str());
}

这是我的 arduino 代码。

pwm.ino

const int LED = 11;
int rsv_data;
void setup()
{
  Serial.begin(9600);
  pinMode(LED,OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
    rsv_data = Serial.parseInt();
    analogWrite(LED,rsv_data);
  }
}

提前谢谢你。

this is ui image

this is debug output image

【问题讨论】:

  • 数字之间没有分隔符,因此它发送 1234567891011.... parseInt 等待下一秒
  • @Juraj 所以我应该怎么做,请帮忙。
  • 您到底尝试了什么?从您的代码看来,Juraj 是对的。您只发送数字但没有分隔符,因此 Arduino 将在 1 秒后超时。 arduino->readAll() 有什么用?你不应该在阅读之前等待阅读吗?请改进你的帖子。添加更多信息。到底发生了什么?
  • 请停止通过 cmets 添加信息。更新您可以正确格式化文本的问题。此外,如果您已修复 123456 问题,则此问题已过时。发布新问题或更改此问题,直到您收到满意的答案
  • 让您的 Arduino 打印所有接收到的字符以进行调试。您可能会收到一个额外的非数字字符,因此 parseInt 超时并在 1 秒后返回 0 .. 您未能更新代码。它仍然只发送数字。

标签: qt arduino brightness pwm qslider


【解决方案1】:

我已经使用以下解决方案解决了这个问题:

我在下面这行arduino&gt;write(QString(",%1").arg(val).toStdString().c_str());中的值之前添加了逗号(,)作为分隔符

这一行在这个函数void MainWindow::on_pluse_slider_valueChanged(int value)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多