基於Arduino的RGB色燈上位機控制Demo

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變色

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章