← Configurazione Tasmota | Indice
Libreria Arduino IDE
Versione 1.0 — 2019
Stai sviluppando un progetto con Arduino? Libreria Arduino per ESP32/8266, STM32 e schede Arduino. Esempi di codice inclusi.
Connessione I/O
Il dimmer si collega ai controllori Arduino tramite due pin digitali:
- Primo (Zero) — per controllare il passaggio per lo zero di fase della AC, utilizzato per generare il segnale di interrupt
- Secondo (DIM/PSM) — per controllare (dimmerizzare) la corrente
Il pin Zero richiede il collegamento ai pin designati del microcontrollore (che variano in base al modello: Uno, Nano, Leonardo e Mega), poiché è collegato agli interrupt del microcontrollore.
La tensione VCC del dimmer deve corrispondere al livello logico del microcontrollore:
- 5 V per Uno, Nano, Leonardo e Mega
- 3,3 V per STM32, ESP32, ESP8266
Tabella di connessione
| Scheda | Pin INGRESSO Passaggio per lo zero | Pin USCITA |
|---|---|---|
| Leonardo | D7 (NON MODIFICABILE) | D0-D6, D8-D13 |
| Mega | D2 (NON MODIFICABILE) | D0-D1, D3-D70 |
| UNO / NANO | D2 (NON MODIFICABILE) | D0-D1, D3-D20 |
| ESP8266 | D1(GPIO5), D5(GPIO14), D7(GPIO13), D2(GPIO4), D6(GPIO12), D8(GPIO15) | D0(GPIO16), D2(GPIO4), D6(GPIO12), D8(GPIO15), D1(GPIO5), D5(GPIO14), D7(GPIO13) |
| ESP32 | GPIO: 36, 39, 32, 25, 27, 12, 7, 2, 4, 17, 18, 21, 22, 34, 35, 33, 26, 14, 13, 15, 0, 16, 5, 19, 1, 23 | GPIO: 32, 25, 27, 12, 15, 0, 16, 5, 19, 3, 22, 33, 26, 14, 13, 2, 4, 17, 18, 21, 1, 23 |
| Arduino M0 / Arduino Zero | D7 (NON MODIFICABILE) | D0-D6, D8-D13 |
| Arduino Due | D0-D53 | D0-D53 |
| STM32, Blue Pill (STM32F1) | PA0-PA15, PB0-PB15, PC13-PC15 | PA0-PA15, PB0-PB15, PC13-PC15 |
Libreria e funzioni
In Arduino, il dimmer viene controllato tramite la libreria RBDdimmer.h, che utilizza interrupt esterni e interrupt di tempo di processo. Questo semplifica la scrittura del codice e lascia più tempo di elaborazione al codice principale, consentendo il controllo di più dimmer da un singolo microcontrollore.
La libreria include diversi esempi d'uso. La aggiorniamo costantemente, quindi consigliamo di consultare gli aggiornamenti del sito o di iscriversi alla nostra newsletter.
Questa libreria semplifica il codice utente con le seguenti funzioni:
1. Funzione dimmerLamp
Questa funzione inizializza il pin operativo ed è definita dall'utente:
a. Per schede SENZA pin ZERO-CROSS modificabile (AVR, Arduino M0/Zero):
dimmerLamp dimmer(4); // dimmer output DIM/PSM is initialized on the pin 4
b. Per schede con passaggio per lo zero modificabile (ESP32, ESP8266, Arduino Due):
dimmerLamp dimmer(4, 2); // dimmer output DIM/PSM on pin 4, zero-cross on pin 2
2. Funzione begin
Inizializzazione della porta, del timer e dell'interrupt esterno dal passaggio per lo zero:
dimmer.begin(NORMAL_MODE, ON/OFF);
Parametro 1: modalità di funzionamento del dimmer:
NORMAL_MODE— fa funzionare il dimmer con il valore definito da 0 a 100 (%)- Esempio:
\RBDdimmer\examples\SimpleDimmer TOGGLE_MODE— variazione fluida del valore di dimmerizzazione verso l'alto o verso il basso in un intervallo definito- Esempio:
\RBDdimmer\examples\SimpleToggleDimmer
Parametro 2: ON/OFF:
ON— attiva il timer, consente l'uso del dimmerOFF— disattiva i parametri del timer, impedisce l'uso del dimmer
3. Funzione setPower
Imposta il valore di dimmerizzazione da 0 a 100%:
dimmer.setPower(90);
4. Funzione getPower
Mostra il valore di dimmerizzazione corrente:
Serial.print(dimmer.getPower()); // Result 0~100 int
5. Funzione setMode
Imposta e modifica la modalità di funzionamento:
dimmer.setMode(NORMAL_MODE/TOGGLE_MODE);
6. Funzione getMode
Mostra il valore della modalità di funzionamento corrente:
Serial.print(dimmer.getMode()); // Result 0 (NORMAL_MODE) or 1 (TOGGLE_MODE)
7. Funzione setState
Imposta lo stato del dimmer ON/OFF:
dimmer.setState(ON);
delay(100);
dimmer.setState(OFF);
8. Funzione getState
Mostra lo stato corrente del dimmer:
Serial.print(dimmer.getState()); // Result 0 (OFF) or 1 (ON)
9. Funzione changeState
Cambia lo stato del dimmer al contrario:
dimmer.setState(ON);
delay(100);
dimmer.changeState();
delay(100);
10. Funzione toggleSettings
Variazione fluida del valore di dimmerizzazione verso l'alto o verso il basso in un intervallo definito:
Esempio: \RBDdimmer\examples\SimpleToggleDimmer
Esempi
Esempio: valore di dimmerizzazione tramite porta seriale
Lo sketch seguente consente di definire il valore di dimmerizzazione tramite la porta seriale del controllore:
- Si utilizza
USE_SERIAL.begin - La funzione
void printSpace()viene usata per aggiungere spazio dopo i dati funzionali void loop()è il valutatore della porta seriale, usato per registrare e definire i valori indimmer.setPower(outVal)
#include
#define outputPin 12
#define zerocross 5 // for boards with CHANGEABLE input pins
// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);
// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);
int buttonRed = 0;
void setup() {
dimmer.begin(NORMAL_MODE, ON); // dimmer initialisation: name.begin(MODE, STATE)
dimmer.setPower(50);
pinMode(14, INPUT);
}
void loop() {
button = digitalRead(14);
if (button == 1)
{
delay(50);
dimmer.setState(ON); // .setState(ON/OFF);
}
if (button == 0)
{
delay(50);
dimmer.setState(OFF); // .setState(ON/OFF);
}
}
Esempio: accensione/spegnimento
Lo sketch seguente consente di accendere e spegnere la lampada con un pulsante:
pinMode(14, INPUT)— il pulsante è collegato al pin 14void loop()— valutatore del pulsante ON/OFF del dimmer indimmer.setState(ON/OFF)
#include
#define outputPin 12
#define zerocross 5 // for boards with CHANGEABLE input pins
// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);
// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);
int buttonRed = 0;
void setup() {
dimmer.begin(NORMAL_MODE, ON); // dimmer initialisation: name.begin(MODE, STATE)
dimmer.setPower(50);
pinMode(14, INPUT);
}
void loop() {
button = digitalRead(14);
if (button == 1)
{
delay(50);
dimmer.setState(ON); // .setState(ON/OFF);
}
if (button == 0)
{
delay(50);
dimmer.setState(OFF); // .setState(ON/OFF);
}
}
Esempio: dimmerizzazione con potenziometro
Lo sketch seguente consente di definire il valore di dimmerizzazione tramite un potenziometro:
- I valori del potenziometro variano nell'intervallo da 0 a 1023
- I valori del potenziometro vengono convertiti tramite la funzione
mapin valori da 0 a 100% e salvati indimmer.setPower(outVal)
#include
#define outputPin 12
#define zerocross 5 // for boards with CHANGEABLE input pins
// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);
// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);
int outVal = 0;
void setup()
{
dimmer.begin(NORMAL_MODE, ON); // dimmer initialisation: name.begin(MODE, STATE)
}
void loop()
{
outVal = map(analogRead(0), 1, 1024, 100, 0); // analogRead(analog_pin), min, max, 100%, 0%
dimmer.setPower(outVal); // name.setPower(0%-100%)
}
Esempio: alternanza dei valori di dimmerizzazione
Lo sketch seguente definisce tramite una funzione le variazioni fluide del valore di dimmerizzazione in un intervallo di valori definito.
I valori sono definiti in un intervallo da 0 a 100%:
#include
#define outputPin 12
#define zerocross 5 // for boards with CHANGEABLE input pins
// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);
// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);
void setup() {
dimmer.begin(TOGGLE_MODE, OFF); // dimmer initialisation: name.begin(MODE, STATE)
dimmer.toggleSettings(0, 70); // Name.toggleSettings(MIN, MAX);
dimmer.setState(ON); // state: dimmer1.setState(ON/OFF);
}
void loop() {
// ...
dimmer.setState(ON); // set power to MAX value
// ...
dimmer.setState(OFF); // set power to MIN value
}
Esempio: dimmerizzazione fluida con pulsanti
Lo sketch seguente consente di accendere il dimmer gradualmente premendo il primo pulsante e di spegnerlo premendo il secondo:
#include
#define outputPin 12
#define zerocross 5 // for boards with CHANGEABLE input pins
#define LAMPMAXVALUE 100
// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer(outputPin, zerocross);
// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer(outputPin);
int stateL = 0, valLamp;
int mainLamp = 0;
int buttonRed = 0;
int buttonBlue = 0;
bool setLamp = true;
void setup() {
dimmer.begin(NORMAL_MODE, ON); // dimmer initialisation: name.begin(MODE, STATE)
// ...
}
void RiseFallLamp(bool RiseFallInt)
{
if ((RiseFallInt == true) && (mainLamp < LAMPMAXVALUE)) mainLamp++;
else if ((RiseFallInt != true) && (mainLamp > 0)) mainLamp--;
}
bool setLampState(int val)
{
bool ret;
if (val >= 1) ret = true;
else ret = false;
return ret;
}
void readButtonState()
{
buttonRed = digitalRead(13);
buttonBlue = digitalRead(15);
if (buttonRed < 1) stateL++;
if (buttonBlue < 1) stateL--;
if (stateL < 0) stateL = 0;
if (stateL > 1) stateL = 1;
}
void loop() {
readButtonState();
dimmer.setPower(mainLamp); // setPower(0-100%);
RiseFallLamp(setLampState(stateL));
delay(25);
}
Connessione di due o più dimmer
Z-C (ZeroCross): ZC pin needs only for 1st dimmer. For the next dimmers don't need to connect Z-C.
Per ogni dimmer è necessario collegare il pin Dim.
Codice
#define outputPin1 12 // Dim pin for dimmer 1
#define outputPin2 11 // Dim pin for dimmer 2
#define outputPin3 10 // Dim pin for dimmer 3
#define zerocross 5 // for boards with CHANGEABLE input pin
// For ESP8266, ESP32, STM32, Arduino due boards
// dimmerLamp dimmer1(outputPin1, zerocross);
// dimmerLamp dimmer2(outputPin2, zerocross);
// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer1(outputPin1); // initialise port for dimmer 1
dimmerLamp dimmer2(outputPin2); // initialise port for dimmer 2
dimmerLamp dimmer3(outputPin3); // initialise port for dimmer 3
void setup() {
dimmer1.begin(NORMAL_MODE, ON);
dimmer2.begin(NORMAL_MODE, ON);
dimmer3.begin(NORMAL_MODE, ON);
}
void loop() {
// ...
dimmer1.setPower(outVal1);
dimmer2.setPower(outVal2);
dimmer3.setPower(outVal3);
// ...
}
Dimmer a 2 e 4 canali su una fase AC
I dimmer a 2 e 4 canali hanno 1 pin ZC e 2-4 pin Dim.
Esempio di codice multicanale
#define outputPin1 12 // Dim pin for dimmer 1
#define outputPin2 11 // Dim pin for dimmer 2
#define outputPin3 10 // Dim pin for dimmer 3
#define outputPin4 9 // Dim pin for dimmer 4
#define zerocross 5 // for boards with CHANGEABLE input pin
// For ESP8266, ESP32, Arduino due boards
// dimmerLamp dimmer1(outputPin1, zerocross);
// dimmerLamp dimmer2(outputPin2, zerocross);
// For MEGA, Leonardo, UNO, Arduino M0, Arduino Zero
dimmerLamp dimmer1(outputPin1); // initialise port for dimmer 1
dimmerLamp dimmer2(outputPin2); // initialise port for dimmer 2
dimmerLamp dimmer3(outputPin3); // initialise port for dimmer 3
dimmerLamp dimmer4(outputPin4); // initialise port for dimmer 4
void setup() {
dimmer1.begin(NORMAL_MODE, ON);
dimmer2.begin(NORMAL_MODE, ON);
dimmer3.begin(NORMAL_MODE, ON);
dimmer4.begin(NORMAL_MODE, ON);
}
void loop() {
// ...
dimmer1.setPower(outVal1);
dimmer2.setPower(outVal2);
dimmer3.setPower(outVal3);
dimmer4.setPower(outVal4);
// ...
}