文章目录
前言
2022年的电赛结束后,留在学校有些许无聊,故自费买了一块Arduino UNO 开发板入门。
由于之前一直用的是STM32,有了开发基础,所以对于笔者而言Arduino的入门并不是很难。
跟着视频与例程学习了几天,学习了如何使用Arduino控制RGB灯。
但仅仅点个灯,未免有些单调,于是在某个安静的夜晚,想法就这么诞生了。
一、Arduino UNO开发板简介
Arduino UNO是基于ATmega328P的Arduino开发板。它有14个数字输入/输出引脚(其中6个可用于PWM输出)、6个模拟输入引脚,一个16 MHz的晶体振荡器,一个USB接口,一个DC接口,一个ICSP接口,一个复位按钮。
在接触到Arduino之后,就感觉到它比STM32要友好许多,省去许多纷繁的配置,不需要了解眼花缭乱的寄存器,只需要像搭积木一样,用别人造好的轮子来构造自己的逻辑代码。
在淘宝购买一块Arduino UNO的板子,跟着客服的资料,基本几天就可入门。
对于Arduino的入门学习,个人推荐B站太极创客的教程:
Arduino入门教程
二、Arduino控制RGB灯
1.原理
Arduino开发板通过其自带的数字引脚,输出PWM信号来改变LED灯的亮度阶数,再使三盏灯的亮度叠加在一起,亮度阶数的不同组合即产生不同颜色的光。我们通过串口发送不同的RGB数值,Arduino接收到RGB三组数值后进行处理,最后执行指令。
教程指路:
基于Arduino UNO开发板的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灯产生不同颜色的光。
4.实物效果
四、总结
这是本人在放假期间无聊时所做的一个小项目,后续还打算学习开发安卓应用实现手机端控制以及基于ESP8266的WIFI物联网控制,还有十来天就开学了,也不知道进度能到哪,好好努力吧!