Arduino and dimmer nativity lights

Good morning everyone, I'm a beginner and I use Arduino mainly for the movements of the nativity scene. I ask if it is feasible to vary the lights (using 220V incandescent lamps) to simulate sunrise/day/sunset/night with Arduino. I currently use Arduino as a simple timer combined with a 4 relay module but I would like to improve the system by making it more pleasing to the eye. The Arduino module also sends the day/night signal to some individual modules to start them up or stop them during the night.
My only problem is having to use 220V, I tried to buy this 2-channel dimmer to do some tests but I can't get results https://it.aliexpress.com/item/32972336897.html?spm=a2g0o.order_list.order_list_main.25.463c3696f2RteZ&gatewayAdapt=glo2ita

Can anyone give me clarification? Thank you all!

I moved your topic to an appropriate forum category @ivodtt.

In the future, please take some time to pick the forum category that best suits the subject of your topic. There is an "About the _____ category" topic at the top of each category that explains its purpose.

This is an important part of responsible forum usage, as explained in the "How to get the best out of this forum" guide. The guide contains a lot of other useful information. Please read it.

Thanks in advance for your cooperation.

That should work. Show us your wiring diagram (NO pictures) just hand drawn plus your entire code in code tags ^^^^ or in the IDE Edit/Copy for forum

this is the code I tried:

// prova dimmer a 2 canali da Copilot
// 06/07/2024 
const int dimmerPin1 = 5; // Pin D1 del dimmer
const int dimmerPin2 = 6; // Pin D2 del dimmer

void setup() {
  pinMode(dimmerPin1, OUTPUT);
  pinMode(dimmerPin2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // Pausa di 3 secondi
  delay(3000);

  // Aumento D1 da 0 a max in 10 secondi
  for (int brightnessD1 = 0; brightnessD1 <= 255; brightnessD1++) {
    analogWrite(dimmerPin1, brightnessD1);
    delay(100);
  }

  // Mantieni D1 al massimo per 3 secondi
  delay(3000);

  // Diminuisci D1 da max a 0 in 10 secondi
  for (int brightnessD1 = 255; brightnessD1 >= 0; brightnessD1--) {
    analogWrite(dimmerPin1, brightnessD1);
    delay(100);
  }

  // Pausa di 3 secondi
  delay(3000);

  // Aumenta D2 da 0 a max in 10 secondi
  for (int brightnessD2 = 0; brightnessD2 <= 255; brightnessD2++) {
    analogWrite(dimmerPin2, brightnessD2);
    delay(100);
  }

  // Mantieni D2 al massimo per 3 secondi
  delay(3000);

  // Diminuisci D2 da max a 0 in 10 secondi
  for (int brightnessD2 = 255; brightnessD2 >= 0; brightnessD2--) {
    analogWrite(dimmerPin2, brightnessD2);
    delay(100);
  }
}

with this code lamp 1 works while lamp 2 flashes and I can't adjust it.

Quick check, change the pins around, see if the flashing stays with the pin, or the light. I am thinking maybe the pin is a pwm pin.

also seeing the problem of maintaining maximum brightness on the D1 I tried to reduce from 100% to 95% by modifying the program in this way. the final result does not change: incandescent lamps, D1 works correctly while D2 flashes in a loop and does not finish the program.

#include <TimerOne.h>

// Dichiarazione dei pin
const int triacPin1 = 5; // Pin digitale per il dimmer D1
const int triacPin2 = 6; // Pin digitale per il dimmer D2
const int zcPin = 2;     // Pin digitale per il rilevamento dello zero crossing

volatile int dim1 = 0;   // Livello di dimmer per D1
volatile int dim2 = 0;   // Livello di dimmer per D2
volatile bool zcDetected = false; // Flag per indicare il rilevamento dello zero crossing

void setup() {
  pinMode(triacPin1, OUTPUT);
  pinMode(triacPin2, OUTPUT);
  pinMode(zcPin, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(zcPin), zeroCrossingISR, FALLING); // Configura l'interrupt per lo zero crossing
  Timer1.initialize(10000); // Timer1 inizializzato con un periodo di 10000 microsecondi (10ms)
  Timer1.attachInterrupt(timerISR, 10000); // Configura l'interrupt del timer
  Timer1.stop(); // Ferma il timer all'inizio

  Serial.begin(9600); // Inizializza la comunicazione seriale per il debug
}

void zeroCrossingISR() {
  zcDetected = true;
  Timer1.start(); // Avvia il timer quando viene rilevato lo zero crossing
}

void timerISR() {
  if (zcDetected) {
    // Calcola il ritardo per il dimming
    if (dim1 > 0) {
      delayMicroseconds(dim1);
      digitalWrite(triacPin1, HIGH);
      delayMicroseconds(10); // Pulse width to trigger the triac
      digitalWrite(triacPin1, LOW);
    }

    if (dim2 > 0) {
      delayMicroseconds(dim2 + 20); // Aggiungi un piccolo offset per evitare interferenze tra i canali
      digitalWrite(triacPin2, HIGH);
      delayMicroseconds(10); // Pulse width to trigger the triac
      digitalWrite(triacPin2, LOW);
    }

    zcDetected = false;
    Timer1.stop(); // Ferma il timer fino al prossimo zero crossing
  }
}

void loop() {
  // Spento per 5 secondi
  Serial.println("Starting loop...");
  delay(5000);

  // Aumento della luminosità di D1 da 0 a 100% in 5 secondi
  for (int i = 0; i <= 95; i++) { // Limita il valore massimo a 95%
    dim1 = map(i, 0, 100, 7800, 300); // Mappa la luminosità su un ritardo per il dimming
    delay(50);
    Serial.print("Brightness D1: ");
    Serial.println(i);
  }

  // Max intensità di D1 per 5 secondi
  dim1 = map(95, 0, 100, 7800, 300); // Imposta la luminosità al massimo (95%)
  delay(5000);

  // Riduzione dell'intensità di D1 da 100% a 0% in 5 secondi
  for (int i = 95; i >= 0; i--) { // Inizia da 95% anziché 100%
    dim1 = map(i, 0, 100, 7800, 300); // Mappa la luminosità su un ritardo per il dimming
    delay(50);
    Serial.print("Brightness D1: ");
    Serial.println(i);
  }

  // Tutto spento per 3 secondi
  dim1 = 0;
  delay(3000);

  // Aumento della luminosità di D2 da 0 a 100% in 5 secondi
  for (int i = 0; i <= 95; i++) { // Limita il valore massimo a 95%
    dim2 = map(i, 0, 100, 7800, 300); // Mappa la luminosità su un ritardo per il dimming
    delay(50);
    Serial.print("Brightness D2: ");
    Serial.println(i);
  }

  // Max intensità di D2 per 5 secondi
  dim2 = map(95, 0, 100, 7800, 300); // Imposta la luminosità al massimo (95%)
  delay(5000);

  // Riduzione dell'intensità di D2 da 100% a 0% in 5 secondi
  for (int i = 95; i >= 0; i--) { // Inizia da 95% anziché 100%
    dim2 = map(i, 0, 100, 7800, 300); // Mappa la luminosità su un ritardo per il dimming
    delay(50);
    Serial.print("Brightness D2: ");
    Serial.println(i);
  }

  // Tutto spento per 3 secondi
  dim2 = 0;
  delay(3000);

  Serial.println("Loop complete.");
}

I state that this is a test, the complete system should have 3 channels for sunrise/day/sunset while night has no problems as it does not include any variations

Why would you need 3 channels, start at 0 rise thru sunrise to full day brightness at about noon, then slowly dim to night. All one channel. Am I missing something?

What does mean:

D2 flashes in a loop and does not finish the program

Try exchangin pin 5 and 6 is still the same triack output that flashes?

I already asked him to do that in post 6, but he does not listen.

unfortunately I read English poorly and I use Google Translate, what do you mean by this? Try exchangin pin 5 and 6 is still the same triack output that flashes? I am a beginner and I have learned many things by following this forum and trying on Arduino by having Chat GPT explain the various instructions to me so that I can understand them and possibly, if they are useful to my project, apply them.

[ita mode on]

  • ora hai il pin 5 che pilota il triac1 ( ed il pin 6 il triac2 )
  • collega invece il pin 5 al triac2 ( ed il pin 6 al triac 1 )
  • facendo così qual'è la 'luce che lampeggia' è la stessa di prima oppure ora è l'altra

Puoi anche fare la prova 'opposta':

  • lascia il pin 5 che pilota il triac1 ( ed il pin 6 il triac2 ), come nel collegamento originale
  • scambia la lampada1 con la lampada2
  • facendo così qual'è la 'luce che lampeggia' è la stessa del caso originale oppure ora è l'altra

[ita mode off]

  • now you have pin 5 connected to triac1 ( and pin 6 to triac2 )
  • try connecting pin5 to triac2 ( and pin6 to triac1 )
  • is it the same light that flicker ( as before ) or is the other one?

You can also do the 'opposite':

  • leave pin 5 connected to triac1 ( and pin 6 to triac2 ) as in the original connection
  • now exchange lamp1 and lamp2
  • is it the same light that flicker ( as in the original condition ) or is the other one?

il funzionamento delle luci del presepio è gestito da arduino che controlla i relè. notte: accese le luci notturne(illuminazione case e capanna e tutti i movimenti fermi. alba: avvio movimenti e accensione della luce posta dietro le montagne sulla destra (questo è il momento in cui vorrei incrementare la luce dell'alba fino l massimo) e luce notturne ancora accese. Giorno: spegnimento luce notte ,accensione luci che illuminano tutto l'ambiente (in questo momento vorrei un aumento prograssivo della luce giorno e diminuzione progressiva della luce alba). tramonto: accensione luce tramonto posta a sinistra (diminuzione progressiva della luce giorno e aumento progressivo della luce tramonto) e quando al massimo la luce tramonto accendere le luci notte e fermare tutti i movimenti. Notte: spegnimento delle luci tramonto progressivo fino ad arrivare a notte. Attualmente questo sistema è gestito da relè ma mi piacerebbe, se possibile poter variare la luce su alba, giorno e notte per ottenere un effetto scenico, preciso che il presepio è circa 4mt x 9mt

Buongiorno a tutti, chiedo innanzitutto scusa per la prolungata assenza ma a causa di problemi gravi di salute di un famigliare ho dovuto lasciare da parte il progetto.
Ho fatto le prove che mi avete chiesto , smontato tutto l'hardware e nuovamente rimontato e tutto magicamente si è messo a funzionare sui due canali (probabilmente ho fatto una qualche connessione non proprio affidabile).
Unico problema è che il tutto è funzionante solamente con le lampade ad incandescenza mentre con le lampade a led dimmerabili funziona in aumento e diminuzione della luminosità ma quando è al massimo, e dovrebbe stare alcuni secondi, spegne la lampada e non so se il problema siano le lampade ( collegate alla luce direttamente funzionano alla perfezione) oppure il dimmer non riesce a gestirle.
Ora volevo aggiungere il terzo canale per poter completare il ciclo alba/giorno/tramonto e quindi acquistare un ulteriore dimmer per avere il completamento del progetto.

For the dimmable led lamps try reducing the maximum value form the actual 95% to 85-90% ( or even less, if it is not enough ), incandescent lamps are pure resistive loads, probably dimmable leds are not.

ok, I had already initially tried to reduce the value from 100 to 95 without having solved the problem, then I gave up because I concentrated on the flashing of triac 2. I'll try to reduce it gradually to see if it works. Thank you!

Posting an annotated schematic might get you a answer. You might want to use LEDs to test the software first.