├── .vscode └── settings.json ├── library.properties ├── library.json ├── src ├── sam │ ├── RBDmcuSAM.h │ └── RBDmcuSAM.cpp ├── samd │ ├── RBDmcuSAMD21.h │ └── RBDmcuSAMD21.cpp ├── stm32duino │ └── STM32F1 │ │ ├── RBDmcuSTM32F1.h │ │ └── RBDmcuSTM32F1.cpp ├── esp8266 │ ├── RBDmcuESP8266.h │ └── RBDmcuESP8266.cpp ├── esp32 │ ├── RBDmcuESP32.h │ └── RBDmcuESP32.cpp ├── RBDdimmer.h └── avr │ ├── RBDmcuAVR.h │ └── RBDmcuAVR.cpp ├── keywords.txt ├── index.json ├── examples ├── SimpleToggleDimmer │ └── SimpleToggleDimmer.ino ├── SimpleButton │ └── SimpleButton.ino ├── SimplePotentiometer │ └── SimplePotentiometer.ino ├── TwoButtonsFluently │ └── TwoButtonsFluently.ino └── SerialMonitorDim │ └── SerialMonitorDim.ino ├── ReadMe(en).txt ├── ReadMe(ru).txt └── README.md /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "C_Cpp.dimInactiveRegions": false 3 | } -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=RBDdimmer 2 | version=1.0 3 | author=RobotDyn (Vladislav Snegirev & Ivan Kryukov) 4 | maintainer=Shavkat Begishev 5 | sentence=A library to control dimmable lamps and other AC loads. 6 | paragraph=Use triacs and a zero cross circuit to control the power of connected devices. 7 | category=Device Control 8 | url=* 9 | architectures=* 10 | -------------------------------------------------------------------------------- /library.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "RBDdimmer", 3 | "keywords": "RBDdimmer, dimmer, lamp, AVR,M0, SAM3, ESP8266, ESP32, STM32", 4 | "description": "Arduino AC-dimming library for AVR, ESP8266, ESP32 processor", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/Lib-RBD-Dimmer-for-ESP32/RBDdimmerESP32.git" 8 | }, 9 | "frameworks": "arduino", 10 | "platforms": [ 11 | "atmelavr", 12 | "espressif" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /src/sam/RBDmcuSAM.h: -------------------------------------------------------------------------------- 1 | #ifndef RBDMCUSAM_H 2 | #define RBDMCUSAM_H 3 | 4 | #include "Arduino.h" 5 | #include "RBDdimmer.h" 6 | #include 7 | 8 | static const uint8_t powerBuf[] = { 9 | 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 10 | 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 11 | 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 12 | 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 13 | 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 14 | 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 15 | 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 16 | 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 17 | 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 18 | 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 19 | }; 20 | 21 | #define ALL_DIMMERS 80 22 | 23 | void isr_ext(void); 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /src/samd/RBDmcuSAMD21.h: -------------------------------------------------------------------------------- 1 | #ifndef RBDMCUSAMD21_H 2 | #define RBDMCUSAMD21_H 3 | 4 | #include "Arduino.h" 5 | #include "RBDdimmer.h" 6 | #include "sam.h" 7 | #include 8 | 9 | static const uint8_t powerBuf[] = { 10 | 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 11 | 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 12 | 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 13 | 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 14 | 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 15 | 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 16 | 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 17 | 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 18 | 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 19 | 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 20 | }; 21 | 22 | #define ALL_DIMMERS 80 23 | 24 | #endif 25 | -------------------------------------------------------------------------------- /src/stm32duino/STM32F1/RBDmcuSTM32F1.h: -------------------------------------------------------------------------------- 1 | #ifndef RBDMCUSTM32F1_H 2 | #define RBDMCUSTM32F1_H 3 | 4 | #include "Arduino.h" 5 | #include "RBDdimmer.h" 6 | #include 7 | 8 | static const uint8_t powerBuf[] = { 9 | 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 10 | 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 11 | 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 12 | 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 13 | 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 14 | 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 15 | 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 16 | 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 17 | 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 18 | 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 19 | }; 20 | 21 | void isr_ext(void); 22 | void onTimerISR(); 23 | 24 | #endif 25 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Colouring Map For RBDdimmerESP32 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | dimmerLamp KEYWORD1 9 | 10 | ####################################### 11 | # Methods and Functions (KEYWORD2) 12 | ####################################### 13 | begin KEYWORD2 14 | setPower KEYWORD2 15 | getPower KEYWORD2 16 | setMode KEYWORD2 17 | getMode KEYWORD2 18 | setState KEYWORD2 19 | getState KEYWORD2 20 | changeState KEYWORD2 21 | toggleSettings KEYWORD2 22 | 23 | ####################################### 24 | # Constants (LITERAL1) 25 | ####################################### 26 | ON LITERAL1 27 | OFF LITERAL1 28 | NORMAL_MODE LITERAL1 29 | TOGGLE_MODE LITERAL1 30 | 31 | -------------------------------------------------------------------------------- /src/esp8266/RBDmcuESP8266.h: -------------------------------------------------------------------------------- 1 | #ifndef RBDMCUESP8266_H 2 | #define RBDMCUESP8266_H 3 | 4 | #include "Arduino.h" 5 | #include "RBDdimmer.h" 6 | #include "pins_arduino.h" 7 | #include 8 | #include "ets_sys.h" 9 | 10 | static const uint8_t powerBuf[] = { 11 | 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 12 | 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 13 | 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 14 | 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 15 | 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 16 | 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 17 | 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 18 | 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 19 | 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 20 | 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 21 | }; 22 | 23 | #define ALL_DIMMERS 20 24 | 25 | void isr_ext(void); 26 | void ICACHE_RAM_ATTR onTimerISR(); 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /src/esp32/RBDmcuESP32.h: -------------------------------------------------------------------------------- 1 | #ifndef RBDMCUESP32_H 2 | #define RBDMCUESP32_H 3 | 4 | #include "Arduino.h" 5 | #include "RBDdimmer.h" 6 | #include 7 | #include 8 | #include "rom/ets_sys.h" 9 | #include "esp_attr.h" 10 | #include "esp_intr.h" 11 | #include "rom/gpio.h" 12 | #include "soc/gpio_reg.h" 13 | #include "soc/io_mux_reg.h" 14 | #include "soc/gpio_struct.h" 15 | #include "soc/rtc_io_reg.h" 16 | 17 | #define ALL_DIMMERS 50 18 | 19 | static const uint8_t powerBuf[] = { 20 | 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 21 | 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 22 | 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 23 | 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 24 | 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 25 | 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 26 | 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 27 | 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 28 | 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 29 | 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 30 | }; 31 | 32 | void IRAM_ATTR isr_ext(); 33 | void IRAM_ATTR onTimerISR(); 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /index.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": 3 | [ 4 | { 5 | "name": "RBDdimmer", 6 | "maintainer": "RobotDyn", 7 | "websiteURL": "https://robotdyn.com", 8 | "help": 9 | { 10 | "online": "https://robotdyn.com" 11 | }, 12 | "platforms": 13 | [ 14 | { 15 | "name": "Atmel SAMD21 Xplained-pros", 16 | "architecture": "samd", 17 | "version": "3.0", 18 | "category": "Contributed", 19 | "url": "https://github.com/AtmelUniversityFrance/atmel-samd21-xpro-boardmanagermodule/releases/download/v0.3.0/atmel-samd21-xpro-boardmanagermodule-0.3.0.tar.bz2", 20 | "archiveFileName": "atmel-samd21-xpro-boardmanagermodule-0.3.0.tar.bz2", 21 | "checksum": "SHA-256:70b351f50e4408bf4384519ffcc3547fbf27612fc551dbd66a7d2d48ea8fafdc", 22 | "size": "55213", 23 | "boards": [ 24 | { 25 | "name": "atmel_samd21_xpro_v1" 26 | }, 27 | { 28 | "name": "atmel_samr21_xpro" 29 | }, 30 | { 31 | "name": "atmel_samw25_xpro" 32 | } 33 | ], 34 | "toolsDependencies": 35 | [ 36 | { 37 | "packager": "arduino", 38 | "name": "arm-none-eabi-gcc", 39 | "version": "4.8.3-2014q1" 40 | }, 41 | { 42 | "packager": "arduino", 43 | "name": "bossac", 44 | "version": "1.6.1-arduino" 45 | }, 46 | { 47 | "packager": "arduino", 48 | "name": "openocd", 49 | "version": "0.9.0-arduino" 50 | }, 51 | { 52 | "packager": "arduino", 53 | "name": "CMSIS", 54 | "version": "4.0.0-atmel" 55 | } 56 | ] 57 | } 58 | ], 59 | "tools": 60 | [ 61 | ] 62 | } 63 | ] 64 | } 65 | -------------------------------------------------------------------------------- /src/RBDdimmer.h: -------------------------------------------------------------------------------- 1 | #ifndef RBDDIMMER_H 2 | #define RBDDIMMER_H 3 | 4 | #include 5 | 6 | #if defined(ARDUINO_ARCH_AVR) 7 | #include "avr/RBDmcuAVR.h" 8 | #elif defined(ARDUINO_ARCH_ESP32) 9 | #include "esp32/RBDmcuESP32.h" 10 | #elif defined(ARDUINO_ARCH_ESP8266) 11 | #include "esp8266/RBDmcuESP8266.h" 12 | #elif defined(ARDUINO_ARCH_SAMD) 13 | #include "samd/RBDmcuSAMD21.h" 14 | #elif defined(ARDUINO_ARCH_SAM) 15 | #include "sam/RBDmcuSAM.h" 16 | #elif defined(ARDUINO_ARCH_STM32F1) 17 | #include "stm32duino/STM32F1/RBDmcuSTM32F1.h" 18 | #elif defined(ARDUINO_ARCH_STM32F4) 19 | #include "stm32duino/STM32F4/RBDmcuSTM32F4.h" 20 | #else 21 | #error "This library only supports boards with an AVR, ESP32, ESP8266, SAMD, SAM, STM32F1/F4 processor." 22 | #endif 23 | 24 | typedef enum 25 | { 26 | NORMAL_MODE = 0, 27 | TOGGLE_MODE = 1 28 | } DIMMER_MODE_typedef; 29 | 30 | typedef enum 31 | { 32 | OFF = false, 33 | ON = true 34 | } ON_OFF_typedef; 35 | 36 | #define ALL_DIMMERS 30 37 | 38 | class dimmerLamp 39 | { 40 | private: 41 | int current_num; 42 | int timer_num; 43 | bool toggle_state; 44 | int tog_current; 45 | 46 | void port_init(void); 47 | void timer_init(void); 48 | void ext_int_init(void); 49 | 50 | public: 51 | uint16_t pulse_begin; 52 | int dimmer_pin; 53 | int tog_max; 54 | int tog_min; 55 | 56 | #if !(defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_SAMD)) 57 | int zc_pin; 58 | 59 | dimmerLamp(int user_dimmer_pin, int zc_dimmer_pin); 60 | #else 61 | dimmerLamp(int user_dimmer_pin); 62 | #endif 63 | void begin(DIMMER_MODE_typedef DIMMER_MODE, ON_OFF_typedef ON_OFF); 64 | void setPower(int power); 65 | int getPower(void); 66 | void setState(ON_OFF_typedef ON_OFF); 67 | bool getState(void); 68 | void changeState(void); 69 | void setMode(DIMMER_MODE_typedef DIMMER_MODE); 70 | DIMMER_MODE_typedef getMode(void); 71 | void toggleSettings(int minValue, int maxValue); 72 | }; 73 | 74 | #endif 75 | -------------------------------------------------------------------------------- /src/avr/RBDmcuAVR.h: -------------------------------------------------------------------------------- 1 | #ifndef RBDMCUAVR_H 2 | #define RBDMCUAVR_H 3 | 4 | #include "Arduino.h" 5 | #include "RBDdimmer.h" 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) 13 | #define DIMMER_TIMER 4 14 | #define INT_vect INT4_vect 15 | #define INTx INT4 16 | #define EICRX EICRB 17 | #define ISCx1 ISC41 18 | #define ISCx0 ISC40 19 | #define ALL_DIMMERS 50 20 | 21 | #define TCCRxA_VALUE 0x00 // CTC mode 22 | #define TCCRxB_VALUE 0x0A // 0b1011 // (1 << WGMx2)|(1 << CSx1)|(1 << CSx0) 23 | #define OCRxAH_VALUE 0x00 24 | #define OCRxAL_VALUE 0x0F 25 | 26 | #define _OCRxAH(X) OCR ## X ## AH 27 | #define OCRxAH(X) _OCRxAH(X) 28 | #define _OCRxAL(X) OCR ## X ## AL 29 | #define OCRxAL(X) _OCRxAL(X) 30 | 31 | #elif defined(__AVR_ATmega32U4__) 32 | #define DIMMER_TIMER 1 33 | #define INT_vect INT6_vect 34 | #define INTx INT6 35 | #define EICRX EICRB 36 | #define ISCx1 ISC61 37 | #define ISCx0 ISC60 38 | #define ALL_DIMMERS 30 39 | 40 | #define TCCRxA_VALUE 0x00 // CTC mode 41 | #define TCCRxB_VALUE 0x09// 0b1011 (1 << WGMx2)|(1 << CSx1)|(1 << CSx0) 42 | #define OCRxAH_VALUE 0x00 43 | #define OCRxAL_VALUE 0xBC 44 | 45 | #define _OCRxAH(X) OCR ## X ## AH 46 | #define OCRxAH(X) _OCRxAH(X) 47 | #define _OCRxAL(X) OCR ## X ## AL 48 | #define OCRxAL(X) _OCRxAL(X) 49 | 50 | #else 51 | #define DIMMER_TIMER 2 52 | #define INT_vect INT0_vect 53 | #define INTx INT0 54 | #define EICRX EICRA 55 | #define ISCx1 ISC01 56 | #define ISCx0 ISC00 57 | #define ALL_DIMMERS 13 58 | 59 | #define TCCRxA_VALUE 0x02 60 | #define TCCRxB_VALUE 0x09 // 0b1010 // (1 << WGMx2)|(1 << CSx1) 61 | #define OCRxAH_VALUE 0x00 62 | #define OCRxAL_VALUE 0xFF 63 | 64 | #define _OCRxAH(X) OCR ## X ## A 65 | #define OCRxAH(X) _OCRxAH(X) 66 | #define _OCRxAL(X) OCR ## X ## A 67 | #define OCRxAL(X) _OCRxAL(X) 68 | 69 | #endif 70 | 71 | #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__) 72 | static const uint16_t powerBuf[] = { 73 | 610, 604, 598, 592, 586, 580, 574, 568, 562, 556, 74 | 550, 544, 538, 532, 526, 520, 514, 508, 502, 496, 75 | 490, 484, 478, 472, 466, 460, 454, 448, 442, 436, 76 | 430, 424, 418, 412, 406, 400, 394, 388, 382, 376, 77 | 370, 364, 358, 352, 346, 340, 334, 328, 322, 316, 78 | 310, 304, 298, 292, 286, 280, 274, 268, 262, 256, 79 | 250, 244, 238, 232, 226, 220, 214, 208, 202, 196, 80 | 180, 174, 168, 162, 156, 150, 144, 138, 132, 126, 81 | 120, 114, 108, 102, 96, 90, 84, 78, 72, 66, 82 | 60, 54, 48, 42, 36, 30, 24, 18, 12, 6 83 | }; 84 | #else 85 | static const uint16_t powerBuf[] = { 86 | 600, 600, 598, 592, 586, 580, 574, 568, 562, 556, 87 | 550, 544, 538, 532, 526, 520, 514, 508, 502, 496, 88 | 490, 484, 478, 472, 466, 460, 454, 448, 442, 436, 89 | 430, 424, 418, 412, 406, 400, 394, 388, 382, 376, 90 | 370, 364, 358, 352, 346, 340, 334, 328, 322, 316, 91 | 310, 304, 298, 292, 286, 280, 274, 268, 262, 256, 92 | 250, 244, 238, 232, 226, 220, 214, 208, 202, 196, 93 | 180, 174, 168, 162, 156, 150, 144, 138, 132, 126, 94 | 120, 114, 108, 102, 96, 90, 84, 78, 72, 66, 95 | 60, 54, 48, 42, 36, 30, 24, 18, 12, 8 96 | }; 97 | #endif 98 | 99 | #endif 100 | -------------------------------------------------------------------------------- /examples/SimpleToggleDimmer/SimpleToggleDimmer.ino: -------------------------------------------------------------------------------- 1 | /************** 2 | * RobotDyn 3 | * Dimmer Library 4 | * ************** 5 | * The following sketch is meant to define by function the smooth changes of dimming values in a range of values defined by user 6 | * values are defined in range from 0 to 100% 7 | * 8 | * ---------------------- OUTPUT & INPUT Pin table --------------------- 9 | * +---------------+-------------------------+-------------------------+ 10 | * | Board | INPUT Pin | OUTPUT Pin | 11 | * | | Zero-Cross | | 12 | * +---------------+-------------------------+-------------------------+ 13 | * | Lenardo | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 14 | * +---------------+-------------------------+-------------------------+ 15 | * | Mega | D2 (NOT CHANGABLE) | D0-D1, D3-D70 | 16 | * +---------------+-------------------------+-------------------------+ 17 | * | Uno | D2 (NOT CHANGABLE) | D0-D1, D3-D20 | 18 | * +---------------+-------------------------+-------------------------+ 19 | * | ESP8266 | D1(IO5), D2(IO4), | D0(IO16), D1(IO5), | 20 | * | | D5(IO14), D6(IO12), | D2(IO4), D5(IO14), | 21 | * | | D7(IO13), D8(IO15), | D6(IO12), D7(IO13), | 22 | * | | | D8(IO15) | 23 | * +---------------+-------------------------+-------------------------+ 24 | * | ESP32 | 4(GPI36), 6(GPI34), | 8(GPO32), 9(GP033), | 25 | * | | 5(GPI39), 7(GPI35), | 10(GPIO25), 11(GPIO26), | 26 | * | | 8(GPO32), 9(GP033), | 12(GPIO27), 13(GPIO14), | 27 | * | | 10(GPI025), 11(GPIO26), | 14(GPIO12), 16(GPIO13), | 28 | * | | 12(GPIO27), 13(GPIO14), | 23(GPIO15), 24(GPIO2), | 29 | * | | 14(GPIO12), 16(GPIO13), | 25(GPIO0), 26(GPIO4), | 30 | * | | 21(GPIO7), 23(GPIO15), | 27(GPIO16), 28(GPIO17), | 31 | * | | 24(GPIO2), 25(GPIO0), | 29(GPIO5), 30(GPIO18), | 32 | * | | 26(GPIO4), 27(GPIO16), | 31(GPIO19), 33(GPIO21), | 33 | * | | 28(GPIO17), 29(GPIO5), | 34(GPIO3), 35(GPIO1), | 34 | * | | 30(GPIO18), 31(GPIO19), | 36(GPIO22), 37(GPIO23), | 35 | * | | 33(GPIO21), 35(GPIO1), | | 36 | * | | 36(GPIO22), 37(GPIO23), | | 37 | * +---------------+-------------------------+-------------------------+ 38 | * | Arduino M0 | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 39 | * | Arduino Zero | | | 40 | * +---------------+-------------------------+-------------------------+ 41 | * | Arduino Due | D0-D53 | D0-D53 | 42 | * +---------------+-------------------------+-------------------------+ 43 | * | STM32 | PA0-PA15,PB0-PB15 | PA0-PA15,PB0-PB15 | 44 | * | Black Pill | PC13-PC15 | PC13-PC15 | 45 | * | BluePill | | | 46 | * | Etc... | | | 47 | * +---------------+-------------------------+-------------------------+ 48 | */ 49 | 50 | #include // 51 | 52 | //#define USE_SERIAL SerialUSB //Serial for boards whith USB serial port 53 | #define USE_SERIAL Serial 54 | #define outputPin 12 55 | #define zerocross 5 // for boards with CHANGEBLE input pins 56 | 57 | //dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for ESP8266, ESP32, Arduino due boards 58 | dimmerLamp dimmer(outputPin); //initialase port for dimmer for MEGA, Leonardo, UNO, Arduino M0, Arduino Zero 59 | 60 | 61 | void setup() { 62 | USE_SERIAL.begin(9600); 63 | dimmer.begin(TOGGLE_MODE, OFF); //dimmer initialisation: name.begin(MODE, STATE) 64 | USE_SERIAL.println("--- Toggle dimmer example ---"); 65 | dimmer.toggleSettings(0, 100); //Name.toggleSettings(MIN, MAX); 66 | dimmer.setState(ON); // state: dimmer1.setState(ON/OFF); 67 | pinMode(14, INPUT); 68 | } 69 | void loop() { 70 | // put your main code here, to run repeatedly: 71 | 72 | } 73 | -------------------------------------------------------------------------------- /examples/SimpleButton/SimpleButton.ino: -------------------------------------------------------------------------------- 1 | /************** 2 | * RobotDyn 3 | * Dimmer Library 4 | * ************** 5 | * 6 | * The following sketch is meant to turn the lamp on/off with use of a button. 7 | * pinMode(14, INPUT); button is connected to 14th pin 8 | * void loop() ON/OFF button evaluator of dimmer in dim4.setState(ON/OFF); 9 | * 10 | * 11 | * ---------------------- OUTPUT & INPUT Pin table --------------------- 12 | * +---------------+-------------------------+-------------------------+ 13 | * | Board | INPUT Pin | OUTPUT Pin | 14 | * | | Zero-Cross | | 15 | * +---------------+-------------------------+-------------------------+ 16 | * | Lenardo | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 17 | * +---------------+-------------------------+-------------------------+ 18 | * | Mega | D2 (NOT CHANGABLE) | D0-D1, D3-D70 | 19 | * +---------------+-------------------------+-------------------------+ 20 | * | Uno | D2 (NOT CHANGABLE) | D0-D1, D3-D20 | 21 | * +---------------+-------------------------+-------------------------+ 22 | * | ESP8266 | D1(IO5), D2(IO4), | D0(IO16), D1(IO5), | 23 | * | | D5(IO14), D6(IO12), | D2(IO4), D5(IO14), | 24 | * | | D7(IO13), D8(IO15), | D6(IO12), D7(IO13), | 25 | * | | | D8(IO15) | 26 | * +---------------+-------------------------+-------------------------+ 27 | * | ESP32 | 4(GPI36), 6(GPI34), | 8(GPO32), 9(GP033), | 28 | * | | 5(GPI39), 7(GPI35), | 10(GPIO25), 11(GPIO26), | 29 | * | | 8(GPO32), 9(GP033), | 12(GPIO27), 13(GPIO14), | 30 | * | | 10(GPI025), 11(GPIO26), | 14(GPIO12), 16(GPIO13), | 31 | * | | 12(GPIO27), 13(GPIO14), | 23(GPIO15), 24(GPIO2), | 32 | * | | 14(GPIO12), 16(GPIO13), | 25(GPIO0), 26(GPIO4), | 33 | * | | 21(GPIO7), 23(GPIO15), | 27(GPIO16), 28(GPIO17), | 34 | * | | 24(GPIO2), 25(GPIO0), | 29(GPIO5), 30(GPIO18), | 35 | * | | 26(GPIO4), 27(GPIO16), | 31(GPIO19), 33(GPIO21), | 36 | * | | 28(GPIO17), 29(GPIO5), | 34(GPIO3), 35(GPIO1), | 37 | * | | 30(GPIO18), 31(GPIO19), | 36(GPIO22), 37(GPIO23), | 38 | * | | 33(GPIO21), 35(GPIO1), | | 39 | * | | 36(GPIO22), 37(GPIO23), | | 40 | * +---------------+-------------------------+-------------------------+ 41 | * | Arduino M0 | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 42 | * | Arduino Zero | | | 43 | * +---------------+-------------------------+-------------------------+ 44 | * | Arduino Due | D0-D53 | D0-D53 | 45 | * +---------------+-------------------------+-------------------------+ 46 | * | STM32 | PA0-PA15,PB0-PB15 | PA0-PA15,PB0-PB15 | 47 | * | Black Pill | PC13-PC15 | PC13-PC15 | 48 | * | BluePill | | | 49 | * | Etc... | | | 50 | * +---------------+-------------------------+-------------------------+ 51 | */ 52 | 53 | #include // 54 | 55 | //#define USE_SERIAL SerialUSB //Serial for boards whith USB serial port 56 | #define USE_SERIAL Serial 57 | #define outputPin 12 58 | #define zerocross 5 // for boards with CHANGEBLE input pins 59 | 60 | //dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for ESP8266, ESP32, Arduino due boards 61 | dimmerLamp dimmer(outputPin); //initialase port for dimmer for MEGA, Leonardo, UNO, Arduino M0, Arduino Zero 62 | 63 | int buttonRed = 0; 64 | 65 | void setup() { 66 | dimmer.begin(NORMAL_MODE, ON); //dimmer initialisation: name.begin(MODE, STATE) 67 | dimmer.setPower(50); 68 | pinMode(13, INPUT); 69 | } 70 | 71 | void loop() { 72 | buttonRed = digitalRead(13); 73 | if (buttonRed == 1) 74 | { 75 | delay(10); 76 | dimmer.setState(ON); //name.setState(ON/OFF); 77 | } 78 | if (buttonRed == 0) 79 | { 80 | delay(10); 81 | dimmer.setState(OFF); //name.setState(ON/OFF); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /examples/SimplePotentiometer/SimplePotentiometer.ino: -------------------------------------------------------------------------------- 1 | /************** 2 | * RobotDyn 3 | * Dimmer Library 4 | * ************** 5 | * 6 | * The following sketch is meant to to define dimming value through potentiometer, 7 | * The potentiometer values are changing in range from 0 to 1023 8 | * potentiometer values are converted through the map function to values from 0 to 100% and saved in dimmer.setPower(outVal); 9 | * Serial.begin is used to display dimming values 10 | * 11 | * 12 | * ---------------------- OUTPUT & INPUT Pin table --------------------- 13 | * +---------------+-------------------------+-------------------------+ 14 | * | Board | INPUT Pin | OUTPUT Pin | 15 | * | | Zero-Cross | | 16 | * +---------------+-------------------------+-------------------------+ 17 | * | Lenardo | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 18 | * +---------------+-------------------------+-------------------------+ 19 | * | Mega | D2 (NOT CHANGABLE) | D0-D1, D3-D70 | 20 | * +---------------+-------------------------+-------------------------+ 21 | * | Uno | D2 (NOT CHANGABLE) | D0-D1, D3-D20 | 22 | * +---------------+-------------------------+-------------------------+ 23 | * | ESP8266 | D1(IO5), D2(IO4), | D0(IO16), D1(IO5), | 24 | * | | D5(IO14), D6(IO12), | D2(IO4), D5(IO14), | 25 | * | | D7(IO13), D8(IO15), | D6(IO12), D7(IO13), | 26 | * | | | D8(IO15) | 27 | * +---------------+-------------------------+-------------------------+ 28 | * | ESP32 | 4(GPI36), 6(GPI34), | 8(GPO32), 9(GP033), | 29 | * | | 5(GPI39), 7(GPI35), | 10(GPIO25), 11(GPIO26), | 30 | * | | 8(GPO32), 9(GP033), | 12(GPIO27), 13(GPIO14), | 31 | * | | 10(GPI025), 11(GPIO26), | 14(GPIO12), 16(GPIO13), | 32 | * | | 12(GPIO27), 13(GPIO14), | 23(GPIO15), 24(GPIO2), | 33 | * | | 14(GPIO12), 16(GPIO13), | 25(GPIO0), 26(GPIO4), | 34 | * | | 21(GPIO7), 23(GPIO15), | 27(GPIO16), 28(GPIO17), | 35 | * | | 24(GPIO2), 25(GPIO0), | 29(GPIO5), 30(GPIO18), | 36 | * | | 26(GPIO4), 27(GPIO16), | 31(GPIO19), 33(GPIO21), | 37 | * | | 28(GPIO17), 29(GPIO5), | 34(GPIO3), 35(GPIO1), | 38 | * | | 30(GPIO18), 31(GPIO19), | 36(GPIO22), 37(GPIO23), | 39 | * | | 33(GPIO21), 35(GPIO1), | | 40 | * | | 36(GPIO22), 37(GPIO23), | | 41 | * +---------------+-------------------------+-------------------------+ 42 | * | Arduino M0 | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 43 | * | Arduino Zero | | | 44 | * +---------------+-------------------------+-------------------------+ 45 | * | Arduino Due | D0-D53 | D0-D53 | 46 | * +---------------+-------------------------+-------------------------+ 47 | * | STM32 | PA0-PA15,PB0-PB15 | PA0-PA15,PB0-PB15 | 48 | * | Black Pill | PC13-PC15 | PC13-PC15 | 49 | * | BluePill | | | 50 | * | Etc... | | | 51 | * +---------------+-------------------------+-------------------------+ 52 | */ 53 | 54 | #include // 55 | 56 | //#define USE_SERIAL SerialUSB //Serial for boards whith USB serial port 57 | #define USE_SERIAL Serial 58 | #define outputPin 12 59 | #define zerocross 5 // for boards with CHANGEBLE input pins 60 | 61 | //dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for ESP8266, ESP32, Arduino due boards 62 | dimmerLamp dimmer(outputPin); //initialase port for dimmer for MEGA, Leonardo, UNO, Arduino M0, Arduino Zero 63 | 64 | int outVal = 0; 65 | 66 | void setup() { 67 | USE_SERIAL.begin(9600); 68 | dimmer.begin(NORMAL_MODE, ON); //dimmer initialisation: name.begin(MODE, STATE) 69 | } 70 | 71 | void loop() 72 | { 73 | outVal = map(analogRead(0), 1, 1024, 100, 0); // analogRead(analog_pin), min_analog, max_analog, 100%, 0%); 74 | USE_SERIAL.println(outVal); 75 | dimmer.setPower(outVal); // name.setPower(0%-100%) 76 | } 77 | -------------------------------------------------------------------------------- /examples/TwoButtonsFluently/TwoButtonsFluently.ino: -------------------------------------------------------------------------------- 1 | /************** 2 | * RobotDyn 3 | * Dimmer Library 4 | * ************** 5 | * The following sketch is meant to smoothly turn the dimmer ON after pressing the first button and turn it OFF after pressing a second one 6 | * 7 | * ---------------------- OUTPUT & INPUT Pin table --------------------- 8 | * +---------------+-------------------------+-------------------------+ 9 | * | Board | INPUT Pin | OUTPUT Pin | 10 | * | | Zero-Cross | | 11 | * +---------------+-------------------------+-------------------------+ 12 | * | Lenardo | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 13 | * +---------------+-------------------------+-------------------------+ 14 | * | Mega | D2 (NOT CHANGABLE) | D0-D1, D3-D70 | 15 | * +---------------+-------------------------+-------------------------+ 16 | * | Uno | D2 (NOT CHANGABLE) | D0-D1, D3-D20 | 17 | * +---------------+-------------------------+-------------------------+ 18 | * | ESP8266 | D1(IO5), D2(IO4), | D0(IO16), D1(IO5), | 19 | * | | D5(IO14), D6(IO12), | D2(IO4), D5(IO14), | 20 | * | | D7(IO13), D8(IO15), | D6(IO12), D7(IO13), | 21 | * | | | D8(IO15) | 22 | * +---------------+-------------------------+-------------------------+ 23 | * | ESP32 | 4(GPI36), 6(GPI34), | 8(GPO32), 9(GP033), | 24 | * | | 5(GPI39), 7(GPI35), | 10(GPIO25), 11(GPIO26), | 25 | * | | 8(GPO32), 9(GP033), | 12(GPIO27), 13(GPIO14), | 26 | * | | 10(GPI025), 11(GPIO26), | 14(GPIO12), 16(GPIO13), | 27 | * | | 12(GPIO27), 13(GPIO14), | 23(GPIO15), 24(GPIO2), | 28 | * | | 14(GPIO12), 16(GPIO13), | 25(GPIO0), 26(GPIO4), | 29 | * | | 21(GPIO7), 23(GPIO15), | 27(GPIO16), 28(GPIO17), | 30 | * | | 24(GPIO2), 25(GPIO0), | 29(GPIO5), 30(GPIO18), | 31 | * | | 26(GPIO4), 27(GPIO16), | 31(GPIO19), 33(GPIO21), | 32 | * | | 28(GPIO17), 29(GPIO5), | 34(GPIO3), 35(GPIO1), | 33 | * | | 30(GPIO18), 31(GPIO19), | 36(GPIO22), 37(GPIO23), | 34 | * | | 33(GPIO21), 35(GPIO1), | | 35 | * | | 36(GPIO22), 37(GPIO23), | | 36 | * +---------------+-------------------------+-------------------------+ 37 | * | Arduino M0 | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 38 | * | Arduino Zero | | | 39 | * +---------------+-------------------------+-------------------------+ 40 | * | Arduino Due | D0-D53 | D0-D53 | 41 | * +---------------+-------------------------+-------------------------+ 42 | * | STM32 | PA0-PA15,PB0-PB15 | PA0-PA15,PB0-PB15 | 43 | * | Black Pill | PC13-PC15 | PC13-PC15 | 44 | * | BluePill | | | 45 | * | Etc... | | | 46 | * +---------------+-------------------------+-------------------------+ 47 | */ 48 | 49 | #include 50 | 51 | //#define USE_SERIAL SerialUSB //Serial for boards whith USB serial port 52 | #define USE_SERIAL Serial 53 | #define outputPin 12 54 | #define zerocross 5 // for boards with CHANGEBLE input pins 55 | 56 | #define LAMPMAXVALUE 100 57 | 58 | //dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for ESP8266, ESP32, Arduino due boards 59 | dimmerLamp dimmer(outputPin); //initialase port for dimmer for MEGA, Leonardo, UNO, Arduino M0, Arduino Zero 60 | 61 | 62 | 63 | int stateL = 0, valLamp; 64 | int DIM4 = 0; 65 | int mainLamp = 0; 66 | int buttonRed = 0; 67 | int buttonBlue = 0; 68 | bool setLamp = true; 69 | 70 | void setup() { 71 | USE_SERIAL.begin(9600); 72 | dimmer.begin(NORMAL_MODE, ON); //dimmer initialisation: name.begin(MODE, STATE) 73 | } 74 | 75 | void RiseFallLamp(bool RiseFallInt) 76 | { 77 | if ((RiseFallInt == true) && (mainLamp < LAMPMAXVALUE)) mainLamp++; 78 | else if ((RiseFallInt != true) && (mainLamp > 0)) mainLamp--; 79 | } 80 | 81 | bool setLampState(int val) 82 | { 83 | bool ret; 84 | if (val >= 1) ret = true; 85 | else ret = false; 86 | return ret; 87 | } 88 | 89 | void readButtonState() 90 | { 91 | buttonRed = digitalRead(13); 92 | buttonBlue = digitalRead(15); 93 | 94 | if (buttonRed < 1) stateL++; 95 | if (buttonBlue < 1) stateL--; 96 | if (stateL < 0) stateL = 0; 97 | if (stateL > 1) stateL = 1; 98 | } 99 | 100 | void loop() { 101 | readButtonState(); 102 | dimmer.setPower(mainLamp); // setPower(0-100%); 103 | RiseFallLamp(setLampState(stateL)); 104 | delay(25); 105 | } 106 | -------------------------------------------------------------------------------- /examples/SerialMonitorDim/SerialMonitorDim.ino: -------------------------------------------------------------------------------- 1 | /************** 2 | * RobotDyn 3 | * Dimmer Library 4 | * ************** 5 | * 6 | * The following sketch is meant to define the dimming value through the serial port of the controller, 7 | * using USE_SERIAL.begin 8 | * void printSpace() function is used for adding of space after functional data 9 | * void loop() serial port evaluator, used to register and define values in dimmer.setPower(outVal); 10 | * 11 | * 12 | * ---------------------- OUTPUT & INPUT Pin table --------------------- 13 | * +---------------+-------------------------+-------------------------+ 14 | * | Board | INPUT Pin | OUTPUT Pin | 15 | * | | Zero-Cross | | 16 | * +---------------+-------------------------+-------------------------+ 17 | * | Lenardo | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 18 | * +---------------+-------------------------+-------------------------+ 19 | * | Mega | D2 (NOT CHANGABLE) | D0-D1, D3-D70 | 20 | * +---------------+-------------------------+-------------------------+ 21 | * | Uno | D2 (NOT CHANGABLE) | D0-D1, D3-D20 | 22 | * +---------------+-------------------------+-------------------------+ 23 | * | ESP8266 | D1(IO5), D2(IO4), | D0(IO16), D1(IO5), | 24 | * | | D5(IO14), D6(IO12), | D2(IO4), D5(IO14), | 25 | * | | D7(IO13), D8(IO15), | D6(IO12), D7(IO13), | 26 | * | | | D8(IO15) | 27 | * +---------------+-------------------------+-------------------------+ 28 | * | ESP32 | 4(GPI36), 6(GPI34), | 8(GPO32), 9(GP033), | 29 | * | | 5(GPI39), 7(GPI35), | 10(GPIO25), 11(GPIO26), | 30 | * | | 8(GPO32), 9(GP033), | 12(GPIO27), 13(GPIO14), | 31 | * | | 10(GPI025), 11(GPIO26), | 14(GPIO12), 16(GPIO13), | 32 | * | | 12(GPIO27), 13(GPIO14), | 23(GPIO15), 24(GPIO2), | 33 | * | | 14(GPIO12), 16(GPIO13), | 25(GPIO0), 26(GPIO4), | 34 | * | | 21(GPIO7), 23(GPIO15), | 27(GPIO16), 28(GPIO17), | 35 | * | | 24(GPIO2), 25(GPIO0), | 29(GPIO5), 30(GPIO18), | 36 | * | | 26(GPIO4), 27(GPIO16), | 31(GPIO19), 33(GPIO21), | 37 | * | | 28(GPIO17), 29(GPIO5), | 34(GPIO3), 35(GPIO1), | 38 | * | | 30(GPIO18), 31(GPIO19), | 36(GPIO22), 37(GPIO23), | 39 | * | | 33(GPIO21), 35(GPIO1), | | 40 | * | | 36(GPIO22), 37(GPIO23), | | 41 | * +---------------+-------------------------+-------------------------+ 42 | * | Arduino M0 | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 43 | * | Arduino Zero | | | 44 | * +---------------+-------------------------+-------------------------+ 45 | * | Arduino Due | D0-D53 | D0-D53 | 46 | * +---------------+-------------------------+-------------------------+ 47 | * | STM32 | PA0-PA15,PB0-PB15 | PA0-PA15,PB0-PB15 | 48 | * | Black Pill | PC13-PC15 | PC13-PC15 | 49 | * | BluePill | | | 50 | * | Etc... | | | 51 | * +---------------+-------------------------+-------------------------+ 52 | */ 53 | 54 | #include // 55 | 56 | //#define USE_SERIAL SerialUSB //Serial for boards whith USB serial port 57 | #define USE_SERIAL Serial 58 | #define outputPin 12 59 | #define zerocross 5 // for boards with CHANGEBLE input pins 60 | 61 | //dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for ESP8266, ESP32, Arduino due boards 62 | dimmerLamp dimmer(outputPin); //initialase port for dimmer for MEGA, Leonardo, UNO, Arduino M0, Arduino Zero 63 | 64 | int outVal = 0; 65 | 66 | void setup() { 67 | USE_SERIAL.begin(9600); 68 | dimmer.begin(NORMAL_MODE, ON); //dimmer initialisation: name.begin(MODE, STATE) 69 | USE_SERIAL.println("Dimmer Program is starting..."); 70 | USE_SERIAL.println("Set value"); 71 | } 72 | 73 | void printSpace(int val) 74 | { 75 | if ((val / 100) == 0) USE_SERIAL.print(" "); 76 | if ((val / 10) == 0) USE_SERIAL.print(" "); 77 | } 78 | 79 | void loop() { 80 | int preVal = outVal; 81 | 82 | if (USE_SERIAL.available()) 83 | { 84 | int buf = USE_SERIAL.parseInt(); 85 | if (buf != 0) outVal = buf; 86 | delay(200); 87 | } 88 | dimmer.setPower(outVal); // setPower(0-100%); 89 | 90 | if (preVal != outVal) 91 | { 92 | USE_SERIAL.print("lampValue -> "); 93 | printSpace(dimmer.getPower()); 94 | USE_SERIAL.print(dimmer.getPower()); 95 | USE_SERIAL.println("%"); 96 | 97 | } 98 | delay(50); 99 | 100 | } 101 | -------------------------------------------------------------------------------- /src/esp8266/RBDmcuESP8266.cpp: -------------------------------------------------------------------------------- 1 | #if defined(ARDUINO_ARCH_ESP8266) 2 | 3 | #include "RBDmcuESP8266.h" 4 | 5 | 6 | int pulseWidth = 1; 7 | volatile int current_dim = 0; 8 | int all_dim = 3; 9 | int rise_fall = true; 10 | char user_zero_cross = '0'; 11 | int timeoutPin = 435; // 80us 12 | int extIntPin = 2; //z-c 13 | 14 | static int toggleCounter = 0; 15 | static int toggleReload = 25; 16 | 17 | static dimmerLamp* dimmer[ALL_DIMMERS]; 18 | volatile uint16_t dimPower[ALL_DIMMERS]; 19 | volatile uint16_t dimOutPin[ALL_DIMMERS]; 20 | volatile uint16_t dimZCPin[ALL_DIMMERS]; 21 | volatile uint16_t zeroCross[ALL_DIMMERS]; 22 | volatile DIMMER_MODE_typedef dimMode[ALL_DIMMERS]; 23 | volatile ON_OFF_typedef dimState[ALL_DIMMERS]; 24 | volatile uint16_t dimCounter[ALL_DIMMERS]; 25 | static uint16_t dimPulseBegin[ALL_DIMMERS]; 26 | volatile uint16_t togMax[ALL_DIMMERS]; 27 | volatile uint16_t togMin[ALL_DIMMERS]; 28 | volatile bool togDir[ALL_DIMMERS]; 29 | 30 | dimmerLamp::dimmerLamp(int user_dimmer_pin, int zc_dimmer_pin): 31 | dimmer_pin(user_dimmer_pin), 32 | zc_pin(zc_dimmer_pin) 33 | { 34 | current_dim++; 35 | dimmer[current_dim-1] = this; 36 | current_num = current_dim-1; 37 | toggle_state = false; 38 | 39 | dimPulseBegin[current_dim-1] = 1; 40 | dimOutPin[current_dim-1] = user_dimmer_pin; 41 | dimZCPin[current_dim-1] = zc_dimmer_pin; 42 | dimCounter[current_dim-1] = 0; 43 | zeroCross[current_dim-1] = 0; 44 | dimMode[current_dim-1] = NORMAL_MODE; 45 | togMin[current_dim-1] = 0; 46 | togMax[current_dim-1] = 1; 47 | pinMode(user_dimmer_pin, OUTPUT); 48 | } 49 | 50 | void dimmerLamp::timer_init(void) 51 | { 52 | timer1_attachInterrupt(onTimerISR); 53 | timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE); 54 | timer1_write(timeoutPin); //100 us 55 | } 56 | 57 | void dimmerLamp::ext_int_init(void) 58 | { 59 | int inPin = dimZCPin[this->current_num]; 60 | pinMode(inPin, INPUT_PULLUP); 61 | attachInterrupt(inPin, isr_ext, FALLING); 62 | } 63 | 64 | 65 | void dimmerLamp::begin(DIMMER_MODE_typedef DIMMER_MODE, ON_OFF_typedef ON_OFF) 66 | { 67 | dimMode[this->current_num] = DIMMER_MODE; 68 | dimState[this->current_num] = ON_OFF; 69 | timer_init(); 70 | ext_int_init(); 71 | } 72 | 73 | void dimmerLamp::setPower(int power) 74 | { 75 | if (power >= 99) 76 | { 77 | power = 99; 78 | } 79 | dimPower[this->current_num] = power; 80 | dimPulseBegin[this->current_num] = powerBuf[power]; 81 | 82 | delay(1); 83 | } 84 | 85 | int dimmerLamp::getPower(void) 86 | { 87 | if (dimState[this->current_num] == ON) 88 | return dimPower[this->current_num]; 89 | else return 0; 90 | } 91 | 92 | void dimmerLamp::setState(ON_OFF_typedef ON_OFF) 93 | { 94 | dimState[this->current_num] = ON_OFF; 95 | } 96 | 97 | bool dimmerLamp::getState(void) 98 | { 99 | bool ret; 100 | if (dimState[this->current_num] == ON) ret = true; 101 | else ret = false; 102 | return ret; 103 | } 104 | 105 | void dimmerLamp::changeState(void) 106 | { 107 | if (dimState[this->current_num] == ON) dimState[this->current_num] = OFF; 108 | else 109 | dimState[this->current_num] = ON; 110 | } 111 | 112 | DIMMER_MODE_typedef dimmerLamp::getMode(void) 113 | { 114 | return dimMode[this->current_num]; 115 | } 116 | 117 | void dimmerLamp::setMode(DIMMER_MODE_typedef DIMMER_MODE) 118 | { 119 | dimMode[this->current_num] = DIMMER_MODE; 120 | } 121 | 122 | void dimmerLamp::toggleSettings(int minValue, int maxValue) 123 | { 124 | if (maxValue > 99) 125 | { 126 | maxValue = 99; 127 | } 128 | if (minValue < 1) 129 | { 130 | minValue = 1; 131 | } 132 | dimMode[this->current_num] = TOGGLE_MODE; 133 | togMin[this->current_num] = powerBuf[maxValue]; 134 | togMax[this->current_num] = powerBuf[minValue]; 135 | 136 | toggleReload = 50; 137 | } 138 | 139 | void isr_ext() 140 | { 141 | for (int i = 0; i < current_dim; i++ ) 142 | if (dimState[i] == ON) 143 | { 144 | zeroCross[i] = 1; 145 | } 146 | } 147 | 148 | 149 | static int k; 150 | void ICACHE_RAM_ATTR onTimerISR() 151 | { 152 | 153 | toggleCounter++; 154 | for (k = 0; k < current_dim; k++) 155 | { 156 | if (zeroCross[k] == 1 ) 157 | { 158 | dimCounter[k]++; 159 | 160 | if (dimMode[k] == TOGGLE_MODE) 161 | { 162 | /***** 163 | * TOGGLE DIMMING MODE 164 | *****/ 165 | if (dimPulseBegin[k] >= togMax[k]) 166 | { 167 | // if reach max dimming value 168 | togDir[k] = false; // downcount 169 | } 170 | if (dimPulseBegin[k] <= togMin[k]) 171 | { 172 | // if reach min dimming value 173 | togDir[k] = true; // upcount 174 | } 175 | if (toggleCounter == toggleReload) 176 | { 177 | if (togDir[k] == true) dimPulseBegin[k]++; 178 | else dimPulseBegin[k]--; 179 | } 180 | } 181 | 182 | /***** 183 | * DEFAULT DIMMING MODE (NOT TOGGLE) 184 | *****/ 185 | if (dimCounter[k] >= dimPulseBegin[k] ) 186 | { 187 | digitalWrite(dimOutPin[k], HIGH); 188 | } 189 | 190 | if (dimCounter[k] >= (dimPulseBegin[k] + pulseWidth) ) 191 | { 192 | digitalWrite(dimOutPin[k], LOW); 193 | zeroCross[k] = 0; 194 | dimCounter[k] = 0; 195 | } 196 | } 197 | } 198 | if (toggleCounter >= toggleReload) toggleCounter = 1; 199 | timer1_write(timeoutPin); 200 | 201 | } 202 | 203 | #endif -------------------------------------------------------------------------------- /src/stm32duino/STM32F1/RBDmcuSTM32F1.cpp: -------------------------------------------------------------------------------- 1 | #if defined(ARDUINO_ARCH_STM32F1) 2 | 3 | #include "RBDmcuSTM32F1.h" 4 | #define __cplusplus 5 | 6 | int pulseWidth = 2; 7 | volatile int current_dim = 0; 8 | int all_dim = 3; 9 | int rise_fall = true; 10 | char user_zero_cross = '0'; 11 | 12 | static int toggleCounter = 0; 13 | static int toggleReload = 25; 14 | 15 | static dimmerLamp* dimmer[ALL_DIMMERS]; 16 | static uint16_t dimPower[ALL_DIMMERS]; 17 | static uint16_t dimOutPin[ALL_DIMMERS]; 18 | static uint16_t dimZCPin[ALL_DIMMERS]; 19 | static uint16_t zeroCross[ALL_DIMMERS]; 20 | static DIMMER_MODE_typedef dimMode[ALL_DIMMERS]; 21 | static ON_OFF_typedef dimState[ALL_DIMMERS]; 22 | static uint16_t dimCounter[ALL_DIMMERS]; 23 | static uint16_t dimPulseBegin[ALL_DIMMERS]; 24 | static uint16_t togMax[ALL_DIMMERS]; 25 | static uint16_t togMin[ALL_DIMMERS]; 26 | static bool togDir[ALL_DIMMERS]; 27 | 28 | dimmerLamp::dimmerLamp(int user_dimmer_pin, int zc_dimmer_pin): 29 | dimmer_pin(user_dimmer_pin), 30 | zc_pin(zc_dimmer_pin) 31 | { 32 | current_dim++; 33 | dimmer[current_dim-1] = this; 34 | current_num = current_dim-1; 35 | toggle_state = false; 36 | 37 | dimPulseBegin[current_dim-1] = 1; 38 | dimOutPin[current_dim-1] = user_dimmer_pin; 39 | dimZCPin[current_dim-1] = zc_dimmer_pin; 40 | dimCounter[current_dim-1] = 0; 41 | zeroCross[current_dim-1] = 0; 42 | dimMode[current_dim-1] = NORMAL_MODE; 43 | togMin[current_dim-1] = 0; 44 | togMax[current_dim-1] = 1; 45 | pinMode(user_dimmer_pin, OUTPUT); 46 | } 47 | 48 | void dimmerLamp::timer_init(void) 49 | { 50 | Timer3.setMode(TIMER_CH1, TIMER_OUTPUTCOMPARE); 51 | Timer3.setPeriod(95); // in microseconds 52 | Timer3.setCompare(TIMER_CH1, 1); // overflow might be small 53 | Timer3.attachInterrupt(TIMER_CH1, onTimerISR); 54 | } 55 | 56 | void dimmerLamp::ext_int_init(void) 57 | { 58 | int inPin = dimZCPin[this->current_num]; 59 | pinMode(inPin, INPUT_PULLUP); 60 | attachInterrupt(digitalPinToInterrupt(inPin), isr_ext, RISING); 61 | } 62 | 63 | void dimmerLamp::begin(DIMMER_MODE_typedef DIMMER_MODE, ON_OFF_typedef ON_OFF) 64 | { 65 | dimMode[this->current_num] = DIMMER_MODE; 66 | dimState[this->current_num] = ON_OFF; 67 | timer_init(); 68 | ext_int_init(); 69 | } 70 | 71 | void dimmerLamp::setPower(int power) 72 | { 73 | if (power >= 99) 74 | { 75 | power = 99; 76 | } 77 | dimPower[this->current_num] = power; 78 | dimPulseBegin[this->current_num] = powerBuf[power]; 79 | 80 | delay(1); 81 | } 82 | 83 | int dimmerLamp::getPower(void) 84 | { 85 | if (dimState[this->current_num] == ON) 86 | return dimPower[this->current_num]; 87 | else return 0; 88 | } 89 | 90 | void dimmerLamp::setState(ON_OFF_typedef ON_OFF) 91 | { 92 | dimState[this->current_num] = ON_OFF; 93 | } 94 | 95 | bool dimmerLamp::getState(void) 96 | { 97 | bool ret; 98 | if (dimState[this->current_num] == ON) ret = true; 99 | else ret = false; 100 | return ret; 101 | } 102 | 103 | void dimmerLamp::changeState(void) 104 | { 105 | if (dimState[this->current_num] == ON) dimState[this->current_num] = OFF; 106 | else 107 | dimState[this->current_num] = ON; 108 | } 109 | 110 | DIMMER_MODE_typedef dimmerLamp::getMode(void) 111 | { 112 | return dimMode[this->current_num]; 113 | } 114 | 115 | void dimmerLamp::setMode(DIMMER_MODE_typedef DIMMER_MODE) 116 | { 117 | dimMode[this->current_num] = DIMMER_MODE; 118 | } 119 | 120 | void dimmerLamp::toggleSettings(int minValue, int maxValue) 121 | { 122 | if (maxValue > 99) 123 | { 124 | maxValue = 99; 125 | } 126 | if (minValue < 1) 127 | { 128 | minValue = 1; 129 | } 130 | dimMode[this->current_num] = TOGGLE_MODE; 131 | togMin[this->current_num] = powerBuf[maxValue]; 132 | togMax[this->current_num] = powerBuf[minValue]; 133 | 134 | toggleReload = 50; 135 | } 136 | 137 | void isr_ext(void) 138 | { 139 | for (int i = 0; i < current_dim; i++ ) 140 | if (dimState[i] == ON) 141 | { 142 | zeroCross[i] = 1; 143 | } 144 | } 145 | 146 | static int k; 147 | void onTimerISR() 148 | { 149 | digitalWrite(PC13, !(digitalRead(PC13))); 150 | toggleCounter++; 151 | for (k = 0; k < current_dim; k++) 152 | { 153 | 154 | if (zeroCross[k] == 1 ) 155 | { 156 | 157 | dimCounter[k]++; 158 | 159 | if (dimMode[k] == TOGGLE_MODE) 160 | { 161 | /***** 162 | * TOGGLE DIMMING MODE 163 | *****/ 164 | if (dimPulseBegin[k] >= togMax[k]) 165 | { 166 | // if reach max dimming value 167 | togDir[k] = false; // downcount 168 | } 169 | if (dimPulseBegin[k] <= togMin[k]) 170 | { 171 | // if reach min dimming value 172 | togDir[k] = true; // upcount 173 | } 174 | if (toggleCounter == toggleReload) 175 | { 176 | if (togDir[k] == true) dimPulseBegin[k]++; 177 | else dimPulseBegin[k]--; 178 | } 179 | } 180 | 181 | /***** 182 | * DEFAULT DIMMING MODE (NOT TOGGLE) 183 | *****/ 184 | if (dimCounter[k] >= dimPulseBegin[k] ) 185 | { 186 | digitalWrite(dimOutPin[k], HIGH); 187 | } 188 | 189 | if (dimCounter[k] >= (dimPulseBegin[k] + pulseWidth) ) 190 | { 191 | digitalWrite(dimOutPin[k], LOW); 192 | zeroCross[k] = 0; 193 | dimCounter[k] = 0; 194 | } 195 | } 196 | } 197 | if (toggleCounter >= toggleReload) toggleCounter = 1; 198 | } 199 | 200 | #endif 201 | -------------------------------------------------------------------------------- /src/esp32/RBDmcuESP32.cpp: -------------------------------------------------------------------------------- 1 | #if defined(ARDUINO_ARCH_ESP32) 2 | 3 | #include "RBDmcuESP32.h" 4 | 5 | 6 | int pulseWidth = 1; 7 | volatile int current_dim = 0; 8 | int all_dim = 3; 9 | int rise_fall = true; 10 | char user_zero_cross = '0'; 11 | 12 | static int toggleCounter = 0; 13 | static int toggleReload = 25; 14 | 15 | static dimmerLamp* dimmer[ALL_DIMMERS]; 16 | volatile uint16_t dimPower[ALL_DIMMERS]; 17 | volatile uint16_t dimOutPin[ALL_DIMMERS]; 18 | volatile uint16_t dimZCPin[ALL_DIMMERS]; 19 | volatile uint16_t zeroCross[ALL_DIMMERS]; 20 | volatile DIMMER_MODE_typedef dimMode[ALL_DIMMERS]; 21 | volatile ON_OFF_typedef dimState[ALL_DIMMERS]; 22 | volatile uint16_t dimCounter[ALL_DIMMERS]; 23 | static uint16_t dimPulseBegin[ALL_DIMMERS]; 24 | volatile uint16_t togMax[ALL_DIMMERS]; 25 | volatile uint16_t togMin[ALL_DIMMERS]; 26 | volatile bool togDir[ALL_DIMMERS]; 27 | 28 | dimmerLamp::dimmerLamp(int user_dimmer_pin, int zc_dimmer_pin): 29 | dimmer_pin(user_dimmer_pin), 30 | zc_pin(zc_dimmer_pin) 31 | { 32 | current_dim++; 33 | dimmer[current_dim-1] = this; 34 | current_num = current_dim-1; 35 | toggle_state = false; 36 | 37 | dimPulseBegin[current_dim-1] = 1; 38 | dimOutPin[current_dim-1] = user_dimmer_pin; 39 | dimZCPin[current_dim-1] = zc_dimmer_pin; 40 | dimCounter[current_dim-1] = 0; 41 | zeroCross[current_dim-1] = 0; 42 | dimMode[current_dim-1] = NORMAL_MODE; 43 | togMin[current_dim-1] = 0; 44 | togMax[current_dim-1] = 1; 45 | pinMode(user_dimmer_pin, OUTPUT); 46 | } 47 | 48 | void dimmerLamp::timer_init(void) 49 | { 50 | hw_timer_t * timer = NULL; 51 | // Use 1st timer of 4 (counted from zero). 52 | // Set 80 divider for prescaler (see ESP32 Technical Reference Manual for more info). 53 | timer = timerBegin(0, 250, true); 54 | // Attach onTimer function to our timer. 55 | timerAttachInterrupt(timer, &onTimerISR, true); 56 | // Set alarm to call onTimer function every second (value in microseconds). 57 | // Repeat the alarm (third parameter) 58 | timerAlarmWrite(timer, 30, true); 59 | // Start an alarm 60 | timerAlarmEnable(timer); 61 | } 62 | 63 | void dimmerLamp::ext_int_init(void) 64 | { 65 | int inPin = dimZCPin[this->current_num]; 66 | pinMode(inPin, INPUT_PULLUP); 67 | attachInterrupt(inPin, isr_ext, RISING); 68 | } 69 | 70 | void dimmerLamp::begin(DIMMER_MODE_typedef DIMMER_MODE, ON_OFF_typedef ON_OFF) 71 | { 72 | dimMode[this->current_num] = DIMMER_MODE; 73 | dimState[this->current_num] = ON_OFF; 74 | timer_init(); 75 | ext_int_init(); 76 | } 77 | 78 | void dimmerLamp::setPower(int power) 79 | { 80 | if (power >= 99) 81 | { 82 | power = 99; 83 | } 84 | dimPower[this->current_num] = power; 85 | dimPulseBegin[this->current_num] = powerBuf[power]; 86 | 87 | delay(1); 88 | } 89 | 90 | int dimmerLamp::getPower(void) 91 | { 92 | if (dimState[this->current_num] == ON) 93 | return dimPower[this->current_num]; 94 | else return 0; 95 | } 96 | 97 | void dimmerLamp::setState(ON_OFF_typedef ON_OFF) 98 | { 99 | dimState[this->current_num] = ON_OFF; 100 | } 101 | 102 | bool dimmerLamp::getState(void) 103 | { 104 | bool ret; 105 | if (dimState[this->current_num] == ON) ret = true; 106 | else ret = false; 107 | return ret; 108 | } 109 | 110 | void dimmerLamp::changeState(void) 111 | { 112 | if (dimState[this->current_num] == ON) dimState[this->current_num] = OFF; 113 | else 114 | dimState[this->current_num] = ON; 115 | } 116 | 117 | DIMMER_MODE_typedef dimmerLamp::getMode(void) 118 | { 119 | return dimMode[this->current_num]; 120 | } 121 | 122 | void dimmerLamp::setMode(DIMMER_MODE_typedef DIMMER_MODE) 123 | { 124 | dimMode[this->current_num] = DIMMER_MODE; 125 | } 126 | 127 | void dimmerLamp::toggleSettings(int minValue, int maxValue) 128 | { 129 | if (maxValue > 99) 130 | { 131 | maxValue = 99; 132 | } 133 | if (minValue < 1) 134 | { 135 | minValue = 1; 136 | } 137 | dimMode[this->current_num] = TOGGLE_MODE; 138 | togMin[this->current_num] = powerBuf[maxValue]; 139 | togMax[this->current_num] = powerBuf[minValue]; 140 | 141 | toggleReload = 50; 142 | } 143 | 144 | void IRAM_ATTR isr_ext() 145 | { 146 | for (int i = 0; i < current_dim; i++ ) 147 | if (dimState[i] == ON) 148 | { 149 | zeroCross[i] = 1; 150 | } 151 | } 152 | 153 | static int k; 154 | void IRAM_ATTR onTimerISR() 155 | { 156 | 157 | toggleCounter++; 158 | for (k = 0; k < current_dim; k++) 159 | { 160 | if (zeroCross[k] == 1 ) 161 | { 162 | dimCounter[k]++; 163 | 164 | if (dimMode[k] == TOGGLE_MODE) 165 | { 166 | /***** 167 | * TOGGLE DIMMING MODE 168 | *****/ 169 | if (dimPulseBegin[k] >= togMax[k]) 170 | { 171 | // if reach max dimming value 172 | togDir[k] = false; // downcount 173 | } 174 | if (dimPulseBegin[k] <= togMin[k]) 175 | { 176 | // if reach min dimming value 177 | togDir[k] = true; // upcount 178 | } 179 | if (toggleCounter == toggleReload) 180 | { 181 | if (togDir[k] == true) dimPulseBegin[k]++; 182 | else dimPulseBegin[k]--; 183 | } 184 | } 185 | 186 | /***** 187 | * DEFAULT DIMMING MODE (NOT TOGGLE) 188 | *****/ 189 | if (dimCounter[k] >= dimPulseBegin[k] ) 190 | { 191 | digitalWrite(dimOutPin[k], HIGH); 192 | } 193 | 194 | if (dimCounter[k] >= (dimPulseBegin[k] + pulseWidth) ) 195 | { 196 | digitalWrite(dimOutPin[k], LOW); 197 | zeroCross[k] = 0; 198 | dimCounter[k] = 0; 199 | } 200 | } 201 | } 202 | if (toggleCounter >= toggleReload) toggleCounter = 1; 203 | 204 | } 205 | 206 | #endif -------------------------------------------------------------------------------- /src/sam/RBDmcuSAM.cpp: -------------------------------------------------------------------------------- 1 | #if defined(ARDUINO_ARCH_SAM) 2 | 3 | #include "RBDmcuSAM.h" 4 | #define __cplusplus 5 | 6 | int pulseWidth = 2; 7 | volatile int current_dim = 0; 8 | int all_dim = 3; 9 | int rise_fall = true; 10 | char user_zero_cross = '0'; 11 | 12 | static int toggleCounter = 0; 13 | static int toggleReload = 25; 14 | 15 | static dimmerLamp* dimmer[ALL_DIMMERS]; 16 | static uint16_t dimPower[ALL_DIMMERS]; 17 | static uint16_t dimOutPin[ALL_DIMMERS]; 18 | static uint16_t dimZCPin[ALL_DIMMERS]; 19 | static uint16_t zeroCross[ALL_DIMMERS]; 20 | static DIMMER_MODE_typedef dimMode[ALL_DIMMERS]; 21 | static ON_OFF_typedef dimState[ALL_DIMMERS]; 22 | static uint16_t dimCounter[ALL_DIMMERS]; 23 | static uint16_t dimPulseBegin[ALL_DIMMERS]; 24 | static uint16_t togMax[ALL_DIMMERS]; 25 | static uint16_t togMin[ALL_DIMMERS]; 26 | static bool togDir[ALL_DIMMERS]; 27 | 28 | dimmerLamp::dimmerLamp(int user_dimmer_pin, int zc_dimmer_pin): 29 | dimmer_pin(user_dimmer_pin), 30 | zc_pin(zc_dimmer_pin) 31 | { 32 | current_dim++; 33 | dimmer[current_dim-1] = this; 34 | current_num = current_dim-1; 35 | toggle_state = false; 36 | 37 | dimPulseBegin[current_dim-1] = 1; 38 | dimOutPin[current_dim-1] = user_dimmer_pin; 39 | dimZCPin[current_dim-1] = zc_dimmer_pin; 40 | dimCounter[current_dim-1] = 0; 41 | zeroCross[current_dim-1] = 0; 42 | dimMode[current_dim-1] = NORMAL_MODE; 43 | togMin[current_dim-1] = 0; 44 | togMax[current_dim-1] = 1; 45 | pinMode(user_dimmer_pin, OUTPUT); 46 | } 47 | 48 | void dimmerLamp::timer_init(void) 49 | { 50 | PMC->PMC_PCER0 |= PMC_PCER0_PID29; // Timer Counter 0 channel 2 is TC2 51 | 52 | TC0->TC_CHANNEL[2].TC_CCR = TC_CCR_CLKDIS; 53 | 54 | TC0->TC_CHANNEL[2].TC_CMR |= TC_CMR_TCCLKS_TIMER_CLOCK1 55 | | TC_CMR_CPCTRG 56 | | TC_CMR_ACPC_SET 57 | | TC_CMR_CPCDIS; 58 | TC0->TC_CHANNEL[2].TC_RC = 4100; 59 | 60 | TC0->TC_CHANNEL[2].TC_IER |= TC_IER_CPCS; 61 | TC0->TC_CHANNEL[2].TC_CCR |= TC_CCR_SWTRG | TC_CCR_CLKEN; 62 | 63 | NVIC_EnableIRQ(TC2_IRQn); 64 | } 65 | 66 | void dimmerLamp::ext_int_init(void) 67 | { 68 | int inPin = dimZCPin[this->current_num]; 69 | pinMode(inPin, INPUT_PULLUP); 70 | attachInterrupt(digitalPinToInterrupt(inPin), isr_ext, RISING); 71 | } 72 | 73 | void dimmerLamp::begin(DIMMER_MODE_typedef DIMMER_MODE, ON_OFF_typedef ON_OFF) 74 | { 75 | dimMode[this->current_num] = DIMMER_MODE; 76 | dimState[this->current_num] = ON_OFF; 77 | timer_init(); 78 | ext_int_init(); 79 | } 80 | 81 | void dimmerLamp::setPower(int power) 82 | { 83 | if (power >= 99) 84 | { 85 | power = 99; 86 | } 87 | dimPower[this->current_num] = power; 88 | dimPulseBegin[this->current_num] = powerBuf[power]; 89 | 90 | delay(1); 91 | } 92 | 93 | int dimmerLamp::getPower(void) 94 | { 95 | if (dimState[this->current_num] == ON) 96 | return dimPower[this->current_num]; 97 | else return 0; 98 | } 99 | 100 | void dimmerLamp::setState(ON_OFF_typedef ON_OFF) 101 | { 102 | dimState[this->current_num] = ON_OFF; 103 | } 104 | 105 | bool dimmerLamp::getState(void) 106 | { 107 | bool ret; 108 | if (dimState[this->current_num] == ON) ret = true; 109 | else ret = false; 110 | return ret; 111 | } 112 | 113 | void dimmerLamp::changeState(void) 114 | { 115 | if (dimState[this->current_num] == ON) dimState[this->current_num] = OFF; 116 | else 117 | dimState[this->current_num] = ON; 118 | } 119 | 120 | DIMMER_MODE_typedef dimmerLamp::getMode(void) 121 | { 122 | return dimMode[this->current_num]; 123 | } 124 | 125 | void dimmerLamp::setMode(DIMMER_MODE_typedef DIMMER_MODE) 126 | { 127 | dimMode[this->current_num] = DIMMER_MODE; 128 | } 129 | 130 | void dimmerLamp::toggleSettings(int minValue, int maxValue) 131 | { 132 | if (maxValue > 99) 133 | { 134 | maxValue = 99; 135 | } 136 | if (minValue < 1) 137 | { 138 | minValue = 1; 139 | } 140 | dimMode[this->current_num] = TOGGLE_MODE; 141 | togMin[this->current_num] = powerBuf[maxValue]; 142 | togMax[this->current_num] = powerBuf[minValue]; 143 | 144 | toggleReload = 50; 145 | } 146 | 147 | void isr_ext(void) 148 | { 149 | for (int i = 0; i < current_dim; i++ ) 150 | if (dimState[i] == ON) 151 | { 152 | zeroCross[i] = 1; 153 | } 154 | } 155 | 156 | static int k, rc; 157 | void TC2_Handler() 158 | { 159 | rc = (TC0->TC_CHANNEL[2].TC_SR & TC_SR_CPCS); 160 | TC0->TC_CHANNEL[2].TC_IMR &= ~TC_SR_CPCS; 161 | 162 | 163 | toggleCounter++; 164 | for (k = 0; k < current_dim; k++) 165 | { 166 | 167 | if (zeroCross[k] == 1 ) 168 | { 169 | 170 | dimCounter[k]++; 171 | 172 | if (dimMode[k] == TOGGLE_MODE) 173 | { 174 | /***** 175 | * TOGGLE DIMMING MODE 176 | *****/ 177 | if (dimPulseBegin[k] >= togMax[k]) 178 | { 179 | // if reach max dimming value 180 | togDir[k] = false; // downcount 181 | } 182 | if (dimPulseBegin[k] <= togMin[k]) 183 | { 184 | // if reach min dimming value 185 | togDir[k] = true; // upcount 186 | } 187 | if (toggleCounter == toggleReload) 188 | { 189 | if (togDir[k] == true) dimPulseBegin[k]++; 190 | else dimPulseBegin[k]--; 191 | } 192 | } 193 | 194 | /***** 195 | * DEFAULT DIMMING MODE (NOT TOGGLE) 196 | *****/ 197 | if (dimCounter[k] >= dimPulseBegin[k] ) 198 | { 199 | digitalWrite(dimOutPin[k], HIGH); 200 | } 201 | 202 | if (dimCounter[k] >= (dimPulseBegin[k] + pulseWidth) ) 203 | { 204 | digitalWrite(dimOutPin[k], LOW); 205 | zeroCross[k] = 0; 206 | dimCounter[k] = 0; 207 | } 208 | } 209 | } 210 | if (toggleCounter >= toggleReload) toggleCounter = 1; 211 | TC0->TC_CHANNEL[2].TC_IMR |= TC_SR_CPCS; 212 | } 213 | 214 | #endif 215 | -------------------------------------------------------------------------------- /ReadMe(en).txt: -------------------------------------------------------------------------------- 1 | 2 | The following library is used for work with dimmer, it gives ability to control large ammoun of dimmer by the means of hardware timer and external interrupt. 3 | When used this libarary better discover pin table 4 | 5 | * ---------------------- OUTPUT & INPUT Pin table --------------------- 6 | * +---------------+-------------------------+-------------------------+ 7 | * | Board | INPUT Pin | OUTPUT Pin | 8 | * | | Zero-Cross | | 9 | * +---------------+-------------------------+-------------------------+ 10 | * | Leonardo | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 11 | * +---------------+-------------------------+-------------------------+ 12 | * | Mega | D2 (NOT CHANGABLE) | D0-D1, D3-D70 | 13 | * +---------------+-------------------------+-------------------------+ 14 | * | Uno | D2 (NOT CHANGABLE) | D0-D1, D3-D20 | 15 | * +---------------+-------------------------+-------------------------+ 16 | * | ESP8266 | D1(IO5), D2(IO4), | D0(IO16), D1(IO5), | 17 | * | | D5(IO14), D6(IO12), | D2(IO4), D5(IO14), | 18 | * | | D7(IO13), D8(IO15), | D6(IO12), D7(IO13), | 19 | * | | | D8(IO15) | 20 | * +---------------+-------------------------+-------------------------+ 21 | * | ESP32 | 4(GPI36), 6(GPI34), | 8(GPO32), 9(GP033), | 22 | * | | 5(GPI39), 7(GPI35), | 10(GPIO25), 11(GPIO26), | 23 | * | | 8(GPO32), 9(GP033), | 12(GPIO27), 13(GPIO14), | 24 | * | | 10(GPI025), 11(GPIO26), | 14(GPIO12), 16(GPIO13), | 25 | * | | 12(GPIO27), 13(GPIO14), | 23(GPIO15), 24(GPIO2), | 26 | * | | 14(GPIO12), 16(GPIO13), | 25(GPIO0), 26(GPIO4), | 27 | * | | 21(GPIO7), 23(GPIO15), | 27(GPIO16), 28(GPIO17), | 28 | * | | 24(GPIO2), 25(GPIO0), | 29(GPIO5), 30(GPIO18), | 29 | * | | 26(GPIO4), 27(GPIO16), | 31(GPIO19), 33(GPIO21), | 30 | * | | 28(GPIO17), 29(GPIO5), | 34(GPIO3), 35(GPIO1), | 31 | * | | 30(GPIO18), 31(GPIO19), | 36(GPIO22), 37(GPIO23), | 32 | * | | 33(GPIO21), 35(GPIO1), | | 33 | * | | 36(GPIO22), 37(GPIO23), | | 34 | * +---------------+-------------------------+-------------------------+ 35 | * | Arduino M0 | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 36 | * | Arduino Zero | | | 37 | * +---------------+-------------------------+-------------------------+ 38 | * | Arduino Due | D0-D53 | D0-D53 | 39 | * +---------------+-------------------------+-------------------------+ 40 | * | STM32 | PA0-PA15,PB0-PB15 | PA0-PA15,PB0-PB15 | 41 | * | Black Pill | PC13-PC15 | PC13-PC15 | 42 | * | BluePill | | | 43 | * | Etc... | | | 44 | * +---------------+-------------------------+-------------------------+ 45 | 46 | This library can simplify user code with following functions: 47 | 48 | 1. Function dimmerLamp - this function initializes the number of operating pin and is defined by the user 49 | Example: 50 | a.dimmerLamp dimmer(4); dimmer output DIM/PSM is initialized on the pin 4 for the bords WITHOUT changable ZERO-CROSS input pin (AVR, Arduino M0/Zero) 51 | b.dimmerLamp dimmer(4, 2); dimmer output DIM/PSM is initialized on the pin 4 and zero-cross initialized on pin 2. Only for boards whith changable zero-cross(ESP32, ESP8266, Arduino Due) 52 | 53 | 2. Function begin port initialization, timer and external interrupt from zero-cross. 54 | Example: 55 | dimmer.begin(NORMAL_MODE, ON/OFF); port initialization, work mode choice, ON/OFF. 56 | Parameter 1: dimmer working modes consist of two choices - NORMAL_MODE and TOGGLE_MODE 57 | a. NORMAL_MODE to make dimmer work in defined value from 0 to 100 (%) (integer) 58 | Example of this mode located in \RBDdimmer\examples\SimpleDimmer 59 | b. TOGGLE_MODE smooth change of dimming value up or down in a defined range. This solutions implies change of dimming values by means of hardware timer, without using the cycle code. 60 | Example of this mode located in \RBDdimmer\examples\SimpleToggleDimmer 61 | 62 | Parameter 2: ON/OFF. 63 | a. ON - turns timer ON, allows to use dimmer. 64 | b. OFF - turns timer parameters OFF, prevents the use of dimmer. 65 | 66 | 3. Function setPower sets dimming value from 0 to 100% 67 | Example: dimmer.setPower(90); 68 | 69 | 4. Function getPower to display current dimming value 70 | Example: Serial.print(dimmer.getPower()); Result 0~100 int 71 | 72 | 5. Function setMode sets and changes the work mode (NORMAL_MODE and TOGGLE_MODE) 73 | dimmer.setMode(NORMAL_MODE/TOGGLE_MODE) 74 | 75 | 6. Function getMode displays values of current work mode 76 | Example: Serial.print(dimmer.getPower()); Result 0 (NORMAL_MODE) or 1 (TOGGLE_MODE) 77 | 78 | 7. Function setState sets dimming state ON/OFF 79 | Example: dimmer.setState(ON); delay(100); dimmer.setState(OFF); 80 | 81 | 8. Function getState displays current state of dimmer 82 | Serial.print(dimmer.getState()); Result 0 (OFF) or 1 (ON) 83 | 84 | 9. Function changeState changes dimmer state to the opposite one 85 | Пример dimmer.setState(ON); delay(100); dimmer.changeState; delay(100); 86 | 87 | 10. Function toggleSettings smooth change of dimming value up or down in a defined range 88 | Example located in \RBDdimmer\examples\SimpleToggleDimmer 89 | -------------------------------------------------------------------------------- /ReadMe(ru).txt: -------------------------------------------------------------------------------- 1 | 2 | Данная библиотека предназначена для работы с диммером, дает возможность управления большим количеством диммеров используя аппаратный таймер и внешние прерывания. 3 | При использовании библиотеки стоит заранее ознакомится с таблицей задаваемых пинов. 4 | 5 | * ---------------------- OUTPUT & INPUT Pin table --------------------- 6 | * +---------------+-------------------------+-------------------------+ 7 | * | Board | INPUT Pin | OUTPUT Pin | 8 | * | | Zero-Cross | | 9 | * +---------------+-------------------------+-------------------------+ 10 | * | Leonardo | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 11 | * +---------------+-------------------------+-------------------------+ 12 | * | Mega | D2 (NOT CHANGABLE) | D0-D1, D3-D70 | 13 | * +---------------+-------------------------+-------------------------+ 14 | * | Uno | D2 (NOT CHANGABLE) | D0-D1, D3-D20 | 15 | * +---------------+-------------------------+-------------------------+ 16 | * | ESP8266 | D1(IO5), D2(IO4), | D0(IO16), D1(IO5), | 17 | * | | D5(IO14), D6(IO12), | D2(IO4), D5(IO14), | 18 | * | | D7(IO13), D8(IO15), | D6(IO12), D7(IO13), | 19 | * | | | D8(IO15) | 20 | * +---------------+-------------------------+-------------------------+ 21 | * | ESP32 | 4(GPI36), 6(GPI34), | 8(GPO32), 9(GP033), | 22 | * | | 5(GPI39), 7(GPI35), | 10(GPIO25), 11(GPIO26), | 23 | * | | 8(GPO32), 9(GP033), | 12(GPIO27), 13(GPIO14), | 24 | * | | 10(GPI025), 11(GPIO26), | 14(GPIO12), 16(GPIO13), | 25 | * | | 12(GPIO27), 13(GPIO14), | 23(GPIO15), 24(GPIO2), | 26 | * | | 14(GPIO12), 16(GPIO13), | 25(GPIO0), 26(GPIO4), | 27 | * | | 21(GPIO7), 23(GPIO15), | 27(GPIO16), 28(GPIO17), | 28 | * | | 24(GPIO2), 25(GPIO0), | 29(GPIO5), 30(GPIO18), | 29 | * | | 26(GPIO4), 27(GPIO16), | 31(GPIO19), 33(GPIO21), | 30 | * | | 28(GPIO17), 29(GPIO5), | 34(GPIO3), 35(GPIO1), | 31 | * | | 30(GPIO18), 31(GPIO19), | 36(GPIO22), 37(GPIO23), | 32 | * | | 33(GPIO21), 35(GPIO1), | | 33 | * | | 36(GPIO22), 37(GPIO23), | | 34 | * +---------------+-------------------------+-------------------------+ 35 | * | Arduino M0 | D7 (NOT CHANGABLE) | D0-D6, D8-D13 | 36 | * | Arduino Zero | | | 37 | * +---------------+-------------------------+-------------------------+ 38 | * | Arduino Due | D0-D53 | D0-D53 | 39 | * +---------------+-------------------------+-------------------------+ 40 | * | STM32 | PA0-PA15,PB0-PB15 | PA0-PA15,PB0-PB15 | 41 | * | Black Pill | PC13-PC15 | PC13-PC15 | 42 | * | BluePill | | | 43 | * | Etc... | | | 44 | * +---------------+-------------------------+-------------------------+ 45 | 46 | Использование данной библиотеки упрощает код пользователя при помощи функций: 47 | 1. функция dimmerLamp. Данная функция инициализирует значение пина которое будет использоватся, задается пользователем 48 | 49 | а.Пример dimmerLamp dimmer(4); диммер выход DIM/PSM инциализируется на пин 4 для плат, в которых пин Zero-Cros не переназначается (NOT CHANGABLE для AVR, SAMD) 50 | б.Пример dimmerLamp dimmer(4, 2); диммер выход DIM/PSM инциализируется на пин 4 для плат, на которых Zero-Cross можно переназначать (ESP32, ESP8266, Arduino Due) 51 | 52 | 2. функция begin - инициализация портов, таймера и внешнего прерывания от zero-cross. 53 | Пример dimmer.begin(NORMAL_MODE, ON); инициализация портов, выбор режима работы, вкл/выкл. 54 | Параметр 1: Выбор режим работы диммера состоит из двух вариантов NORMAL_MODE и TOGGLE_MODE 55 | 56 | а. NORMAL_MODE работа диммера в заданном значении от 0 до 100 (%) (целочисленное) 57 | Пример работы режима находится в папке \RBDdimmer\examples\SimpleDimmer 58 | б. TOGGLE_MODE плавное изменение значения димминга увеличение и снижение в заданных границах. Данное решение построенно на изменении значения диминга за счет 59 | аппаратного таймера и не использует код цикла. 60 | Пример работы режима находится в папке \RBDdimmer\examples\SimpleToggleDimmer 61 | 62 | Параметр 2: ON/OFF. 63 | a. ON - включение таймера, диммер использовать можно. 64 | a. OFF - выключение параметров для таймера, диммер использовать нельзя. 65 | 66 | 3. Функция setPower установка значения димминга от 0 до 100% 67 | Пример dimmer.setPower(90); 68 | 69 | 4. Функция getPower используется для того что бы получить текущее значение димминга 70 | Пример Serial.print(dimmer.getPower()); Result 0~100 int 71 | 72 | 5. Функция setMode установка или изменение мода режимами работы (NORMAL_MODE и TOGGLE_MODE) 73 | dimmer.setMode(NORMAL_MODE/TOGGLE_MODE) 74 | 75 | 6. Функция getMode полученние нынешнего значения режима работы 76 | Пример Serial.print(dimmer.getPower()); Result 0 (NORMAL_MODE) or 1 (TOGGLE_MODE) 77 | 78 | 7. Функция setState задет состояние димминга ON/OFF 79 | Пример dimmer.setState(ON); delay(100); dimmer.setState(OFF); 80 | 81 | 8. Функция getState полученние нынешнего значения состояния диммера 82 | Serial.print(dimmer.getState()); Result 0 (OFF) or 1 (ON) 83 | 84 | 9. Функция changeState изменяет состояние диммера на противоположное 85 | Пример dimmer.setState(ON); delay(100); dimmer.changeState; delay(100); 86 | 87 | 10. Функция toggleSettings плавное изменение значения димминга увеличение и снижение в заданных границах 88 | Пример находится в папке \RBDdimmer\examples\SimpleToggleDimmer 89 | -------------------------------------------------------------------------------- /src/avr/RBDmcuAVR.cpp: -------------------------------------------------------------------------------- 1 | #if defined(ARDUINO_ARCH_AVR) 2 | 3 | #include "RBDmcuAVR.h" 4 | 5 | #define _TCNT(X) TCNT ## X 6 | #define TCNT(X) _TCNT(X) 7 | #define _TCCRxA(X) TCCR ## X ## A 8 | #define TCCRxA(X) _TCCRxA(X) 9 | #define _TCCRxB(X) TCCR ## X ## B 10 | #define TCCRxB(X) _TCCRxB(X) 11 | #define _TIMSKx(X) TIMSK ## X 12 | #define TIMSKx(X) _TIMSKx(X) 13 | #define _TIFRx(X) TIFR ## X 14 | #define TIFRx(X) _TIFRx(X) 15 | #define _OCFxA(X) OCF ## X ## A 16 | #define OCFxA(X) _OCFxA(X) 17 | #define _OCFxB(X) OCF ## X ## B 18 | #define OCFxB(X) _OCFxB(X) 19 | #define _TOIEx(X) TOIE ## X 20 | #define TOIEx(X) _TOIEx(X) 21 | #define _OCIExA(X) OCIE ## X ## A 22 | #define OCIExA(X) _OCIExA(X) 23 | #define _TIMER_COMPA_VECTOR(X) TIMER ## X ## _COMPA_vect 24 | #define TIMER_COMPA_VECTOR(X) _TIMER_COMPA_VECTOR(X) 25 | 26 | int pulseWidth = 1; 27 | volatile int current_dim = 0; 28 | int all_dim = 3; 29 | int rise_fall = true; 30 | char user_zero_cross = '0'; 31 | 32 | static int toggleCounter = 0; 33 | static int toggleReload = 25; 34 | 35 | static dimmerLamp* dimmer[ALL_DIMMERS]; 36 | volatile uint16_t dimPower[ALL_DIMMERS]; 37 | volatile uint16_t dimOutPin[ALL_DIMMERS]; 38 | volatile uint16_t zeroCross[ALL_DIMMERS]; 39 | volatile DIMMER_MODE_typedef dimMode[ALL_DIMMERS]; 40 | volatile ON_OFF_typedef dimState[ALL_DIMMERS]; 41 | volatile uint16_t dimCounter[ALL_DIMMERS]; 42 | static uint16_t dimPulseBegin[ALL_DIMMERS]; 43 | volatile uint16_t togMax[ALL_DIMMERS]; 44 | volatile uint16_t togMin[ALL_DIMMERS]; 45 | volatile bool togDir[ALL_DIMMERS]; 46 | 47 | dimmerLamp::dimmerLamp(int user_dimmer_pin): 48 | dimmer_pin(user_dimmer_pin) 49 | { 50 | current_dim++; 51 | dimmer[current_dim-1] = this; 52 | current_num = current_dim-1; 53 | timer_num = DIMMER_TIMER; 54 | toggle_state = false; 55 | 56 | dimPulseBegin[current_dim-1] = 1; 57 | dimOutPin[current_dim-1] = user_dimmer_pin; 58 | dimCounter[current_dim-1] = 0; 59 | zeroCross[current_dim-1] = 0; 60 | dimMode[current_dim-1] = NORMAL_MODE; 61 | togMin[current_dim-1] = 0; 62 | togMax[current_dim-1] = 1; 63 | pinMode(user_dimmer_pin, OUTPUT); 64 | } 65 | 66 | void dimmerLamp::timer_init(void) 67 | { 68 | TCCRxA(DIMMER_TIMER) &= ~(0xFF); // clean TCCRxA register 69 | TCCRxB(DIMMER_TIMER) &= ~(0xFF); // clean TCCRxB register 70 | 71 | TIMSKx(DIMMER_TIMER) |= (1 << OCIExA(DIMMER_TIMER)); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L) 72 | 73 | TCCRxB(DIMMER_TIMER) = TCCRxB_VALUE; 74 | if (DIMMER_TIMER != 2) OCRxAH(DIMMER_TIMER) = OCRxAH_VALUE; 75 | OCRxAL(DIMMER_TIMER) = OCRxAL_VALUE; 76 | 77 | TIMSKx(DIMMER_TIMER) |= (1 << TOIEx(DIMMER_TIMER)); //timer interrupt enable 78 | } 79 | 80 | void dimmerLamp::ext_int_init(void) 81 | { 82 | EICRX &= ~0xFF; 83 | 84 | EIMSK |= (1 << INTx); 85 | EICRX |= (1 << ISCx1)|(1 << ISCx0);//0b00001100 86 | } 87 | 88 | 89 | void dimmerLamp::begin(DIMMER_MODE_typedef DIMMER_MODE, ON_OFF_typedef ON_OFF) 90 | { 91 | dimMode[this->current_num] = DIMMER_MODE; 92 | dimState[this->current_num] = ON_OFF; 93 | timer_init(); 94 | ext_int_init(); 95 | } 96 | 97 | void dimmerLamp::setPower(int power) 98 | { 99 | if (power >= 99) 100 | { 101 | power = 99; 102 | } 103 | dimPower[this->current_num] = power; 104 | dimPulseBegin[this->current_num] = powerBuf[power]; 105 | 106 | delay(1); 107 | } 108 | 109 | int dimmerLamp::getPower(void) 110 | { 111 | if (dimState[this->current_num] == ON) 112 | return dimPower[this->current_num]; 113 | else return 0; 114 | } 115 | 116 | void dimmerLamp::setState(ON_OFF_typedef ON_OFF) 117 | { 118 | dimState[this->current_num] = ON_OFF; 119 | } 120 | 121 | bool dimmerLamp::getState(void) 122 | { 123 | bool ret; 124 | if (dimState[this->current_num] == ON) ret = true; 125 | else ret = false; 126 | return ret; 127 | } 128 | 129 | void dimmerLamp::changeState(void) 130 | { 131 | if (dimState[this->current_num] == ON) dimState[this->current_num] = OFF; 132 | else 133 | dimState[this->current_num] = ON; 134 | } 135 | 136 | DIMMER_MODE_typedef dimmerLamp::getMode(void) 137 | { 138 | return dimMode[this->current_num]; 139 | } 140 | 141 | void dimmerLamp::setMode(DIMMER_MODE_typedef DIMMER_MODE) 142 | { 143 | dimMode[this->current_num] = DIMMER_MODE; 144 | } 145 | 146 | void dimmerLamp::toggleSettings(int minValue, int maxValue) 147 | { 148 | if (maxValue > 99) 149 | { 150 | maxValue = 99; 151 | } 152 | if (minValue < 1) 153 | { 154 | minValue = 1; 155 | } 156 | dimMode[this->current_num] = TOGGLE_MODE; 157 | togMin[this->current_num] = minValue; 158 | togMax[this->current_num] = maxValue; 159 | 160 | toggleReload = 50; 161 | } 162 | 163 | ISR(INT_vect) 164 | { 165 | for (int i = 0; i < current_dim; i++ ) 166 | if (dimState[i] == ON) 167 | { 168 | zeroCross[i] = 1; 169 | } 170 | } 171 | 172 | static int k; 173 | ISR (TIMER_COMPA_VECTOR(DIMMER_TIMER)) 174 | { 175 | toggleCounter++; 176 | for (k = 0; k < current_dim; k++) 177 | { 178 | if (zeroCross[k] == 1 ) 179 | { 180 | dimCounter[k]++; 181 | 182 | if (dimMode[k] == TOGGLE_MODE) 183 | { 184 | /***** 185 | * TOGGLE DIMMING MODE 186 | *****/ 187 | if (dimPulseBegin[k] >= togMax[k]) 188 | { 189 | // if reach max dimming value 190 | togDir[k] = false; // downcount 191 | } 192 | if (dimPulseBegin[k] <= togMin[k]) 193 | { 194 | // if reach min dimming value 195 | togDir[k] = true; // upcount 196 | } 197 | if (toggleCounter == toggleReload) 198 | { 199 | if (togDir[k] == true) dimPulseBegin[k]++; 200 | else dimPulseBegin[k]--; 201 | } 202 | } 203 | 204 | /***** 205 | * DEFAULT DIMMING MODE (NOT TOGGLE) 206 | *****/ 207 | if (dimCounter[k] >= dimPulseBegin[k] ) 208 | { 209 | digitalWrite(dimOutPin[k], HIGH); 210 | } 211 | 212 | if (dimCounter[k] >= (dimPulseBegin[k] + pulseWidth) ) 213 | { 214 | digitalWrite(dimOutPin[k], LOW); 215 | zeroCross[k] = 0; 216 | dimCounter[k] = 0; 217 | } 218 | } 219 | } 220 | 221 | if (toggleCounter >= toggleReload) toggleCounter = 1; 222 | TIFRx(DIMMER_TIMER) |= ((1<OSC8M.bit.PRESC = 0; // no prescaler (is 8 on reset) 53 | SYSCTRL->OSC8M.reg |= SYSCTRL_OSC8M_ENABLE; // enable source 54 | 55 | GCLK->GENDIV.bit.ID = 0x07; // select GCLK_GEN[1] 56 | GCLK->GENDIV.bit.DIV = 0; // no prescaler 57 | 58 | GCLK->GENCTRL.bit.SRC = 0x06; 59 | GCLK->GENCTRL.bit.ID = 0x07; // select GCLK_GEN[1] 60 | GCLK->GENCTRL.bit.GENEN = 1; // enable generator 61 | 62 | PM->APBCSEL.bit.APBCDIV = 0; // no prescaler 63 | PM->APBCMASK.bit.TC3_ = 1; // enable TC3 interface 64 | 65 | // Configure asynchronous clock source 66 | GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID_TCC2_TC3; // select TC3 peripheral channel 67 | GCLK->CLKCTRL.reg |= GCLK_CLKCTRL_GEN_GCLK7; // select source GCLK_GEN[0] 68 | GCLK->CLKCTRL.bit.CLKEN = 1; // enable TC3 generic clock 69 | 70 | // Configure synchronous bus clock 71 | TC3->COUNT8.CTRLA.bit.MODE = 0x1; // Configure Count Mode (16-bit) 72 | TC3->COUNT8.CTRLA.bit.WAVEGEN = 0x01; 73 | TC3->COUNT8.CTRLA.bit.PRESCALER = 0x02; // Configure Prescaler for divide by 2 (500kHz clock to COUNT) 74 | TC3->COUNT8.CTRLBCLR.bit.DIR = 1; 75 | TC3->COUNT8.CTRLC.bit.CPTEN1 = 1; 76 | TC3->COUNT8.INTENSET.bit.MC0 = 1; // Enable TC3 compare mode interrupt generation // Enable match interrupts on compare channel 0 77 | TC3->COUNT8.CC[0].reg = 190; // Initialize compare value for 100mS @ 500kHz 78 | 79 | while(TC3->COUNT8.STATUS.bit.SYNCBUSY == 1); // Wait until TC3 is enabled 80 | TC3->COUNT8.CTRLA.bit.ENABLE = 1; // Enable TC3 81 | NVIC_EnableIRQ(TC3_IRQn); // Enable TC3 NVIC Interrupt Line 82 | } 83 | 84 | void dimmerLamp::ext_int_init(void) 85 | { 86 | // Configure interrupt port (D8) 87 | PORT->Group[PORTA].WRCONFIG.reg |= 88 | PORT_WRCONFIG_WRPINCFG | // Enables the configuration of PINCFG 89 | PORT_WRCONFIG_WRPMUX | // Enables the configuration of the PMUX for the selected pins 90 | PORT_WRCONFIG_PMUX(MUX_PA15A_EIC_EXTINT15) | // Bulk configuration for PMUX EIC for PA06 91 | PORT_WRCONFIG_PMUXEN | // Enables the PMUX for the pins 92 | PORT_WRCONFIG_PINMASK(PORT_PA15)| 93 | PORT_WRCONFIG_PULLEN | 94 | PORT_WRCONFIG_INEN; // Enable input 95 | 96 | GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID_EIC | GCLK_CLKCTRL_GEN_GCLK1 | GCLK_CLKCTRL_CLKEN; 97 | REG_PM_APBCMASK |= PM_APBAMASK_EIC; 98 | 99 | while (EIC->CTRL.bit.SWRST | EIC->STATUS.bit.SYNCBUSY); 100 | EIC->CTRL.reg |= EIC_CTRL_SWRST; 101 | EIC->CONFIG[1].reg |= EIC_CONFIG_FILTEN7 | EIC_CONFIG_SENSE7_RISE; 102 | EIC->INTENSET.reg |= EIC_INTENSET_EXTINT15; 103 | EIC->CTRL.reg |= EIC_CTRL_ENABLE; // Enable EIC 104 | 105 | NVIC_EnableIRQ(EIC_IRQn); 106 | } 107 | 108 | 109 | void dimmerLamp::begin(DIMMER_MODE_typedef DIMMER_MODE, ON_OFF_typedef ON_OFF) 110 | { 111 | dimMode[this->current_num] = DIMMER_MODE; 112 | dimState[this->current_num] = ON_OFF; 113 | timer_init(); 114 | ext_int_init(); 115 | } 116 | 117 | void dimmerLamp::setPower(int power) 118 | { 119 | if (power >= 99) 120 | { 121 | power = 99; 122 | } 123 | dimPower[this->current_num] = power; 124 | dimPulseBegin[this->current_num] = powerBuf[power]; 125 | 126 | delay(1); 127 | } 128 | 129 | int dimmerLamp::getPower(void) 130 | { 131 | if (dimState[this->current_num] == ON) 132 | return dimPower[this->current_num]; 133 | else return 0; 134 | } 135 | 136 | void dimmerLamp::setState(ON_OFF_typedef ON_OFF) 137 | { 138 | dimState[this->current_num] = ON_OFF; 139 | } 140 | 141 | bool dimmerLamp::getState(void) 142 | { 143 | bool ret; 144 | if (dimState[this->current_num] == ON) ret = true; 145 | else ret = false; 146 | return ret; 147 | } 148 | 149 | void dimmerLamp::changeState(void) 150 | { 151 | if (dimState[this->current_num] == ON) dimState[this->current_num] = OFF; 152 | else 153 | dimState[this->current_num] = ON; 154 | } 155 | 156 | DIMMER_MODE_typedef dimmerLamp::getMode(void) 157 | { 158 | return dimMode[this->current_num]; 159 | } 160 | 161 | void dimmerLamp::setMode(DIMMER_MODE_typedef DIMMER_MODE) 162 | { 163 | dimMode[this->current_num] = DIMMER_MODE; 164 | } 165 | 166 | void dimmerLamp::toggleSettings(int minValue, int maxValue) 167 | { 168 | if (maxValue > 99) 169 | { 170 | maxValue = 99; 171 | } 172 | if (minValue < 1) 173 | { 174 | minValue = 1; 175 | } 176 | dimMode[this->current_num] = TOGGLE_MODE; 177 | togMin[this->current_num] = powerBuf[maxValue]; 178 | togMax[this->current_num] = powerBuf[minValue]; 179 | 180 | toggleReload = 50; 181 | } 182 | 183 | void EIC_Handler(void) 184 | { 185 | for (int i = 0; i < current_dim; i++ ) 186 | if (dimState[i] == ON) 187 | { 188 | zeroCross[i] = 1; 189 | } 190 | EIC->INTFLAG.reg |= EIC_INTFLAG_EXTINT15; // clear interrupt flag 191 | } 192 | 193 | 194 | static int k; 195 | void TC3_Handler(void) 196 | { 197 | toggleCounter++; 198 | for (k = 0; k < current_dim; k++) 199 | { 200 | if (zeroCross[k] == 1 ) 201 | { 202 | dimCounter[k]++; 203 | 204 | if (dimMode[k] == TOGGLE_MODE) 205 | { 206 | /***** 207 | * TOGGLE DIMMING MODE 208 | *****/ 209 | if (dimPulseBegin[k] >= togMax[k]) 210 | { 211 | // if reach max dimming value 212 | togDir[k] = false; // downcount 213 | } 214 | if (dimPulseBegin[k] <= togMin[k]) 215 | { 216 | // if reach min dimming value 217 | togDir[k] = true; // upcount 218 | } 219 | if (toggleCounter == toggleReload) 220 | { 221 | if (togDir[k] == true) dimPulseBegin[k]++; 222 | else dimPulseBegin[k]--; 223 | } 224 | } 225 | 226 | /***** 227 | * DEFAULT DIMMING MODE (NOT TOGGLE) 228 | *****/ 229 | if (dimCounter[k] >= dimPulseBegin[k] ) 230 | { 231 | digitalWrite(dimOutPin[k], HIGH); 232 | } 233 | 234 | if (dimCounter[k] >= (dimPulseBegin[k] + pulseWidth) ) 235 | { 236 | digitalWrite(dimOutPin[k], LOW); 237 | zeroCross[k] = 0; 238 | dimCounter[k] = 0; 239 | } 240 | } 241 | } 242 | 243 | if (toggleCounter >= toggleReload) toggleCounter = 1; 244 | TC3->COUNT8.INTFLAG.reg = TC_INTFLAG_MC0; // Acknowledge the interrupt (clear MC0 interrupt flag to re-arm) 245 | } 246 | 247 | #endif 248 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 34 | 41 | 49 | 56 | 57 | 58 | 59 | 76 | 93 | 108 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 137 | 139 | 141 | 142 | 143 |
BoardINPUT Pin
Zero Cross
OUTPUT Pin
LeonardoD7 (NOT CHANGABLE)D0-D6, D8-D13
MegaD2 (NOT CHANGABLE)D0-D1, D3-D70
UNO
NANO
D2 (NOT CHANGABLE)D0-D1, D3-D20
ESP8266 28 |
    29 |
  • D1(IO5)
  • 30 |
  • D5(IO14)
  • 31 |
  • D7(IO13)
  • 32 |
33 |
35 |
    36 |
  • D2(IO4)
  • 37 |
  • D6(IO12)
  • 38 |
  • D8(IO15)
  • 39 |
40 |
42 |
    43 |
  • D0(IO16)
  • 44 |
  • D2(IO4)
  • 45 |
  • D6(IO12)
  • 46 |
  • D8(IO15)
  • 47 |
48 |
50 |
    51 |
  • D1(IO5)
  • 52 |
  • D5(IO14)
  • 53 |
  • D7(IO13)
  • 54 |
55 |
ESP32 60 |
    61 |
  • 4(GPI36)
  • 62 |
  • 5(GPI39)
  • 63 |
  • 8(GPO32)
  • 64 |
  • 10(GPI025)
  • 65 |
  • 12(GPIO27)
  • 66 |
  • 14(GPIO12)
  • 67 |
  • 21(GPIO7)
  • 68 |
  • 24(GPIO2)
  • 69 |
  • 26(GPIO4)
  • 70 |
  • 28(GPIO17)
  • 71 |
  • 30(GPIO18)
  • 72 |
  • 33(GPIO21)
  • 73 |
  • 36(GPIO22)
  • 74 |
75 |
77 |
    78 |
  • 6(GPI34)
  • 79 |
  • 7(GPI35)
  • 80 |
  • 9(GP033)
  • 81 |
  • 11(GPIO26)
  • 82 |
  • 13(GPIO14)
  • 83 |
  • 16(GPIO13)
  • 84 |
  • 23(GPIO15)
  • 85 |
  • 25(GPIO0)
  • 86 |
  • 27(GPIO16)
  • 87 |
  • 29(GPIO5)
  • 88 |
  • 31(GPIO19)
  • 89 |
  • 35(GPIO1)
  • 90 |
  • 37(GPIO23)
  • 91 |
92 |
94 |
    95 |
  • 8(GPO32)
  • 96 |
  • 10(GPIO25)
  • 97 |
  • 12(GPIO27)
  • 98 |
  • 14(GPIO12
  • 99 |
  • 23(GPIO15)
  • 100 |
  • 25(GPIO0)
  • 101 |
  • 27(GPIO16)
  • 102 |
  • 29(GPIO5)
  • 103 |
  • 31(GPIO19)
  • 104 |
  • 34(GPIO3)
  • 105 |
  • 36(GPIO22)
  • 106 |
107 |
109 |
    110 |
  • 9(GP033)
  • 111 |
  • 11(GPIO26)
  • 112 |
  • 13(GPIO14)
  • 113 |
  • 16(GPIO13)
  • 114 |
  • 24(GPIO2)
  • 115 |
  • 26(GPIO4)
  • 116 |
  • 28(GPIO17)
  • 117 |
  • 30(GPIO18)
  • 118 |
  • 33(GPIO21)
  • 119 |
  • 35(GPIO1)
  • 120 |
  • 37(GPIO23)
  • 121 |
122 |
Arduino M0
Arduino Zero
D7 (NOT CHANGABLE)D0-D6, D8-D13
Arduino Due D0-D53D0-D53
STM32
Black Pill 136 |
Blue Pill
Etc...
PA0-PA15, PB0-PB15 138 |
PC13-PC15
PA0-PA15, PB0-PB15 140 |
PC13-PC15
144 | 145 | This library can simplify user code with following functions: 146 | 147 | 1. Function dimmerLamp - this function initializes the number of operating pin and is defined by the user 148 | Example: 149 | a.dimmerLamp dimmer(4); dimmer output DIM/PSM is initialized on the pin 4 for the bords WITHOUT changable ZERO-CROSS input pin (AVR, Arduino M0/Zero) 150 | b.dimmerLamp dimmer(4, 2); dimmer output DIM/PSM is initialized on the pin 4 and zero-cross initialized on pin 2. Only for boards whith changable zero-cross(ESP32, ESP8266, Arduino Due) 151 | 152 | 2. Function begin port initialization, timer and external interrupt from zero-cross. 153 | Example: 154 | dimmer.begin(NORMAL_MODE, ON/OFF); port initialization, work mode choice, ON/OFF. 155 | Parameter 1: dimmer working modes consist of two choices - NORMAL_MODE and TOGGLE_MODE 156 | a. NORMAL_MODE to make dimmer work in defined value from 0 to 100 (%) (integer) 157 | Example of this mode located in \RBDdimmer\examples\SimpleDimmer 158 | b. TOGGLE_MODE smooth change of dimming value up or down in a defined range. This solutions implies change of dimming values by means of hardware timer, without using the cycle code. 159 | Example of this mode located in \RBDdimmer\examples\SimpleToggleDimmer 160 | 161 | Parameter 2: ON/OFF. 162 | a. ON - turns timer ON, allows to use dimmer. 163 | b. OFF - turns timer parameters OFF, prevents the use of dimmer. 164 | 165 | 3. Function setPower sets dimming value from 0 to 100% 166 | Example: dimmer.setPower(90); 167 | 168 | 4. Function getPower to display current dimming value 169 | Example: Serial.print(dimmer.getPower()); Result 0~100 int 170 | 171 | 5. Function setMode sets and changes the work mode (NORMAL_MODE and TOGGLE_MODE) 172 | dimmer.setMode(NORMAL_MODE/TOGGLE_MODE) 173 | 174 | 6. Function getMode displays values of current work mode 175 | Example: Serial.print(dimmer.getPower()); Result 0 (NORMAL_MODE) or 1 (TOGGLE_MODE) 176 | 177 | 7. Function setState sets dimming state ON/OFF 178 | Example: dimmer.setState(ON); delay(100); dimmer.setState(OFF); 179 | 180 | 8. Function getState displays current state of dimmer 181 | Serial.print(dimmer.getState()); Result 0 (OFF) or 1 (ON) 182 | 183 | 9. Function changeState changes dimmer state to the opposite one 184 | Пример dimmer.setState(ON); delay(100); dimmer.changeState; delay(100); 185 | 186 | 10. Function toggleSettings smooth change of dimming value up or down in a defined range 187 | Example located in \RBDdimmer\examples\SimpleToggleDimmer 188 | --------------------------------------------------------------------------------