Arduino无线控制模拟器-实验4(一)

实验目的:

了解红外线通信的原理;
了解蓝牙通信的原理;
学会使用 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

接下文

Arduino无线控制模拟器-实验4(二)-CSDN博客文章浏览阅读4次。得到Debug.elf文件后,加入A、B的Program File,两个文件一致。文中截图了老师的ppt,及自己的实验过程图。可以选择重新构建,重新编译运行。如上图所示就运行成功了!再次运行,就可以啦!https://blog.csdn.net/2301_79859344/article/details/134395938

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值