小张 发表于 2014-3-21 18:33:48

手机蓝牙控制Uno板上的多个LED灯

本帖最后由 小张 于 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灯熄灭.
程序
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,HIGH)
    } //ledOut对应第二行程序中的数组,为13脚LED.
    else
    {
      if (ch >= 'A' && ch <= 'L')
      {
      digitalWrite(ledOut[(ch - 'A')], LOW);//如此时串口输入的为"B",(ch - 'B')=1,程序等同为digitalWrite(ledOut,LOW)
      }//ledOut对应第二行程序中的数组,为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灯熄灭.
}
先在电脑上串口助手调试程序成功,再将板子接入外接电源并插入蓝牙模块(模块已经设置过).
上全图

手机上安装有 "蓝牙串口助手 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个灯,那这次能不能有所突破呢?
先上程序
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 );   //
}
}


这回用了两个按钮当作调节键,其它的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个灯以不同的亮度显示.

504835618 发表于 2014-5-12 20:39:02

最后那个程序编译出错
sketch_may12a.ino: In function 'void loop()':
sketch_may12a:40: error: lvalue required as left operand of assignment

小张 发表于 2014-6-4 20:25:13

40行改为if (ch == 'z' || ch == 'Z')

wadechen 发表于 2014-6-5 21:31:14

楼主不错,mark一下

loganyi 发表于 2014-7-27 22:42:17

楼主,文中说蓝牙模块设置过,请问是怎样设置的啊??

雨轩 发表于 2014-10-22 19:38:24

蓝牙模块怎么设置咧?

雨轩 发表于 2014-10-23 21:46:38

为什么我按你设置的LED一个都不亮?我用万用表一个一个的量IO口,没有一个有电压输出的。我的hc-05是直接烧下面这个文件:#define AT 2
#define LED 13
void setup()
{
       pinMode(LED,OUTPUT);
       pinMode(AT,OUTPUT);
       digitalWrite(AT,HIGH);
       Serial.begin(38400);//这里应该和你的模块通信波特率一致
       delay(100);
       Serial.println("AT");
       delay(100);
       Serial.println("AT+NAME=OPENJUMPER-Bluetooth");//命名模块名
       delay(100);
       Serial.println("AT+ROLE=0");//设置主从模式:0从机,1主机
       delay(100);
       Serial.println("AT+PSWD=1234");//设置配对密码,如1234
       delay(100);
       Serial.println("AT+UART=9600,0,0");//设置波特率9600,停止位1,校验位无
       delay(100);
       Serial.println("AT+RMAAD");//清空配对列表
}
void loop()
{
       digitalWrite(LED, HIGH);
       delay(500);
       digitalWrite(LED, LOW);
       delay(500);
}

雨轩 发表于 2014-10-23 21:47:45

烧完上面那个文件后我就把你的文件烧进去了,用手机连接成功,但是就是没有输出,为什么啊

雨轩 发表于 2014-10-23 23:12:00

上传成功,但是底下提示这个:avrdude: stk500_getsync(): not in sync: resp=0x00
我用人家老外的代码就可以控制:char val;
int ledpin=13;
void setup()
{
Serial.begin(9600);
pinMode(ledpin,OUTPUT);
}

void loop()
{
val=Serial.read();
if(val=='q')
{
    digitalWrite(ledpin,HIGH);
    Serial.println("LED ON!");
}else if(val=='w'){
digitalWrite(ledpin,LOW);
Serial.println("LED OFF!");
}
}
页: [1]
查看完整版本: 手机蓝牙控制Uno板上的多个LED灯