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.

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.

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

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