1. 程式人生 > >《博哥玩Arduino》- 藍芽七彩燈基礎版

《博哥玩Arduino》- 藍芽七彩燈基礎版

一、前言

app 下載路徑:http://sj.qq.com/myapp/detail.htm?apkName=com.wty.app.wifirgb

       前些時間做了藍芽小車
       
       《博哥玩Arduino》-藍芽小車-基礎篇
              http://www.arduino.cn/forum.php? ... 31059&fromuid=93655  (出處: Arduino中文社群)

      《博哥玩Arduino》-藍芽小車-實操篇
             http://www.arduino.cn/forum.php? ... 31096&fromuid=93655

   (出處: Arduino中文社群)

        後面又研究了一下ESP8266 wifi模組,然後發現在買ESP8266模組時發現商家提供了app+RGB燈,app可以控制RGB顯示顏色。感覺還是有點意思,所以就考慮一下要不咱也做一個藍芽版本的RGB燈。

        由於我這裡修改了藍芽模組的名字,需要自己命名的可以看這篇:


      《博哥玩Arduino》- 藍芽模組HC06 重新命名

             http://www.arduino.cn/forum.php? ... 31517&fromuid=93655   (出處: Arduino中文社群)


       注意:Arduino板子是Mega2560,由於樓主沒有RGB模組,所以以下都是講解原理以及實際效果,樓主會通過 串列埠列印講解實際效果(畢竟RGB其實就是收到0-255數字量而已,這個很多資料)


二、設計原理

        1.概念圖          
        手機App掃描附近藍芽裝置,找到”藍芽檯燈“,點選連線,然後隨意點選圓盤顏色選擇器,就會把選擇的顏色傳送到HC06藍芽模組,arduino再讀取串列埠資料緩衝區拿到協議資料,再解析並控制RGB燈

      app 下載路徑:http://sj.qq.com/myapp/detail.htm?apkName=com.wty.app.wifirgb

        2.電路連線
           HC06--->串列埠1(serial1)
           

       3.RGB LED原理
         
 
        之所以叫RGB,是因為這個LED是由紅(Red)、綠(Green)和藍(Blue)三色組成。我們電腦的顯示器也是由一個個小的紅、綠、藍點組成的。可以通過調整三個LED中每個燈的亮度就能產生不同的顏色。

          RGB燈有4個引腳,R、G、B三個引腳連線到LED燈的一端,還有一個引腳是共用的正極(vcc)或者共用的陰極(gnd)。假設這裡選用的是共陰RGB。R、G、B其實就是三個LED的正極,把它們的負極拉到一個公共引腳上了,它們公共引腳是負極,所以稱之為共陰RGB。

         RGB燈如何使用呢?如何實現變色呢?
         RGB只是簡單的把三個顏色的LED燈封裝在一個LED中。只要當做三個燈使用就可以了。我們都知道紅色、綠色、藍色是三原色,Arduino通過PWM口對三種顏色明暗的調節,也就analogWrite(value)語句,就能讓LED調出任何你想要的顏色。
        使用PWM可以產生0~255之間的全部顏色,共16777216種顏色(256×256×256),市面上那些說自己有1000萬種顏色的燈就是這個原理。

        共陽RGB與共陰RGB的區別(需要去試驗):
        (1)接線中的改變,共陽的話,共用端需要接5V,共陰需要接GND。
        (2)第二點就是,在顏色的調配上,與共陰是完全相反的。
                 舉個例子:共陰RGB顯示紅色為R-255,G-0,B-0。然而共陽則完全相反,RGB數值是R-0,G-255,B-255。


三、材料

          配件如下:
     ARDUINO 開發板                1塊(我這裡使用mega)
     HC06 藍芽模組                   1個
     安卓手機                            1部      
     杜邦線                                若干
     RGB模組                             1個(樓主資金短缺,當做它存在就可以了)


四、除錯過程

          1.測試RGB模組

             R引腳 ----> 引腳9
             G引腳 ----> 引腳10           
             B引腳 ----> 引腳11

[C] 純文字檢視 複製程式碼

?

程式碼

001

002

003

004

005

006

007

008

009

010

011

012

013

014

015

016

017

018

019

020

021

int redPin = 9;

int greenPin = 10;

int bluePin = 11;

void setup(){

pinMode(redPin, OUTPUT);

pinMode(greenPin, OUTPUT);

pinMode(bluePin, OUTPUT);

}

void loop(){

//R:0-255 G:0-255 B:0-255

colorRGB(random(0,255),random(0,255),random(0,255)); 

delay(1000);

}

void colorRGB(int red, int green, int blue){

analogWrite(redPin,constrain(red,0,255));

analogWrite(greenPin,constrain(green,0,255));

analogWrite(bluePin,constrain(blue,0,255));

}



       沒錯的話,應該可以看到LED顏色呈現隨機的變化。(constrain()函式需要3個引數:x、a和b。這裡x是一個被約束的數,a是最小值,b是最大值。如果值小於a,則返回a。如果大於b,則返回b。random()函式用於生成一個隨機數,min隨機數的最小值,max隨機數的最大值。)

      2.app+arduino除錯(乾貨來了)      首先,由於限制,app無法上傳,有需要的人請在本帖留言 。樓主自助app,自測沒有什麼問題,如發現什麼明顯錯誤,煩請在本帖子留言。
      然後,附上Arduino程式碼:

[C] 純文字檢視 複製程式碼

?

程式碼

001

002

003

004

005

006

007

008

009

010

011

012

013

014

015

016

017

018

019

020

021

022

023

024

025

026

027

028

029

030

031

032

033

034

035

036

037

038

039

040

041

042

043

044

045

046

047

048

049

050

051

052

053

054

055

056

057

058

059

060

061

062

063

064

065

066

067

068

069

070

071

072

073

074

075

076

077

078

079

080

081

082

083

084

085

086

087

088

089

090

091

092

093

094

095

096

097

098

099

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

/**

* 日期:2016/11/24

* 功能:藍芽檯燈

* 作者:微控制器菜鳥

**/

#define BTSerial Serial1

#define MyDebugSerial Serial

//該條語句用於使能DEBUG輸出資訊,遮蔽掉就不會輸出debug除錯資訊

#define DEBUG

#ifdef DEBUG

#define DBGLN(message)    MyDebugSerial.println(message)

#else

#define DBGLN(message)

#endif

#define PIN_RED 9

#define PIN_GREEN 10

#define PIN_BLUE 11

int red = 0;//紅色

int green = 0;//綠色

int blue = 0;//藍色

void setup() {

pinMode(PIN_RED, OUTPUT);

pinMode(PIN_GREEN, OUTPUT);

pinMode(PIN_BLUE, OUTPUT);

BTSerial.begin(9600);

MyDebugSerial.begin(9600);

}

void loop() {

int leng = ReceiveBTMessage();

if(leng>0){

//收到了新RGB數值

colorRGB(red,green,blue);

}

}

/**

* 讀取串列埠緩衝區裡面的資料

*

*/

int ReceiveBTMessage(){

/**

* @Desc 把RGB組合成協議內的資料格式

*  開始符+長度+rgb+結束符

* "+C,n:rgbString;"

* 例子:"+C,10:100,255,60;"

**/

String data = "";

if (BTSerial.available()>0){

unsigned long start;

start = millis();

char c0 = BTSerial.read();

if (c0 == '+')

{

char c;

while (millis()-start<200)

{

if (BTSerial.available()>0)

{

c = BTSerial.read();

data += c;

}

if (c==';')

break;

}

int sLen = strlen(data.c_str());

int i,r,g,b;

for (i = 0; i <= sLen; i++){

if (data[i] == ':'){

break;

}

}

DBGLN(data);

int iSize;

//"+C,10:100,255,60;"   

String _size = data.substring(2, i);

iSize = _size.toInt();

for(r=i+1;r<=sLen;r++){

if(data[r]==','){

break;

}

for(g=r+1;g<=sLen;g++){

if(data[g]==','){

break;

}

for(b=g+1;b<=sLen;b++){

if(data[b]==';'){

break;

}

String sred = data.substring(i+1,r);

String sgreen = data.substring(r+1,g);

String sblue = data.substring(g+1,b);

red = sred.toInt();

green = sgreen.toInt();

blue = sblue.toInt();

DBGLN("red:"+sred);

DBGLN("green:"+sgreen);

DBGLN("blue:"+sblue);

return iSize;

}else{

while(BTSerial.read() >= 0){} 

}

}

return 0;

}

void colorRGB(int red, int green, int blue){

analogWrite(PIN_RED,constrain(red,0,255));

analogWrite(PIN_GREEN,constrain(green,0,255));

analogWrite(PIN_BLUE,constrain(blue,0,255));

}



最後,有圖有真相:
 

 

 

以及用Arduino IDE 串列埠列印的結果(這個結果應該是跟app端顯示的RGB值是一致的):


 

使用的時候隨意點選圓盤中的任意一個點(每個點就是一個RGB值),就會看到app 頁面的四方塊顯示當前選擇的顏色以及RGB值。

注意點:
     手機端以及Arduino的資料協議格式,我定義為: 
      "+C,10:100,255,60;"
      含義:+C  開始符
                10  後面真正的資料長度(100,255,60)
                :   資料開始符
                ;   資料結束符
                ,   分隔符

      所以Arduino 程式的ReceiveBTMessage 就會去解析這個協議。

      好了,總結一下:

      1)重要是理解RGB燈的原理,其次就是藍芽模組的使用。
      2)最重要是 一步一步除錯 不能急躁。
      3)樓主由於窮,沒去買RGB模組 只能模擬了,大夥諒解。

優化版:《博哥玩Arduino》- 藍芽七彩燈優化版
http://www.arduino.cn/forum.php?mod=viewthread&tid=32113&fromuid=93655
(出處: Arduino中文社群)