极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17350|回复: 9

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

[复制链接]
发表于 2017-3-29 01:20:03 | 显示全部楼层 |阅读模式
写了一段代码,前半部分温度模块测温度,串口屏显示数字,蜂鸣器报警这一部分功能已经实现。后半部分有关于红外发出和接收并且蜂鸣器报警这一功能实现不出来,求大神指导!谢谢!

  1. //DATA TO  A4
  2. //CLK  TO  A5
  3. #include "Wire.h"
  4. #include "LiquidCrystal.h"
  5. #include <IRSendRev.h>
  6. #include <OneWire.h>
  7. #include <DallasTemperature.h>

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

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

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

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

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

  31. void loop() {

  32.   sensors.requestTemperatures(); // 发送命令获取温度
  33.   int val=sensors.getTempCByIndex(0) ;
  34.   lcd.print(val);
  35.   lcd.print("C");
  36.   delay(2000);
  37.   lcd.clear();
  38.   lcd.setBacklight(HIGH);
  39.   if(val<21)
  40. {
  41. digitalWrite(5,LOW);//低电平触发蜂鸣器
  42. delay(1000);
  43. digitalWrite(5,HIGH);
  44. delay(500);
  45. }
  46. else
  47. {
  48.   digitalWrite(5,HIGH);
  49.    delay(1000);
  50. }

  51. IR.Send(d, 38);//sent the data via 38Kz IR
  52. delay(1000);
  53. if(IR.IsDta())
  54.     {
  55.        // IR.Recv(dta);
  56.         int length= IR.Recv(dta);
  57.         for (int i =0;i<length;i++)
  58.         {
  59.           Serial.print(dta[i]);
  60.           Serial.print("\t");
  61.         }
  62.         Serial.println();
  63.     }
  64. if(IR.IsDta()){
  65.   int length=IR.Recv(dta);
  66.   if(length==0){
  67.     digitalWrite(5,HIGH);
  68.     delay(1000);
  69.      }
  70.     else {
  71.       digitalWrite(5,LOW);//低电平触发蜂鸣器
  72.       delay(100);
  73.       digitalWrite(5,HIGH);
  74.       delay(100);
  75.       }
  76.     }
  77.   else{
  78.   digitalWrite(5,HIGH);
  79.   delay(1000);}
  80. }
复制代码
回复

使用道具 举报

 楼主| 发表于 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替换成蜂鸣器就可以。
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)。还有就是怎么把代码改一下 变成控制蜂鸣器呀?
资料里给的红外发射端代码有两个(第一个试验成功了,第二段代码有错误):
第一个代码:

  1. void setup() {
  2.   // initialize digital pin 13 as an output.
  3.   pinMode(3, OUTPUT);
  4. }
  5. // the loop function runs over and over again forever
  6. void loop() {
  7.   digitalWrite(3, HIGH);   // turn the LED on (HIGH is the voltage level)
  8.   delay(1000);              // wait for a second
  9.   digitalWrite(3, LOW);    // turn the LED off by making the voltage LOW
  10.   delay(1000);              // wait for a second
  11. }
复制代码

第二个代码:

  1. #include <IRremote.h>
  2. IRsend irsend;
  3. void setup()
  4. {
  5. }
  6. void loop() {

  7.      irsend.sendRC5(0x0, 8); //send 0x0 code (8 bits)
  8.      delay(200);
  9.      irsend.sendRC5(0x1, 8);
  10.      delay(200);
  11. }
复制代码

红外接收端程序代码:

  1. #include <IRremote.h>
  2. const int RECV_PIN = 11;
  3. const int LED_PIN = 13;
  4. IRrecv irrecv(RECV_PIN);
  5. decode_results results;
  6. void setup()
  7. {
  8.    Serial.begin(9600);
  9.    irrecv.enableIRIn(); // Start the receiver
  10. }
  11. void loop()
  12. {   
  13.    if (irrecv.decode(&results))
  14.    {
  15.      if ( results.bits > 0 )
  16.      {
  17.        int state;
  18.        if ( 0x1 == results.value )        
  19.        {               
  20.          state = HIGH;
  21.        }
  22.        else
  23.        {
  24.                state = LOW;
  25.        }        
  26.        digitalWrite( LED_PIN, state );                        
  27.      }
  28.      irrecv.resume();        // prepare to receive the next value
  29.    }
  30. }
复制代码
回复 支持 反对

使用道具 举报

发表于 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 编辑
  1. //DATA TO  A4
  2. //CLK  TO  A5
  3. #include "Wire.h"
  4. #include "LiquidCrystal.h"
  5. #include <OneWire.h>
  6. #include <DallasTemperature.h>

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

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

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

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

  19. void setup() {
  20.   
  21.   pinMode(buzzer,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
  22.   
  23.   pinMode(Receive,INPUT);
  24.   // set up the LCD's number of rows and columns:
  25.   lcd.begin(16, 2);
  26.   Serial.begin(38400);

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

  30. void loop() {

  31.   sensors.requestTemperatures(); // 发送命令获取温度
  32.   int val=sensors.getTempCByIndex(0) ;
  33.   int buttonState = digitalRead(Receive);
  34.   lcd.print(val);
  35.   lcd.print("C");
  36.   delay(2000);
  37.   lcd.clear();
  38.   lcd.setBacklight(HIGH);
  39.   if(val<21)
  40. {
  41. digitalWrite(5,LOW);//低电平触发蜂鸣器
  42. delay(1000);
  43. digitalWrite(5,HIGH);
  44. delay(500);
  45. }

  46. else
  47. {
  48.   digitalWrite(5,HIGH);
  49.    delay(1000);
  50. }
  51.   if (buttonState == HIGH) {     
  52.   
  53.     digitalWrite(buzzer, LOW);  
  54.   }
  55.   else {

  56.     digitalWrite(buzzer, HIGH);
  57.   }
  58. }

  59. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
    }
  }
}
回复 支持 反对

使用道具 举报

发表于 2017-4-12 15:02:04 | 显示全部楼层
本帖最后由 董董soul 于 2017-4-12 15:14 编辑

套件里面的蜂鸣器是无源蜂鸣器,需要用tone函数,而代码里面是有源蜂鸣器……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 07:53 , Processed in 0.043245 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表