nnnxxx 发表于 2017-3-29 01:20:03

【求助帖】关于红外发射接收模块连接蜂鸣器的代码

写了一段代码,前半部分温度模块测温度,串口屏显示数字,蜂鸣器报警这一部分功能已经实现。后半部分有关于红外发出和接收并且蜂鸣器报警这一功能实现不出来,求大神指导!谢谢!

//DATA TOA4
//CLKTOA5
#include "Wire.h"
#include "LiquidCrystal.h"
#include <IRSendRev.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define IR_OUT_PIN 3 //红外线发射3号引脚

// 定义DS18B20数据口连接arduino的4号IO上
#define ONE_WIRE_BUS 4
// 初始连接在单总线上的单总线设备
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int buzzer=5;//设置控制蜂鸣器的数字IO脚
int Receive=2;
// Connect via i2c, default address #0 (A0-A2 not jumpered)
LiquidCrystal lcd(0);

unsigned char d[] = {15, 70, 70, 20, 60, 10, 1, 2, 3, 4,5,6,7,8,9,10};//接受
unsigned char dta;//发射

void setup() {

pinMode(buzzer,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
pinMode(Receive,INPUT_PULLUP);
// set up the LCD's number of rows and columns:
lcd.begin(16, 2);
Serial.begin(38400);
IR.Init(IR_OUT_PIN);//红外线接收初始化
digitalWrite(5,HIGH);
sensors.begin();//温度传感器初始化
}

void loop() {

sensors.requestTemperatures(); // 发送命令获取温度
int val=sensors.getTempCByIndex(0) ;
lcd.print(val);
lcd.print("C");
delay(2000);
lcd.clear();
lcd.setBacklight(HIGH);
if(val<21)
{
digitalWrite(5,LOW);//低电平触发蜂鸣器
delay(1000);
digitalWrite(5,HIGH);
delay(500);
}
else
{
digitalWrite(5,HIGH);
   delay(1000);
}

IR.Send(d, 38);//sent the data via 38Kz IR
delay(1000);
if(IR.IsDta())
    {
       // IR.Recv(dta);
      int length= IR.Recv(dta);
      for (int i =0;i<length;i++)
      {
          Serial.print(dta);
          Serial.print("\t");
      }
      Serial.println();
    }
if(IR.IsDta()){
int length=IR.Recv(dta);
if(length==0){
    digitalWrite(5,HIGH);
    delay(1000);
   }
    else {
      digitalWrite(5,LOW);//低电平触发蜂鸣器
      delay(100);
      digitalWrite(5,HIGH);
      delay(100);
      }
    }
else{
digitalWrite(5,HIGH);
delay(1000);}
}

nnnxxx 发表于 2017-3-29 01:24:09

具体功能是:红外发出端发出红外光线,红外接收端检测到光线后,蜂鸣器报警。若没有检测到红外线则不会报警。
求解答~

幻生幻灭 发表于 2017-3-29 08:10:48

不能用Delay

弘毅 发表于 2017-3-30 08:07:18

你红外和DS18B20在3,4管脚,这两个其实是一个定时器。。。这两个库对定时器时序要求都很高,否则工作就会不正常,你看一个放在4管脚,一个放D12管脚试试看。

弘毅 发表于 2017-3-30 14:38:53

首先你需要把复杂功能,拆成单独的功能一个个测试,然后再组合,你其他部分没问题了,就需要单独测试红外控制的点led,没问题后,再把led替换成蜂鸣器就可以。

nnnxxx 发表于 2017-3-31 15:43:23

弘毅 发表于 2017-3-30 14:38
首先你需要把复杂功能,拆成单独的功能一个个测试,然后再组合,你其他部分没问题了,就需要单独测试红外控 ...

谢谢大神!发射端已经测试过了,成功了,下面是红外发射和接收单独的代码,不过接收端控制的是led,并且测试接收端的时候出现了以下问题(接收端代码第三行加粗字体是提示错误部分,错误是:sketch_mar31a.ino: In function 'void loop()':
sketch_mar31a:18: error: 'irrecv' was not declared in this scope
sketch_mar31a:18: error: 'results' was not declared in this scope)。还有就是怎么把代码改一下 变成控制蜂鸣器呀?
资料里给的红外发射端代码有两个(第一个试验成功了,第二段代码有错误):
第一个代码:

void setup() {
// initialize digital pin 13 as an output.
pinMode(3, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(3, HIGH);   // turn the LED on (HIGH is the voltage level)
delay(1000);            // wait for a second
digitalWrite(3, LOW);    // turn the LED off by making the voltage LOW
delay(1000);            // wait for a second
}

第二个代码:

#include <IRremote.h>
IRsend irsend;
void setup()
{
}
void loop() {

   irsend.sendRC5(0x0, 8); //send 0x0 code (8 bits)
   delay(200);
   irsend.sendRC5(0x1, 8);
   delay(200);
}

红外接收端程序代码:

#include <IRremote.h>
const int RECV_PIN = 11;
const int LED_PIN = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
   Serial.begin(9600);
   irrecv.enableIRIn(); // Start the receiver
}
void loop()
{   
   if (irrecv.decode(&results))
   {
   if ( results.bits > 0 )
   {
       int state;
       if ( 0x1 == results.value )      
       {               
         state = HIGH;
       }
       else
       {
               state = LOW;
       }      
       digitalWrite( LED_PIN, state );                        
   }
   irrecv.resume();      // prepare to receive the next value
   }
}

弘毅 发表于 2017-4-1 14:22:58

本帖最后由 弘毅 于 2017-4-1 14:24 编辑

nnnxxx 发表于 2017-3-31 15:43
谢谢大神!发射端已经测试过了,成功了,下面是红外发射和接收单独的代码,不过接收端控制的是led,并 ...

。。。。。。。。你所谓的成功,只是在IDE下编译通过而已了吧,并不是红外发射和接收通信正常吧。你的接收端代码在我们IDE下编译。。。没有发现报错。

你发射和接收互相通信,还没成功吧

我是马甲 发表于 2017-4-1 17:26:18

本帖最后由 我是马甲 于 2017-4-1 17:43 编辑

//DATA TOA4
//CLKTOA5
#include "Wire.h"
#include "LiquidCrystal.h"
#include <OneWire.h>
#include <DallasTemperature.h>

#define IR_OUT_PIN 3 //红外线发射3号引脚

// 定义DS18B20数据口连接arduino的4号IO上
#define ONE_WIRE_BUS 4
// 初始连接在单总线上的单总线设备
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int buzzer=5;//设置控制蜂鸣器的数字IO脚
int Receive=2; //红外接收器的数字IO脚
// Connect via i2c, default address #0 (A0-A2 not jumpered)
LiquidCrystal lcd(0);

unsigned char d[] = {15, 70, 70, 20, 60, 10, 1, 2, 3, 4,5,6,7,8,9,10};//接受
unsigned char dta;//发射

void setup() {

pinMode(buzzer,OUTPUT);//设置数字IO脚模式,OUTPUT为输出

pinMode(Receive,INPUT);
// set up the LCD's number of rows and columns:
lcd.begin(16, 2);
Serial.begin(38400);

digitalWrite(5,HIGH);
sensors.begin();//温度传感器初始化
}

void loop() {

sensors.requestTemperatures(); // 发送命令获取温度
int val=sensors.getTempCByIndex(0) ;
int buttonState = digitalRead(Receive);
lcd.print(val);
lcd.print("C");
delay(2000);
lcd.clear();
lcd.setBacklight(HIGH);
if(val<21)
{
digitalWrite(5,LOW);//低电平触发蜂鸣器
delay(1000);
digitalWrite(5,HIGH);
delay(500);
}

else
{
digitalWrite(5,HIGH);
   delay(1000);
}
if (buttonState == HIGH) {   

    digitalWrite(buzzer, LOW);
}
else {

    digitalWrite(buzzer, HIGH);
}
}

}

nnnxxx 发表于 2017-4-10 22:56:37

后来请教了朋友,他说我实现这个装置需要两块主板,把红外发射装在第一块板上,红外接收和蜂鸣器接在第二块主板上,然后分别烧录程序,但现在实验还是不成功,想请大神帮忙看看哪里有问题了,谢谢了!程序如下(烧录以后没有报错信息)
发射程序:
#include <IRremote.h>
IRsend irsend;
void setup()
{
Serial.begin(9600);
}
void loop()
{
delay(200);
irsend.sendRC5(0x01,8); //send 0x01 code (8 bits)

}


接收及蜂鸣器程序:
#include <IRremote.h>
const int RECV_PIN = 11;
const int buzzer_PIN = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
irrecv.enableIRIn(); // Start the receiver
pinMode(buzzer_PIN, OUTPUT);
digitalWrite(buzzer_PIN, HIGH);
}
void loop()
{
int i = 0;
while (1)
{
    if (irrecv.decode(&results))
    {
      if ( results.bits > 0 )
      {

      if ( 0x01 == results.value )
      {
          i = 1;
      }
      }
    }
    if (i == 1)
    {
      digitalWrite(buzzer_PIN, LOW);
      delay(5000);
      digitalWrite(buzzer_PIN, HIGH);
      i = 0;
    }
}
}

董董soul 发表于 2017-4-12 15:02:04

本帖最后由 董董soul 于 2017-4-12 15:14 编辑

套件里面的蜂鸣器是无源蜂鸣器,需要用tone函数,而代码里面是有源蜂鸣器……
页: [1]
查看完整版本: 【求助帖】关于红外发射接收模块连接蜂鸣器的代码