透传点灯实验

来自Microduino Wikipedia
跳转至: 导航搜索

目的

本教程使用Microduino-Zigbee透传来控制LED灯的亮灭,实现无线控制。

设备

  • Microduino模块
模块 数量 功能
Microduino-Zigbee/zh 2 无线通讯
Microduino-Core+/zh 2 核心
Microduino-Core/zh 2 核心
Microduino-USBTTL/zh 2 下载程序
Microduino-Cube-S1/zh 2 扩展
  • 其他硬件设备
相关硬件 数量 功能
LED灯 2个 指示
面包板跳线 1盒 电气连接线。

路由器控制协调器上的led灯

  • 我们采用Microduino-Cube-S1/zh上的模拟按键来控制协调器上led灯的亮灭。
  • 协调器端搭建

将Microduino-USBTTL、Microduino-Zigbee与Microduino-Core(或Microduino-Core+)三个模块直接叠加,在D6上叠加一个led灯(长接D6,短接GND)。

  • 路由节点搭建

将Microduino-USBTTL、Microduino-Zigbee、Microduino-Core(或Microduino-Core+)和Microduino-Cube-S1四个模块直接叠加。

程序

采用Core做核心

  • 协调器端:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX

#define led_pin 6

String myStringSerial1="";
String myString="";

void setup()  
{
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(led_pin,OUTPUT);
}

void loop() // run over and over
{
  while (mySerial.available() > 0)  
  {
    myStringSerial1 += char(mySerial.read());
    delay(2);
  }

  if (myStringSerial1.length() > 0)
  {   
    for(int i=10;i<myStringSerial1.length()-2;i++) 
      myString+=myStringSerial1[i];
    Serial.println(myString);
  }

  if(myString=="led_on")
    digitalWrite(led_pin,HIGH);
  else if(myString=="led_off")
    digitalWrite(led_pin,LOW);

  myStringSerial1="";
  myString="";
  delay(100);
}
  • 路由节点端
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX

boolean led_power;

String led_switch_0="led_off";
String led_switch_1="led_on";

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop() {

  int sensorValue = analogRead(A6);
  Serial.println(sensorValue);
  if(sensorValue<300)
  {
    delay(300);
    led_power=!led_power;
    if(led_power==true)
      mySerial.print(led_switch_0);
    else
      mySerial.print(led_switch_1);
  }
}
  • 程序说明

路由器给协调器发送数据,协调器接收到: +ZBD=XXXX, Data,XXXX为你的路由器的为短地址。其实对我们有用的数据就是Data,因此我们只要或取出Data就行了,再根据Data进行判断。

  if (myStringSerial1.length() > 0)
  {   
    for(int i=10;i<myStringSerial1.length()-2;i++) 
      myString+=myStringSerial1[i];
    Serial.println(myString);
  }

采用Core+做核心

  • 协调器端:
#define led_pin 6

String myStringSerial1="";
String myString="";

void setup()  
{
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(led_pin,OUTPUT);
}

void loop() // run over and over
{
  while (Serial1.available() > 0)  
  {
    myStringSerial1 += char(Serial1.read());
    delay(2);
  }

  if (myStringSerial1.length() > 0)
  {   
    for(int i=10;i<myStringSerial1.length()-2;i++) 
      myString+=myStringSerial1[i];
    Serial.println(myString);
  }

  if(myString=="led_on")
    digitalWrite(led_pin,HIGH);
  else if(myString=="led_off")
    digitalWrite(led_pin,LOW);

  myStringSerial1="";
  myString="";
  delay(100);
}
  • 路由节点端
boolean led_power;

String led_switch_0="led_off";
String led_switch_1="led_on";

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {

  int sensorValue = analogRead(A6);
  Serial.println(sensorValue);
  if(sensorValue<300)
  {
    delay(300);
    led_power=!led_power;
    if(led_power==true)
      Serial1.print(led_switch_0);
    else
      Serial1.print(led_switch_1);
  }
}

调试

  • 分别打开两个IDE开发环境,将程序复制到编辑框,选择好板卡和COM端口,将程序分别下载到核心。
  • 先复位协调器,再复位路由,这样就能建立连接了。
    • 当Zigbee的RST接到Core的RST,就可以通过Core或其他扩展板的复位按键进行复位
Microduino-Zigbee Front
  • 每按下路由器上Microduino-Cube-S1的按键一次,可以看到协调器上的led亮灭翻转一次。

协调器控制路由器上的led灯

硬件搭建和上文是一样的,只是要把Microduino-Cube-S1叠加在协调器上,把led放在路由器上。

程序

采用Core做核心

  • 协调器:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX

#define led_pin 6

boolean led_power;

String led_switch_0="led_off";
String led_switch_1="led_on";

String myStringSerial1="";
String MACString="";
String myString="";

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(led_pin,OUTPUT);
  digitalWrite(led_pin,LOW);
}

void loop() {

  int sensorValue = analogRead(A6);
  //Serial.println(sensorValue);

  while (mySerial.available() > 0)  
  {
    myStringSerial1 += char(mySerial.read());
    delay(2);
  }

  if (myStringSerial1.length() > 0&&myStringSerial1[0]=='+'&&myStringSerial1[7]==','&&myStringSerial1[12]==',')
  {   
    for(int i=8;i<13;i++) 
      MACString+=myStringSerial1[i];
    myString="+ZBD="+ MACString;
    Serial.println(myString);
    myStringSerial1="";
    digitalWrite(led_pin,HIGH);
  }

  if(sensorValue<300)
  {
    delay(300);
    led_power=!led_power;
    if(led_power==true)
      mySerial.println(myString+led_switch_1);
    else
      mySerial.println(myString+led_switch_0);
  }
}
  • 路由器:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX

#define led_pin 6

String myStringSerial1="";
String myString="";

void setup()  
{
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(led_pin,OUTPUT);
}

void loop() // run over and over
{
  while (mySerial.available() > 0)  
  {
    myStringSerial1 += char(mySerial.read());
    delay(2);
  }

  if (myStringSerial1.length() > 0)
  {   
    for(int i=10;i<myStringSerial1.length()-2;i++) 
      myString+=myStringSerial1[i];
    Serial.println(myString);
  }

  if(myString=="led_on")
    digitalWrite(led_pin,HIGH);
  else if(myString=="led_off")
    digitalWrite(led_pin,LOW);

  myStringSerial1="";
  myString="";
  delay(100);
}
  • 程序说明

协调器给路由器发送数据格式为:+ZBD=XXXX,YYYY,XXXX为你的路由器的短地址,YYYY为你想发送的数据,这样路由器才能接收。因此必须先获取到路由器的短地址,获取方式:

  • 先复位你的协调器,再复位你的路由,这样两个能够连接,路由器自动发送包含自己IEEE地址和短地址的报告数据包到协调器,这时只要把短地址读取然后提取出来就行了。
  • 程序
  while (mySerial.available() > 0)  
  {
    myStringSerial1 += char(mySerial.read());
    delay(2);
  }

  if (myStringSerial1.length() > 0&&myStringSerial1[0]=='+'&&myStringSerial1[7]==','&&myStringSerial1[12]==',')
  {   
    for(int i=8;i<13;i++) 
      MACString+=myStringSerial1[i];
    myString="+ZBD="+ MACString;
    Serial.println(myString);
    myStringSerial1="";
    digitalWrite(led_pin,HIGH);
  }
  • 你可以在协调器的D6引脚上叠加一个led灯,先复位协调器,再复位路由,这样就能建立连接了。当协调器获取到路由的短地址时该led灯能够亮。这时你就可以通过协调器控制路由器了。

采用Core+做核心程序这里就不提供,你可以参考上文,把mySerial.read()改成Serial1.read()就行了,因为用Core做核心用到的是软串口,用Core+做核心用到的是串口1(Serial1)。