极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32668|回复: 8

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

[复制链接]
发表于 2014-3-21 18:33:48 | 显示全部楼层 |阅读模式
本帖最后由 小张 于 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个灯以不同的亮度显示.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 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')
回复 支持 反对

使用道具 举报

发表于 2014-6-5 21:31:14 | 显示全部楼层
楼主不错,mark一下
回复 支持 反对

使用道具 举报

发表于 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!");
  }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 02:27 , Processed in 0.056444 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表