实验目的:
了解红外线通信的原理;
了解蓝牙通信的原理;
学会使用
IRremote
类库实现红外遥控信号的发送与接收;
学会使用
Proteus
中的
IRLINK
模块、
HC-06
蓝牙模块
;
学会使用
Proteus
中的虚拟终端、示波器设备帮助调测。
实验任务:
通过
Arduino A
板(
A-SENDER
)控制蓝牙模块(
A-BT
),发送
POWERON/POWEROFF
指令。
通过
Arduino B
板(
B-RECEIVER
)控制蓝牙模块(
B-BT
),接收
POWERON
指令并打开
LED
,接收
POWEROFF
指令并关闭
LED
。
通过
Arduino
A
板(
A-SENDER
)
控制红外
发射
电路(红外
LED
),发送
指令,并将发送日志显示到虚拟终端
VT-SENDER
。
通过
Arduino
B
板(
B-RECEIVER
)
控制红外
接收
电路(红外接收器),
接收信号并解码,将解码后的指令显示到虚拟终端
VT-RECEIVER。
实验前准备:
绘图:
#include <IRremote.h>
#include <SoftwareSerial.h>
int RECV_PIN = 11;
int VT_RX_PIN=7;
int VT_TX_PIN=6;
int B_LED_PIN=10;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
SoftwareSerial VTserial(VT_RX_PIN,VT_TX_PIN);
decode_results results;
#define RECEIVER 1
#define SENDER 2
#define ERROR 3
#define POWERON 1
#define POWEROFF 0
typedef
struct {
decode_type_t decode_type;
unsigned long value;
int bits;
String cmd;
}
ir_info;
ir_info codeArray[] = {{NEC,0xE318261B,32,"1"},{NEC,0x3D9AE3F7,32,"UP"},
{SONY,0xD,12,"1"},{SONY,0x4CD,12,"UP"},
{SAMSUNG,0xA0A020DF,32,"1"},{SAMSUNG,0xA0A07887,32,"UP"}};
int mode;
void setup() {
Serial.begin(9600);
VTserial.begin(9600);
VTserial.println("Bluetooth Init Done");
pinMode(B_LED_PIN,OUTPUT);
if(digitalRead(RECV_PIN)==HIGH){
mode=RECEIVER;
irrecv.enableIRIn();
VTserial.println("Receiver mode");
}
else{
mode = SENDER;
VTserial.println("Sender mode");
}
}
void waitForGap(int gap){
VTserial.println("Waiting for gap");
while(1){
while(digitalRead(RECV_PIN)==LOW){
}
unsigned long time =millis();
while(digitalRead(RECV_PIN)==HIGH){
if(millis() - time > gap){
return;
}
}
}
}
void testIR(int label,int type,unsigned long value,int bits){
if(mode == SENDER){
VTserial.print(label);
if(type==NEC){
irsend.sendNEC(value,bits);
}
else if(type==SONY){
irsend.sendSony(value,bits);
}
else if(type==SAMSUNG){
irsend.sendSAMSUNG(value,bits);
}
else if(type==RC5){
irsend.sendRC5(value,bits);
}
else if(type==RC6){
irsend.sendRC6(value,bits);
}
else{
VTserial.print(label);
VTserial.println("Bad type!");
}
VTserial.println(":Send Done");
VTserial.print("Send Data:0x");
VTserial.print(value,HEX);
VTserial.print("(");
VTserial.print(bits,DEC);
VTserial.println("bits)");
delay(500);
}
else if(mode==RECEIVER){
irrecv.resume();
unsigned long max_time=millis()+30000;
while(!irrecv.decode(&results)){
if(millis()>max_time){
VTserial.println("Timeout receving data");
mode = ERROR;
return;
}
}
if(type==results.decode_type && value== results.value && bits==results.bits){
VTserial.print(label);
VTserial.println(":Decode Done");
switch(results.decode_type){
case RC5:VTserial.print("Receive Info:RC5 0x");break;
case RC6:VTserial.print("Receive Info:RC6 0x");break;
case NEC:VTserial.print("Receive Info:NEC 0x");break;
case SONY:VTserial.print("Receive Info:SONY 0x");break;
case SAMSUNG:VTserial.print("Receive Info:SAMSUNG 0x");
}
for(int i=0; i<sizeof(codeArray)/sizeof(ir_info); i++){
if(codeArray[i].value==results.value){
VTserial.print(results.value,HEX);
VTserial.print("(");
VTserial.print(results.bits,DEC);
VTserial.print("bits)");
VTserial.print("--->");
VTserial.println(codeArray[i].cmd);
}
}
}
else{
VTserial.println(":BAD");
mode =ERROR;
}
}
}
void testBT(int data){
if(mode==SENDER){
Serial.print(data);
VTserial.print("BT sender command:");
VTserial.print(data);
if(data==1)
VTserial.println("POWER ON");
else if(data == 0)
VTserial.println("POWER OFF");
}
else if(mode == RECEIVER){
VTserial.println("In BT receiver mode");
while(Serial.available()==0){
}
if(Serial.available()>0){
char data =Serial.read();
VTserial.print("BT receiver command:");
VTserial.print(data);
if(data=='1'){
digitalWrite(B_LED_PIN,HIGH);
VTserial.println("POWER ON");
}
else if(data=='0'){
digitalWrite(B_LED_PIN,LOW);
VTserial.println("POWER OFF");
}
}
}
}
void loop() {
testBT(POWERON);
if(mode==SENDER){
delay(2000);
}
else if(mode==RECEIVER){
waitForGap(1000);
}
else if(mode==ERROR){
VTserial.print("Loop Error");
delay(5000);
mode=RECEIVER;
return;
}
for(int i=0; i < sizeof(codeArray)/sizeof(ir_info) ; i++){
testIR(i,codeArray[i].decode_type,codeArray[i].value,codeArray[i].bits);
}
testBT(POWEROFF);
delay(2000);
}
第一次运行:有WARNING没有问题,编译成功就可以,找到这行代码,复制
在地址后面添加/Debug.elf
C:/Users/86188/AppData/Local/Temp/VSM Studio/f66a5bee69c74a1a96410c66224c43a8/ARDUINO UNO/Debug/Debug.elf
接下文