本帖最后由 小张 于 2014-3-21 18:51 编辑
之前看到过关于蓝牙控制LED灯的贴子http://www.geek-workshop.com/forum.php?mod=viewthread&tid=8108,
决定自己动手尝试一下.
主板使用了Arduino Uno板,蓝牙模块是HC-05,(悲剧的反接过一回,背板上的3.3V电源IC烧了,现在直连3.3V供电).
开始时,和前面的贴子一样,使用开关量,
不过和原程序不同的是,这个程序控制的是12个LED.
每次从串口输入"a,b,c,d,e,f,g,h,i,j,k,l"中的一个字符时,对应从13到2脚的LED灯点亮.
每次从串口输入"A,B,C,D,E,F,G,H,I,J,K,L"中的一个字符时,对应从13到2脚的LED灯熄灭.
程序
[pre lang="arduino" line="1" file="BULE_LED"]int ledCount = 12; //LED的总数量.
int ledOut[] = { 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2};//12个LED从13脚开始到2脚.
void setup() {
Serial.begin(115200); //设置串口波特率,使用蓝牙模块时,注意收发引脚交叉(T-R,R-T)
int i; //设定一个变量.
for (i = 0; i < ledCount; i++)//循环一次,从0到11
pinMode(ledOut, OUTPUT);//设定0到11的LED为输出模式.
}
void loop() {
char ch;
if (Serial.available() > 0) //如果串口数据>0.
{
ch = Serial.read(); //读取串口数据到ch中.
if (ch >= 'a' && ch <= 'l') //如果数据>=字符a,并且<=l,
{
digitalWrite(ledOut[(ch - 'a')], HIGH);//如此时串口输入的为"a",(ch - 'a')=0,程序等同为digitalWrite(ledOut[0],HIGH)
} //ledOut[0]对应第二行程序中的数组,为13脚LED.
else
{
if (ch >= 'A' && ch <= 'L')
{
digitalWrite(ledOut[(ch - 'A')], LOW);//如此时串口输入的为"B",(ch - 'B')=1,程序等同为digitalWrite(ledOut[1],LOW)
}//ledOut[1]对应第二行程序中的数组,为12脚LED.
}//每次从串口输入"a,b,c,d,e,f,g,h,i,j,k,l"中的一个字符时,对应从13到2脚的LED灯点亮.
}//每次从串口输入"A,B,C,D,E,F,G,H,I,J,K,L"中的一个字符时,对应从13到2脚的LED灯熄灭.
} [/code]
先在电脑上串口助手调试程序成功,再将板子接入外接电源并插入蓝牙模块(模块已经设置过).
上全图
手机上安装有 "蓝牙串口助手 v1.97.apk",
打开软件,选择模块
图:
选择"实时模式"
图:
输入小写字母打开灯,输入大写字母关闭灯.
每次都要输入字母是不是太麻烦了,OK,选择键盘模式吧.
图:
在键盘模式下的9个按键是可以自己定义的,名字和功能(输出命令).
问题来了,9个键盘输入24个控制字符,怎么看都实现不了啊!
不要在意这些细节!先点亮4灯再说.
键盘设置如下:
键盘: 1 2 3
功能: 1灯开 2灯开 3灯开
命令: a b c
键盘: 4 5 6
功能: 1灯关 2灯关 3灯关
命令: A B C
键盘: 7 8 9
功能: 4灯开 4灯关
命令: d D
现在可以方便的按下按钮就能控制灯的开关了,只是能控制灯少了点...
玩过一会后,感觉只是开开关关的也没兴趣了,嗯-玩下亮度调节吧.\
一般来说亮度调节要有调亮和调暗两个功能,事实上以下程序也有这两个功能.
之前的程序只能控制4个灯,那这次能不能有所突破呢?
先上程序
[pre lang="arduino" line="1" file="pwm_led"]int ledCount = 6; //LED的总数量.
int ledOut[] = { 11, 10, 9, 6, 5, 3};//6个PWM输出,LED从11脚开始到3脚.
int b1; //1灯亮度.
int b2; //2灯亮度.
int b3; //3灯亮度.
int b4; //4灯亮度.
int b5; //5灯亮度.
int b6; //6灯亮度.
byte brigh [] = { b1, b2, b3, b4, b5, b6}; //将6个亮度合成一个数组,方便调用.
int i = 0 ; //设定一个变量.
void setup() {
Serial.begin(115200); //设置串口波特率,使用蓝牙模块时,注意收发引脚交叉(T-R,R-T).
}
void loop() {
char ch;
if (Serial.available() > 0) //如果串口数据>0.
{
ch = Serial.read(); //读取串口数据到ch中.
switch (ch ) {
case '1': //根据发送的字符'1'-'6',赋值i '0'-'5'.
i = 0;
break;
case '2':
i = 1;
break;
case '3':
i = 2;
break;
case '4':
i = 3;
break;
case '5':
i = 4;
break;
case '6':
i = 5;
break;
}
}
if (ch = 'z' || ch = "Z")
{
if (i >= 0 && i <= 6)
{
if (ch == 'z' && brigh < 248) //小写字母'z'用于增加亮度,每次加8
{
brigh = brigh + 8;
}
if (ch == 'Z' && brigh > 0 ) //大写字母'Z'用于减小亮度,每次减8
{
brigh = brigh - 8;
}
}
analogWrite(ledOut, brigh ); //
}
}[/code]
这回用了两个按钮当作调节键,其它的6个键用于选择,为什么只有6个而不是12个了?Uno板只有6个PWM输出好吧.
键盘设置如下:
键盘: 1 2 3
功能: 1灯 2灯 3灯
命令: 1 2 3
键盘: 4 5 6
功能: 4灯 5灯 6灯
命令: 4 5 6
键盘: 7 8 9
功能: 渐亮 渐暗 全亮
命令: z Z zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
使用时,先按下1-6的,选择其中的一个灯,再按"渐亮"或者"渐暗"调节其亮度.
实验结果发现,前面亮度调节时效果明显,到后面就看不到变化了.
因为每次加,减只有8,所以从0-248要按动31下,有点受不了.所以有了9号键盘的设置,按下时直接写入31个"z".不想按31下才熄灭灯的话再去掉一个灯吧,把省下的键盘设置成全灭,直接写入31个"Z".
相对于键盘模式下能方便控制单个灯,在实时模式下,控制多个灯就显的方便了,
输入"1z2zz3zzz4zzzz5zzzzz6zzzzzz"可直接控制6个灯以不同的亮度显示.
|