如果您觉得本文对您有用,希望您点赞,收藏并且把它分享出去,不明白的可以在评论区留言,我会一一解答,感谢您的支持!!

目标

Android手机HC-05蓝牙连接Arduino nano获取DHT-11温湿度传感器数据

我以为的串口输出等于蓝牙输出,其实并不是

起初我所理解的,应该是这样连接
HC-05 nano
 TX----RX
 RX----TX
 5V----5V
GND----GND

HC-05蓝牙3.3V即可,5V蓝牙可以自适应不会烧掉

DHT-11 nano
 Out----D2
 5V----5V
GND----GND

DHT-11温湿度传感器5V没问题,3.3V也能用

我认为温湿度传感器输出到了串口,那么就等于输出到了蓝牙。
通电以后:DHT-11输出到蓝牙,安卓手机app接收蓝牙传过来的数据以文本显示在前端变量上

结果测试了很多次以后,发现输出是乱码。

于是我就怀疑起蓝牙到底发过来的是什么,蓝牙到底是怎样传输,我所认为的对不对。后来我发现蓝牙输出并不一定要用串口输出,所以就改变了接线。
HC-05 nano
 TX----D6
 RX----D5
 5V----5V
GND----GND

这时,nano即使USB串口连着电脑也可以正常烧录代码,不用拔插蓝牙的RX,TX了(主要是当蓝牙RX,TX连接了nano的TX,RX时,占用串口无法烧录,nano烧录的时候是使用这两个端口进行数据传输的)

单说nano DHT-11串口输出

#include <dht11.h> //引用dht11.h文件,头文件必须要有,如果没有后面输出会报错,必须放到工程文件夹下。
dht11 DHT11;    //实例化,我虽然不明白啥叫实例化,但这一句可能就是把dht11实例化给一个常量进行声明,以方便后面的参数调用吧。
#define DHT11PIN 2  //定义dht11输出引脚给一个变量,变量名可以修改,这里结尾没有";",不需要加分号
void setup() {Serial.begin(38400);  //串口对频
}
void loop() {char chk = DHT11.read(DHT11PIN);      //读取温度传感器发出来的值Serial.println(DHT11.temperature);    //单行串口输出温度值Serial.println(DHT11.humidity);      //单行串口输出湿度值delay(1000);     //间隔1秒输出一次
}

那么我在想串口是啥呢?串口其实就是Serial,串口输出就是Serial.print
如果是蓝牙输出那就是Bluetooth.print,要是屏幕输出那就是LCD.print,扬声器输出那就是Sound.print,其实这个前缀(Serial,Bluetooth,LCD,Sound当然也可以改名,只要你知道就行)这些变量,应该就是在dht11.h里面定义的,不然的话没办法输出。

dht11.h源码

#ifndef dht11_h
#define dht11_h
#if defined(ARDUINO) && (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif#define DHT11LIB_VERSION "0.4.1"#define DHTLIB_OK           0
#define DHTLIB_ERROR_CHECKSUM   -1
#define DHTLIB_ERROR_TIMEOUT    -2class dht11
{public:int read(int pin);int humidity;int temperature;
};
#endif

这里面太深我也看不懂,里面还包含了<Arduino.h>,<WProgram.h>文件,所以你的arduino编辑器也得加载这些库文件吧,不然的话无法运行
除此之外还有一个文件,也要放到工程目录下,不然的话无法运行

dht11.cpp源码

#include "dht11.h"
int dht11::read(int pin)
{// BUFFER TO RECEIVEuint8_t bits[5];uint8_t cnt = 7;uint8_t idx = 0;// EMPTY BUFFERfor (int i=0; i< 5; i++) bits[i] = 0;// REQUEST SAMPLEpinMode(pin, OUTPUT);digitalWrite(pin, LOW);delay(18);digitalWrite(pin, HIGH);delayMicroseconds(40);pinMode(pin, INPUT);// ACKNOWLEDGE or TIMEOUTunsigned int loopCnt = 10000;while(digitalRead(pin) == LOW)if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;loopCnt = 10000;while(digitalRead(pin) == HIGH)if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;// READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUTfor (int i=0; i<40; i++){loopCnt = 10000;while(digitalRead(pin) == LOW)if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;unsigned long t = micros();loopCnt = 10000;while(digitalRead(pin) == HIGH)if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;if ((micros() - t) > 40) bits[idx] |= (1 << cnt);if (cnt == 0)   // next byte?{cnt = 7;    // restart at MSBidx++;      // next byte!}else cnt--;}humidity    = bits[0]; temperature = bits[2]; uint8_t sum = bits[0] + bits[2];  if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;return DHTLIB_OK;
}

我把大部分英文备注都去了,我也看不懂,我觉得是根据电路图
往引脚pin输出低电平,18毫秒后,输出高电平,40微秒后再往pin引脚输入,来获取传感器数值,并且放到一个数组里面,这个数组是bits,前两位是湿度值,后两位是温度值,uint8_t 代表无符号整形,8位=1字节,t是啥意思?typedef。代表他是通过typedef定义的头文件。其他的自己联想吧,不想看C的可以略过

再说nano HC-05蓝牙输出

以前我以为串口输出=蓝牙输出,其实不然,蓝牙可以是蓝牙,串口可以是串口。
之前还发过蓝牙调试,我当时写了其实也没太明白,现在感觉明白点了。

重点:HC-05蓝牙默认频率是38400,所以最好设置成这个,不然的话我感觉输出的内容可能会是乱码

之前输出到安卓手机的时候,始终是一个菱形框里面有个问号,要么就是多个菱形框里面有问号,大家可以手机下载蓝牙串口SPP连接蓝牙进行调试,看看输出的是什么。
当时还输出0x80啥的,我网上查了也查不到是啥,我起初以为是16进制输出需要转换成UTF-8,后来可能是我多想了。

#include <SoftwareSerial.h>        //引用库文件,这个文件应该是用于软件串口输出的
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
//Pin5为RX,接HC05的TX针脚
//Pin6为TX,接HC05的RX针脚
SoftwareSerial BT(6, 5);        //定义蓝牙输入输出引脚
char val;   //定义一个字符变量用于数据传输
void setup() {Serial.begin(38400);      //串口输出,最终目标是温湿度传感器通过蓝牙发送到安卓手机,这两句其实可以不用写Serial.println("Buletooth is ready!");      //可以不写BT.begin(38400);      //定义蓝牙频率,nano连接蓝牙,他就用这个频率输出,无论是nano连蓝牙,还是蓝牙连串口都用这一个频率就对了,就好像nano连串口,输出频率要设置成9600,那么arduino软件串口的频率也要调成38400一样才能正确接收数据不会出现乱码一样。
}void loop() {char chk = DHT11.read(DHT11PIN); //之前已经实例化过了,现在是读取dht11数据BT.print(DHT11.temperature);     //蓝牙输出温度值BT.print("a");BT.print(DHT11.humidity);          //蓝牙输出湿度值BT.println("a");//当串口接收到数据读取串口赋值给val变量,并且蓝牙输出if (Serial.available()) {val = Serial.read();BT.print(val);}//当蓝牙接收到数据读取蓝牙赋值给val变量,并且串口输出if (BT.available()) {val = BT.read();Serial.print(val);}//我觉得上面两个if不用写也可以吧delay(1000);     //延迟1秒
}

以上就是传到nano上的源码了,还有一句没有说明,BT.print("a");就是这个,后面的App Inventor会用到。

蓝牙到底输出了什么,输出的是什么

我现在也没搞懂他到底输出了什么,我只知道他输出了温度值和湿度值,至于这个温度值和湿度值是什么格式我也不知道(后来知道能就是1个字节的8位整形无符号数),应该是int。

App inventor前端设计


样式就不说什么了,"连接蓝牙"是一个列表选择框,点击以后就会弹出蓝牙的列表,选择以后就建立蓝牙和手机的连接。

蓝牙客户端:
这里的蓝牙客户端所指的就是手机
字符编码:
默认设置为UTF-8,当然也可以支持ASCII,或者Unicode啥的,当然还有GBKBig5,其他的我都没测试,有可能是蓝牙发送中文的时候会用得到。这里蓝牙到底发的啥我也不知道,所以就UTF-8吧。
分隔符字节码:
我的理解是,因为蓝牙每间隔1秒发送一次数据给手机,那么他给手机的就是例如:2430,其中24表示温度值,30表示湿度值,但是我显示在前端应该是两个数据,在这1秒钟里,所以我对于蓝牙发送过来的数据进行拆分。如何进行拆分呢?那么就要在数据之间加入分隔符,我下位机加入分隔符的方法就是BT.print("a");加入了a字符,但在这个分隔符字节码选项里面我试了,#号不行,其他符号也不行,英文也不行,只能是0-9,所以我认为,它是按照字节进行分隔的,于是我就填入了1,按照1个字节进行分割,所以在程序中加入了,PS:这个a也可以是其他字母,最好不要是数字,因为会跟温湿度值混淆,避免出错,也就是蓝牙会输出成这样:24 a 30 a,那么到安卓app上面按照字节再进行拆分。
此外还要设置一个计时器,计时器的作用是:让蓝牙发送和蓝牙客户端接收数据能够同步进行,当手机连接到蓝牙以后,计时器启动,手机客户端接收,不然的话有可能会导致数据错位。

这里计时器的计时间隔我也设置成为1秒。

以上是组件设计,以下是逻辑设计

连接蓝牙的方法


当蓝牙选择完成时计时器开始启用

输入列表变量默认为空文本

当到计时器间隔点时,先清空变量,然后接收数据

这个函数表示:如果蓝牙客户端(手机)获取到了数据,那么就将蓝牙接收到的数据以文本的形式进行分割,然后就将分割完成后的第1项设置成为温度的文本,第2项设置成为湿度的文本。经过测试后,成功了。
整体截图

以下是手机app的测试截图

当然,以上测试还在使用串口供电,arduino nano也可以使用2节18650电池供电,单节电池是3.7V,要大于5V就得两节。所以还要重新设计电路。
以下是
高仿小米温湿度传感器样式制作的安卓app截图

如果您觉得本文对您有用,希望您点赞,收藏并且把它分享出去,不明白的可以在评论区留言,我会一一解答,感谢您的支持!!

Android手机HC-05蓝牙连接Arduino nano获取DHT-11温湿度传感器数据相关推荐

  1. android接收arduino字符串,【教程】Android手机通过OTG线连接Arduino,读写串口数据...

    因为自己对电子电路是半桶水,复杂的单片机电路把我难倒了,幸好Arduino的出现,让一切都简化了不少.平时和朋友们就喜欢制作一些Arduino的小玩意儿来帮助生活和工作. 因为朋友单位需要采购一些数据 ...

  2. Android 设备蓝牙连接扫描枪获取扫描内容

    Android 设备蓝牙连接扫描枪获取扫描内容 标签(空格分隔): 未分类 条形扫描枪主要可以扫描条形码和二维码等,扫描速度比手机扫描设备快得多,本文简单介绍android 通过蓝牙监听蓝牙连接,当扫 ...

  3. android 蓝牙链接电脑,如何使从台式电脑到Android设备的测试蓝牙连接

    我正在使用具有蓝牙适配器的Ubuntu 11.10台式电脑和使用带有蓝牙的Android 2.2的Android平板电脑. (两款设备上的蓝牙版本应为2.0或2.1版本)如何使从台式电脑到Androi ...

  4. Android手机发生了SSL连接错误该怎么解决

    Android手机在国内的市场占有率是非常高的,使用的人非常多,经常会有人反应当Android手机在浏览网页时会出现"您的连接不是私密的"."此站点证书不受信任" ...

  5. android手机 GPRS 已断开连接 无法连接

    参考: android手机 GPRS 已断开连接 下一个  海桌冲浪  软件, 安装完毕之后进入联网助手-点击一键设置APN信息之后 即可正常使用了. 这个软件真强大...

  6. 当没有无线路由器的时候怎么让Android手机通过家用宽带连接Internet呢?只要有一台笔记本或者是台式机+无线网卡。具体的做法如下: 首先以管理员身份...

    当没有无线路由器的时候怎么让Android手机通过家用宽带连接Internet呢?只要有一台笔记本或者是台式机+无线网卡.具体的做法如下: 首先以管理员身份在CMD中运行如下命令: netsh wla ...

  7. android蓝牙传文件,安卓手机怎样使用蓝牙连接传输文件

    首先要打开手机的蓝牙功能,平常大家不用蓝牙的时候一般处于关闭状态,需要的时候才开启,这样比较省电不是~~ 步骤一:打开蓝牙 打开蓝牙于两种方法,一种是通过快捷方式,比如桌面的蓝牙开关等以及状态栏的下拉 ...

  8. 使用蓝牙测试app和Web Bluetooth API(web蓝牙)连接arduino蓝牙模块并通信

    原文链接:https://dsx2016.com/?p=1505 公众号:大师兄2016 前言 前面的arduino操作都是建立在usb串口通信上的,然而有线的操作不仅不方便,还受限设备数量,数据传输 ...

  9. android:手机与BLE-CC41-A蓝牙模块通信

    原创地址:http://blog.csdn.net/bigtree_mfc/article/details/53783585 手机蓝牙的开启.搜索就不再多说,和手机之间的蓝牙通信一样. 需要注意的安卓 ...

最新文章

  1. CTFshow php特性 web143
  2. 详解tf.nn.dropout
  3. 这些老外的开源技术养活了很多国产软件
  4. JMeter测试组件
  5. apache ignite_使用Spring Data的Apache Ignite
  6. C++ 读取单个字符
  7. 数学分析中的基本定理
  8. java扫描指定主机的端口socket服务
  9. 请教高手,如何取得Target属性
  10. SQL2005开发版下载地址
  11. FileZilla Server连接服务器失败
  12. 三合一收款二维码原理以及源码
  13. LCP 19. 秋叶收藏集(C++)---动态规划解题
  14. pyTest官方手册(Release 4.2)之蹩脚翻译(6)
  15. 微信公众号页面开发记录
  16. Allegro PCB同时走多跟网络线以及颜色设置
  17. inter cpu 测试软件,Intel官方CPU检测工具
  18. 公司被Autodesk收购, 更名为CADC
  19. 第2节:英语中的形容词,副词,动词,动名词,动词不定式
  20. linux can测试程序,Linux CAN Shell 测试脚本程序

热门文章

  1. 如何快速定位页面(江湖故人就是个铁憨憨)即时相关性?
  2. 回答完数据库连接池原理,面试官跪着求我入职他们公司
  3. 没有计算的推理和基于推理的计算 逻辑与算法之五
  4. 用C语言写一个图书管理系统大作业
  5. SSM洗衣店管理系统
  6. 基本概念:节点、集群、分片及副本
  7. python爬取去哪网数据_用户观点:企查查数据爬取技术与Python 爬取企查查数据...
  8. 数据库迁移 软件Spoon Kettle环境搭配(本人踩过的坑)
  9. RH linux 6.4的虚机里 OpenGL或OSG不能用
  10. 使用R进行pubmed爬虫