【记录】QT Creator开发上位机控制Arduino UNO开发板上的RGB灯

发布于:2022-08-10 ⋅ 阅读:(686) ⋅ 点赞:(0)

前言

2022年的电赛结束后,留在学校有些许无聊,故自费买了一块Arduino UNO 开发板入门。
由于之前一直用的是STM32,有了开发基础,所以对于笔者而言Arduino的入门并不是很难。
跟着视频与例程学习了几天,学习了如何使用Arduino控制RGB灯。
但仅仅点个灯,未免有些单调,于是在某个安静的夜晚,想法就这么诞生了。

一、Arduino UNO开发板简介

Arduino UNO是基于ATmega328P的Arduino开发板。它有14个数字输入/输出引脚(其中6个可用于PWM输出)、6个模拟输入引脚,一个16 MHz的晶体振荡器,一个USB接口,一个DC接口,一个ICSP接口,一个复位按钮。
Arduino UNO开发板
在接触到Arduino之后,就感觉到它比STM32要友好许多,省去许多纷繁的配置,不需要了解眼花缭乱的寄存器,只需要像搭积木一样,用别人造好的轮子来构造自己的逻辑代码。
在淘宝购买一块Arduino UNO的板子,跟着客服的资料,基本几天就可入门。
对于Arduino的入门学习,个人推荐B站太极创客的教程:Arduino入门教程

二、Arduino控制RGB灯

1.原理

Arduino开发板通过其自带的数字引脚,输出PWM信号来改变LED灯的亮度阶数,再使三盏灯的亮度叠加在一起,亮度阶数的不同组合即产生不同颜色的光。我们通过串口发送不同的RGB数值,Arduino接收到RGB三组数值后进行处理,最后执行指令。

2.程序源码

 
/*
 * Serial-RGB-LED
 * 通过串口输入信息调整LED的颜色
 * 指令示例: r128g100b20
 * 以上指令将LED的RGB数值调整为(128,100,20)
 *         
 */
#define rLedPin  5  //引脚R
#define gLedPin  6  //引脚G
#define bLedPin  3  //引脚B

int ledR  = 0; //R Led 亮度
int ledG  = 0; //G Led 亮度
int ledB  = 0; //B Led 亮度
 
void setup() {
  pinMode(rLedPin, OUTPUT);
  pinMode(gLedPin, OUTPUT);
  pinMode(bLedPin, OUTPUT);
  Serial.begin(115200);
}
 
void loop() {
  
  if (Serial.available()>0) { 
    char serialCmdChar = Serial.read();  
    serialCmd(serialCmdChar);       
  }
  delay(20);      
}
 
void serialCmd(char serialCmdChar) {  
  switch (serialCmdChar){
    case 'r':
      ledR = Serial.parseInt();
      break;
 
    case 'g':
      ledG = Serial.parseInt();
      break;
 
    case 'b':
      ledB = Serial.parseInt();
      break;    
 
 
  analogWrite(rLedPin, ledR);
  //delay(10);
  analogWrite(gLedPin, ledG);
  //delay(10);
  analogWrite(bLedPin, ledB); 
  delay(20);   
}

三、QT Creator编写上位机

1.开发准备

既然Arduino是通过串口来实现RGB灯功能的,那么我们开发的上位机本质上是一个串口发送端。
程序流程图:
上位机流程图
这里我们使用QT Creator来开发,好处多多:
一是入门简单,仅需要一定的C++基础,开发周期短;
二是功能强大,包含丰富的开发库,并且支持跨平台。
详细可看我之前的文章:
【上位机】通过QTCreator编写WIFI上位机与网络调试助手通信绘制曲线
【上位机与下位机通信】使用WIFI模块ESP8266连接单片机与上位机通信

2.数据处理源码

/*发送RGB值*/
void ArduinoRGB::on_Set_Button_clicked()
{
    QString sendstr = 'r'+ui->R_Editor->toPlainText() +
                       'g'+ui->G_Editor->toPlainText()+
                        'b'+ui->G_Editor->toPlainText(); //拼接三个文本框数据
    QByteArray sendarr = sendstr.toLocal8Bit(); //转换数据类型
    serialport->write(sendarr);
}

/*清空输入框*/
void ArduinoRGB::on_Clear_Button_clicked()
{
    ui->R_Editor->clear();
    ui->G_Editor->clear();
    ui->B_Editor->clear();
}

3.开发成果

这是一个功能较为简单的上位机,只需在RGB输入框中输入合适的数值,便可控制连接在Arduino上的RGB灯产生不同颜色的光。
RGB上位机

4.实物效果

实物效果

四、总结

这是本人在放假期间无聊时所做的一个小项目,后续还打算学习开发安卓应用实现手机端控制以及基于ESP8266的WIFI物联网控制,还有十来天就开学了,也不知道进度能到哪,好好努力吧!

本文含有隐藏内容,请 开通VIP 后查看

网站公告


今日签到

点亮在社区的每一天
去签到