1.入门级应用–手机连接蓝牙控制
本次将使用3个jdy-24m互相组网控制,三个蓝牙地址0077,0088,0099。
实现:连接三个蓝牙中任意一个,发送指令控制对应的arduino的灯珠上的亮度。



arduino代码
int serialData=0; //串口数据变量
byte variable[80];//数组
byte index = 0;//数据位
int a=0;//亮度初始为0
void setup() {
Serial.begin(9600);
pinMode(9,OUTPUT);//9号引脚接灯正极,避免灯珠烧坏,随便串上一个电阻
}
void loop() {
while( Serial.available()>0 )//当串口有收到数据
{ //当串口有数据时
byte serialData = Serial.read();// 由于Serial.read()每次只读取一个字节,而一个字节八位,每次读取两个16进制位(例0x16是一个字节,可以看成0001 0110 八位),这也是为什么数据位数要偶数才行,然后赋给serialData
variable[index++] = serialData;//index每次+1,variable[0]为读取到的第一个字节,variable[1]为读取到的第二个字节…
//这一段是让数据位不错乱的,下边我写了接收数据长度10,如果数据长度不小心发了9,数据位index没有变为0,就会一直叠加下去。然后这里是有一个矫正的作用。
byte forward[]={0xF1};
xunhuan:
if ((variable[0] != forward[0]) && index >= 1 ){
for(int i=0; i < index; i++)
{
variable[i] = variable[i+1];
}
index–;
goto xunhuan;
}
//当数据位为10位时候,就执行。
if (index==10)
{//把接收到一串字节,整齐并在一行
for (int i=0;i<10;i++)
{Serial.print(variable[i], HEX);
delay(10);}
Serial.println("");
//把接收到一串字节,每个字节单独拿出来
for (int i=0;i<10;i++)
{ Serial.println(variable[i], HEX);
}
//上面这两个for循环其实也可以不用,只不过在实践的时候还是显示出来比较好,可以好判断有没有收到,然后数据规律是什么。

if (variable[8]>=0x00 && variable[8] <= 0xff) //读取这段数据的第9位,0xFF转化成10进制就是255,就是最亮的,0x00就是对应0,亮度为0x00到0xff之间。
{
a=variable[8];//把亮度值赋给a
}
index=0;//数据位清0
}
}
analogWrite(9,a);//执行亮度语句放在while( Serial.available()>0 )外部,采用变量a不断执行灯的亮度电平。
}

2.升级版应用–arduino代替手机发送指令控制
本次将使用3个jdy-24m互相组网控制,三个蓝牙地址0077,0088,0099。
实现:一个作为主控发送指令控制另外两个arduino的灯珠,主控端为一个光照探测装置。当亮度超过800,自身灯珠亮,同时就会发送指令让另外两个arduino的灯珠亮,若小于800,则变暗。



主控发射端代码,另外两个受控端代码跟之前的一样。
#define ADpin A5//A5引脚读取AD值
#define LED 13 //灯珠13号引脚
int ADBuffer = 0;//亮度AD值初始化为0
void setup()
{
lcd.begin(16,2); //初始化LCD1602显示屏
lcd.print(“Welcome to use!”); //液晶显示Welcome to use!
delay(1000); //延时1000ms
lcd.clear(); //液晶清屏
pinMode(LED,OUTPUT);
Serial.begin(9600); //波特率9600

}
void loop()
{
ADBuffer = analogRead(ADpin); //读取亮度AD值
delay(100);
lcd.setCursor(0,0); //设置液晶开始显示的指针位置
lcd.print(“Brightness =”); //液晶显示“Brightness =”
lcd.setCursor(0,1); //设置液晶开始显示的指针位置
lcd.print(ADBuffer);
if (ADBuffer>800)//大于八百就亮
{analogWrite(LED,255);//自身灯珠亮
delay(100);
Serial.write(c,15);//发送C数组指令,让另外两灯亮
}
else{
analogWrite(LED,0);//自身灯珠灭
delay(100);
Serial.write(b,15);//发送b数组指令,让另外两灯灭
}
}
LCD显示屏接线图

光敏电阻接线图

3.终极应用–获取反馈数据


如图,常量反馈,发送F101000088110000 程序里写了获取variable[7]]这一位,这里是11,那边就反馈回来一段数据,然后读取第九位就是55。
变量反馈,发送F1010000882210000 程序里写了获取variable[7]]这一位,这里是22,那边就反馈回来变量数组的一段数据,然后读取第九位是光照亮度。
详情看代码。

0099蓝牙端的代码


亮度探测端代码
0099蓝牙对应的

int serialData=0; //串口数据变量
byte variable[80];//数组
byte index = 0;//数据位
void setup() {
Serial.begin(9600);//波特率9600
}
void loop() {
while( Serial.available()>0 ){ //当串口有数据时
byte serialData = Serial.read();//Serial.read()每次只读取一个字节,然后赋给serialData
variable[index++] = serialData;//serialData依次赋给variable[0],variable[1] ,variable[2]…
//这部分是数据位矫正的代码,防止发送数据长度不够,没有把index清0(保证数据长度正确的话,这个可以不加)
byte forward[]={0xF1};
xunhuan:
if ((variable[0] != forward[0]) && index >= 1 ){
for(int i=0; i < index; i++)
{
variable[i] = variable[i+1];
}
index–;
goto xunhuan;
}
//数据长度为10时候(ps:地址后面数据第一位就是variable[7],)
if (index==10)
{/这里是显示全部接受数据的,可以不用管先。
for (int i=0;i<10;i++)
{Serial.print(variable[i], HEX);
delay(10);}
Serial.println("");
for (int i=0;i<10;i++)
{ Serial.println(variable[i], HEX);
}
/
delay(100);

Serial.println(variable[9], HEX);//读取variable[9],即是数据长度为10的最后一位。
index=0;//数据位清0
}

}

}

0088对应的光照探测代码:
unsigned char c[15]={0x41,0x54,0x2B,0x4D,0x45,0x53,0x48,0x00,0x00,0x99,
0x99,0x99,0x55,0x0d,0x0a};//c为没有变量的数组,发送给的地址是0099
byte variable[80];
byte index = 0;
#define ADpin A5
int ADBuffer = 0;
void setup()
{
Serial.begin(9600); //波特率9600
}
void loop()
{ ADBuffer = analogRead(ADpin); //读取AD值
int B=ADBuffer/10;
unsigned char b[15]={0x41,0x54,0x2B,0x4D,0x45,0x53,0x48,0x00,0x00,0x99,
0x99,0x99,B,0x0d,0x0a};//b为带有变量的数据,发送给的地址是0099
while( Serial.available()>0 ){
byte serialData = Serial.read();//如果串口缓存有数
variable[index++] = serialData;
byte forward[]={0xF1};
xunhuan:
if ((variable[0] != forward[0]) && index >= 1 ){
for(int i=0; i < index; i++)
{
variable[i] = variable[i+1];
}
index–;
goto xunhuan;
}
delay(500);
//数据长度为10时候(ps:发送的数据地址后面数据第一位就是variable[7],)
if (index==10){
if( variable[7]==0x11)//读取variable[7]位的数据,如果是11,就发送c数组
{
delay(100);
Serial.write(c,15);
}
if( variable[7]==0x22)//读取variable[7]位的数据,如果是11,就发送b数组
{
delay(100);
Serial.write(b,15);
}
index=0;//数据位清0
}
}
}

总结:
根据前面初步探索已经知道发送数据,arduino以16进制发送
41542b4d45534800+目标蓝牙地址+数据+0d0a。
手机app的则是 选择第三特征0ffe3,16进制发送
F10100+四位地址+数据

应用的时候:采用Serial.read()读取收到的数据,Serial.read()每次只读取一个字节,然后赋给serialData,再由variable[index++] = serialData;serialData依次赋给variable[0],variable[1] ,variable[2],…
注意无论是以手机还是arduino发送指令,只需记住variable[7]都是蓝牙地址后面的第一位数据。然后程序里写的if (index=10)是指定发送数据长度是10(长度也可以超过10,但是只读10位),若发送长度是9位长度,则没有相应。例子 从0099兰蓝牙发F10100 0088 1100给0088,,0088是收到了这些信息,但不符合arduino里面写的长度10,故而要发F10100 0088 110000,这里11就是variable[7],也就是第8位,然后后面00 00 就是第9,10位,符合arduino写的程序。

总结
“arduino 读取HEX数据”–应用在手机连接蓝牙控制
“arduino向jdy蓝牙发送16进制指令”–应用在arduino代替手机向蓝牙发送,也可应用收取反馈数据
这两个是最基础的,如果觉得程序杂乱,可以参考这两个。
arduino 读取HEX数据代码:
byte variable[80];
byte index = 0;
void setup()
{
Serial.begin(9600); //波特率9600
}
void loop()
{ while( Serial.available()>0 ){
byte serialData = Serial.read();//如果串口缓存有数
variable[index++] = serialData;
if (index==10){//数据长度为10
for (int i=0;i<10;i++)
{Serial.print(variable[i], HEX);//10个数据并在一起
delay(10);}
Serial.println("");
for (int i=0;i<10;i++)
{ Serial.println(variable[i], HEX);//10个数据分开一行行显示
}
}
}
arduino向jdy蓝牙发送16进制指令
unsigned char a[16]={0x41,0x54,0x2B,0x4D,0x45,0x53,0x48,0x00,0xFF,0xFF,
0x19,0xFF,0x22,0x33,0x0d,0x0a
};
void setup()
{
Serial.begin(9600);
Serial.write(a,16);
}
void loop() {

}
//按下 复位键,发送一次0x41,0x54,0x2B,0x4D,0x45,0x53,0x48,0x00,0xFF,0xFF,
0x19,0xFF,0x22,0x33,0x0d,0x0a

JDY-24M蓝牙应用探索相关推荐

  1. CSR1010蓝牙开发探索(一)

    花了多少时间我已经不想提起,但是至少还是有点成果的,分析了不少代码,也看了不少资料,发现比较接地气的东西还是比较少,不多花点时间积累,说实话很辛苦. 现在还没有足够的水平上升到蓝牙协议的层次,饭要一口 ...

  2. arduino nano 蓝牙_探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架...

    介绍 Nano 是什么? 轻量级,方便,高性能 golang 的游戏服务器框架. nano 是一个轻量级的服务器框架,它最适合的应用领域是网页游戏.社交游戏.移动游戏的服务端.当然还不仅仅是游戏,用  ...

  3. 基于stm32蓝牙智能小车设计

    前言: 本文描述了一个由STM32微处理器.步进电机.蓝牙,L298N等模块构成的.该系统采用STM32微处理器为核心,在MDK环境下进行编程,通知控制L298N模块IN1~IN4引脚的高低电平进而控 ...

  4. 51单片机蓝牙模块(HC05)运行原理

    51单片机蓝牙模块(HC05)及其运行原理 目录 51单片机蓝牙模块(HC05)及其运行原理 一.测试蓝牙模块 二.配置蓝牙模块 三.烧写程序 四.测试 参考博文 一.测试蓝牙模块 在所有工作进行之前 ...

  5. 偷偷修复漏洞 苹果要求研究员噤声

    1.偷偷修复漏洞 苹果要求研究员噤声 此前公布苹果0day漏洞PoC的研究员,如今伤口又被撒盐:前两天更新的iOS 15.0.2又"偷偷"修复了他之前提交的漏洞,而且和往常一样没有 ...

  6. 实战项目(1)beacon信标

    1 前提 1.1介绍 2014年,许多组织开始着力开发蓝牙beacon试点项目,到2015年,已经有许多公司开始尝试利用部署好的蓝牙beacon探索新的服务模式.据市场研究机构(ABI Researc ...

  7. 【Android探索】基于Android Studio平台的蓝牙遥控APP

    前言:好久没更新这博客了,接下来有时间记录下前阵子做的东西,当作是复习之余的回顾往事和时间消遣,哈哈.首先是这个蓝牙遥控APP,这个APP是之前做一个小比赛的时候尝试做来玩玩的,主要内容是使用这个AP ...

  8. IOS 自动化探索——使用蓝牙实现 XCUITest 的 Tap 操作

    原文由 自然生长 发表于TesterHome社区,点击 原文链接 可与作者直接交流. 一.前言 远程使用 WeTest 和 Testin 的 ios 设备时,总会觉得操作不流畅,因为它在松开鼠标时, ...

  9. 24M逻辑分析仪采集esp32蓝牙i2s数据audacity播放

    1. 接好引脚,采集波形 2. 设置协议,开始分析 这里选 更好些,esp32硬件时序图是上升沿采样. 3.导出协议分析后的数据 4.生成的txt文件这个样 value列就是数据,用python或者c ...

  10. 【iOS官方文档翻译】iOS蓝牙的基本概念

    之前写了[iOS官方文档翻译]iOS的蓝牙连接.数据接收及发送一文,介绍了怎样进行蓝牙通讯,但是很多基本概念没有进行解释,看起来可能有点吃力,所以现在再翻译一篇苹果对官方蓝牙4.0一些基本概念介绍的文 ...

最新文章

  1. 设计模式读书笔记-单件模式
  2. java塞班手机最大闪存rom_揭秘:为什么手机ROM最大只有256GB?
  3. 饶毅:脑、物理、化学、 生物、心理认知的交叉研究
  4. 通过举例谈谈阻塞赋值与非阻塞赋值的区别
  5. arm云教室服务器_成都凌点科技告诉你ARM集群服务器适合的应用场景有哪些
  6. CSS学习之盒子模型
  7. idea下快速创建SpringBoot项目
  8. html里面超链接alt_前端html--超链接,表格,表单属性
  9. 数组的最后一位的下一位为什么是0?
  10. React开发(249):react项目理解 ant design input loading
  11. 模拟退火与遗传与蚁群算法
  12. 驯龙大师稳了!iQOO Neo6游戏实测:两款手游均接近满帧
  13. Ubuntu14.04安装及配置mysql5.7.19
  14. 论文推荐到计算机科学期刊,计算机类论文参考文献推荐 计算机类核心期刊参考文献哪里找...
  15. 在Android手机上对https请求进行抓包
  16. 用python分析股票收益影响因素的方法_用Python分析股票的收益和风险
  17. 伽罗华有限域_伽罗华域性质简析
  18. 加ing形式的单词有哪些_初中英语中哪些单词后接动词要加ing形式
  19. 《Adobe Illustrator CC经典教程》—第0课0.15节使用画笔
  20. 基本数据结构--字典和常用内置序列函数

热门文章

  1. prompt弹出输入框中文php,Prompt输入框
  2. 在android studio开发中,关于绘制GifView异常,硬件加速问题的解决办法
  3. SSM框架使用拦截器和过滤器实现登录的拦截
  4. 图像处理——Haar特征
  5. 安卓投屏大师_【投屏】全平台全设备无线投屏工具幕享
  6. 超详细的AI深度学习“花书”笔记(附中英文电子书资料)
  7. 操作系统【时间片轮转调度算法 课本例题】
  8. Java爬虫爬取京东商城
  9. Mac PyCharm下numpy安装
  10. HTML 基础源代码