zoukankan      html  css  js  c++  java
  • 手机与Arduino蓝牙串口通讯实验及完整例程

    http://www.arduino.cn/thread-16311-1-1.html 转载来源,原作者谢谢你!

    能够干自己喜欢的工作,学习自己喜欢的知识,读自己喜欢读的书,这就是目前我能够追求的幸福!

    安卓手机与Arduino之间采用蓝牙串口通讯,是很多智能装置和互动装置常用的控制方法,简单而有效,无需网络环境,很实用的技术。

    在论坛搜了一下,帖子很少,问问题的很多。各种教材中炒来炒去,原创的很少,不能给很多愿意学习的人提供帮助。有鉴于此,最近设计了一个实验(包括例程),在这里提供给大家。如果有更简捷可靠的实现方法,欢迎赐教。

    实验采用Arduino UNO板,加了一块1602LCD屏做显示(因为只有一个串口,用来做蓝牙通讯,再用串口助手不方便,也不直观)。蓝牙模块使用十几元一个的HC-06。一个LED接在11脚作为演示。手机端做了一个简单的界面,有按键和滑动条。用按键控制LED点亮和熄灭,演示开关量控制。滑动条控制LED的亮度,演示模拟量控制(0-100范围)。LCD屏实时显示传送的数据。模块接线按标准接法,大家都玩过的,请参考各种教程或书籍。硬件图片如下。

    关于蓝牙串口通讯的几个要点:

    1. Arduino的串口,print()和println()函数都是用ASCII字符的方式传送数据,无论是int、float还是string,都自动转换成ASCII码传送。其中println()函数在传送的数据后面加了回车和换行符(" "和" ")。换行符正好可以作为结束符来让手机端识别。

    2. 蓝牙串口是异步传输方式,每次Serial.read()只读一个字节,在一个loop()循环中可能收不全一条数据信息,必须要有一个全局变量来收集接收到的字符。如果要通讯可靠,使用结束符来确定收到了一条完整的信息,是非常必要的。手机端也是一样。

    3. 例程中用的Serial.parseInt()函数,作用是在收到的字符流中,找到数字字符,并累积在一起,直到收到一个非数字字符时,将前面收到的数字字符转换成一个整数。如果要传送多个数值,中间用逗号等分隔符隔开即可。比如三个数值,”12,325,993“,后面加一个自定义的结束符,作为字符串发给Arduino。(例程中用字符"X”作为结束符。)这样接收数据完整而可靠。接收float可以用Serial.parseFloat()函数,用法一样。

    安卓手机端可以用蓝牙串口助手APP。但是建议自己写一个简单的APP,才真正完整的知道怎么通讯。再说了,如果真的做一个产品或服务,总是要自己做手机端APP的,蓝牙串口助理不能当产品用。

    Arduino完整例程如下。IDE 1.6.3编译通过,运行正常。欢迎大家修改使用,完全开源。例程内有详细注释。

    /* 本例程演示从手机蓝牙串口接收指令,点亮或熄灭11脚的LED,或者调整亮度。
     * 接收指令格式:“101X”点亮,“102X"熄灭,”000X"调整亮度。(000为0-100的整数,表示亮度值,X是结束符。)
     * 串口是异步接收的,用parseInt()查找第一个有效整数,检测到结束符后开始处理。
     * 接收数据显示在1602LCD屏上。
     * 点亮或熄灭LED后,将收到数据回传给手机。用pringln()函数,数据后面加了" "和" "两个字符,可以用作结束符。
     * 串口传送的是ASCII字符,数据格式可以自动转换。
     */
      
    #include <Wire.h>                  // 包含LCD库。
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2);  // 初始化LCD对象,地址为0x27,每行16个字符,共两行。
    int p;                             // 定义整数型全局变量,保存接收的数据。
     
    void setup() {
      lcd.init();                      // 初始化LCD。
      lcd.backlight();                 // 打开LCD背光。
      Serial.begin(9600);              // 打开串口(蓝牙)
      pinMode(11,OUTPUT);              // 定义11脚为输出。(数字或PWM)
    }
     
    void loop() {
      while (Serial.available() > 0) {   // 串口收到字符数大于零。
        p = Serial.parseInt();           // 在串口数据流中查找一个有效整数。
        if (Serial.read() == 'X') {      // 收到结束符后开始处理数据。
          lcd.clear();                   // LCD清屏。
          lcd.print(p);                  // LCD显示收到的数据(整数)。
          switch (p) {                   // 判断数据内容。
          case 101:
            digitalWrite(11,HIGH);       // 点亮LED。
            Serial.println(p);           // 回传数据。
            break;
          case 102:
            digitalWrite(11,LOW);        // 熄灭LED。
            Serial.println(p);           // 回传数据。
            break;
          default:
            p = map(p,0,100,0,255);      // 转换数据范围到PWM输出值。
            analogWrite(11,p);           // 调整LED亮度。(PWM)
          }
        }
      }
    }

     ========================================================================

    https://jingyan.baidu.com/article/d45ad148b252a969552b80db.html  这个看着比较靠谱

  • 相关阅读:
    ios-pch文件的手动添加
    iOS远程消息推送自我整理版
    iOS远程消息推送
    苹果App store 2015最新审核标准公布(2015.3)
    App上线基本流程
    iOS中常用的正则表达式
    如何获取App当前版本号
    添加Appicon的方法
    键盘弹出
    iOS9适配中出现的一些常见问题
  • 原文地址:https://www.cnblogs.com/qingdou/p/8195633.html
Copyright © 2011-2022 走看看