[SOLVED] Sending IR-Code with ATTINY85 ? (iremote library)

Hey you guys/girls,

this is my first post so please be patient :slight_smile:

I want to send an IR-Code through an IR-LED connected to an ATTINY85

I have configured my Arduino Uno (Arduino IDE 1.4) as ISP Programmer for the ATTINY85.

I want to send an IR Code using the IREMOTE Library.

After a lot of trouble i finally got the sketch to upload to the ATTINY85.

The Pin to send a signal on the Arduino Uno is PIN3 (PWM).

Unfortunatly, die PIN3 is configured in the Library, not in the sketch. I want to send the signal on PIN0

(which is also a PWM Pin on the ATTINY85) but i dont know how to change it in the .cpp file

IRremote.cpp (17.3 KB)

IRremote.h (2.61 KB)

IRremoteInt.h (3.39 KB)

IRsendDemo.pde (450 Bytes)

First to cut confusion..... We are talking about a PWM pin. Not a PWR pin. PWM is pulse width modulation.

Sorry, just noticed that....

i AM new to Arduino :slight_smile:

You are not the first to look for this. You might consider this alternative library from Nick Gammon : http://gammon.com.au/Arduino/IRremote_Attiny.zip

This is the one i use. I already searched for a ported library and found it, but the layout with Pin3 being the output-pin seems the same.

Pin3 on Attiny85 is the AnalogIn Pin, so i doubt that you can use PWM on that? I just want to change it to Pin0 where you can use PWN on the Attiny85.

I maybe found out where the problem lies.
This seems to be the piece of code in the cpp-file:

void IRsend::mark(int time) {
 // Sends an IR mark for the specified number of microseconds.
 // The mark output is modulated at the PWM frequency.
#if defined (__AVR_ATtinyX5__)
 TCCR0A |= _BV(COM0B1); // Enable pin 3 PWM output
#else  
 TCCR2A |= _BV(COM2B1); // Enable pin 3 PWM output
#endif
 delayMicroseconds(time);
}
void IRsend::space(int time) {
 // Sends an IR space for the specified number of microseconds.
 // A space is no output, so the PWM output is disabled.
#if defined (__AVR_ATtinyX5__)
 TCCR0A &= ~(_BV(COM0B1)); // Disable pin 3 PWM output
#else
 TCCR2A &= ~(_BV(COM2B1)); // Disable pin 3 PWM output
#endif
   delayMicroseconds(time);
void IRsend::enableIROut(int khz) {
 // Enables IR output.  The khz value controls the modulation frequency in kilohertz.
 // The IR output will be on pin 3 (OC2B).
 // This routine is designed for 36-40KHz; if you use it for other values, it's up to you
 // to make sure it gives reasonable results.  (Watch out for overflow / underflow / rounding.)
 // TIMER2 is used in phase-correct PWM mode, with OCR2A controlling the frequency and OCR2B
 // controlling the duty cycle.
 // There is no prescaling, so the output frequency is 16MHz / (2 * OCR2A)
 // To turn the output on and off, we leave the PWM running, but connect and disconnect the output pin.
 // A few hours staring at the ATmega documentation and this will all make sense.
 // See my Secrets of Arduino PWM at http://arcfn.com/2009/07/secrets-of-arduino-pwm.html for details.

 
 // Disable the Timer2 Interrupt (which is used for receiving IR)
#if defined (__AVR_ATtinyX5__)
 TIMSK &= ~_BV(TOIE0); //Timer2 Overflow Interrupt
#else
 TIMSK2 &= ~_BV(TOIE2); //Timer2 Overflow Interrupt
#endif
 
 pinMode(3, OUTPUT);
 digitalWrite(3, LOW); // When not sending PWM, we want it low
 
 // COM2A = 00: disconnect OC2A
 // COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
 // WGM2 = 101: phase-correct PWM with OCRA as top
 // CS2 = 000: no prescaling
#if defined (__AVR_ATtinyX5__)
 TCCR0A = _BV(WGM00);
 TCCR0B = _BV(WGM02) | _BV(CS00);

 // The top value for the timer.  The modulation frequency will be SYSCLOCK / 2 / OCR2A.
 OCR0A = SYSCLOCK / 2 / khz / 1000;
 OCR0B = OCR0A / 3; // 33% duty cycle
#else
 TCCR2A = _BV(WGM20);
 TCCR2B = _BV(WGM22) | _BV(CS20);

   // The top value for the timer.  The modulation frequency will be SYSCLOCK / 2 / OCR2A.
 OCR2A = SYSCLOCK / 2 / khz / 1000;
 OCR2B = OCR2A / 3; // 33% duty cycle
#endif


}

I wanted a workaround because it is only one signal to send. So i used this code, but somehow the blinking of the IR-LED seems pretty slow. Maybe it has to do with the “delaymicroseconds”.

int IRledPin =  0;
void setup()   {               
  pinMode(IRledPin, OUTPUT);     
  //Serial.begin(9600);
}

void loop()                    
{
  SendChannelUpCode();
  delay(100);
}

void pulseIR(long microsecs) {
 
  cli(); 

  while (microsecs > 0) {
    // 38 kHz is about 13 microseconds high and 13 microseconds low
   digitalWrite(IRledPin, HIGH);  // this takes about 3 microseconds to happen
   delayMicroseconds(10);         // hang out for 10 microseconds
   digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds

   // so 26 microseconds altogether
   microsecs -= 26;
  }
  sei();  // this turns them back on
}


void SendChannelUpCode() {
  delayMicroseconds(36328);      //Time off (LEFT column)       
  pulseIR(280);                               //Time on (RIGHT column)    <-------DO NOT MIX THESE UP
  delayMicroseconds(820);
  pulseIR(300);
  delayMicroseconds(1580);
  pulseIR(320);
  delayMicroseconds(640);
  pulseIR(240);
  delayMicroseconds(1280);
  pulseIR(240);
  delayMicroseconds(1240);
  pulseIR(240);
  delayMicroseconds(1120);
  pulseIR(240);
  delayMicroseconds(2600);
  pulseIR(240);
  delayMicroseconds(12740);
  pulseIR(240);
  delayMicroseconds(840);
  pulseIR(240);
  delayMicroseconds(980);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(720);
  pulseIR(240);
  delayMicroseconds(2460);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(14904);
  pulseIR(240);
  delayMicroseconds(820);
  pulseIR(240);
  delayMicroseconds(1600);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(260);
  delayMicroseconds(2740);
  pulseIR(240);
  delayMicroseconds(1240);
  pulseIR(240);
  delayMicroseconds(1260);
  pulseIR(240);
  delayMicroseconds(1100);
  pulseIR(240);
  delayMicroseconds(2620);
  pulseIR(240);
  delayMicroseconds(12720);
  pulseIR(260);
  delayMicroseconds(840);
  pulseIR(220);
  delayMicroseconds(2080);
  pulseIR(240);
  delayMicroseconds(1780);
  pulseIR(260);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(2480);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
}

Some things to note:

  • delayMicroseconds only works from 1 up to a max of 16383.
  • the first value in your channelupcode ( 36328) is not relevant and can be removed.
  • the timings of your signal appear to inconsistent. How do you know they are accurate/correct?

Can you post the signal you recorded from IRremote (looks line RAW(xx): ....)

I think it doent matter, since it is the time where the led is off (but you are right, i can remove it)
Because i tried this on the arduino, where it send the code via IR LED to a tsot? IR Receiver and it decoded the signal into an HEX value.

I uploaded it to the attiny and tried sending it to the tsot? module on the arduino, but it didnt work.

The numbers inside the brackets are from the IRemote buffer someone has read out.
Link to the original:

The Point i am trying to proof is that after compiling and uploading to attiny85, the delaymicroseconds() is not very accurate probably, because i read that you have to use an external oscillator with 8Mhz to get the timing right. Also, if i point my smartphonecamera at it, the flashes are slower than usual (in comparison with the remote).

In this case it sounds possible that you have not set the fuses correctly on the ATTiny85, particularly if the difference is noticeable with the eye. (Otherwise it could be the calibration of the internal oscillator)

Try blinking an red LED at 1 second intervals and see if it is about right.

You should also be able to calibrate the internal oscillator of the ATTiny85 (OSCCAL??) using a serial connection. You should be able to find some software online to do this (via search)

Also look for TinyTuner, via search.

I will try again tomorrow. Thanks AnalysisIR :slight_smile:

So i got the LED to transmit IR Codes. Thats pretty cool! But on the other hand, my receiver shows different readings, which is bad :stuck_out_tongue: (I followed the instructions of AnalysisIR, see links)

For example, i send the Samsung TV Code

E0E0D02F

but most of the Time, the receiver gets:

E0E0D02
E0E0D
P....(some unknown code, but always the same)

My manual to get the LED to work:

1.) install Attiny85 Core(*): Attiny85, 8Mmhz(internal Oscillator, BOD disabled) in your directory: >documents/arduino/hardware/... (there is a manual in every .zip core-file you download)
1.a) go to examples and select "Arduino as ISP"
1.b) Upload this sketch to the Arduino

2.) Look up MIT's High Low Tech Group Manual how to use your arduino uno as ISP for the ATTINY85
2.b) follow this manual and connect the attiny85 to the arduino uno
2.c) Under "boards" select the Attiny85 Core (*) and press "Burn Bootloader"

Now you need to calibrate the oscillator

3.) Install TinyTuner library and install the "Serial" example to your attiny
3.a) Install the "Bare Minimum" Example to your Arduino (dont forget to select the board)
3.b) Follow further Instruction and wiring here (got it to work with different capacitor and no resistor)
-->http://forum.arduino.cc/index.php?topic=221296.0

Your Oscillator is calibrated if you put the right value in your sketch. A good example can be found here: An ATTiny85 Home Automation IR Device

4.) I took my sketch and added the OSSCAL value and the tinytuner.h library.

Compile and run! Finished.

Great post- with all the helpful tips for others.

Can you post the Output you get from your other arduino in RAW format

looks like Raw (xx): ..... from irrecvDUMP sketch & I will have a look at the signal you are receiving.

Also, how have you the IR LED/emitter wired up and is it pointing directly at the receiver. Bring them closer to see if it helps.

Could you also post the RAW output for your Samsung TV remote captured using the Arduino. (As I mentioned earlier, the timings you are using don't appear good???).

EDIT: another thing to test is to use the same timings when sending from your Arduino!

Button: Volume[-]

Samsung-Raw [received with IRemote on Arduino]:
m4350 s4500 m500 s1700 m500 s1700 m500 s1750 m500 s600 m500 s600 m450 s600 m500 s600 m500 s600 m500 s1750 m500 s1700 m500 s1700 m500 s600 m500 s600 m500 s600 m500 s600 m500 s600 m500 s1700 m500 s1750 m450 s600 m500 s1750 m500 s600 m500 s600 m500 s600 m500 s600 m450 s600 m500 s600 m500 s1750 m500 s600 m500 s1700 m500 s1700 m500 s1750 m500 s1700 m500

Samsung-Code[Decoded with IRemote on Arduino]: 0xE0E0D02F

Transmission of Code:[IRemote on Arduino]
HDRMARK:5000
HDRSPACE:5000
BITMARK:560
ONESPACE:1600
BITMARK:560
ONESPACE:1600
BITMARK:560
ONESPACE:1600
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ONESPACE:1600
BITMARK:560
ONESPACE:1600
BITMARK:560
ONESPACE:1600
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ONESPACE:1600
BITMARK:560
ONESPACE:1600
BITMARK:560
ZEROSPACE:560
BITMARK:560
ONESPACE:1600
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ZEROSPACE:560
BITMARK:560
ONESPACE:1600
BITMARK:560
ZEROSPACE:560
BITMARK:560
ONESPACE:1600
BITMARK:560
ONESPACE:1600
BITMARK:560
ONESPACE:1600
BITMARK:560
ONESPACE:1600
BITMARK:560
Null:0

As you can see, somehow the received raw-data doesnt match the decoded raw format.

This is a bit of the protocol on the Arduino when i send the code from the attiny:

Received unknown code, saving as raw
m6650 s5050 m700 s1650 m700 s1700 m700 s1650 m700 s600 m700 s650 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s1650 m700 s1700 m700 s600 m700 s650 m700 s600 m700 s650 m700 s650 m700 s1650 m700 s1650 m700 s650 m700 s1650 m700 s600 m750 s600 m700 s650 m700 s600 m700 s650 m700 s600 m700 s1700 m700 s600 m700 s1650 m700 s1700 m700 s1650 m700 s1650 m700

Received unknown code, saving as raw
m6650 s5050 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s650 m700 s600 m700 s1700 m700 s1650 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s1650 m700 s650 m700 s1650 m700 s650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s650 m700 s1650 m700 s1650 m700 s1650 m700 s1700 m700

Unexpected codeType 12
E0E0D02

Received unknown code, saving as raw
m6650 s5050 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s600 m750 s600 m700 s650 m700 s600 m700 s1650 m700 s1700 m700 s1650 m700 s600 m700 s650 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s1650 m700 s650 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s600 m750 s1650 m700 s600 m700 s1650 m700 s1700 m700 s1650 m700 s1650 m700

Received unknown code, saving as raw
m6650 s5050 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s1650 m700 s1650 m750 s1650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s600 m700 s1700 m700 s1650 m700 s600 m700 s1700 m700 s600 m700 s650 m700 s600 m700 s650 m700 s650 m700 s600 m700 s1650 m700 s650 m700 s1650 m700 s1650 m700 s1650 m700 s1700 m700

Received unknown code, saving as raw
m6650 s5050 m700 s1650 m700 s1650 m700 s1700 m700 s600 m700 s650 m700 s600 m700 s650 m700 s600 m750 s1650 m700 s1650 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s600 m750 s600 m750 s1600 m700 s1650 m750 s600 m700 s1650 m700 s650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s650 m700 s1650 m700 s1650 m700 s1650 m700 s1700 m700

Received unknown code, saving as raw
m6650 s5050 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s1650 m700 s1650 m750 s600 m700 s650 m700 s600 m700 s650 m700 s600 m700 s1700 m700 s1650 m700 s600 m700 s1700 m700 s600 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s650 m700 s1650 m700 s1650 m700 s1650 m700 s1650 m750

Received unknown code, saving as raw
m6650 s5050 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s650 m700 s600 m700 s1650 m700 s1700 m700 s1650 m700 s600 m750 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s1650 m700 s650 m700 s1650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s650 m700 s600 m700 s1700 m700 s600 m700 s1650 m700 s1650 m700 s1700 m700 s1650 m700

Received unknown code, saving as raw
m6650 s5050 m700 s1650 m700 s1650 m700 s1700 m700 s600 m700 s650 m700 s600 m700 s650 m700 s650 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s1650 m700 s650 m700 s1650 m700 s600 m700 s650 m700 s600 m750 s600 m700 s600 m700 s650 m700 s1650 m700 s650 m700 s1650 m700 s1650 m700 s1650 m700 s1650 m700

Received unknown code, saving as raw
m6650 s5050 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s1650 m700 s1650 m700 s1700 m700 s600 m700 s650 m700 s600 m700 s650 m700 s600 m700 s1700 m700 s1650 m700 s600 m700 s1650 m750 s600 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s600 m700 s1650 m700 s1700 m700 s1650 m700 s1650 m700

Received unknown code, saving as raw
m6600 s5050 m700 s1650 m700 s1650 m700 s1650 m750 s600 m700 s650 m700 s600 m700 s650 m700 s600 m700 s1650 m700 s1650 m750 s1650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s600 m750 s1650 m700 s1650 m700 s600 m700 s1700 m700 s600 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s650 m700 s1650 m700 s1650 m700 s1650 m700 s1650 m700

Received unknown code, saving as raw
m6600 s5050 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s1650 m700 s1650 m700 s1700 m700 s600 m700 s650 m700 s600 m700 s650 m700 s600 m700 s1650 m700 s1650 m750 s600 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s650 m700 s1650 m700 s600 m700 s1650 m700 s1650 m700 s1700 m700 s1650 m700

Received unknown code, saving as raw
m6600 s5050 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s650 m700 s1650 m700 s1650 m700 s1650 m700 s650 m700 s600 m750 s600 m700 s600 m700 s650 m700 s1650 m700 s1650 m750 s600 m700 s1650 m700 s650 m700 s600 m700 s650 m700 s600 m700 s600 m750 s600 m700 s1650 m700 s650 m700 s1650 m700 s1650 m700 s1650 m700 s1650 m700

Unexpected codeType 12
E0E0D02

Unexpected codeType 12
E0E0D02

Unexpected codeType 12
E0E0D02

Unexpected codeType 12
E0E0D02

Received unknown code, saving as raw
m100 s3100 m100 s4100 m250 s1350 m250 s800 m100 s2500 m0

As you can see, the mark and space timings differ sometimes, although the sent code is the same (quality-issues? OSSCAL Value wrong?)

Now i transmit the raw-data from my remote on the attiny and here is the received protocol-data on the arduino:

Unexpected codeType 11
E0E0D02F
Received unknown code, saving as raw
m5800 s4550 m650 s1700 m650 s1750 m650 s1800 m650 s650 m650 s600 m650 s600 m750 s550 m700 s600 m650 s1800 m650 s1750 m650 s1750 m650 s650 m650 s600 m700 s600 m700 s600 m700 s600 m650 s1750 m650 s1800 m600 s600 m650 s1800 m650 s650 m650 s650 m650 s650 m650 s650 m600 s650 m650 s600 m650 s1800 m650 s650 m800 s1600 m650 s1750 m650 s1750 m700 s1700 m650
Unexpected codeType 11
E0E0D02F
Unexpected codeType 11
E0E0D02F
Unexpected codeType 11
E0E0D02F

PS:

To add to more confusion, i tried transmitting another button: the [1]-Button -Code.
Works like a charm for the TV.
It is mysterious why the volume+- codes are considered Samsung-Codes while the 1-9 buttons are not.
They are only available in raw (IRemote doesnt recognize them as Samsung) and transmitted, they work perfectly fine.

My goal here was to make a little "attiny-watch" that students can wear while running. An arduino base-station would receive the IR-Code and clock their time for every round and save the data to an sd-card.

I wanted to test the principle using the TV but after many failed attempts i will use what i have now. I can receive some form of information on the arduino from the attiny and that is enough.

I was pleasantly surprised when the Volume+ code was recognized [90%] by my Arduino-Uno. That is enough for my project.

Thanks to especially AnalysisIR, you helped me big time. (Also, i read your tips to improve IR-Communication and was a "little" concerned about that sunlight-is-not-good-for-it fact...hopefully it will work anyway :stuck_out_tongue: )

PSPS:

If anyone uses the workaround with pulseIR() and delayMicroseconds() instead of the IRemote-library, putting the times into the brackets is a pain.

So just copy the raw-codes into the windows editor and use the "Search&Replace" function (Ctrl+H). Start with replacing:

"s" with "; delayMicroseconds("

and then

"m" with "; pulseIR("
(remember checking "case-sensitive" because there is an "r" in Microseconds)

There will be 2 formal errors:
if the first line is sXXXX you have ;Microseconds(
if the first line is mXXXX you have ;pulseIR(
if the last line is sXXXX you will have to close the line with );
if the last line is mXXXX you will have to close the line with );

Copy the result into your sketch. Done ! :slight_smile:

For the samsung protocol the valid timings are

4500, 560 & 1690.

So just change all your values to the above for better performance.

for example here is a clean Samsung (TV) signal:

Raw (75): 4500,-4500,560,-1690,560,-1690,560,-1690,560,-560,560,-560,560,-560,560,-560,560,-560,560,-1690,560,-1690,560,-1690,560,-560,560,-560,560,-560,560,-560,560,-560,560,-560,560,-1690,560,-560,560,-560,560,-560,560,-560,560,-560,560,-560,560,-1690,560,-560,560,-1690,560,-1690,560,-1690,560,-1690,560,-1690,560,-1690,560,-560,560,-560,560,-560,560,-560,560

I have written a little tool where you can input raw data from the IRemote library and turn it into

pulse:

void pulseIR(long microsecs) {
 
  cli(); 

  while (microsecs > 0) { // 38 kHz is about 13 microseconds high and 13 microseconds low
   digitalWrite(IRledPin, HIGH);  // this takes about 3 microseconds to happen
   delayMicroseconds(10);         // hang out for 10 microseconds
   digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds

   // so 26 microseconds altogether
   microsecs -= 26;
  }
  sei();  // this turns them back on
}

and delayMicroseconds() (which is native to the Arduino IDE like e.g delay() )

You now define a send-function, where your codes are stored:

void SendCode() {
pulseIR(1000);
delayMicroseconds(500);
...
.
}

You can call this send-function wherever you like (in loop() or setup() ) :

void loop(){
// do something...
SendCode();
// do something else if you want...
}

This is the tool (written in Java):

Raw2ino

Raw2ino.zip (1.91 KB)

Can you tell if you modified Nick Gammon’s IRremote Attiny library? Can you share your final sketch? I can’t get IRremote Attiny library to compile.

Hey zasf !

Sorry if you waited too long for an answer :frowning: I actually didnt use the IRemote Library from Nick Gammon at all because for me it didn't work on the Attiny85 :slight_smile: Instead i used a workaround described earlier in the thread using the pulseIR and delayMicroseconds() functions.
If you tune your oscillator right, it will work like a charm and to make editing quick, use my java tool :slight_smile:

Although I didn't get it to work, here is a (maybe) useful link for you: