在arduino中使用QSlider和PWM调整led的亮度
adjust brightness of led using QSlider and PWM in arduino
我尝试用 QSlider 控制 led 的亮度 qt ui.i 面临的问题是 led 不能用滑块值打开。我认为它的值像 123456... 然后我尝试了添加一些分隔符的解决方案.. parseInt() 在任何非数字字符上停止。现在我面临的问题是 led 使用从滑块传递的 pwm 值正确打开,但它会在一秒钟后自动关闭。
这是我的qt代码。
mainwindow.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
我已经使用以下解决方案解决了这个问题:
我在下面这一行的值之前添加了逗号 (,) 作为分隔符 arduino>write(QString(",%1").arg(val).toStdString().c_str());
这一行在这个函数中void MainWindow::on_pluse_slider_valueChanged(int value)
我尝试用 QSlider 控制 led 的亮度 qt ui.i 面临的问题是 led 不能用滑块值打开。我认为它的值像 123456... 然后我尝试了添加一些分隔符的解决方案.. parseInt() 在任何非数字字符上停止。现在我面临的问题是 led 使用从滑块传递的 pwm 值正确打开,但它会在一秒钟后自动关闭。
这是我的qt代码。
mainwindow.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
我已经使用以下解决方案解决了这个问题:
我在下面这一行的值之前添加了逗号 (,) 作为分隔符 arduino>write(QString(",%1").arg(val).toStdString().c_str());
这一行在这个函数中void MainWindow::on_pluse_slider_valueChanged(int value)