Introduction: How to Use the IR Library With an Attiny

Picture of How to Use the IR Library With an Attiny

This Instructable will tell you how to use the IR (infrared) library on an Attiny. I will be using an Attiny85 with an Arduino Uno. I won't cover how to upload sketches to the Attiny just how to use the IR library with it. the best tutorial on uploading sketches I've found is this YouTube tutorial :

(a quck note and warning, You will need to have software serial working for the attiny (follow this instructable : or google it

Step 1: Getting the Files

Picture of Getting the Files

Hey Guys this instructables is a bit old and I would recommend using the arduino 1.0.5 Ide and it should work just fine as the newer updated Ides have been changed so this no longer works. Just download the 1.0.5 ide as a zip file from the arduino site and extract it to a different directory to your current ide so they don't interfere with each other.

The main issues that you would come across when trying to use the IR library with an Attiny are errors like this:

C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:229: error: 'TCCR2B' was not declared in this scope

this is all to do with different timers on the Attiny than the Atmega chip but we don't need to worry about it unless you want to change the library code (THAT IS SOME HARD STUFF DON'T CHANGE THE CODE) but there are some libraries or the same library just ported to the Attiny so the codes we write is the same as it is for the arduino. you can download the zip file here :

Just extract the files and put the IRremote file in the libraries folder in the the arduino folder the path should look like

C:\Users\(your user)\Documents\Arduino\libraries

you will also need to download this for the next step:

Step 2: Fixing the Final Error

Picture of Fixing the Final Error

Hopefully if you try to upload a sketch utalising the IR library you should now be left with this error

c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o:(.init9+0x2): relocation truncated to fit: R_AVR_13_PCREL against symbol `exit' defined in .fini9 section in c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_exit.o)

But don't worry if you don't you may likely be using the wrong core so just skip to step 4 (Troubleshooting) and come back to this step.

if you have the error above you are going to need to extract the second download from the last step ( this step is quite easy just copy the hardware folder to the hardware folder in where you installed the arduino ide (IT IS NOT WHERE WE PUT THE IR LIBRARY FOLDER) it will be some where in your program files (x86) (or the version for your operating system and pc). The path for mine is:

C:\Program Files (x86)\Arduino\hardware

once you copy it it will ask you if you want to replace Id.exe (make sure its only Id.exe and nothing else) select replace and let it copy (it doesn't affect the normal ide so once its there you don't need to worry.

if you are using a mac read reply #4 on this thread:

Step 3: A Bit of Code

Picture of A Bit of Code

This step is about code that I used to first get this working it was code that i used on the arduino except different pin numbers due to the less amount of pins on the attiny85. however for this code you will need to use an arduino and the serial monitor just so you can find out the code the buttons use. all the code and can be found here :

Step 4: Troubleshooting

Picture of Troubleshooting

If in step 2 you did not get the different error you probably are using the wrong. the core used for software serial should work but if it doesn't then you can download this one:

follow the installation guide in the read me file if your computer says that it can't open it just browse for a program and open it in note pad it should open just fine anyway.

If you want to switch back to using the IR library for the Arduino and not the Attiny the you will need to replace the ported library with the regular library which you can download from here:

i hope this helps this is my first instructable if there are any problems feel free to message me as i know it van be hard to find a straight tutorial for this on the internet. All the infomation in this tutorial came from these sites:


seejaydee (author)2016-07-26

I have modified the library and it now works perfectly (tested on an ATtiny85). Follow the same instructions as for

You'll need to change the #include names but everything else is identical.

IV0 (author)seejaydee2016-07-26


I spent a lot of time with the library described in this tutorial... Finaly I managed to compile the code and uploade it to the attiny, but everytime I press a button of my remote, the code is 0. Maybe something is wrong with the library. I tried your library, but it gives an error when it is compiling:

core.a(wiring.c.o): In function `__vector_4':

C:\Users\User\Documents\Arduino\hardware\attiny\cores\tiny/wiring.c:78: multiple definition of `__vector_4'

tiny_IRremote\tiny_IRremote.cpp.o:C:\Users\Deana\Documents\Arduino\libraries\tiny_IRremote/tiny_IRremote.cpp:271: first defined here

I didnt find that __vector_4 anywhere... Can you pease help me?

I am using Arduino IDE 1.0.5 r2, the attiny cores described in this tutorial and the patch too.


seejaydee (author)IV02016-07-26

I'm using Arduino 1.6.4 and set the board to "Adafruit Trinket 8MHz" (also uses the attiny85). I followed the instructions at to add support for the attiny. You still need to "upload using programmer" etc

No "patch" either. This instructable is somewhat dated. Go to 1.6 you won't regret it.

Nemac (author)seejaydee2017-09-27

Hello.. I try to follow your instructions but nothing happens :(
Can you PLEASE give some closer instructions how you manage to make it work.. I done some coding, mostly editing and combining some sketches and on arduino uno, all works fine. When I try to upload to attiny85, no errors, but nothing works.. PLEASE HELP :(

seejaydee (author)IV02016-07-26

What other libraries are you running?

tiny_IRremote uses Timer1, and it sounds like another of your libraries is also using that timer.

The error output is referring to line 78 of Arduino/Hardware/attiny/cores/tiny/wiring.c and line 271 of libraries/tiny_IRremote/tiny_IRremote.cpp

Tell me what code is on those lines and I will be able to help more.
If you haven't already got it, look up "Notepad++" and install it. It's great for editing code.

IV0 (author)seejaydee2016-07-27

Thank you for the fast response.

I deleted everything. I instaled IDE 1.6.4 and the adafruit boards. The __vector4_ error doesn´t appear anymore. But there is another error. The Trinket uses a bootloader, wich takes 3Kb of the flash memory, leaving 5Kb for the scketch, so I wasn´t able to upload the scketch. I installed the attiny85 on the IDE following this tutorial: (It has allways worked for me with attiny85)

And I was able to upload the code, but... the same thing... 0. Allways 0... on any button...0... For the reading I am using Software Serial library at 2400 baud rate and works fine.

The IR pin is 4 (on tue attiny). Power comes from an Arduino UNO, IR sensor works ok with arduino and original library.

Any suggestions?

Thanks againg.

maths_nerd (author)IV02016-08-27

Hello IV0 i am getting all buttons as 0 too :/ have you been able to solve the problem? thank you

seejaydee (author)maths_nerd2017-02-02

see venumz's comment below

IV0 (author)maths_nerd2016-09-12

Hello maths_nerd. I didn't manage to solve the problem. I had to use an atmega328p with the regular IR arduino libaries to finish the proyect. If you have succes with this, please write me, I'm still interested in trying IR with an attiny.

Thank you!

seejaydee (author)IV02017-02-02

See venumz's comment below

Thank you very much. i have downloaded your above file and did the rest.its worked.again thank you.

runr (author)seejaydee2017-05-13

can please make video on uploading ir lib to attiny using ardiuno ide

runr (author)seejaydee2017-05-11

can we apply it for attiny 45

venumz (author)seejaydee2017-01-30

Awesome, you made my day man. I've looked everywhere (literally) and this is the only working code that I have found.

In case anyone have issues, I have used the tiny core from:

You need to change the timer for millis in the attiny core:

edit the file tiny/avr/cores/tiny/core_build_options.h
look out for tiny85 section and leave the timer define like:

Then burn the bootloader "ATtiny85 @ 16MHz (internal PLL;4.3V BOD)"

If you accept donations I would gladly pay you two paints of beer, so let me know!

seejaydee (author)venumz2017-02-02

Thanks man! I'm glad you found it useful :)

That millis() thing is pretty odd. I must've missed it because I converted all my delay() and millis() calls into delayMicroseconds() and micros() in order to make the sketch fit in the flash! xD

Curiously, if you examine the file Arduino\hardware\arduino\avr\cores\arduino\wiring.c there is a preprocessor statement:
`#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)

This is the version of wiring.c which ships with the IDE by default, and it's quite odd that it checks for ATtiny*4 but not ATtiny*5. However in Arduino.h there is a statement which checks for both! I will raise this as an issue on the repo.

As for beer, thanks for the offer (i <3 beer) but the fact someone found my code useful is a reward in and of itself :)
Have a drink for me!

venumz (author)seejaydee2017-02-02

Thanks seejaydee, I have finally a working prototype of an IR receiver for my
linux media center that I can program to work with most IR transmitters.

Your library and the library v-usb for arduino made the trick.

After reading the info that you posted before, I noticed as well differences for the attiny85 regarding the original configuration for the timer in the tiny core I linked before:

For various reasons, Timer 1 is a better choice for the millis timer on the
'85 processor.

Only the attiny85 was configured to use interrupt1 for the millis timer, all the other micro-controllers where configured to use interrupt0.

Many people are having issues due to that very fact and I wonder why the developer of the core chose that configuration.

Thanks again for your cool code!

mytestingtempmail (author)2017-07-20

Thank you

runr (author)2017-05-13

can yoy please make video on this

AmarnathK (author)2017-04-02

thank u very much

arifraza (author)2016-10-05

Its a Nice wqork

ok2chatt made it! (author)2016-03-12

Was a bit of a pain to get this working, but well worth it. I have a few ideas for this and with the compact size of the trinket, this will work perfectly.

MisloElectronics made it! (author)2016-01-07

thank you very much I was able to complete my project...I had trouble with the last three sensors but with the first three sensors working perfectly...I'm working on the second project with PWM and i have big problems :)

Canito75 (author)2015-09-14

Is it possible to provide an sketch example and the schematic? I followed this tutorial step by step using the the same IDE suggested version. The only part I made different is to burn the bootloader for an Atiny85 8Mhz using the 1.6.4 IDE version. My sketch seems to upload without any problem, but it doesn't work when I use the IR remote control.

This is my sketch:

typedef struct Buleanos {

int mibuleano;

} Buleano;

#include <IRremote.h>

int IR_Recv = 4;

int Led = 0;

Buleano bulPower;

IRrecv irrecv(IR_Recv);

decode_results results;

void setup(){

Serial.begin(9600); //starts serial communication

irrecv.enableIRIn(); // Starts the receiver

bulPower.mibuleano = 0; //0 off, 1 on

pinMode(Led, OUTPUT);


void loop(){

//decodes the infrared input

if (irrecv.decode(&results)){

//long int decCode = results.value;

Serial.println(results.value, DEC);

//switch case to use the selected remote control button

switch (results.value){

case 3810010651: //power button

if (bulPower.mibuleano == 1) { //lights turn on

digitalWrite(Led, HIGH);


if (bulPower.mibuleano == 0) { //lights turn off

digitalWrite(Led, LOW);


if (bulPower.mibuleano == 0)

bulPower.mibuleano = 1;


bulPower.mibuleano = 0;





irrecv.resume(); // Receives the next value from the button you press




nakouzia (author)2015-08-26

I still have this error:


Arduino: 1.6.5 (Windows 8.1), Board: "ATtiny, ATtiny45, 1 MHz (internal)"

In file included from C:\arduino\libraries\IRremote\IRremote.cpp:13:0:

C:\arduino\libraries\IRremote\IRremoteInt.h:15:22: fatal error: WProgram.h: No such file or directory

#include <WProgram.h>


I still can't make it work on tiny 45, even the cores and the libraries are installed...

any solution?!?!

ayushjain114 (author)nakouzia2015-09-12


For this error :C:\arduino\libraries\IRremote\IRremoteInt.h:15:22: fatal error: WProgram.h: No such file or directory

#include <WProgram.h>

Go to library folder where your IR library for attiny is present , there go to Irremoteint.h ,,, in that library , change #include <Wprogram.h> to #include<Arduino.h>

It works for me

m2_farzan (author)2015-07-11

I found this page helpful too:

AymanK2 (author)2015-07-09

C:\Program Files\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5:16: error: 'TKD2' was not declared in this scope
int RECV_PIN = TKD2; // the pin the IR receiver is connected to
Error compiling.

m2_farzan (author)AymanK22015-07-10

If I remember correctly, this error raises when Arduino compiler mixes up our desired IRRemote library with RobotIRremote library, so all you have to do is temporarily removing RobotIRremote folder from "C:\Program Files\Arduino\libraries\RobotIRremote". Also make sure you've already copied IRRemote library to the path.

NikolajG (author)2015-05-16

I have an attiny84 and i am able to send the ir codes, but i cant get the reciever to work. i have the following code:

int RECV_PIN = 7;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
pinMode(9, OUTPUT);
irrecv.enableIRIn(); // Start the receiver

void loop() {
if (irrecv.decode(&results)) {
//Serial.println(results.value, HEX);
digitalWrite(9, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(9, LOW);
irrecv.resume(); // Receive the next value

I have an LED connected to pin 9 and the ir reciever conected to pin 7.
But the LED does not blink.
Hope someone can help me

Sheerforce (author)NikolajG2015-06-21

Your include statement on the first line has no parameters, change it to

#include <IRremote.h>

joeybab3 (author)2014-10-26

I get: error: 'volatile struct irparams_t' has no member named 'rawlen'

rwhite19 (author)joeybab32015-05-25

Hey I'm really sorry about the long reply I had lots to do . So does the error occur with the original IR library on the arduino Uno? And are you on a PC or Mac?

joeybab3 (author)rwhite192015-05-25

wow idk its been a while ill see if i still get that

orestman (author)joeybab32015-01-05

I am getting the shame error, no matter what board i choose.And when I copy the hardware folder from tinyPCRELpatch into the hardware folder it doesnot ask me to replace anything.Why?????

Ploopy (author)2015-02-21


But I keep getting this error :

warning: 'TIMER2_COMPA_vect' appears to be a misspelled signal handler

This is for the IRrecvDemo sketch. My core is "ATtiny85 (internal 8MHz clock)

This is the full error:

Arduino: 1.0.6 (Mac OS X), Board: "ATtiny85 (internal 8 MHz clock)"

/Applications/ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=attiny85 -DF_CPU=8000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=106 -I/Applications/ -I/Users/luigipizzolito/Documents/Arduino/hardware/attiny/variants/tiny8 -I/Users/luigipizzolito/Documents/Arduino/libraries/IRremote /var/folders/gb/cl6mrjbs3vq4hz2wmlpvxprc0000gq/T/build2445791945727236569.tmp/IRrecvDemo.cpp -o /var/folders/gb/cl6mrjbs3vq4hz2wmlpvxprc0000gq/T/build2445791945727236569.tmp/IRrecvDemo.cpp.o

In file included from /Applications/,

from /Applications/,

from /Applications/,

from IRrecvDemo.ino:11:

/Applications/ warning: "BIN" redefined

In file included from /Applications/,

from /Applications/,

from /Applications/,

from /Applications/,

from IRrecvDemo.ino:11:

/Applications/ warning: this is the location of the previous definition

/Applications/ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=attiny85 -DF_CPU=8000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=106 -I/Applications/ -I/Users/luigipizzolito/Documents/Arduino/hardware/attiny/variants/tiny8 -I/Users/luigipizzolito/Documents/Arduino/libraries/IRremote -I/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/utility /Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp -o /var/folders/gb/cl6mrjbs3vq4hz2wmlpvxprc0000gq/T/build2445791945727236569.tmp/IRremote/IRremote.cpp.o

In file included from /Applications/,

from /Applications/,

from /Applications/,

from /Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremoteInt.h:20,

from /Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:20:

/Applications/ warning: "BIN" redefined

In file included from /Applications/,

from /Applications/,

from /Applications/,

from /Applications/,

from /Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremoteInt.h:20,

from /Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:20:

/Applications/ warning: this is the location of the previous definition

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:941: warning: this decimal constant is unsigned only in ISO C90

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp: In member function 'void IRsend::mark(int)':

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:227: error: 'TCCR2A' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:227: error: 'COM2B1' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp: In member function 'void IRsend::space(int)':

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:235: error: 'TCCR2A' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:235: error: 'COM2B1' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp: In member function 'void IRsend::enableIROut(int)':

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:253: error: 'TIMSK2' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:263: error: 'TCCR2A' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:263: error: 'WGM20' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:263: error: 'TCCR2B' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:263: error: 'WGM22' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:263: error: 'CS20' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:263: error: 'OCR2A' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:263: error: 'OCR2B' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp: In member function 'void IRrecv::enableIRIn()':

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:279: error: 'TCCR2A' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:279: error: 'WGM21' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:279: error: 'TCCR2B' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:279: error: 'CS21' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:279: error: 'OCR2A' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:279: error: 'TCNT2' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:282: error: 'TIMSK2' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:282: error: 'OCIE2A' was not declared in this scope

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp: At global scope:

/Users/luigipizzolito/Documents/Arduino/libraries/IRremote/IRremote.cpp:311: warning: 'TIMER2_COMPA_vect' appears to be a misspelled signal handler

KiralyCraft (author)2014-12-05

This actually works & compiles. But what about sending IR codes? What pin is used for that?

gallobruno (author)2014-11-14


About This Instructable




Add instructable to: