diff --git a/README.md b/README.md
index 3678c18..cd304a0 100644
--- a/README.md
+++ b/README.md
@@ -459,7 +459,7 @@ Click on the receiver while simulation is running to specify individual NEC IR c
# Compile options / macros for this library
To customize the library to different requirements, there are some compile options / macros available.
-These macros must be defined in your program before the line `#include ` to take effect.
+These macros must be defined in your program **before** the line `#include ` to take effect.
Modify them by enabling / disabling them, or change the values if applicable.
| Name | Default value | Description |
diff --git a/examples/SendDemo/SendDemo.ino b/examples/SendDemo/SendDemo.ino
index bcd5e55..383bfa4 100644
--- a/examples/SendDemo/SendDemo.ino
+++ b/examples/SendDemo/SendDemo.ino
@@ -32,12 +32,13 @@
#include
-//#define EXCLUDE_EXOTIC_PROTOCOLS // saves around 240 bytes program memory if IrSender.write is used
-//#define SEND_PWM_BY_TIMER
-//#define USE_NO_SEND_PWM
-//#define NO_LED_FEEDBACK_CODE // saves 566 bytes program memory
+//#define EXCLUDE_EXOTIC_PROTOCOLS // Saves around 240 bytes program memory if IrSender.write is used
+//#define SEND_PWM_BY_TIMER // Disable carrier PWM generation in software and use (restricted) hardware PWM.
+//#define USE_NO_SEND_PWM // Use no carrier PWM, just simulate an active low receiver signal. Overrides SEND_PWM_BY_TIMER definition
+//#define NO_LED_FEEDBACK_CODE // Saves 566 bytes program memory
+//#define USE_OPEN_DRAIN_OUTPUT_FOR_SEND_PIN // Use or simulate open drain output mode at send pin. Attention, active state of open drain is LOW, so connect the send LED between positive supply and send pin!
-#include "PinDefinitionsAndMore.h" //Define macros for input and output pin etc.
+#include "PinDefinitionsAndMore.h" //Define macros for input and output pin etc.
#include
#define DELAY_AFTER_SEND 2000
diff --git a/examples/SendRawDemo/SendRawDemo.ino b/examples/SendRawDemo/SendRawDemo.ino
index 924e8eb..6c147c1 100644
--- a/examples/SendRawDemo/SendRawDemo.ino
+++ b/examples/SendRawDemo/SendRawDemo.ino
@@ -37,6 +37,11 @@
*/
#include
+//#define SEND_PWM_BY_TIMER // Disable carrier PWM generation in software and use (restricted) hardware PWM.
+//#define USE_NO_SEND_PWM // Use no carrier PWM, just simulate an active low receiver signal. Overrides SEND_PWM_BY_TIMER definition
+//#define NO_LED_FEEDBACK_CODE // Saves 566 bytes program memory
+//#define USE_OPEN_DRAIN_OUTPUT_FOR_SEND_PIN // Use or simulate open drain output mode at send pin. Attention, active state of open drain is LOW, so connect the send LED between positive supply and send pin!
+
#include "PinDefinitionsAndMore.h" //Define macros for input and output pin etc.
#include
diff --git a/examples/SimpleSender/SimpleSender.ino b/examples/SimpleSender/SimpleSender.ino
index 64f301c..2186f36 100644
--- a/examples/SimpleSender/SimpleSender.ino
+++ b/examples/SimpleSender/SimpleSender.ino
@@ -13,9 +13,8 @@
*/
#include
-//#define SEND_PWM_BY_TIMER
-//#define USE_NO_SEND_PWM
-//#define NO_LED_FEEDBACK_CODE // saves 418 bytes program memory
+//#define SEND_PWM_BY_TIMER // Disable carrier PWM generation in software and use (restricted) hardware PWM.
+//#define USE_NO_SEND_PWM // Use no carrier PWM, just simulate an active low receiver signal. Overrides SEND_PWM_BY_TIMER definition
#include "PinDefinitionsAndMore.h" //Define macros for input and output pin etc.
#include
diff --git a/examples/UnitTest/UnitTest.ino b/examples/UnitTest/UnitTest.ino
index ac952f7..c411f9e 100644
--- a/examples/UnitTest/UnitTest.ino
+++ b/examples/UnitTest/UnitTest.ino
@@ -42,11 +42,11 @@
#endif
//#define EXCLUDE_UNIVERSAL_PROTOCOLS // Saves up to 1000 bytes program memory.
-//#define EXCLUDE_EXOTIC_PROTOCOLS
-//#define SEND_PWM_BY_TIMER
-//#define USE_NO_SEND_PWM
-#define NO_LED_FEEDBACK_CODE // saves 500 bytes program memory
-#define MARK_EXCESS_MICROS 10 // Adapt it to your IR receiver module. See also IRremote.h.
+//#define EXCLUDE_EXOTIC_PROTOCOLS // Saves around 240 bytes program memory if IrSender.write is used
+//#define SEND_PWM_BY_TIMER // Disable carrier PWM generation in software and use (restricted) hardware PWM.
+//#define USE_NO_SEND_PWM // Use no carrier PWM, just simulate an active low receiver signal. Overrides SEND_PWM_BY_TIMER definition
+#define NO_LED_FEEDBACK_CODE // Saves 344 bytes program memory
+#define MARK_EXCESS_MICROS 10 // Adapt it to your IR receiver module. See also IRremote.h.
//#define TRACE // For internal usage
//#define DEBUG // Activate this for lots of lovely debug output from the decoders.
diff --git a/src/IRSend.hpp b/src/IRSend.hpp
index 65b9004..b95c2dd 100644
--- a/src/IRSend.hpp
+++ b/src/IRSend.hpp
@@ -432,22 +432,27 @@ void IRsend::sendBiphaseData(unsigned int aBiphaseTimeUnit, uint32_t aData, uint
*/
void IRsend::mark(unsigned int aMarkMicros) {
-#if defined(SEND_PWM_BY_TIMER)
+#if defined(SEND_PWM_BY_TIMER) || defined(USE_NO_SEND_PWM)
# if !defined(NO_LED_FEEDBACK_CODE)
if (FeedbackLEDControl.LedFeedbackEnabled == LED_FEEDBACK_ENABLED_FOR_SEND) {
setFeedbackLED(true);
}
# endif
+#endif
+
+#if defined(SEND_PWM_BY_TIMER)
+ /*
+ * Generate hardware PWM signal
+ */
ENABLE_SEND_PWM_BY_TIMER; // Enable timer or ledcWrite() generated PWM output
customDelayMicroseconds(aMarkMicros);
- IRLedOff(); // manages also feedback LED
+ IRLedOff(); // disables hardware PWM and manages feedback LED
+ return;
#elif defined(USE_NO_SEND_PWM)
-# if !defined(NO_LED_FEEDBACK_CODE)
- if (FeedbackLEDControl.LedFeedbackEnabled == LED_FEEDBACK_ENABLED_FOR_SEND) {
- setFeedbackLED(true);
- }
-# endif
+ /*
+ * Here we generate no carrier PWM, just simulate an active low receiver signal.
+ */
# if defined(USE_OPEN_DRAIN_OUTPUT_FOR_SEND_PIN) && !defined(OUTPUT_OPEN_DRAIN)
pinModeFast(sendPin, OUTPUT); // active state for mimicking open drain
# else
@@ -460,9 +465,13 @@ void IRsend::mark(unsigned int aMarkMicros) {
if (FeedbackLEDControl.LedFeedbackEnabled == LED_FEEDBACK_ENABLED_FOR_SEND) {
setFeedbackLED(false);
}
+ return;
# endif
-#else
+#else // defined(SEND_PWM_BY_TIMER)
+ /*
+ * Generate PWM by bit banging
+ */
unsigned long tStartMicros = micros();
unsigned long tNextPeriodEnding = tStartMicros;
unsigned long tMicros;
@@ -478,7 +487,7 @@ void IRsend::mark(unsigned int aMarkMicros) {
noInterrupts(); // do not let interrupts extend the short on period
# if defined(USE_OPEN_DRAIN_OUTPUT_FOR_SEND_PIN)
# if defined(OUTPUT_OPEN_DRAIN)
- digitalWriteFast(sendPin, LOW); // active state for open drain
+ digitalWriteFast(sendPin, LOW); // set output with pin mode OUTPUT_OPEN_DRAIN to active low
# else
pinModeFast(sendPin, OUTPUT); // active state for mimicking open drain
# endif
diff --git a/src/IRremote.hpp b/src/IRremote.hpp
index cb126be..2d87ca4 100644
--- a/src/IRremote.hpp
+++ b/src/IRremote.hpp
@@ -244,7 +244,7 @@
*/
//#define USE_OPEN_DRAIN_OUTPUT_FOR_SEND_PIN
#if defined(USE_OPEN_DRAIN_OUTPUT_FOR_SEND_PIN) && !defined(OUTPUT_OPEN_DRAIN)
-#warning Pin mode OUTPUT_OPEN_DRAIN is not supported on this platform -> fall back to mode OUTPUT.
+#warning Pin mode OUTPUT_OPEN_DRAIN is not supported on this platform -> mimick open drain mode by switching between INPUT and OUTPUT mode.
#endif
/**
* This amount is subtracted from the on-time of the pulses generated for software PWM generation.