功能需求
- 四種燈光模式 :照明燈、呼吸燈、流水燈、七彩燈
- 可實現99分鐘內定時功能
- 可調節燈光顏色比例,實現任意彩燈切換
- 遠程控制
效果視頻
https://v.youku.com/v_show/id_XNDI3NDY2NjA0MA==.html?spm=a2h3j.8428770.3416059.1
硬件
- Arduino UNO主板
- HC-06藍牙模塊
- RGB全綵燈 4個
- 四位數碼管
- 手機
- 3D打印相關材料(外殼)或kt板
軟件環境
Arduino IDE
APP inventor
接線
Arduino | RGB全綵燈 |
---|---|
A3 | S |
A4 | S |
A5 | S |
D2 | S |
5V | VCC |
GND | GND |
Arduino | 數碼管 |
---|---|
11 | CLK |
12 | DIO |
5V | VCC |
GND | GND |
Arduino | 藍牙 |
---|---|
RX | TX |
5V | VCC |
GND | GND |
程序
#include <Adafruit_NeoPixel.h>//全綵LED庫文件
#include <Metro.h>
#define PIN1 A3 //設置全綵LED引腳爲A3 可自己調整
#define PIN2 A4 //設置全綵LED引腳爲A4 可自己調整
#define PIN3 A5 //設置全綵LED引腳爲A5 可自己調整
#define PIN4 2 //設置全綵LED引腳爲13 可自己調整
#include <TM1637.h>
// 數碼管 配置引腳
#define CLK 11 //!參數 clk -數字引腳連接到模塊的時鐘引腳數
#define DIO 12//!參數 dio -數字引腳連接到模塊的DIO引腳數
TM1637 TM(CLK, DIO);//!初始化一個TM1637對象,設置時鐘和數據引腳。
#define MAX_LED 9
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel( MAX_LED, PIN1, NEO_RGB + NEO_KHZ800 );//Adafruit_NeoPixel實例化,通過構造函數初始化
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel( MAX_LED, PIN2, NEO_RGB + NEO_KHZ800 );//Adafruit_NeoPixel實例化,通過構造函數初始化
Adafruit_NeoPixel strip3 = Adafruit_NeoPixel( MAX_LED, PIN3, NEO_RGB + NEO_KHZ800 );//Adafruit_NeoPixel實例化,通過構造函數初始化
Adafruit_NeoPixel strip4 = Adafruit_NeoPixel( MAX_LED, PIN4, NEO_RGB + NEO_KHZ800 );//Adafruit_NeoPixel實例化,通過構造函數初始化
Metro metro = Metro(6000); //把 blink1Metro 實例化 Metro 對象 ,並設置間隔時間
int min_time;
long second_time=0;
int red=255,green=255,blue=255;
static long time_1=0;
static long time_2=0;
//uint32_t color_led = strip1.Color(green,red,blue); //GRB
//arduino引腳排列 VCC TX RX GND
void setup()
{
Serial.begin(9600);//初始化波特率爲9600
strip1.begin(); //初始化Adafruit_NeoPixel;
strip2.begin();
strip3.begin();
strip4.begin();
LED(0);
TM.show(false);//設置數碼管顯示 爲真顯示,否則不顯示
}
String comdata = "";
int mode_LED=0;
bool timer=false;
void loop()
{
while (Serial.available() > 0){
comdata += char(Serial.read()); //每次讀一個char字符,並相加
delay(2);
}
if(timer) timing();//定時
if (comdata.length() > 0){
Serial.println(comdata); //打印接收到的字符
switch(comdata.charAt(0)){
case 'a':
String str=comdata.substring(1,comdata.length());
min_time=str.toInt();
Serial.println(min_time);
time_2=millis();
timer=true;
break;
}
/***********設置燈光顏色 rgb****************/
if(comdata.charAt(0)=='g'){
String str=comdata.substring(1,comdata.length());
green=str.toInt();
Serial.println(green);
}
else if(comdata.charAt(0)=='r'){
String str=comdata.substring(1,comdata.length());
red=str.toInt();
Serial.println(red);
}
else if(comdata.charAt(0)=='b'){
String str=comdata.substring(1,comdata.length());
blue=str.toInt();
Serial.println(blue);
}
/***********設置燈光模式****************/
if(comdata.equals("one")){
mode_LED=1;
}
else if(comdata.equals("two")){
mode_LED=2;
}
else if(comdata.equals("three")){
mode_LED=3;
}
else if(comdata.equals("four")){
mode_LED=4;
}
else if(comdata.equals("off")){
mode_LED=5;
}
comdata = "";
}
mode(mode_LED);
}
void timing(){
//
if(millis()-time_2>60000){
min_time=min_time-1;
time_2=millis();
}
if(min_time==0){
LED(0);
mode_LED=0;
delay(500);
TM.show(false);//設置數碼管顯示 爲真顯示,否則不顯示
timer=false;
}else{
TM.DNum(00,min_time,true);//顯示雙數字,左邊兩位顯示num1最後兩位;左邊兩位顯示num2最後兩位;piont 是否顯示中間的兩點
TM.show(true);//設置數碼管顯示 爲真顯示,否則不顯示
}
}
void mode(int number){//燈光模式
switch(number){
case 1:
LED_color(green,red,blue);
LED(255);
break;
case 2:
LED_color(green,red,blue);
two();
break;
case 3:
LED_color(green,red,blue);
three();
break;
case 4:
four();
break;
case 5:
LED(0);
break;
}
}
int x=0;
void two(){
if(x==5) x=0;
if(millis()-time_1>1000){
x++;
time_1=millis();
}
switch(x){
case 1:
strip1.setBrightness(255);
strip1.show();
strip2.setBrightness(0);
strip2.show();
strip3.setBrightness(0);
strip3.show();
strip4.setBrightness(0);
strip4.show();
break;
case 2:
strip1.setBrightness(0);
strip1.show();
strip2.setBrightness(255);
strip2.show();
strip3.setBrightness(0);
strip3.show();
strip4.setBrightness(0);
strip4.show();
break;
case 3:
strip1.setBrightness(0);
strip1.show();
strip2.setBrightness(0);
strip2.show();
strip3.setBrightness(255);
strip3.show();
strip4.setBrightness(0);
strip4.show();
break;
case 4:
strip1.setBrightness(0);
strip1.show();
strip2.setBrightness(0);
strip2.show();
strip3.setBrightness(0);
strip3.show();
strip4.setBrightness(255);
strip4.show();
break;
}
}
int i=255;//呼吸燈 亮度
bool flag;
void three(){
if(i==255) flag=true;
if(i==0) flag=false;
if(millis()-time_1>10){
if(flag) i--;
else i++;
time_1=millis();
}
LED(i);
}
int j=0;
void four(){
if(j==7) j=0;
if(millis()-time_1>2000){
j++;
time_1=millis();
}
switch(j){
case 1:
LED_color(0,255,0);
break;
case 2:
LED_color(255,255,0);
break;
case 3:
LED_color(0,0,255);
break;
case 4:
LED_color(255,0,0);
break;
case 5:
LED_color(255,0,255);
break;
case 6:
LED_color(0,255,255);
break;
case 7:
LED_color(255,255,255);
break;
}
LED(255);
}
void LED_color(int green,int red,int blue){//設置燈光顏色
strip1.setPixelColor(0,strip1.Color(green,red,blue));
strip1.setPixelColor(1,strip1.Color(green,red,blue));
strip2.setPixelColor(0,strip2.Color(green,red,blue));
strip2.setPixelColor(1,strip2.Color(green,red,blue));
strip3.setPixelColor(0,strip3.Color(green,red,blue));
strip3.setPixelColor(1,strip3.Color(green,red,blue));
strip4.setPixelColor(0,strip4.Color(green,red,blue));
strip4.setPixelColor(1,strip4.Color(green,red,blue));
}
void LED(int light){//設置燈光亮度
strip1.setBrightness(light);
strip1.show();
strip2.setBrightness(light);
strip2.show();
strip3.setBrightness(light);
strip3.show();
// strip4.setPixelColor(0, strip4.Color(green,red,blue);
// strip4.setPixelColor(1,strip4.Color(green,red,blue));
strip4.setBrightness(light);
strip4.show();
}
下載鏈接:
QQ交流羣:731722723 驗證消息:Arduino