Infrared remote library for Arduino: send and receive infrared signals with multiple protocols Port from Arduino-IRremote https://github.com/z3t0/Arduino-IRremote
irSend.cpp
- Committer:
- JRM1986
- Date:
- 2019-09-25
- Revision:
- 8:629ef37f2853
- Parent:
- 6:ee990cddff48
File content as of revision 8:629ef37f2853:
#include "IRremote.h"
#include "IRremoteInt.h"
#include "cmath"
//+=============================================================================
void IRsend::sendRaw (unsigned int buf[], unsigned int len, unsigned int hz)
{
// Set IR carrier frequency
enableIROut(hz);
for (unsigned int i = 0; i < len; i++) {
if (i & 1) space(buf[i]) ;
else mark (buf[i]) ;
}
space(0); // Always end with the LED off
}
//+=============================================================================
// Sends an IR mark for the specified number of microseconds.
// The mark output is modulated at the PWM frequency.
//
void IRsend::mark (unsigned int time)
{
_pwm.write(0.5); // Enable PWM output
if (time > 0) custom_delay_usec(time);
}
//+=============================================================================
// Leave pin off for time (given in microseconds)
// Sends an IR space for the specified number of microseconds.
// A space is no output, so the PWM output is disabled.
//
void IRsend::space (unsigned int time)
{
_pwm.write(0.0); // Disable PWM output
if (time > 0) IRsend::custom_delay_usec(time);
}
//+=============================================================================
// Enables IR output. The khz value controls the modulation frequency in kilohertz.
// The IR output will be on pin 3 (OC2B).
// This routine is designed for 36-40KHz; if you use it for other values, it's up to you
// to make sure it gives reasonable results. (Watch out for overflow / underflow / rounding.)
// TIMER2 is used in phase-correct PWM mode, with OCR2A controlling the frequency and OCR2B
// controlling the duty cycle.
// There is no prescaling, so the output frequency is 16MHz / (2 * OCR2A)
// To turn the output on and off, we leave the PWM running, but connect and disconnect the output pin.
// A few hours staring at the ATmega documentation and this will all make sense.
// See my Secrets of Arduino PWM at http://arcfn.com/2009/07/secrets-of-arduino-pwm.html for details.
//
void IRsend::enableIROut (int khz)
{
_pwm.write(0.0);
_pwm.period_us(std::floor((1.0 / khz * 1000) + 0.5)); // round
}
//+=============================================================================
// Custom delay function that circumvents Arduino's delayMicroseconds limit
void IRsend::custom_delay_usec(unsigned long uSecs) {
if (uSecs > 4) {
unsigned long start = us_ticker_read();
unsigned long endMicros = start + uSecs - 4;
if (endMicros < start) { // Check if overflow
while ( us_ticker_read() > start ) {} // wait until overflow
}
while ( us_ticker_read() < endMicros ) {} // normal wait
}
//else {
// __asm__("nop\n\t"); // must have or compiler optimizes out
//}
}