Blynk Infrared transmissor ESP32

Hello, I’m doing a project to use Infrared with Blynk and I started learning Arduino and ESP32 for 6 months on my free time.
I tried to search at google, blynk community and other sources and I didn’t find to ESP32, only was found to NodeMCU and ESP8266.
What I think that I need ? Infrared transmissor library to use at Blynk with ESP32.
Why is so important to me ? Because I’m doing a project to help people with people with disabilities (special people)
What I’ve done till now ?
I had automated all lights and a fan with MCP23017+ESP32+Relay 16 positions using Virtual Pins (I built a board like protoboard to use).
I already installed in one house with people with disabilities (special people)
This is a academy project and not professional work (I’m a student).
I need 5 Virtual Pins,
turn up the volume irsend.sendNEC(0x20DF40BF, 32)
turn down the volume irsend.sendNEC(0x20DFC03F, 32)
up channel irsend.sendNEC(0x20DF00FF, 32)
down channel irsend.sendNEC(0x20DF807F, 32)
power on/off irsend.sendNEC(0x20DF10EF, 32)
I will share my project done and tested.




#include <Adafruit_MCP23017.h>
#include <Wire.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <SPI.h>
#include <SimpleTimer.h>
/**********************************************************************************/
#include <Wire.h>
#include "Adafruit_MCP23017.h" //https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library
Adafruit_MCP23017 mcp;
SimpleTimer timer;


char auth[] = "*********************************";
char ssid[] = "***********";
char pass[] = "*************";

BLYNK_WRITE(V0) // V0 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue = param.asInt();
mcp.digitalWrite(0, pinValue);
Serial.print("pinValue0 = ");
Serial.println(pinValue);
}
BLYNK_WRITE(V1) // V1 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue1 = param.asInt();
mcp.digitalWrite(1, pinValue1);
Serial.print("pinValue1 = ");
Serial.println(pinValue1);
}
BLYNK_WRITE(V2) // V2 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue2 = param.asInt();
mcp.digitalWrite(2, pinValue2);
Serial.print("pinValue2 = ");
Serial.println(pinValue2);
}
BLYNK_WRITE(V3) // V3 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue3 = param.asInt();
mcp.digitalWrite(3, pinValue3);
Serial.print("pinValue3 = ");
Serial.println(pinValue3);
}
BLYNK_WRITE(V4) // V4 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue4 = param.asInt();
mcp.digitalWrite(4, pinValue4);
Serial.print("pinValue4 = ");
Serial.println(pinValue4);
}
BLYNK_WRITE(V5) // V5 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue5 = param.asInt();
mcp.digitalWrite(5, pinValue5);
Serial.print("pinValue5 = ");
Serial.println(pinValue5);
}
BLYNK_WRITE(V6) // V6 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue6 = param.asInt();
mcp.digitalWrite(6, pinValue6);
Serial.print("pinValue6 = ");
Serial.println(pinValue6);
}
BLYNK_WRITE(V7) // V7 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue7 = param.asInt();
mcp.digitalWrite(7, pinValue7);
Serial.print("pinValue7 = ");
Serial.println(pinValue7);
}
BLYNK_WRITE(V8) // V8 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue8 = param.asInt();
mcp.digitalWrite(8, pinValue8);
Serial.print("pinValue8 = ");
Serial.println(pinValue8);
}
BLYNK_WRITE(V9)// V9 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue9 = param.asInt();
mcp.digitalWrite(9, pinValue9);
Serial.print("pinValue9 = ");
Serial.println(pinValue9);
}
BLYNK_WRITE(V10) // V10 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue10 = param.asInt();
mcp.digitalWrite(10, pinValue10);
Serial.print("pinValue10 = ");
Serial.println(pinValue10);
}
BLYNK_WRITE(V11) // V11 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue11 = param.asInt();
mcp.digitalWrite(11, pinValue11);
Serial.print("pinValue11 = ");
Serial.println(pinValue11);
}
BLYNK_WRITE(V12) // V12 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue12 = param.asInt();
mcp.digitalWrite(12, pinValue12);
Serial.print("pinValue12 = ");
Serial.println(pinValue12);
}
BLYNK_WRITE(V13) // V13 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue13 = param.asInt();
mcp.digitalWrite(13, pinValue13);
Serial.print("pinValue13 = ");
Serial.println(pinValue13);
}
BLYNK_WRITE(V14) // V14 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue14 = param.asInt();
mcp.digitalWrite(14, pinValue14);
Serial.print("pinValue14 = ");
Serial.println(pinValue14);
}
BLYNK_WRITE(V15) // V15 is the number of Virtual Pin For Read From BLYNK APP
{
int pinValue15 = param.asInt();
mcp.digitalWrite(15, pinValue15);
Serial.print("pinValue15 = ");
Serial.println(pinValue15);

}

void senddata()
{
int a = mcp.digitalRead(22);
int b = mcp.digitalRead(21);
Blynk.virtualWrite(V35, a); // Send Value to BLYNK APP V35
Blynk.virtualWrite(V36, b); // Send Value to BLYNK APP V36
}
/******************************************************************************************************************/
void setup()
{
Serial.begin(9600); // See the connection status in Serial Monitor
Blynk.begin(auth, ssid, pass);
mcp.begin();
mcp.pinMode(0, OUTPUT);
mcp.pinMode(1, OUTPUT);
mcp.pinMode(2, OUTPUT);
mcp.pinMode(3, OUTPUT);
mcp.pinMode(4, OUTPUT);
mcp.pinMode(5, OUTPUT);
mcp.pinMode(6, OUTPUT);
mcp.pinMode(7, OUTPUT);
mcp.pinMode(8, OUTPUT);
mcp.pinMode(9, OUTPUT);
mcp.pinMode(10, OUTPUT);
mcp.pinMode(11, OUTPUT);
mcp.pinMode(12, OUTPUT);
mcp.pinMode(13, OUTPUT);
mcp.pinMode(14, OUTPUT);
mcp.pinMode(15, OUTPUT);


// mcp.pinMode(1, INPUT); no need to set as input
timer.setInterval(100L, senddata);
}
void loop()
{
Blynk.run(); // Initiates Blynk
timer.run(); // Initiates SimpleTimer
}