top of page
Search

Flipper Zero–Style IR/RF Control On A Budget: I Built An Arduino Garage And AC Remote

Writer: Sanzhi Kobzhan
Sanzhi Kobzhan
5 days ago
7 min read
Flipper Zero–Style IR/RF Control
Flipper Zero–Style IR/RF Control

I wanted to see how much remote-control functionality I could build around a basic Arduino Uno.


The result is a compact device (code and wiring schema provided) that can learn one infrared command from my air conditioner remote and one compatible 433 MHz radio-frequency command from my garage remote, save both commands, and transmit either one from a four-option menu.


This project is for learning and authorized personal use only: people should test it only with a garage door and air conditioner they own or have explicit permission to operate.


Key Takeaways


  • One Arduino Uno manages IR reception, IR transmission, 433 MHz RF reception, RF transmission, an LCD, and joystick navigation.

  • The device stores one IR signal and one RF signal in EEPROM, so both remain available after power is disconnected.

  • The LCD menu separates learning from transmission through four commands: IR Receive, IR Send, RF Receive, and RF Send.

  • The RF function works with compatible fixed-code 433 MHz ASK/OOK remotes, but it does not defeat rolling-code or encrypted garage systems.


Why I Built This Device


Many home devices still use simple remote-control interfaces. Air conditioners commonly receive infrared commands, while some garage systems use radio signals. I wanted one physical controller that could learn both types without depending on a phone, cloud service, or internet connection.


The idea resembles a small part of what a multipurpose device such as a Flipper Zero can do, but the goal was narrower. I was not trying to build a universal security tool. I wanted a transparent Arduino project that shows how signals are received, stored, selected, and transmitted.


What The Finished Controller Does


The device starts on a menu displayed on a 16×2 I²C LCD. Moving the joystick up or down cycles through four options:


  1. IR Receive

  2. IR Send

  3. RF Receive

  4. RF Send


Moving the joystick left selects the highlighted option. Moving it right cancels the current action or returns to the main menu.


flipper zero like device for IR/RF control
flipper zero like device for IR/RF control

IR Receive waits for a command from the original air-conditioner remote. When a valid signal arrives, the Arduino replaces the previously stored IR signal. RF Receive follows the same pattern for a compatible 433 MHz remote and replaces only the saved RF signal.

The device therefore stores exactly two commands: one IR command and one RF command. Saving a new IR command does not erase the RF command, and saving a new RF command does not erase the IR command.


Then I can transmit recorded IR/RF signals to manage my AC or garage.


Parts I Used


The project uses inexpensive modules that are widely available for Arduino prototyping:


  • Arduino Uno R3

  • 433 MHz RF transmitter and receiver module

  • KY-005 IR transmitter and KY-022 IR receiver kit

  • 16×2 LCD with an I²C adapter

  • Analog joystick module

  • Perfboard

  • Male-to-Female jumper wires

  • USB data cable for programming and power


How IR And RF Differ


Infrared requires a direct optical path. I point the original remote toward the KY-022 during learning and aim the KY-005 toward the air conditioner during transmission. The Arduino-IRremote library records the spacing and duration of the infrared pulses, then reproduces that timing through a 38 kHz carrier.


The RF modules use radio rather than light, so they do not require line of sight. They operate around 433 MHz with amplitude-shift keying or on-off keying. The rc-switch library attempts to identify the value, bit length, protocol, and pulse length. Frequency, modulation, and encoding must all be compatible.


How I Connected The Hardware


I powered the modules from the Arduino's 5V and GND connections. Every module shares the same ground.


Wiring schema

Component

Module Pin

Arduino Uno Pin

I²C LCD

VCC

5V

I²C LCD

GND

GND

I²C LCD

SDA

A4

I²C LCD

SCL

A5

IR receiver

S / OUT

D2

IR receiver

VCC

5V

IR receiver

GND

GND

IR transmitter

S / SIG

D5

IR transmitter

VCC

5V

IR transmitter

GND

GND

RF receiver

DATA

D3

RF receiver

VCC

5V

RF receiver

GND

GND

RF transmitter

DATA

D6

RF transmitter

VCC

5V

RF transmitter

GND

GND

Joystick

VRx

A0

Joystick

VRy

A1

Joystick

+5V

5V

Joystick

GND

GND

The RF receiver may have two DATA pins. On this common module design, either DATA output can be used; I connected one of them to D3.


Pin selection became important when I combined everything. The RF receiver needs an interrupt-capable Uno pin, so I assigned it to D3. I kept the IR receiver on D2 and moved the IR transmitter signal to D5. The RF transmitter uses D6.


Fixing The Joystick Direction


The joystick created one of the most instructive problems in the build. Its printed VRx and VRy labels did not match the physical directions I expected after I mounted it. Moving the stick down was initially interpreted as an Enter command.


The wiring remained VRx to A0 and VRy to A1, but I changed the software mapping. The program now treats A0 as physical up/down navigation and A1 as physical left/right control. Both high and low movement on A0 change the menu item, while left selects and right returns to the main menu.


How The Code Stores Two Signals


The Arduino Uno includes 1 KB of EEPROM, which retains data without power. I divided it into two records. The IR record holds its raw timing array and length; the RF record holds the decoded value, bit length, protocol, and pulse length. Both include identifiers and checksums so the program can reject invalid saved data during startup.


The records remain separate. A new air-conditioner command overwrites only the IR record, while a new garage command overwrites only the RF record.


Learning And Sending An IR Command


To learn an infrared command, I select IR Receive, point the original remote at the KY-022, and press the desired button. The program ignores very short noise signals, repeat frames, automatic repeats, and captures that exceed the configured buffer.


When the capture is valid, the raw timing sequence is saved to EEPROM and printed to the Serial Monitor. Selecting IR Send later reproduces the stored sequence at 38 kHz through the KY-005.


Air-conditioner frames may describe power, mode, target temperature, fan speed, and other state information together. I therefore test the capture against the same air conditioner and configuration from which it was learned.


IR Transmitter and RF Receiver modules.
IR Transmitter and RF Receiver modules.

Learning And Sending A 433 MHz RF Command


To learn RF, I select RF Receive and press the button on my own garage remote near the receiver. If rc-switch recognizes the signal, the program stores its value, bit length, protocol, and pulse duration. The Serial Monitor prints these fields so I can verify the result.


Selecting RF Send configures rc-switch with the stored protocol and pulse length, then transmits the value several times. A quarter-wave antenna can improve performance; at 433 MHz, a straight wire approximately 17.3 cm long can be soldered to each antenna pad.


RF Transmitter and IR Receiver modules.
RF Transmitter and IR Receiver modules.

The Fixed-Code And Rolling-Code Limitation


This is the most important technical limitation in the project. The rc-switch library supports several common fixed-code device families, including PT2262, EV1527, and related chipsets. It does not turn a basic ASK/OOK module into a universal garage remote.


Many modern garage systems use rolling-code technology. In those systems, the remote and opener generate or expect a new security code after each accepted use. Capturing one transmission and replaying it later normally fails because that code is no longer current.


A useful first check is to capture several presses and compare the values in the Serial Monitor. A repeated value may indicate a fixed-code remote. A changing value may indicate rolling code, although the opener's documentation is the authoritative compatibility source. I did not attempt to bypass rolling-code protection.


If the original remote uses another frequency, FSK modulation, encryption, or an unsupported encoding format, this 433 MHz ASK/OOK module will not reproduce it. The correct alternative is a manufacturer-approved remote or, where the opener supports it, an isolated relay connected according to the opener's official wall-control instructions.


Installing The Libraries And Uploading The Sketch


After connecting components, I used Arduino IDE and installed three libraries required by the sketch:


  • IRremote by Armin Joachimsmeyer

  • rc-switch by sui77

  • LiquidCrystal_I2C


After installing the libraries, and connecting Arduino Uno to my Mac, I selected Arduino Uno under Tools, selected the correct USB port, verified the sketch, and uploaded it.


setting up Arduino Uno in Arduino IDE
setting up Arduino Uno in Arduino IDE

Paste the code provided, then Sketch => Upload.


The complete Arduino sketch (code). It contains the four-option menu, EEPROM validation, IR raw capture, compatible RF decoding, and the corrected joystick-axis mapping.



What I Learned From The Project


Receiving a signal is only one part of reproducing it. Carrier frequency, modulation, timing, protocol, and the security model all matter. Infrared and 433 MHz radio may both appear simple, but their compatibility requirements differ.


I also learned to treat hardware labels as a starting point. The joystick worked electrically, but its physical orientation changed how the software should interpret its axes. The final controller remains intentionally limited: two persistent commands and four clear menu actions make it easier to understand and troubleshoot.


From Investor Calculators To Physical Tools


I primarily create calculators for investors and publish guides showing how to build calculators and other useful tools with Arduino. The connection between these projects is stronger than it may first appear: each one collects inputs, applies structured logic, and presents a focused result.



This controller applies the same approach to home hardware: make each input, decision, and output visible enough to test and improve.


Responsible Use


Only build and test this controller with your own garage door and air conditioner, or with equipment you have explicit permission to operate. Do not capture or transmit signals for someone else's property. Keep the garage door in view during testing, maintain working obstruction sensors, and stop the test if people, animals, or vehicles could enter the door's path.

This is an educational prototype, not a certified access-control or safety system. Local radio rules may apply, so transmissions should remain brief and compliant.


FAQ


Can This Device Copy Any Garage Remote?

No. It is designed for compatible fixed-code 433 MHz ASK/OOK remotes recognized by rc-switch. Rolling-code, encrypted, FSK, differently encoded, or differently tuned remotes will not work. Use it only with your own garage and never attempt to bypass an access-control system.


How Many Commands Can The Arduino Store?

This version stores two commands: one raw IR signal and one decoded RF signal. A new capture replaces the older signal of the same type.


Do The Saved Commands Disappear When Power Is Removed?

No. The signals are stored in the Uno's EEPROM, which retains its contents without power. The program validates both records when it starts.


Do I Need Antennas On The RF Modules?

The modules may work across a short test distance without antennas, but performance is usually better with them. A straight wire approximately 17.3 cm long is a practical quarter-wave antenna for 433 MHz.


Can I Expand The Menu To Store More Signals?

Yes, but the Uno's 1 KB EEPROM and 2 KB SRAM impose limits, especially for long raw IR timing arrays. A larger Arduino-compatible board, external EEPROM, or flash storage would provide more room for multiple commands.

 
 
 

Comments


bottom of page