This wiki article covers the KY-022 infrared sensor. Included are wiring diagrams, code examples, pinouts, and technical data. This sensor is designed to receive and decode IR signals transmitted from other devices, and remote controls such as those used for televisions and AV gear.
Content
- Sensor/Module Image Gallery
- Description and Technical Data
- Device Pinout
- Projects that use this Sensor/Module
- Code Examples
- Code example for Arduino
- Code example for
Raspberry Pi

Description and Technical Data
The KY-022 has three pins and responds to a carrier frequency of 38kHz at 940nm. This signal is sent to the digital output. An LED module on the board will flash if an IR signal is detected.
This sensor module is perfect for decoding remote controls for home audio/visual equipment (home theater) and other types of remote controls that use IR.
Tech Specs for the KY-022 Infrared Sensor:
- Chip type: VS1838B
- Operating Voltage: 3.3V to 5V
- Current Consumption: 1.5mA peak
- Reception distance: 17m
- Carrier Frequency: 38kHz
- Infrared Wavelength: 940 nm
- Pulse Duration: 400µs to 800µs
- Dimensions: .87in X .35in (22mm x 9mm)
Our Projects that Use this Sensor
The following Geek Pub projects use the KY-022 infrared sensor module:
Code Examples
You’ll find below code examples of using the KY-022 infrared sensor module with both the Arduino and the
KY-022 Infrared Sensor Code Example for Arduino
The following code example is for the Arduino. This code will look for infrared codes from a remote control or other IR device and print the received code on the serial console.
Arduino Wiring:
- KY-022 Sensor GND to Arduino GND
- KY-022 Sensor Vcc+ to Arduino +5V
- KY-022 Sensor Signal to Arduino PIN 10
// Print IR Buttons to Serial Monitor // TheGeekPub.com #include // Define the pin for the IR Receiver const int IR_RECV_PIN = 10; // Create the IR object IRrecv gpirrecv(IR_RECV_PIN); decode_results results; void setup(){ Serial.begin(9600); gpirrecv.enableIRIn(); gpirrecv.blink13(true); Serial.println("READY."); } void loop(){ if (gpirrecv.decode(&results)){ Serial.println(results.value, HEX); gpirrecv.resume(); } }
KY-022 Infrared Sensor Code Example for Raspberry Pi
The following code example is for the
Raspberry Pi Wiring:
- KY-022 Sensor GND to Raspbery Pi GND
- KY-022 Sensor Vcc+ to
Raspberry Pi PIN 2 - KY-022 Sensor Signal to
Raspberry Pi PIN 11
</pre> import RPi.GPIO as GPIO from time import time def setup(): GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) def binary_aquire(pin, duration): # aquires data as quickly as possible t0 = time() results = [] while (time() - t0) < duration: results.append(GPIO.input(pin)) return results def on_ir_receive(pinNo, bouncetime=150): # when edge detect is called (which requires less CPU than constant # data acquisition), we acquire data as quickly as possible data = binary_aquire(pinNo, bouncetime/1000.0) if len(data) < bouncetime: return rate = len(data) / (bouncetime / 1000.0) pulses = [] i_break = 0 # detect run lengths using the acquisition rate to turn the times in to microseconds for i in range(1, len(data)): if (data[i] != data[i-1]) or (i == len(data)-1): pulses.append((data[i-1], int((i-i_break)/rate*1e6))) i_break = i # decode ( < 1 ms "1" pulse is a 1, > 1 ms "1" pulse is a 1, longer than 2 ms pulse is something else) # does not decode channel, which may be a piece of the information after the long 1 pulse in the middle outbin = "" for val, us in pulses: if val != 1: continue if outbin and us > 2000: break elif us < 1000: outbin += "0" elif 1000 < us < 2000: outbin += "1" try: return int(outbin, 2) except ValueError: # probably an empty code return None def destroy(): GPIO.cleanup() if __name__ == "__main__": setup() try: print("Starting IR Listener") while True: print("Waiting for signal") GPIO.wait_for_edge(11, GPIO.FALLING) code = on_ir_receive(11) if code: print(str(hex(code))) else: print("Invalid code") except KeyboardInterrupt: pass except RuntimeError: # this gets thrown when control C gets pressed # because wait_for_edge doesn't properly pass this on pass print("Quitting") destroy() <pre>
We hope this wiki article has been helpful to you. Please leave a comment below if you have any questions or comments, as we try to keep these articles constantly up to date.