Merge pull request #157 from nuclearcat/add-inverted-led

Add inverted LED support to IRSenderESP32
This commit is contained in:
Toni 2023-10-12 12:09:22 +03:00 committed by GitHub
commit c8369594f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 2 deletions

View File

@ -44,6 +44,14 @@ uint8_t IRSender::bitReverse(uint8_t x)
}
// Some boards have inverted signals, so we need to set the pin to HIGH to turn the IR transmitter off
// For example M5Stick-C where LED positive on VCC and negative on pin 9
void IRSender::invert(bool inverted)
{
_inverted = inverted;
}
// Definitions of virtual functions
void IRSender::setFrequency(int) {};
void IRSender::space(int) {};

View File

@ -29,11 +29,13 @@ class IRSender
virtual void setFrequency(int frequency);
void sendIRbyte(uint8_t sendByte, int bitMarkLength, int zeroSpaceLength, int oneSpaceLength);
uint8_t bitReverse(uint8_t x);
virtual void invert(bool inverted);
virtual void space(int spaceLength);
virtual void mark(int markLength);
protected:
uint8_t _pin;
bool _inverted = false;
};

View File

@ -13,6 +13,10 @@ IRSenderESP32::IRSenderESP32(uint8_t pin, uint8_t pwmChannel) : IRSender(pin)
{
_pwmChannel = pwmChannel;
pinMode(_pin, OUTPUT);
// If we have an inverted signal, we need to set the pin from default LOW
// to HIGH to make it off
if (_inverted)
digitalWrite(_pin, HIGH);
}
void IRSenderESP32::setFrequency(int frequency)
@ -37,13 +41,19 @@ void IRSenderESP32::mark(int markLength)
#endif // ESP_ARDUINO_VERSION_MAJOR >= 3
while((int)(micros() - beginning) < markLength);
gpio_reset_pin(static_cast<gpio_num_t>(_pin));
digitalWrite(_pin, LOW);
if (_inverted)
digitalWrite(_pin, HIGH);
else
digitalWrite(_pin, LOW);
}
// Send an IR 'space' symbol, i.e. transmitter OFF
void IRSenderESP32::space(int spaceLength)
{
digitalWrite(_pin, LOW);
if (_inverted)
digitalWrite(_pin, HIGH);
else
digitalWrite(_pin, LOW);
if (spaceLength < 16383) {
delayMicroseconds(spaceLength);