esp8266 mesh 组网

一、网状网络,即Mesh Network,有以下特点:

a.所有节点都可与拓扑中所有节点进行连线而形成一个“局域网路”

b.所有节点可以透过多次跳跃进行数据通信

c.即使在拓扑中有节点无法服务或过于忙碌,网络还是可以正常运作

在乐鑫开发的ESP-MESH协议中,mesh网络节点之间可以组成网络并转发数据包,这样不需要每个模块都接入路由器,就可以达到大量节点连接网络的效果,思路如下图:

在mesh网络中,esp8266相当于开启了AP热点,让它下面的小分支去连接,也可以同时连接其他节点,相当于AP+STA模式。

对于mesh中的细节,比如说,两点的连接最大距离、最高支持多少设备、多少级网络等,大家可自行百度。。。。。。。

二、mesh组网demo

既然mesh网络在智能家居中应用广泛,我们写一个demo试一下。

1、自动开灯,比如说家里开门后,客厅灯自动亮起来,无需人手动开灯

这里我们需要两块esp8266,光电开关或者红外感应模块,小灯(led或者rgd、二极管都行),最主要看自己有啥吧

程序如下:

程序一:esp8266+rgb灯部分

#include <painlessMesh.h>
#define   MESH_PREFIX     "xiaoqiu"   //设置mesh信息,名字密码随意,一样就行
#define   MESH_PASSWORD   "bangbangda"
#define   MESH_PORT       5555
#define ledr 5 //我用的是rgb共阳极灯,大家灯不一样的话,点灯部分百度一下或者问我
#define  ledg 4
#define  ledb  2
Scheduler userScheduler;
painlessMesh  mesh;
void receivedCallback( uint32_t from, String &msg ) {//收消息
  String message = msg.c_str();
  Serial.println(message);
  if (message == "hello") {//8266收到另一块发来的消息后,开灯红色,这里我写了5s关灯
    digitalWrite(ledr, 0);
    digitalWrite(ledg, 255);
    digitalWrite(ledb, 255);
    delay(5000);
    digitalWrite(ledr, 255);
    digitalWrite(ledg, 255);
    digitalWrite(ledb, 255);
    delay(300);
    message="";
  }
}
void setup() {
  Serial.begin(115200);
  pinMode(ledr, OUTPUT);//rgb初始化
  pinMode(ledg, OUTPUT);
  pinMode(ledb, OUTPUT);
  digitalWrite(ledr, 255);//此处是关灯
  digitalWrite(ledg, 255);
  digitalWrite(ledb, 255);
  mesh.setDebugMsgTypes( ERROR | STARTUP );
  //只接收不发送
  mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );
  mesh.onReceive(&receivedCallback);
}
void loop() {

  mesh.update();
}

程序二:esp8266+光电开关、红外感应模块(需要自己调一下程序),我用的是光电开关如图:

 这种红外感应模块我也有,就是用起来不太准,换成了光电开关

#include <painlessMesh.h>
#define   MESH_PREFIX     "xiaoqiu"  //设置mesh信息,名字密码随意,一样就行
#define   MESH_PASSWORD   "bangbangda"
#define   MESH_PORT       5555
Scheduler userScheduler;
painlessMesh  mesh;
void sendMessage() ;
Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );
//只发送不接收
void sendMessage() {
  String msg = "hello";//发送消息,不一定是hello,随便一个,两端要写一样呀
  //  msg += mesh.getNodeId();
  mesh.sendBroadcast( msg );
  taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND * 5 ));
}
void setup() {
  Serial.begin(115200);
  pinMode(5, INPUT);
  mesh.setDebugMsgTypes( ERROR | STARTUP );
  mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );
}

void loop() {
  if (digitalRead(5) == LOW) {//如果来人,发一个消息告诉另一块8266,来人了,开灯吧
       delay(2000);//这里我加了延时,太家可以不加试试看,加延时的目的一是稳定光电开关,二是不想人以来立即开灯,吓死了
    userScheduler.addTask( taskSendMessage );
    taskSendMessage.enable();
 
  }
  mesh.update();
  delay(300);
}

把两成程序分别上传,在连接对应传感器及灯。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦哆小魔仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值