Android手机HC |
您所在的位置:网站首页 › 蓝牙hc05是什么 › Android手机HC |
如果您觉得本文对您有用,希望您点赞,收藏并且把它分享出去,不明白的可以在评论区留言,我会一一解答,感谢您的支持!! 目标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 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 #else #include #endif #define DHT11LIB_VERSION "0.4.1" #define DHTLIB_OK 0 #define DHTLIB_ERROR_CHECKSUM -1 #define DHTLIB_ERROR_TIMEOUT -2 class dht11 { public: int read(int pin); int humidity; int temperature; }; #endif这里面太深我也看不懂,里面还包含了,文件,所以你的arduino编辑器也得加载这些库文件吧,不然的话无法运行 除此之外还有一个文件,也要放到工程目录下,不然的话无法运行 dht11.cpp源码 #include "dht11.h" int dht11::read(int pin) { // BUFFER TO RECEIVE uint8_t bits[5]; uint8_t cnt = 7; uint8_t idx = 0; // EMPTY BUFFER for (int i=0; i 5 BYTES or TIMEOUT for (int i=0; i cnt = 7; // restart at MSB idx++; // 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 //引用库文件,这个文件应该是用于软件串口输出的 #include 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前端设计
连接蓝牙的方法 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |