#pragma once #if ENABLE_DOORBELL #include "Protocol.h" #define BIT_LENGTH 40 #define BIT_LENGTH_3 BIT_LENGTH*3 #define TX_DELAY 620 class Protocol_Doorbell : public Protocol { public: Protocol_Doorbell() : Protocol(PROTOCOL_13) {} void ring(const char* value) { preamble(); for (int i = 0; i < 7; i++) { delayMicroseconds(TX_DELAY); code(value); } } private: void transmitBit(uint8_t value) { digitalWrite(SEND_PIN, value); delayMicroseconds(BIT_LENGTH); digitalWrite(SEND_PIN, LOW); } void transmitHigh() { digitalWrite(SEND_PIN, HIGH); delayMicroseconds(BIT_LENGTH_3); digitalWrite(SEND_PIN, LOW); delayMicroseconds(BIT_LENGTH); } void transmitLow() { digitalWrite(SEND_PIN, HIGH); delayMicroseconds(BIT_LENGTH); digitalWrite(SEND_PIN, LOW); delayMicroseconds(BIT_LENGTH_3); } void preamble() { noInterrupts(); for (int i = 0; i < 370; i++) { transmitBit(HIGH); transmitBit(LOW); } interrupts(); } void code(const char* value) { noInterrupts(); for (const char* p = value; *p; p++) { *p == '1' ? transmitHigh() : transmitLow(); } interrupts(); } } doorbell; #endif