查看: 1138|回复: 13

[未解决] Tone.cpp:254:7: error: expected unqualified-id before '{' token

[复制链接]
  • TA的每日心情
    奋斗
    2018-4-15 12:56
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2018-4-15 13:01 | 显示全部楼层 |阅读模式
    小白实在不会改了,大神们帮帮忙呀,挺着急的在线等,,路过的我伙伴们快救救我吧




    /* Tone.cpp

      A Tone Generator Library

      Written by Brett Hagman

      This library is free software; you can redistribute it and/or
      modify it under the terms of the GNU Lesser General Public
      License as published by the Free Software Foundation; either
      version 2.1 of the License, or (at your option) any later version.

      This library is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Lesser General Public License for more details.

      You should have received a copy of the GNU Lesser General Public
      License along with this library; if not, write to the Free Software
      Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    Version Modified By Date     Comments
    ------- ----------- -------- --------
    0001    B Hagman    09/08/02 Initial coding
    0002    B Hagman    09/08/18 Multiple pins
    0003    B Hagman    09/08/18 Moved initialization from constructor to begin()
    0004    B Hagman    09/09/26 Fixed problems with ATmega8
    0005    B Hagman    09/11/23 Scanned prescalars for best fit on 8 bit timers
                        09/11/25 Changed pin toggle method to XOR
                        09/11/25 Fixed timer0 from being excluded
    0006    D Mellis    09/12/29 Replaced objects with functions
    0007    M Sproul    10/08/29 Changed #ifdefs from cpu to register
    0008    S Kanemoto  12/06/22 Fixed for Leonardo by @maris_HY
    0009    J Reucker   15/04/10 Issue #292 Fixed problems with ATmega8 (thanks to Pete62)
    0010    jipp        15/04/13 added additional define check #2923
    *************************************************/

    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include "Arduino.h"
    #include "pins_arduino.h"

    #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
    #define TCCR2A TCCR2
    #define TCCR2B TCCR2
    #define COM2A1 COM21
    #define COM2A0 COM20
    #define OCR2A OCR2
    #define TIMSK2 TIMSK
    #define OCIE2A OCIE2
    #define TIMER2_COMPA_vect TIMER2_COMP_vect
    #define TIMSK1 TIMSK
    #endif

    // timerx_toggle_count:
    //  > 0 - duration specified
    //  = 0 - stopped
    //  < 0 - infinitely (until stop() method called, or new play() called)

    #if !defined(__AVR_ATmega8__)
    volatile long timer0_toggle_count;
    volatile uint8_t *timer0_pin_port;
    volatile uint8_t timer0_pin_mask;
    #endif

    volatile long timer1_toggle_count;
    volatile uint8_t *timer1_pin_port;
    volatile uint8_t timer1_pin_mask;
    volatile long timer2_toggle_count;
    volatile uint8_t *timer2_pin_port;
    volatile uint8_t timer2_pin_mask;

    #if defined(TIMSK3)
    volatile long timer3_toggle_count;
    volatile uint8_t *timer3_pin_port;
    volatile uint8_t timer3_pin_mask;
    #endif

    #if defined(TIMSK4)
    volatile long timer4_toggle_count;
    volatile uint8_t *timer4_pin_port;
    volatile uint8_t timer4_pin_mask;
    #endif

    #if defined(TIMSK5)
    volatile long timer5_toggle_count;
    volatile uint8_t *timer5_pin_port;
    volatile uint8_t timer5_pin_mask;
    #endif


    #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

    #define AVAILABLE_TONE_PINS 1
    #define USE_TIMER2

    const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 3, 4, 5, 1, 0 */ };
    static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255, 255, 255, 255 */ };

    #elif defined(__AVR_ATmega8__)

    #define AVAILABLE_TONE_PINS 1
    #define USE_TIMER2

    const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1 */ };
    static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ };

    #elif defined(__AVR_ATmega32U4__)

    #define AVAILABLE_TONE_PINS 1
    #define USE_TIMER3

    const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 3 /*, 1 */ };
    static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ };

    #else

    #define AVAILABLE_TONE_PINS 1
    #define USE_TIMER2

    // Leave timer 0 to last.
    const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ };
    static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255 */ };

    #endif



    static int8_t toneBegin(uint8_t _pin)
    {
      int8_t _timer = -1;

      // if we're already using the pin, the timer should be configured.  
      for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
        if (tone_pins[i] == _pin) {
          return pgm_read_byte(tone_pin_to_timer_PGM + i);
        }
      }

      // search for an unused timer.
      for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
        if (tone_pins[i] == 255) {
          tone_pins[i] = _pin;
          _timer = pgm_read_byte(tone_pin_to_timer_PGM + i);
          break;
        }
      }

      if (_timer != -1)
      {
        // Set timer specific stuff
        // All timers in CTC mode
        // 8 bit timers will require changing prescalar values,
        // whereas 16 bit timers are set to either ck/1 or ck/64 prescalar
        switch (_timer)
        {
          #if defined(TCCR0A) && defined(TCCR0B) && defined(WGM01)
          case 0:
            // 8 bit timer
            TCCR0A = 0;
            TCCR0B = 0;
            bitWrite(TCCR0A, WGM01, 1);
            bitWrite(TCCR0B, CS00, 1);
            timer0_pin_port = portOutputRegister(digitalPinToPort(_pin));
            timer0_pin_mask = digitalPinToBitMask(_pin);
            break;
          #endif

          #if defined(TCCR1A) && defined(TCCR1B) && defined(WGM12)
          case 1:
            // 16 bit timer
            TCCR1A = 0;
            TCCR1B = 0;
            bitWrite(TCCR1B, WGM12, 1);
            bitWrite(TCCR1B, CS10, 1);
            timer1_pin_port = portOutputRegister(digitalPinToPort(_pin));
            timer1_pin_mask = digitalPinToBitMask(_pin);
            break;
          #endif

          #if defined(TCCR2A) && defined(TCCR2B)
          case 2:
            // 8 bit timer
            TCCR2A = 0;
            TCCR2B = 0;
            bitWrite(TCCR2A, WGM21, 1);
            bitWrite(TCCR2B, CS20, 1);
            timer2_pin_port = portOutputRegister(digitalPinToPort(_pin));
            timer2_pin_mask = digitalPinToBitMask(_pin);
            break;
          #endif

          #if defined(TCCR3A) && defined(TCCR3B) &&  defined(TIMSK3)
          case 3:
            // 16 bit timer
            TCCR3A = 0;
            TCCR3B = 0;
            bitWrite(TCCR3B, WGM32, 1);
            bitWrite(TCCR3B, CS30, 1);
            timer3_pin_port = portOutputRegister(digitalPinToPort(_pin));
            timer3_pin_mask = digitalPinToBitMask(_pin);
            break;
          #endif

          #if defined(TCCR4A) && defined(TCCR4B) &&  defined(TIMSK4)
          case 4:
            // 16 bit timer
            TCCR4A = 0;
            TCCR4B = 0;
            #if defined(WGM42)
              bitWrite(TCCR4B, WGM42, 1);
            #elif defined(CS43)
              #warning this may not be correct
              // atmega32u4
              bitWrite(TCCR4B, CS43, 1);
            #endif
            bitWrite(TCCR4B, CS40, 1);
            timer4_pin_port = portOutputRegister(digitalPinToPort(_pin));
            timer4_pin_mask = digitalPinToBitMask(_pin);
            break;
          #endif

          #if defined(TCCR5A) && defined(TCCR5B) &&  defined(TIMSK5)
          case 5:
            // 16 bit timer
            TCCR5A = 0;
            TCCR5B = 0;
            bitWrite(TCCR5B, WGM52, 1);
            bitWrite(TCCR5B, CS50, 1);
            timer5_pin_port = portOutputRegister(digitalPinToPort(_pin));
            timer5_pin_mask = digitalPinToBitMask(_pin);
            break;
          #endif
        }
      }

      return _timer;
    }



    // frequency (in hertz) and duration (in milliseconds).

    void newtone(byte tonePin, int frequency, int duration) {
    int period = 1000000L / frequency;
    int pulse = period / 2;
    for (long i = 0; i < duration * 1000L; i += period) {
    digitalWrite(tonePin, HIGH);
    delayMicroseconds(pulse);
    digitalWrite(tonePin, LOW);
    delayMicroseconds(pulse);
    }
    }
    #if defined(TCCR0B)
          {
          if (_timer == 0)
          {
            TCCR0B = (TCCR0B & 0b11111000) | prescalarbits;
          }

          else
    #endif
    }
    #if defined(TCCR2B)
          {
            TCCR2B = (TCCR2B & 0b11111000) | prescalarbits;
          }
    #else
          {
            // dummy place holder to make the above ifdefs work
          }
    #endif
        }
        else
        {
          // two choices for the 16 bit timers: ck/1 or ck/64
          ocr = F_CPU / frequency / 2 - 1;

          prescalarbits = 0b001;
          if (ocr > 0xffff)
          {
            ocr = F_CPU / frequency / 2 / 64 - 1;
            prescalarbits = 0b011;
          }

          if (_timer == 1)
          {
    #if defined(TCCR1B)
            TCCR1B = (TCCR1B & 0b11111000) | prescalarbits;
    #endif
          }
    #if defined(TCCR3B)
          else if (_timer == 3)
            TCCR3B = (TCCR3B & 0b11111000) | prescalarbits;
    #endif
    #if defined(TCCR4B)
          else if (_timer == 4)
            TCCR4B = (TCCR4B & 0b11111000) | prescalarbits;
    #endif
    #if defined(TCCR5B)
          else if (_timer == 5)
            TCCR5B = (TCCR5B & 0b11111000) | prescalarbits;
    #endif

        }


        // Calculate the toggle count
        if (duration > 0)
        {
          toggle_count = 2 * frequency * duration / 1000;
        }
        else
        {
          toggle_count = -1;
        }

        // Set the OCR for the given timer,
        // set the toggle count,
        // then turn on the interrupts
        switch (_timer)
        {

    #if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A)
          case 0:
            OCR0A = ocr;
            timer0_toggle_count = toggle_count;
            bitWrite(TIMSK0, OCIE0A, 1);
            break;
    #endif

          case 1:
    #if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A)
            OCR1A = ocr;
            timer1_toggle_count = toggle_count;
            bitWrite(TIMSK1, OCIE1A, 1);
    #elif defined(OCR1A) && defined(TIMSK) && defined(OCIE1A)
            // this combination is for at least the ATmega32
            OCR1A = ocr;
            timer1_toggle_count = toggle_count;
            bitWrite(TIMSK, OCIE1A, 1);
    #endif
            break;

    #if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A)
          case 2:
            OCR2A = ocr;
            timer2_toggle_count = toggle_count;
            bitWrite(TIMSK2, OCIE2A, 1);
            break;
    #endif

    #if defined(OCR3A) && defined(TIMSK3) && defined(OCIE3A)
          case 3:
            OCR3A = ocr;
            timer3_toggle_count = toggle_count;
            bitWrite(TIMSK3, OCIE3A, 1);
            break;
    #endif

    #if defined(OCR4A) && defined(TIMSK4) && defined(OCIE4A)
          case 4:
            OCR4A = ocr;
            timer4_toggle_count = toggle_count;
            bitWrite(TIMSK4, OCIE4A, 1);
            break;
    #endif

    #if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A)
          case 5:
            OCR5A = ocr;
            timer5_toggle_count = toggle_count;
            bitWrite(TIMSK5, OCIE5A, 1);
            break;
    #endif

        }
      }
    }


    // XXX: this function only works properly for timer 2 (the only one we use
    // currently).  for the others, it should end the tone, but won't restore
    // proper PWM functionality for the timer.
    void disableTimer(uint8_t _timer)
    {
      switch (_timer)
      {
        case 0:
          #if defined(TIMSK0)
            TIMSK0 = 0;
          #elif defined(TIMSK)
            TIMSK = 0; // atmega32
          #endif
          break;

    #if defined(TIMSK1) && defined(OCIE1A)
        case 1:
          bitWrite(TIMSK1, OCIE1A, 0);
          break;
    #endif

        case 2:
          #if defined(TIMSK2) && defined(OCIE2A)
            bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt
          #endif
          #if defined(TCCR2A) && defined(WGM20)
            TCCR2A = (1 << WGM20);
          #endif
          #if defined(TCCR2B) && defined(CS22)
            TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22);
          #endif
          #if defined(OCR2A)
            OCR2A = 0;
          #endif
          break;

    #if defined(TIMSK3) && defined(OCIE3A)
        case 3:
          bitWrite(TIMSK3, OCIE3A, 0);
          break;
    #endif

    #if defined(TIMSK4) && defined(OCIE4A)
        case 4:
          bitWrite(TIMSK4, OCIE4A, 0);
          break;
    #endif

    #if defined(TIMSK5) && defined(OCIE5A)
        case 5:
          bitWrite(TIMSK5, OCIE5A, 0);
          break;
    #endif
      }
    }


    void noTone(uint8_t _pin)
    {
      int8_t _timer = -1;

      for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
        if (tone_pins[i] == _pin) {
          _timer = pgm_read_byte(tone_pin_to_timer_PGM + i);
          tone_pins[i] = 255;
        }
      }

      disableTimer(_timer);

      digitalWrite(_pin, 0);
    }

    #ifdef USE_TIMER0
    ISR(TIMER0_COMPA_vect)
    {
      if (timer0_toggle_count != 0)
      {
        // toggle the pin
        *timer0_pin_port ^= timer0_pin_mask;

        if (timer0_toggle_count > 0)
          timer0_toggle_count--;
      }
      else
      {
        disableTimer(0);
        *timer0_pin_port &= ~(timer0_pin_mask);  // keep pin low after stop
      }
    }
    #endif


    #ifdef USE_TIMER1
    ISR(TIMER1_COMPA_vect)
    {
      if (timer1_toggle_count != 0)
      {
        // toggle the pin
        *timer1_pin_port ^= timer1_pin_mask;

        if (timer1_toggle_count > 0)
          timer1_toggle_count--;
      }
      else
      {
        disableTimer(1);
        *timer1_pin_port &= ~(timer1_pin_mask);  // keep pin low after stop
      }
    }
    #endif


    #ifdef USE_TIMER2
    ISR(TIMER2_COMPA_vect)
    {

      if (timer2_toggle_count != 0)
      {
        // toggle the pin
        *timer2_pin_port ^= timer2_pin_mask;

        if (timer2_toggle_count > 0)
          timer2_toggle_count--;
      }
      else
      {
        // need to call noTone() so that the tone_pins[] entry is reset, so the
        // timer gets initialized next time we call tone().
        // XXX: this assumes timer 2 is always the first one used.
        noTone(tone_pins[0]);
    //    disableTimer(2);
    //    *timer2_pin_port &= ~(timer2_pin_mask);  // keep pin low after stop
      }
    }
    #endif


    #ifdef USE_TIMER3
    ISR(TIMER3_COMPA_vect)
    {
      if (timer3_toggle_count != 0)
      {
        // toggle the pin
        *timer3_pin_port ^= timer3_pin_mask;

        if (timer3_toggle_count > 0)
          timer3_toggle_count--;
      }
      else
      {
        disableTimer(3);
        *timer3_pin_port &= ~(timer3_pin_mask);  // keep pin low after stop
      }
    }
    #endif


    #ifdef USE_TIMER4
    ISR(TIMER4_COMPA_vect)
    {
      if (timer4_toggle_count != 0)
      {
        // toggle the pin
        *timer4_pin_port ^= timer4_pin_mask;

        if (timer4_toggle_count > 0)
          timer4_toggle_count--;
      }
      else
      {
        disableTimer(4);
        *timer4_pin_port &= ~(timer4_pin_mask);  // keep pin low after stop
      }
    }
    #endif


    #ifdef USE_TIMER5
    ISR(TIMER5_COMPA_vect)
    {
      if (timer5_toggle_count != 0)
      {
        // toggle the pin
        *timer5_pin_port ^= timer5_pin_mask;

        if (timer5_toggle_count > 0)
          timer5_toggle_count--;
      }
      else
      {
        disableTimer(5);
        *timer5_pin_port &= ~(timer5_pin_mask);  // keep pin low after stop
      }
    }
    #endif

  • TA的每日心情
    奋斗
    2018-4-15 12:56
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2018-4-15 13:35 | 显示全部楼层
    怎么都没有人在啊,看在是妹纸的份上,各位大神快帮帮忙吧
  • TA的每日心情
    开心
    2018-6-6 20:38
  • 签到天数: 104 天

    [LV.6]常住居民II

    发表于 2018-4-15 16:50 | 显示全部楼层
    这是一个发声的程序?要怎么改?
  • TA的每日心情
    奋斗
    2018-4-15 12:56
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2018-4-15 20:08 | 显示全部楼层
    sanhuasr 发表于 2018-4-15 16:50
    这是一个发声的程序?要怎么改?

    对,这个是一个发声的程序,由于我要实现发声的同时要红外控制,红外库和Tone都使用了相同的内部计时器TIMER2,我就吧Tone.cpp里面void Tone()用这个程序代替了
    void newtone(byte tonePin, int frequency, int duration) {
    int period = 1000000L / frequency;
    int pulse = period / 2;
    for (long i = 0; i < duration * 1000L; i += period) {
    digitalWrite(tonePin, HIGH);
    delayMicroseconds(pulse);
    digitalWrite(tonePin, LOW);
    delayMicroseconds(pulse);
    }
    }
    但是编译结果老是出现上面错误Tone.cpp:254:7: error: expected unqualified-id before '{' token

    我也不知道到到底是哪里定义不对了
  • TA的每日心情
    奋斗
    2018-4-15 12:56
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2018-4-15 20:11 | 显示全部楼层
    18217057382 发表于 2018-4-15 20:08
    对,这个是一个发声的程序,由于我要实现发声的同时要红外控制,红外库和Tone都使用了相同的内部计时器TI ...

    #include <boarddefs.h>
    #include <IRremote.h>
    #include <IRremoteInt.h>
    #include <ir_Lego_PF_BitStreamEncoder.h>
    int RECV_PIN = 10; //红外接收VOUT引脚定义  
    IRrecv irrecv(RECV_PIN); // 设置irReceiverPin定义的端口为红外信号接收端口
    decode_results results;    // 定义results变量为红外结果存放位置
    int on = 0;  
    unsigned long last = millis();  

    #include <Servo.h>
    Servo myservo1,myservo2,myservo3,myservo4;  //创建一个舵机控制对象
                              // 使用Servo类最多可以控制8个舵机
    int pos = 0;// 该变量用与存储舵机角度位置
    void  StatusA();
    void  StatusB();
    void  StatusC();

    #define NOTE_D0 -1  
    #define NOTE_D1 294  
    #define NOTE_D2 330
    #define NOTE_D3 350
    #define NOTE_D4 393
    #define NOTE_D5 441
    #define NOTE_D6 495
    #define NOTE_D7 556
      
    #define NOTE_DL1 147  
    #define NOTE_DL2 165  
    #define NOTE_DL3 175  
    #define NOTE_DL4 196  
    #define NOTE_DL5 221  
    #define NOTE_DL6 248  
    #define NOTE_DL7 278  
      
    #define NOTE_DH1 589  
    #define NOTE_DH2 661
    #define NOTE_DH3 700  
    #define NOTE_DH4 786  
    #define NOTE_DH5 882  
    #define NOTE_DH6 990
    #define NOTE_DH7 1112

    #define WHOLE 1   
    #define HALF 0.5  
    #define QUARTER 0.25  
    #define EIGHTH 0.25  
    #define SIXTEENTH 0.625



    int tune[] =   
      
    {  
      
      NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,  
      
      NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,NOTE_D6,  
      
      NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,NOTE_D6,  
      
      NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,  

      
      NOTE_D1,NOTE_D1,NOTE_D3,  
      
      NOTE_D1,NOTE_D1,NOTE_D3,NOTE_D0,  
      
      NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,  
      
      NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,  
      
      NOTE_DH1,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,  
      
      NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,  
      
      NOTE_D7,NOTE_D7,NOTE_D5,NOTE_D3,  
      
      NOTE_D5,  
      
      NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,  
      
      NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,  
      
      NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,  
      
      NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,  
      
      NOTE_D3,NOTE_D3,NOTE_D1,NOTE_DL6,  
      
      NOTE_D1,  
      
      NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,  
      
      NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,  
      
      NOTE_DH1,NOTE_D0,NOTE_D7,NOTE_D5,  
      
      NOTE_D6,  
      
    };//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数  
       
    float duration[]=  
      
    {  
      
      1,1,0.5,0.5,1,  
      
      0.5,0.5,0.5,0.5,1,0.5,0.5,  
      
      0.5,1,0.5,1,0.5,0.5,  
      
      0.5,0.5,0.5,0.5,1,1,  
      
       
      
      1,1,1+1,  
      
      0.5,1,1+0.5,1,  
      
      1,1,0.5,0.5,1,  
      
      0.5,1,1+0.5,1,  
      
      0.5,0.5,0.5,0.5,1+1,  
      
      0.5,1,1+0.5,1,  
      
      1+1,0.5,0.5,1,  
      
      1+1+1+1,  
      
      0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,  
      
      0.5,1,0.5,1,1,  
      
      0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,  
      
      0.5,1,0.5,1,1,  
      
      1+1,0.5,0.5,1,  
      
      1+1+1+1,  
      
      0.5,1,0.5,1+1,  
      
      0.5,1,0.5,1+1,  
      
      1+1,0.5,0.5,1,  
      
      1+1+1+1  
      
    };
    int length;//这里定义一个变量,后面用来表示共有多少个音符  
    int tonePin=11;//蜂鸣器的pin  

    //编码示例遥控数字1~5代表转换条件
    long key1 = 0x6785E38A;  
    long key2 = 0x823E3FB6;  
    long key3 = 0xBDF598EE;  
    long key4 = 0x783D9008;  
    long key5 = 0xEF0BED8A;  

    #define STATUS_A 1
    #define STATUS_B 2
    #define STATUS_C 3

    //该变量的值即为当前状态机所处的状态
    uint8_t currentStatus = STATUS_A;

    //通过状态机实现的某个任务,
    //需要放入 while(1) 等地方循环执行

    void loop()
    {

    if (irrecv.decode(&results)) {  
        if (millis() - last > 250) {  
          on = !on;  
          digitalWrite(13, on ? HIGH : LOW);  
          dump(&results);  
        }  
    }
        switch(currentStatus) //根据现在的状态执行相应的程序
       {
        case STATUS_A:  // 状态 A
            
          for(int x=0;x<length;x++)   //执行状态 A 中需要执行的任务
          {  
           tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符  
           delay(400*duration[x]);//每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧  
           noTone(tonePin);//停止当前音符,进入下一音符  
           //若满足状态转换的条件,则转换到另一个状态
            if(results.value == key2){ currentStatus = STATUS_B; }
          }
          break;
        case STATUS_B:  //状态 B
           for(int x=0;x<length;x++)   //执行状态 A 中需要执行的任务
          {  
           tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符  
           delay(400*duration[x]);//每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧  
           noTone(tonePin);//停止当前音符,进入下一音符  
           //若满足状态转换的条件,则转换到另一个状态   
           }
           delay(1000);//等待1秒后,循环重新开始 // put your main code here, to run repeatedly:
          
          for(pos = 0; pos < 180; pos += 1)  // 从0度到180度运动
         {                                                     // 每次步进一度
          myservo1.write(pos);        // 指定舵机转向的角度
          myservo2.write(180-pos);        // 指定舵机转向的角度
          delay(1000);                      // 等待15ms让舵机到达指定位置
            }
          for(pos = 0; pos < 180; pos += 1)  // 从0度到180度运动
        {                                                     // 每次步进一度
         myservo1.write(pos);        // 指定舵机转向的角度
         myservo2.write(180-pos);        // 指定舵机转向的角度
         delay(1000);                      // 等待15ms让舵机到达指定位置
          }
            /* 若满足状态转换的条件,则转换到另一个状态 */
           if(results.value == key3){ currentStatus = STATUS_C; }
           if(results.value == key4){ currentStatus = STATUS_A; }
           break;
         case STATUS_C:  /* 状态 C */
          for(int x=0;x<length;x++)  
          {  
          tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符  
          delay(400*duration[x]);//每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧  
          noTone(tonePin);//停止当前音符,进入下一音符  
          }
         delay(1000);//等待1秒后,循环重新开始 // put your main code here, to run repeatedly:
         for(pos = 0; pos < 180; pos += 1)  // 从0度到180度运动
       {                                                     // 每次步进一度
       myservo1.write(pos);        // 指定舵机转向的角度
       myservo2.write(180-pos);        // 指定舵机转向的角度
        delay(1000);                      // 等待15ms让舵机到达指定位置
      
        }

        for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  
      {                                
        myservo1.write(pos);         // 指定舵机转向的角度
        myservo2.write(180-pos);        // 指定舵机转向的角度
        delay(1000);                      // 等待15ms让舵机到达指定位置
         
        }
             /* 若满足状态转换的条件,则转换到另一个状态 */
        if(results.value == key5){ currentStatus = STATUS_A; }   
        break;
        default:
           currentStatus = STATUS_A;
        }
       
    }
          
    void setup() {
    pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式  
    length = sizeof(tune)/sizeof(tune[0]);//这里用了一个sizeof函数,可以查出tone序列里有多少个音符 // put your setup code here, to run once:

    myservo1.attach(3);  // 该舵机由arduino第3脚控制
     myservo2.attach(5);  // 该舵机由arduino第5脚控制
      myservo3.attach(6);  // 该舵机由arduino第6脚控制
     myservo4.attach(9);  // 该舵机由arduino第9脚控制

    pinMode(RECV_PIN, INPUT); //红外VOUT端口模式,输入
    irrecv.enableIRIn();   // 启动红外解码
    Serial.begin(9600);
    Serial.println("system is read now!");  
    }

    void dump(decode_results *results)  
    {  
      int count = results->rawlen;  
      if (results->decode_type == UNKNOWN) {  
        Serial.println("Could not decode message");  
      }  
      else  
      {  
        if (results->decode_type == NEC) {  
          Serial.print("Decoded NEC: ");  
        }  
        else if (results->decode_type == SONY) {  
          Serial.print("Decoded SONY: ");  
        }  
        else if (results->decode_type == RC5) {  
          Serial.print("Decoded RC5: ");  
        }  
        else if (results->decode_type == RC6) {  
          Serial.print("Decoded RC6: ");  
        }  
        Serial.print(results->value, HEX);  
        Serial.print(" (");  
        Serial.print(results->bits, DEC);  
        Serial.println(" bits)");  
      }  
      Serial.print("Raw (");  
      Serial.print(count, DEC);  
      Serial.print("): ");  
      
      for (int i = 0; i < count; i++)  
      {  
        if ((i % 2) == 1) {  
          Serial.print(results->rawbuf*USECPERTICK, DEC);  
        }  
        else {  
          Serial.print(-(int)results->rawbuf*USECPERTICK, DEC);  
        }  
        Serial.print(" ");  
      }  
      Serial.println("");  //comment
    }  

    这个是整个项目的程序,编译没有报错,就是一直报Tone.cpp有错
  • TA的每日心情
    开心
    2018-9-28 11:29
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2018-4-15 20:26 | 显示全部楼层
    好东西,学习了,很详细!
  • TA的每日心情
    开心
    2018-6-6 20:38
  • 签到天数: 104 天

    [LV.6]常住居民II

    发表于 2018-4-15 23:11 | 显示全部楼层
    18217057382 发表于 2018-4-15 20:11
    #include
    #include
    #include

    参考
    急求解答 !!!arduino红外遥控-Arduino中文社区 - Powered by Discuz! https://www.arduino.cn/thread-75918-1-1.html
  • TA的每日心情
    开心
    2018-6-6 20:38
  • 签到天数: 104 天

    [LV.6]常住居民II

    发表于 2018-4-15 23:13 | 显示全部楼层
    红外遥控与TONE函数冲突
  • TA的每日心情
    开心
    2018-6-6 20:38
  • 签到天数: 104 天

    [LV.6]常住居民II

    发表于 2018-4-15 23:32 | 显示全部楼层
    18217057382 发表于 2018-4-15 20:11
    #include
    #include
    #include


    红外发声+舵机控制的程序,有状态机的感觉
    把你的库文件传一下,我这边编译报错
    31.JPG
  • TA的每日心情
    奋斗
    2018-4-15 12:56
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2018-4-17 13:50 | 显示全部楼层
    本帖最后由 18217057382 于 2018-4-17 13:59 编辑
    sanhuasr 发表于 2018-4-15 23:32
    红外发声+舵机控制的程序,有状态机的感觉
    把你的库文件传一下,我这边编译报错


    C:\Users\Administrator\AppData\Local\Temp\build8804351567439212512.tmp/core.a(Tone.cpp.o): In function `__vector_7':
    C:\Users\Administrator\Desktop\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Tone.cpp:538: multiple definition of `__vector_7'
    C:\Users\Administrator\AppData\Local\Temp\build8804351567439212512.tmp\IRremote\IRremote.cpp.o:C:\Users\Administrator\Documents\Arduino\libraries\IRremote/IRremote.cpp:131: first defined here
    collect2.exe: error: ld returned 1 exit status
    Multiple libraries were found for "boarddefs.h"

    Used: C:\Users\Administrator\Documents\Arduino\libraries\IRremote

    Not used: C:\Users\Administrator\Desktop\arduino-1.6.5\hardware\arduino\avr\libraries\IRremote

    Not used: C:\Users\Administrator\Documents\Arduino\libraries\Arduino-IRremote-master

    编译有误。

    报错了
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    体验OneNET,登录就送好礼
    体验OneNET,登录就送好礼
    OneNET--中国移动物联网开发平台,解决协议适配、海量连接、数据存储、设备管理等物
    初学arduino求助
    初学arduino求助
    大佬们,我想问一下,我现在想做一个程序:按下开关持续时间t,延迟7.77t后点亮led0.
    Arduino模拟USB鼠标
    Arduino模拟USB鼠标
    [md]### 模拟鼠标控制 下面将使用摇杆模块和Arduino Leonardo模拟USB鼠标。 [/md] [s
    ATK-esp8266WiFi模块
    ATK-esp8266WiFi模块
    我的esp8266模块以前烧进去过一次,半年没玩了。重新烧就提示错误了[/backcolor] 这是
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表