I have a code to read pulses of a control for the air conditioner, the code is based on pin manipulation to quickly read the pin value, but the code is only compatible with avr-based Arduinos
I use an arduino nano rp2040 connect in which moniflation on pins does not work I saw posts that talk about it but only on the subject of turning on the number of pins but I did not find anyone who talks about the subject of speed
//I'm new to Arduino, I used a translation hope I'm understood
code:
#define IRpin_PIN PIND
#define IRpin 2
// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000
// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20
// we will store up to 300 pulse pairs (this is -a lot-)
uint16_t pulses[300][2]; // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing
void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
}
void loop(void) {
uint16_t highpulse, lowpulse; // temporary storage timing
highpulse = lowpulse = 0; // start out with no pulse length
// while (digitalRead(IRpin)) { // this is too slow!
while (IRpin_PIN & (1 << IRpin)) {
// pin is still HIGH
// count off another few microseconds
highpulse++;
delayMicroseconds(RESOLUTION);
// If the pulse is too long, we 'timed out' - either nothing
// was received or the code is finished, so print what
// we've grabbed so far, and then reset
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
// we didn't time out so lets stash the reading
pulses[currentpulse][0] = highpulse;
// same as above
while (! (IRpin_PIN & _BV(IRpin))) {
// pin is still LOW
lowpulse++;
delayMicroseconds(RESOLUTION);
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][1] = lowpulse;
// we read one high-low pulse successfully, continue!
currentpulse++;
}
void printpulses(void) {
for (uint8_t i = 0; i < currentpulse; i++) {
if(i!=0){
//################### First Array Code Pulse Division ########################
if((int)(pulses[i][0] * RESOLUTION)>7000.0){
Serial.print("3");
}
if((pulses[i][0] * RESOLUTION>4000)&&(pulses[i][0] * RESOLUTION<5000)){
Serial.print("2");
}
if((pulses[i][0] * RESOLUTION>1000)&&(pulses[i][0] * RESOLUTION<2000)){
Serial.print("1");
}
if((pulses[i][0] * RESOLUTION>0)&&(pulses[i][0] * RESOLUTION<1000)){
Serial.print("0");
}
//########################### End of First Array ##############################
Serial.print(", ");
}
//################### Second Array Code Pulse Division ########################
if((int)(pulses[i][1] * RESOLUTION)>7000.0){
Serial.print("3");
}
if((pulses[i][1] * RESOLUTION>4000)&&(pulses[i][1] * RESOLUTION<5000)){
Serial.print("2");
}
if((pulses[i][1] * RESOLUTION>1000)&&(pulses[i][1] * RESOLUTION<2000)){
Serial.print("1");
}
if((pulses[i][1] * RESOLUTION>0)&&(pulses[i][1] * RESOLUTION<1000)){
Serial.print("0");
}
//########################### End of Second Array ##############################
Serial.print(", ");
}
Serial.println("");
}