Passa al contenuto

← 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.

Info
Scarica la libreria dimmer: RBDDimmer



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.

Info
Scarica la libreria dimmer: RBDDimmer

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):

cpp
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):

cpp
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:

cpp
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 dimmer
  • OFF — disattiva i parametri del timer, impedisce l'uso del dimmer


3. Funzione setPower

Imposta il valore di dimmerizzazione da 0 a 100%:

cpp
dimmer.setPower(90);


4. Funzione getPower

Mostra il valore di dimmerizzazione corrente:

cpp
Serial.print(dimmer.getPower()); // Result 0~100 int


5. Funzione setMode

Imposta e modifica la modalità di funzionamento:

cpp
dimmer.setMode(NORMAL_MODE/TOGGLE_MODE);


6. Funzione getMode

Mostra il valore della modalità di funzionamento corrente:

cpp
Serial.print(dimmer.getMode()); // Result 0 (NORMAL_MODE) or 1 (TOGGLE_MODE)


7. Funzione setState

Imposta lo stato del dimmer ON/OFF:

cpp
dimmer.setState(ON);
delay(100);
dimmer.setState(OFF);


8. Funzione getState

Mostra lo stato corrente del dimmer:

cpp
Serial.print(dimmer.getState()); // Result 0 (OFF) or 1 (ON)


9. Funzione changeState

Cambia lo stato del dimmer al contrario:

cpp
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 in dimmer.setPower(outVal)
cpp
#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 14
  • void loop() — valutatore del pulsante ON/OFF del dimmer in dimmer.setState(ON/OFF)
cpp
#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 map in valori da 0 a 100% e salvati in dimmer.setPower(outVal)
cpp
#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%:

cpp
#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:

cpp
#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

cpp
#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

cpp
#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);
  // ...
}

← Configurazione Tasmota | Indice