Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 11 of 11

Thread: IRremote problems with audio sketches.

  1. #1

    IRremote problems with audio sketches.

    I recently had a problem where I couldn't get the serial monitor to connect. As I hadn't updated for a long time I thought it could be this. I did a complete reinstall of Arduino and Teensyduino.

    All worked fine, I can now connect to serial monitor but all my audio sketches with IRremote.h in them no longer compile. If I remove all the IR code, no probs. If I make a sketch with just the IR code on its own, no probs.

    The following is the complete code that used to compile and is actually running on a teensy now but will no longer compile since I updated.

    Code:
    #include <IRremote.h>
    #include <Encoder.h>
    #include <Bounce.h>
    #include <EEPROM.h>
    
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <SerialFlash.h>
    
    // GUItool: begin automatically generated code
    AudioInputI2SQuad        i2s_quad1;      //xy=62,121
    AudioPlaySdWav           playSdWav2;     //xy=71,305
    AudioPlaySdWav           playSdWav1;     //xy=73,236
    AudioMixer4              mixer2;         //xy=218,249
    AudioMixer4              mixer1;         //xy=219,85
    AudioMixer4              mixer3;         //xy=219,317
    AudioMixer4              mixer4;         //xy=224,165
    AudioMixer4              mixer5;         //xy=348,122
    AudioMixer4              mixer6;         //xy=373,255
    AudioMixer4              mixer7;         //xy=490,181
    AudioFilterStateVariable filter1;        //xy=594,38
    AudioFilterStateVariable filter3;        //xy=609,113
    AudioFilterStateVariable filter5;        //xy=611,226
    AudioFilterStateVariable filter2;        //xy=722,35
    AudioFilterStateVariable filter4;        //xy=732,114
    AudioFilterStateVariable filter6;        //xy=738,223
    AudioMixer4              mixer8;         //xy=841,43
    AudioMixer4              mixer9;         //xy=861,131
    AudioMixer4              mixer10;        //xy=865,220
    AudioOutputI2SQuad       i2s_quad2;      //xy=1004,52
    AudioConnection          patchCord1(i2s_quad1, 0, mixer4, 0);
    AudioConnection          patchCord2(i2s_quad1, 1, mixer1, 0);
    AudioConnection          patchCord3(i2s_quad1, 2, mixer1, 1);
    AudioConnection          patchCord4(playSdWav2, 0, mixer3, 0);
    AudioConnection          patchCord5(playSdWav2, 1, mixer3, 1);
    AudioConnection          patchCord6(playSdWav1, 0, mixer2, 0);
    AudioConnection          patchCord7(playSdWav1, 1, mixer2, 1);
    AudioConnection          patchCord8(mixer2, 0, mixer4, 1);
    AudioConnection          patchCord9(mixer1, 0, mixer5, 0);
    AudioConnection          patchCord10(mixer3, 0, mixer6, 1);
    AudioConnection          patchCord11(mixer4, 0, mixer5, 1);
    AudioConnection          patchCord12(mixer5, 0, mixer6, 0);
    AudioConnection          patchCord13(mixer6, 0, mixer7, 0);
    AudioConnection          patchCord14(mixer7, 0, filter1, 0);
    AudioConnection          patchCord15(mixer7, 0, filter3, 0);
    AudioConnection          patchCord16(mixer7, 0, filter5, 0);
    AudioConnection          patchCord17(filter1, 0, filter2, 0);
    AudioConnection          patchCord18(filter3, 0, filter4, 0);
    AudioConnection          patchCord19(filter5, 0, filter6, 0);
    AudioConnection          patchCord20(filter2, 2, mixer8, 0);
    AudioConnection          patchCord21(filter4, 2, mixer9, 0);
    AudioConnection          patchCord22(filter6, 2, mixer10, 0);
    AudioConnection          patchCord23(mixer8, 0, i2s_quad2, 1);
    AudioConnection          patchCord24(mixer9, 0, i2s_quad2, 0);
    AudioConnection          patchCord25(mixer10, 0, i2s_quad2, 3);
    AudioControlSGTL5000     sgtl5000_1;     //xy=67,20
    AudioControlSGTL5000     sgtl5000_2;     //xy=195,20
    // GUItool: end automatically generated code
    
    
    #define SDCARD_CS_PIN    10
    #define SDCARD_MOSI_PIN  7
    #define SDCARD_SCK_PIN   14
    
    const int ledPin1 =  3;
    const int ledPin2 =  4;
    const int ledPin3 =  5;
    
    
    #define RECV_PIN      2
    uint16_t lastCode = 0;
    const uint16_t BUTTON_volup = 0xFFA857; //ir remote codes
    const uint16_t BUTTON_voldown = 0xFFE01F;
    const uint16_t BUTTON_back = 0xFF22DD;
    const uint16_t BUTTON_stop = 0xFFC23D;
    const uint16_t BUTTON_fwd = 0xFF02FD;
    const uint16_t BUTTON_1 = 0xFF30CF;
    const uint16_t BUTTON_2 = 0xFF18E7;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    int volstore ;
    float vol =  0.0  ;
    
    Bounce button1 = Bounce(8, 15);  // 15 = 15 ms debounce time
    Encoder myEnc(1, 0);
    float oldPosition1  = 0.0;
    
    
    void setup() {
      
     irrecv.enableIRIn();
     pinMode (RECV_PIN, INPUT);
     
      AudioMemory(60);
      
      Serial.begin(9600);
     
      
     
    
     pinMode(ledPin1, OUTPUT);
     pinMode(ledPin2, OUTPUT); 
     pinMode(ledPin3, OUTPUT);
    
     pinMode(8, INPUT_PULLUP);
    
      SPI.setMOSI(SDCARD_MOSI_PIN);
      SPI.setSCK(SDCARD_SCK_PIN);
      if (!(SD.begin(SDCARD_CS_PIN))) {
        while (1) {
          Serial.println("Unable to access the SD card");
          delay(500);
        }
      }
    
      
      sgtl5000_1.setAddress(LOW);
      sgtl5000_1.enable();
      sgtl5000_1.lineOutLevel(13);
      sgtl5000_1.lineInLevel(0);
      sgtl5000_1.muteHeadphone();
    
      
      sgtl5000_2.setAddress(HIGH);
      sgtl5000_2.enable();
      sgtl5000_2.lineOutLevel(13);
      sgtl5000_2.lineInLevel(0);
      sgtl5000_2.muteHeadphone();
      
    // bass filter set
      filter1.frequency(200);
      filter2.frequency(40);
      
    // mid filter set
      filter3.frequency(8000);
      filter4.frequency(200);
      
    // high filter set
      filter5.frequency(18000);
      filter6.frequency(8000);
    
    // SD1 to mono
       mixer2.gain(0, 0.5);
       mixer2.gain(1, 0.5);  
    
    // SD2 to mono 
       mixer3.gain(0, 0.5);
       mixer3.gain(1, 0.5);
       
    // set sd2 to 0
       mixer6.gain(0, 1.0 );  
       mixer6.gain(1, 0.0 );
    
    // set main vol to 0
       mixer7.gain(0, 0.0); 
         
         // set bass vol to 0
       mixer8.gain(0, 0.0);
       
       // set mid vol to 0
       mixer9.gain(0, 0.0);
       
       // set high vol to 0   
       mixer10.gain(0, 0.0);
        
       EEPROM.get(20,volstore);
       delay(5);
       Serial.println(volstore); 
     float vol = (float)volstore / 100;
        mixer7.gain(0, vol);
     Serial.println( vol);    
    }
    
    void loop() {
     digitalWrite(ledPin3, HIGH);
    
     
      // saves current volume in eeprom  when pressed
      button1.update();
      if (button1.fallingEdge()) {
            EEPROM.update(20,volstore);
         delay (5);
         digitalWrite(ledPin3, LOW);
         digitalWrite(ledPin2, HIGH);
         delay(100);
         digitalWrite(ledPin2, LOW);
     }
      
      
        float newPosition = myEnc.read();
      if (newPosition != oldPosition1) {
       oldPosition1 = newPosition;
      // Serial.println(newPosition);
     vol = (float)volstore / 100;
        vol = vol + (newPosition / 20);
       
        if (vol>3){
          vol = 3;}
          if (vol<0.00){
          vol = 0.00;}
           Serial.println("vol");
           Serial.println(vol); 
          mixer7.gain(0,vol);
           volstore = vol * 100;
        Serial.println(volstore);
     //   EEPROM.put(10,volstore);
      //  delay (10);
     //    Serial.println(EEPROM.read(10));
         
      myEnc.write(0);
       }
       
    // Pan between line1 and line2    
      int line = analogRead(A6);  
      float line1 = (float)line / 1023.0;
      float line2 = 1.0 - line1;  
      mixer1.gain(0, line1 );  
      mixer1.gain(1, line2 );
     // Serial.println("mic1");
     // Serial.println(line1);
     
     
    // Pan between bluetooth and sd1
      int mic = analogRead(A3);  
      float mic1 = (float)mic / 1023.0;
      float mic2 = 1.0 - mic1; 
      mixer4.gain(0, mic1 );
      mixer4.gain(1, mic2 ); 
    //  Serial.println("music1");
     // Serial.println(mic1);
      
    // Pan between mic and music mixes
      int mix = analogRead(A2);  
      float mix1 = (float)mix / 1023.0;
      float mix2 = 1.0 - mic1; 
      mixer5.gain(0, mix1 );
      mixer5.gain(1, mix2 ); 
    //   Serial.println("mix1");
    //  Serial.println(mix1);
      
    // Bass volume
      int knob = analogRead(A17);
      float bass = (float)knob / 1023.0;
      mixer8.gain(0,bass);
      
    // Mid volume
      int knob1 = analogRead(A16);
      float mid = (float)knob1 / 1023.0;
      mixer9.gain(0,mid);
    
    // High volume
      int knob2 = analogRead(A7);
      float high = (float)knob2 / 1023.0;
      mixer10.gain(0,high);
      
     //set level between sd1/line1/line2/blue and sd2 while sd2 is playing    
    
     if (playSdWav2.isPlaying() == true) {
       
        mixer6.gain(0, 0.5 );  
        mixer6.gain(1, 0.5 );
         }
         else {
         mixer6.gain(0, 1.0 );  
         mixer6.gain(1, 0.0 );
          }
        
     // ir buttons and decoder 
    {
      if (irrecv.decode(&results)) {
        uint16_t resultCode = (results.value & 0xFFFF);
        if (resultCode == 0xFFFF)
          resultCode = lastCode;
        else
          lastCode = resultCode;
        switch (resultCode)
        {
          
          case BUTTON_volup:
          vol = (float)volstore / 100;
          vol = vol + 0.1;
       
        if (vol>3){
          vol = 3;}
          if (vol<0){
          vol = 0;}
          Serial.println(vol); 
          mixer7.gain(0,vol);
           volstore = vol * 100;
        Serial.println(volstore);
      
            break;
    
        case BUTTON_voldown:
        vol = (float)volstore / 100;
          vol = vol - 0.1;
       
        if (vol>3){
          vol = 3;}
          if (vol<0){
          vol = 0;}
           Serial.println(vol); 
          mixer7.gain(0,vol);
           volstore = vol * 100;
        Serial.println(volstore);
      
            break;
            
          case BUTTON_back:
         //  digitalWrite(backbutton, HIGH);
           delay(500 );
       //    digitalWrite(backbutton, LOW);
           //   Serial.println("back");
            break;
          
          
          case BUTTON_stop:
           playSdWav1.stop();
           playSdWav2.stop();
            break;
            
           case BUTTON_fwd:
         //  digitalWrite(fwdbutton, HIGH);
           delay(500);
       //    digitalWrite(fwdbutton, LOW);
           //   Serial.println("forward");
            break;
             
         
          case BUTTON_1:
              playSdWav1.stop(); 
             Serial.println("wav1");
              playSdWav1.play("1.WAV");
              delay(10); // wait for library to parse WAV info
               break;
          
       
          case BUTTON_2:
              playSdWav1.stop(); 
             Serial.println("wav2");
              playSdWav1.play("2.WAV");
              delay(10); // wait for library to parse WAV info
               break;
       
             
          
          default:
            Serial.print("Unrecognized code received: 0x");
            Serial.println(results.value, HEX);
            break;
        }
    
        irrecv.resume();
      }
    }
     
    
    }

  2. #2
    Any help greatly appreciated, lemme know if I need to give more info.

  3. #3
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,134
    I don't know why this works, but move all of these #includes:
    Code:
    #include <IRremote.h>
    #include <Encoder.h>
    #include <Bounce.h>
    #include <EEPROM.h>
    to just before this:
    Code:
    #define SDCARD_CS_PIN    10
    Pete
    P.S. I'm using Arduino 1.8.9 and TD 1.47 beta 4 and compiled it for a T3.6

  4. #4
    Thank you, you lovely person! It works again, woot! woot!

    Not sure why either but I do remember having some issues with the order of the IR stuff before.

  5. #5
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,134
    I played with the order of the includes. It appears to be an interaction between Audio.h and IRremote.h.
    This works:
    Code:
    #include <Encoder.h>
    #include <Bounce.h>
    #include <EEPROM.h>
    
    #include <Audio.h>
    #include <IRremote.h>
    but this fails:
    Code:
    #include <Encoder.h>
    #include <Bounce.h>
    #include <EEPROM.h>
    
    #include <IRremote.h>
    #include <Audio.h>
    I tried some other variations but as long as IRremote.h is included after Audio.h there is no problem.
    I may dig into this later in the afternoon.

    Pete

  6. #6
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,134
    The problem is that both the IRremote library (in IRremoteInt.h) and the Audio library (in synth_wavetable.h) use the name STATE_IDLE. Either or both of them should use a more specific name, e.g. IR_STATE_IDLE and AUDIO_STATE_IDLE, or maybe there's a better way to fix them.

    Pete

  7. #7
    Nice work, thanks again for taking the time.

  8. #8
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,134
    BTW. The compiler gives a warning for each of these:
    Code:
    const uint16_t BUTTON_volup = 0xFFA857; //ir remote codes
    const uint16_t BUTTON_voldown = 0xFFE01F;
    const uint16_t BUTTON_back = 0xFF22DD;
    const uint16_t BUTTON_stop = 0xFFC23D;
    const uint16_t BUTTON_fwd = 0xFF02FD;
    const uint16_t BUTTON_1 = 0xFF30CF;
    const uint16_t BUTTON_2 = 0xFF18E7;
    because they are 24 bits but being crammed into 16 bits. Shouldn't those be uint32_t ? If so, so should this:
    Code:
    uint16_t lastCode = 0;
    Pete

  9. #9
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    20,303
    Quote Originally Posted by el_supremo View Post
    The problem is that both the IRremote library (in IRremoteInt.h) and the Audio library (in synth_wavetable.h) use the name STATE_IDLE. Either or both of them should use a more specific name, e.g. IR_STATE_IDLE and AUDIO_STATE_IDLE, or maybe there's a better way to fix them.
    Thanks for digging into this issue. I've put it on my (low priority) list of bugs to fix.

  10. #10
    Quote Originally Posted by el_supremo View Post
    BTW. The compiler gives a warning for each of these:
    Code:
    const uint16_t BUTTON_volup = 0xFFA857; //ir remote codes
    const uint16_t BUTTON_voldown = 0xFFE01F;
    const uint16_t BUTTON_back = 0xFF22DD;
    const uint16_t BUTTON_stop = 0xFFC23D;
    const uint16_t BUTTON_fwd = 0xFF02FD;
    const uint16_t BUTTON_1 = 0xFF30CF;
    const uint16_t BUTTON_2 = 0xFF18E7;
    because they are 24 bits but being crammed into 16 bits. Shouldn't those be uint32_t ? If so, so should this:
    Code:
    uint16_t lastCode = 0;
    Pete

    Haha, you are highlighting my noobitude. Most of my sketches have come from examples and code shared online, cobbled together and I don't have a huge understanding of how it all works. Mostly I'm just persistent enough to shuffle it until it works.

    I tried using uint32_t instead as per your suggestion but it then spits out all codes as unrecognised and ignores the actions attached to them.

    It's working fine as before though

  11. #11
    Senior Member
    Join Date
    Nov 2012
    Posts
    1,134
    Code:
        uint16_t resultCode = (results.value & 0xFFFF);
        if (resultCode == 0xFFFF)
    .
    .
        switch (resultCode)
        {
          
          case BUTTON_volup:
    The problem is that the result value from IRremote is declared to be a long integer. But you truncate that to 16 bits and store it in a 16-bit integer (resultCode) and then use that as the value for the switch statement. That then clashes with BUTTON_volup etc. being defined to be uint32_t.
    For now, I'd suggest you try using these two lines in place of the first two above:
    Code:
        uint32_t resultCode = (results.value & 0xFFFFFF);
        if (resultCode == 0xFFFFFF)
    This will detect a REPEAT code but you should be aware that REPEAT is actually defined to be 0xFFFFFFFF.

    Pete

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •