Arduino是一個很好的嵌入式開發平臺,它有着很好的易用性。對於我們這種電子業餘愛好者,有着很強的吸引力。這兩天做了一個小Demo分享給大家。
通過控制R,G,B分量來設置RGB色燈的顏色,電位器爲調整光的強度。
// Arduino Nano V3.0 Board
int redPin = 3;//紅色分量 PWM
int greenPin = 5; //綠色分量 PWM
int bluePin = 6; //藍色分量 PWM
int readPin = A3; //讀電位器
int putToRgbPin = 10; //輸出到RGB色燈的亮度 PWM
int onOffPin = A1; //讀壓電陶瓷片
int beeOutPin = 11; //蜂鳴器輸出 PWM
int value = 0; //亮度值
byte serialData[5]; //從串口讀取的數據
void setup() {
// 此處定義一系列的引腳
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(readPin, INPUT);
pinMode(onOffPin, INPUT);
pinMode( beeOutPin , OUTPUT);
pinMode(putToRgbPin, OUTPUT);
//開始串口通信
Serial.begin(115200);
Serial.println("Baud Rate: 115200");
//初始RGB色燈不發光
setColor(0x00, 0x00, 0x00);
//定義了一個隨機數種子
randomSeed(1397);
}
void loop() {
//讀取電位器的模擬值並且轉換成PWM輸入值
value = map(analogRead(readPin), 0, 1023, 0, 255);
//輸入到色燈中
analogWrite(putToRgbPin, value);
//讀取壓電陶瓷模擬值並且轉換成蜂鳴器的輸入值
analogWrite(beeOutPin, map(analogRead(onOffPin), 0, 1023, 0, 255) * 20);
//開始讀取串口數據
if (Serial.available() > 0) {
//讀取一個字節數組
Serial.readBytes(serialData, 5)
//判斷首尾類型實現功能種類判斷
if (serialData[0] == 0x01 && serialData[4] == 0x02)
{
setColor(serialData[1], serialData[2], serialData[3]); //上位機傳入的顏色分量
}
if (serialData[0] == 0x01 && serialData[4] == 0x03)
{
lightFlicker(); //開始自定義閃爍
}
Serial.flush();
}
}
//輸出顏色分量到LED
void setColor(int red, int green, int blue) {
analogWrite(redPin, 255 - red);
analogWrite(greenPin, 255 - green);
analogWrite(bluePin, 255 - blue);
analogWrite(beeOutPin, (red + green + blue) / 3); //蜂鳴器的發聲由三個顏色分量的平均值決定
}
//隨機顯示顏色函數
void randColor(int num) {
while (num--) {
setColor(random(0, 255), random(0, 255), random(0, 255));
delay(500);
setColor(0, 0, 0);
delay(200);
}
}
void lightFlicker()
{
int r = 0, g = 0, b = 0;
while (1) {
for (; r <= 255; r++) {
setColor(r, g, b);
delay(4);
}
for (; g <= 255; g++) {
setColor(r, g, b);
delay(4);
}
for (; b <= 255; b++) {
setColor(r, g, b);
delay(4);
}
for (; r >= 0; r--) {
setColor(r, g, b);
delay(4);
}
for (; g >= 0; g--) {
setColor(r, g, b);
delay(4);
}
for (; b >= 0; b--) {
setColor(r, g, b);
delay(4);
}
delay(496);
setColor(0, 0, 0);
delay(300);
setColor(0xff, 0, 0);
delay(500);
setColor(0, 0, 0);
delay(300);
setColor(0, 0xff, 0);
delay(500);
setColor(0, 0, 0);
delay(300);
setColor(0, 0, 0xff);
delay(500);
setColor(0, 0, 0);
delay(300);
randColor(10);
}
}
Arduio nano開發板 如下:
上位機程序:
using System;
using System.Drawing;
using System.IO.Ports;
using System.Windows.Forms;
namespace RGB_Light
{
public partial class Form1 : Form
{
SerialPort sp = new SerialPort(); //定義一個SerialPort實現串口傳輸支持
byte[] sendBytes = new byte[5]; //定義一個字節數組,包含傳輸的RGB值
public Form1()
{
InitializeComponent();
sp.DataReceived += Sp_DataReceived;
CheckForIllegalCrossThreadCalls = false;
sendBytes[0] = 0x01;
sendBytes[1] = 0x00;
sendBytes[2] = 0x00;
sendBytes[3] = 0x00;
sendBytes[4] = 0x02;
SetTextColorValue();
comboBox2.SelectedIndex = 5;
}
private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
textBox2.AppendText(sp.ReadLine() + Environment.NewLine);
}
private void button1_Click(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex == -1 || comboBox2.SelectedIndex == -1)
{
MessageBox.Show("請選擇一個串口進行通信!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (!sp.IsOpen)
{
SetTextColorValue();
sp.PortName = comboBox1.SelectedItem.ToString(); //用戶選擇串口輸入
sp.BaudRate = Convert.ToInt32(comboBox2.SelectedItem.ToString()); //波特率設置
sp.Open();
Send();
button1.Text = "關閉串口";
}
else
{
sp.Close();
button1.Text = "打開串口";
}
}
private void button2_Click(object sender, EventArgs e)
{
if (sp.IsOpen)
{
MessageBox.Show("發送完畢");
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
sp.Close();
}
private void button3_Click(object sender, EventArgs e)
{
colorDialog1.AllowFullOpen = true;
if (colorDialog1.ShowDialog() == DialogResult.OK)
{
sendBytes[1] = colorDialog1.Color.R; //字節數組1,2,3位是RGB色值 0-255
sendBytes[2] = colorDialog1.Color.G;
sendBytes[3] = colorDialog1.Color.B;
Send();
trackBar1.Value = colorDialog1.Color.R;
trackBar2.Value = colorDialog1.Color.G;
trackBar3.Value = colorDialog1.Color.B;
SetTextColorValue();
SetPicColor();
}
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
sendBytes[1] = Convert.ToByte(trackBar1.Value);
trackBar1.BackColor = Color.FromArgb(0xff, trackBar1.Value, 0, 0);
SetPicColor();
SetTextColorValue();
Send();
}
private void trackBar2_Scroll(object sender, EventArgs e)
{
sendBytes[2] = Convert.ToByte(trackBar2.Value);
trackBar2.BackColor = Color.FromArgb(0xff, 0, trackBar2.Value, 0);
SetPicColor();
SetTextColorValue();
Send();
}
private void trackBar3_Scroll(object sender, EventArgs e)
{
sendBytes[3] = Convert.ToByte(trackBar3.Value);
trackBar3.BackColor = Color.FromArgb(0xff, 0, 0, trackBar3.Value);
SetPicColor();
SetTextColorValue();
Send();
}
private void Send()
{
if (sp.IsOpen)
{
sp.Write(sendBytes, 0, 5);
}
}
private void SetPicColor()
{
Color c = Color.FromArgb(0xff, trackBar1.Value, trackBar2.Value, trackBar3.Value);
pictureBox1.BackColor = c;
}
private void SetTextColorValue()
{
textBox1.Text = string.Format("{0:X2}{1:X2}{2:X2}", trackBar1.Value, trackBar2.Value, trackBar3.Value);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void button2_Click_1(object sender, EventArgs e)
{
if (!sp.IsOpen)
{
return;
}
sendBytes[4] = 0x03;
Send();
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (var item in SerialPort.GetPortNames())
{
comboBox1.Items.Add(item);
}
}
}
}
窗體佈局:
演示視頻:上位機實現Arduino可控RGB變色