透传点灯实验
853387039@qq.com(讨论 | 贡献)2014年11月18日 (二) 04:33的版本
目录目的本教程使用Microduino-Zigbee透传来控制LED灯的亮灭,实现无线控制。 设备
路由器控制协调器上的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);
}
}
调试
协调器控制路由器上的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为你想发送的数据,这样路由器才能接收。因此必须先获取到路由器的短地址,获取方式:
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);
}
采用Core+做核心程序这里就不提供,你可以参考上文,把mySerial.read()改成Serial1.read()就行了,因为用Core做核心用到的是软串口,用Core+做核心用到的是串口1(Serial1)。 |