1. 程式人生 > >《博哥玩Arduino》- 藍芽七彩燈優化版V3.0

《博哥玩Arduino》- 藍芽七彩燈優化版V3.0

博哥自建ESP8266 qq交流群:869920142

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


近來有些哥們說這個藍芽七彩燈優化版V2.0還是有點問題,那就是無法無縫連結到UNO,還是需要自己修改一些程式碼。基於這個點,我修改了一下,釋出優化版V3.0程式碼,以供Arduino UNO的哥們可以直接使用。

二、除錯程式碼

[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

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

/**

* 日期:2017/04/16

* 功能:藍芽檯燈V3.0

* 作者:微控制器菜鳥

**/

#include<EEPROM.h>

#include <SoftwareSerial.h>

//#define UNO      //uncomment this line when you use it with UNO board

#define MEGA    //uncomment this line when you use it with MEGA board

#ifdef UNO

SoftwareSerial mySerial(10,11);

#endif

#ifdef UNO

#define BTSerial  Serial

#define MyDebugSerial mySerial

#endif

#ifdef MEGA

#define BTSerial Serial1

#define MyDebugSerial Serial

#endif 

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

//#define DEBUG

//該條語句用於使能是共陰RGB  遮蔽掉就是共陽RGB

//#define COMMON_GND

#ifdef DEBUG

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

#else

#define DBGLN(message)

#endif

#ifdef UNO

#define PIN_RED 3 //red 引腳

#define PIN_GREEN 5 //green 引腳

#define PIN_BLUE 6 //blue 引腳

#else

#define PIN_RED 2

#define PIN_GREEN 3

#define PIN_BLUE 4

#endif

#define MAX  7

#define KEY  7

#define RED_ADDR 0  //紅色 eeprom地址

#define BLUE_ADDR 1 //藍色 eeprom地址

#define GREEN_ADDR 2 //綠色 eeprom地址

int red = 0;//紅色

int green = 0;//綠色

int blue = 0;//藍色

boolean isNeedtoSave = false;//是否需要儲存

int saveCountX = 0;//統計當前次數

int saveCountY = 0;//統計當前次數

// 定義記錄按鍵當前狀態的變數

int state_btn;

// 定義記錄按鍵最近一次狀態變化的變數,並初始化狀態為LOW。

int lastButtonState = LOW;

// 定義記錄最近一次抖動的時間變數,並初始化時間為0毫秒。

long lastDebounceTime = 0;

// 定義延遲抖動的時間變數

long debouncdDelay = 60;

int currentcode = 0;

//rgb編碼

unsigned int rgb_code[MAX][3] = {

{255,255,255},//白光

{255,0,0},//紅光

{0,255,0},//綠光

{0,0,255},//藍光

{255,255,0},//黃光

{0,255,255},//淺藍

{255,0,255}//淺紫

};

void setup() {

pinMode(PIN_RED, OUTPUT);

pinMode(PIN_GREEN, OUTPUT);

pinMode(PIN_BLUE, OUTPUT);

//配置10號引腳為輸入引腳 如果是自己連線普通按鍵 pinMode(KEY,INPUT_PULLUP),弱上拉

pinMode(KEY,INPUT);

BTSerial.begin(9600);

#ifdef DEBUG

MyDebugSerial.begin(9600);

#endif

init_RGB();

}

void loop() {

int leng = ReceiveBTMessage();

if(leng>0){

//收到了新RGB數值

colorRGB(red,green,blue);

}

changeRGBbyButton();

saveEEPROM();

}

/**

* 初始化RGB燈

*/

void init_RGB(){

red = EEPROM.read(RED_ADDR);

DBGLN(red);

delay(10);

green = EEPROM.read(GREEN_ADDR);

delay(10);

DBGLN(green);

blue = EEPROM.read(BLUE_ADDR);

delay(10);

DBGLN(blue);

colorRGB(red,green,blue);

}

void saveEEPROM(){

//以下這段程式碼是為了儲存eeprom  因為定時中斷不能用 所以就用了這麼猥瑣的程式碼

if(saveCountX == 30){

if(saveCountY == 30000){

saveCountX = 0;

saveCountY = 0;

if(isNeedtoSave){

isNeedtoSave = false;

saveRGBtoEEPROM();

}

}else{

saveCountY ++;

}

}else{

if(saveCountY == 30000){

saveCountX ++;

saveCountY = 0;

}else{

saveCountY ++;

}

}

}

/**

* 把rgb資料儲存到EEPROM上去

*/

void saveRGBtoEEPROM(){

DBGLN("saveRGBtoEEPROM");

DBGLN(red);

DBGLN(green);

DBGLN(blue);

EEPROM.write(RED_ADDR,red);

delay(50);

EEPROM.write(GREEN_ADDR,green);

delay(50);

EEPROM.write(BLUE_ADDR,blue);

delay(50);

}

/**

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

*/

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;

boolean data_right = false;

while (millis()-start<200) {

if (BTSerial.available()>0){

c = BTSerial.read();

delay(1);

data += c;

}

if (c==';'){

data_right = true;

break;

}

}

DBGLN(data);

if(!data_right)return;

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

int i,r,g,b;

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

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

break;

}

}

int iSize;

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

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

iSize = _size.toInt();

//"+C,10:1,1,1;"

if(iSize!=sLen-i-2)return;

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);

isNeedtoSave = true;

//變成0

saveCountX = 0;

saveCountY = 0;

return iSize;

}else{

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

}

}

return 0;

}

/**

* 控制RGB顏色

*/

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

#ifdef COMMON_GND

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

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

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

#else

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

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

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

#endif

}

/**

* 按鍵切換顯示(應用於無app情景)

*/

void changeRGBbyButton(){

int buttonState = digitalRead(KEY);//讀取當前按鍵狀態

if(buttonState != lastButtonState){

//如果按鍵發生了變化  則重新設定最近一次抖動的時間

//方法millis()可以獲取當前時間,單位統一為毫秒。

lastDebounceTime = millis(); 

}

// 判斷按鍵按下或擡起的狀態時間間隔是否大於延遲抖動的時間長度。

if(millis()-lastDebounceTime>debouncdDelay){

// 判斷當前的按鍵狀態是否和之前有所變化

if(buttonState != state_btn){

// 如果發生了變化,

// 則更新按鍵狀態變數。

state_btn = buttonState;

if(state_btn == HIGH){

//再次確認是否真的按下了按鍵,是的話

currentcode++;

if(currentcode == MAX){

currentcode = 0;

}

red = rgb_code[currentcode][0];

green = rgb_code[currentcode][1];

blue = rgb_code[currentcode][2];

colorRGB(red,green,blue);

isNeedtoSave = true;

//變成0

saveCountX = 0;

saveCountY = 0;

}

}

}

// 更新按鍵最近一次狀態變化的變數

lastButtonState = buttonState;

}


  需要用UNO板子的哥們,可以看到這兩句程式碼:

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

?

程式碼

001

002

//#define UNO      //uncomment this line when you use it with UNO board

#define MEGA    //uncomment this line when you use it with MEGA board


  需要用UNO就註釋掉 Mega,需要用Mega就註釋掉UNO

  這個就到此結束,此貼針對於初學者,大神勿噴。

相關推薦

Arduino》- 彩燈優化V3.0

博哥自建ESP8266 qq交流群:869920142 一、前言app 下載路徑:http://sj.qq.com/myapp/detail.htm?apkName=com.wty.app.wifirgb近來有些哥們說這個藍芽七彩燈優化版V2.0還是有點問題,那就是無法無縫

Arduino》- 彩燈基礎

一、前言app 下載路徑:http://sj.qq.com/myapp/detail.htm?apkName=com.wty.app.wifirgb        前些時間做了藍芽小車                《博哥玩Arduino》-藍芽小車-基礎篇        

Arduino》- 模組HC06 重新命名

最近在研究藍芽RGB燈,因為有多塊藍芽模組,然後由於名字是一樣的,導致都不知道手機藍芽到底連線到哪一塊去了。那麼就意味著 我們需要一個標識來區分藍芽模組,這就意味著每個藍芽模組應該可以自定義自己的名字,然後去查了一下資料,果然有AT指令可以支援,以下附上程式碼:   注意:我

Arduino》-Arduino語法手冊

這幾天一直在看8266的手冊以及除錯,可惜總出現一些問題,由於UNO R3板子只有一個硬體串列埠,除錯起來很不方便,所以就上網買了個Mega2560,剛好過兩天就週末,就可以基於Mega2560去除錯8266模組,當然這查詢資料的過程中,也學習了不少新知識,老鳥勿噴。    

iOS開發之()不看此文,枉做開發

前言: 之前詳細談過不少關於HTTP協議的知識點,TCP/IP也通過tcpdump做過簡單的介紹,但網路協議的本質其實是連線,裝置或者端之間連線的方式有多種,常見的http或者基於tcp的socket只是森林一葉,還有些不那麼常見的協議比如藍芽。適當腦洞,也能玩出不少新花樣

用樹莓派

作者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁轉載。 藍芽是一個使用廣泛的無線通訊協議,這兩年又隨著物聯網概念進一步推廣。我將介紹藍芽協議,特別是低功耗藍芽,並用樹莓派來實踐。樹莓派3中內建了藍芽模組。樹莓派通過UART介面和該模組通訊。樹莓派1和樹莓派2中沒有內

Arduino

Arduino 藍芽 前言 Arduino,我將它理解為一個嵌入式裝置,只是因為這學期有一門這個課,就叫嵌入式。 這是一個開源硬體。 開源軟體大家都很清楚,那開源硬體是啥呢? 意思就是這個東西怎做會在網上說的很清楚,會做的人都能自己做一個出來。 我剛上大學時買了一個。買回來3

Androidble4.0開發相容2.0應用(針對arduino控制小車開發應用HC-08,06模組的連線)

1.嗯有段時間沒更新部落格啦,給廣大CSDN友上點幹活 2.android藍芽即智慧穿戴裝置火起來之後藍芽的普及也是有點猛,今天我們部落格的主題就是圍繞arduino開發藍芽控制小車寫的測試demo,連線的藍芽模組是HC-08,06型號,所以出廠的硬體UUID是廠商提供的,

Arduino-開發入門2-Arduino模組與Android實現通訊

 首先show一下新入手的藍芽模組  藍芽引數特點 1.藍芽核心模組使用HC-06從模組,引出介面包括VCC,GND,TXD,RXD,預留LED狀態輸出腳,微控制器可通過該腳狀態判斷藍芽是否已經連線 2.led指示藍芽連線狀態,閃爍表示沒有藍芽連線,

Android開發(二) BLE4.0低功耗

一、BLE4.0低功耗藍芽 Bluetooth Low Energy,藍芽低功耗,是從藍芽4.0開始支援的技術。相較傳統藍芽,傳輸速度更快、覆蓋範圍廣、安全性高、延時短、耗電低等特點。 二、關鍵術語 1.GATT(通用屬性配置):通用屬性配置檔案,用於ble鏈路上傳送和接

熱門耳機收納盒,你有了解過嗎?

刷微博的朋友最近一定都被一個小東西刷屏了,它就是藍芽耳機收納盒 藍芽耳機收納盒的出現解決了藍芽耳機充電和收納整理的問題。有時候耳機使用時間過長,又沒有辦法充電常常使人煩惱。為了解決這個問題,藍芽耳機收納盒這時候就出現在人們的生活中了。 藍芽耳機主要有以下幾個功能: 1.收

arduino教程-13.

智慧移動裝置和Arduino微電腦,兩者相輔相成,可各自發揮所長。例如,用手機當成Arduino的顯示器或輸入裝置,Arduino當做手機的硬體擴充套件口,控制燈光和自走車,或者返回溫溼度感測器的資料給手機。 電波、頻段和無線傳輸簡介 利用電波或紅外線來傳輸資料。可見光、紅外線和電波

Arduino 製作開關

硬體 arduino nano主機板 繼電器 HC-06藍芽模組 Android 手機 軟體 arduino IDE Android Studio 接線 藍芽 na

Arduino模組做一個開門裝置

用Arduino和藍芽模組做一個開門裝置 閒來無事,給門上裝一個不用鑰匙開門的裝置(如圖) 學校很老的鎖也搞不出什麼花樣了,就拿個舵機拉根杜邦線拽著鎖。 很簡單的東西,做著玩玩。(好吧,我承認看著有點’低電平‘) 用的好像是HC04藍芽模組吧,就網上賣的Arduino套間裡的那個

控制arduino的安卓軟體(基於app inventor2 )(之一:andriod軟體設計篇)

藍芽控制arduino的安卓軟體(基於app inventor ) 最近在無線電雜誌上看到關於app inventor 的內容,趕腳很厲害,從圖書館回來後就開始嘗試,發現真的不錯。因為之前在用arduino,所以我想能能不能用app inventor寫軟體通過WIFI

使用耳機遊戲聲音卡頓延遲問題

樓主最近買的藍芽耳機到了,59元天貓暢銷款,入手後引發了這個問題的誕生:看視訊、聽音樂都沒問題,玩遊戲(王者榮耀等)延遲(1-2s),這讓我有點頭大,奈何作為一個技術宅,遇到問題就得想著解決。百度後,在

APP Inventor,一個能快速做出app的工具。只要會C語言就行,很好的除錯微控制器工具。基於arduino資料傳送在APP顯示,室內花園的製作。

  今天記錄一下前幾天做的一個關於智慧窗戶APP的製作過程。這次製作是通過APP inventor來實現的下面是最原始的版本,雖然有點醜,但這都不是重點,以後有待改進。(1)APP初次開啟的顯示:如圖所示,這一APP有獲取藍芽地址、連線藍芽、開關燈、氣泵的開關、智慧模式的開關

全功能智慧車之PC上位機遙控起步(第篇)

PC上位機藍芽遙控起步: 在網上找到一個串列埠MFC程式,實現了藍芽串列埠的收發功能 開發環境:Visual Studio 2013 語言:MFC C++ 注意:開啟工程升級之後不要馬上就生成可執行程

Windows平臺耳機遊戲沒有聲音

問題:使用藍芽耳機玩遊戲一直沒有聲音,但是一退出遊戲就恢復。 解決方法: 1. 安裝藍芽驅動(這裡以CSR Harmony無線軟體棧為例) 開啟藍芽驅動軟體–我的Bluetooth裝置

Arduino的串列埠通訊

1:對於Arduino,print()和println()函式都是用ASCII字元的方式傳送資料。 無論是int、float還是string,都自動轉換成ASCII碼傳送。 其中println()函式在傳送的資料後面加了回車和換行符(”\r”和”\n”)。換