Dimmer AC e Servomotore

Ciao a tutti, ho un problema con un codice per arduino.
Ho bisogno di controllare un Dimmer AC attraverso un potenziometro e fin lì ci sono, funziona, regola la potenza in uscita correttamente. Funziona anche la scrittura del valore di potenza (in percentuale) su uno schermo OLED 128x64. Il dimmer è dotato di VCC, GND, ZC e PSM da collegare ad Arduino.
Il problema è che con un altro potenziometro devo muovere un servomotore a seconda della sua apertura e scrivere il valore di gradi di apertura sullo schermo OLED. Quando aggiungo il controllo del servomotore il dimmer smette di funzionare, i valori continuano a venire visualizzati sullo schermo, sia del dimmer che del servo, il servo gira, ma il dimmer smette di dare segni di vita e non riesco a capire il perché.
Ho anche provato ad alimentare il servo e il dimmer con alimentatori a 5V esterni per evitare di sovraccariccare arduino ma niente.
In programmazione non sono molto ferrato, ma vengo da un istituto tecnico elettrotecnico quindi la corrente so come "maneggiarla" in sicurezza.
Qua il codice funzionante con solo il controllo del dimmer:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Dichiarazione dei pin
const int zeroCrossingPin = 2;   // Collegato al pin ZC del dimmer
const int pwmPin = 9;            // Collegato al pin PWM del dimmer
const int potPin = A0;           // Collegato al potenziometro

int dimValue = 0;                // Valore di intensità in uscita

void setup() {
  pinMode(zeroCrossingPin, INPUT);
  pinMode(pwmPin, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(zeroCrossingPin), zeroCrossing, RISING);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // Inizializza lo schermo OLED
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
}

void loop() {
  dimValue = map(analogRead(potPin), 0, 1023, 0, 100);  // Leggi il valore del potenziometro
  analogWrite(pwmPin, dimValue * 2.55);                // Imposta il valore PWM per controllare l'intensità

  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("Apertura: ");
  display.print(dimValue);
  display.print("%");
  display.display();
  
  delay(10);
}

void zeroCrossing() {
  // Vuoto, non è necessario per l'utilizzo del pin PWM
}
Di seguito il codice non funzionante causa aggiunta servomotore:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Servo.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Pin Declarations
const int zeroCrossingPin = 2;     // Connected to the dimmer's ZC pin
const int pwmPinDimmer = 9;        // Connected to the dimmer's PWM pin
const int potPinDimmer = A0;       // Connected to the potentiometer for dimmer
const int potPinServo = A1;        // Connected to the potentiometer for servo motor
const int pwmPinServo = 5;        // Connected to the servo motor

int dimValue = 0;                  // Dimmer intensity value
int servoAngle = 0;                // Servo motor angle value

Servo servo;

void setup() {
  pinMode(zeroCrossingPin, INPUT);
  pinMode(pwmPinDimmer, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(zeroCrossingPin), zeroCrossing, RISING);

  servo.attach(pwmPinServo);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
}

void loop() {
  dimValue = map(analogRead(potPinDimmer), 0, 1023, 0, 255);  // Read intensity value from the potentiometer
  analogWrite(pwmPinDimmer, dimValue);  // Set the dimmer intensity using analogWrite()

  servoAngle = map(analogRead(potPinServo), 0, 1023, 0, 180); // Read angle value from the potentiometer
  servo.write(servoAngle);                                   // Set the servo motor angle

  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("Intensity: ");
  display.print(dimValue * 100 / 255);  // Scale the intensity value to a percentage
  display.print("%");

  display.setCursor(0, 20);
  display.print("Angle: ");
  display.print(servoAngle);
  display.print(" deg");

  display.display();
  delay(10);
}

void zeroCrossing() {
  // Empty, not required for interrupt handling in this case
}
}

``

Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Detto questo, come richiesto al punto 7 del succitato regolamento, per favore edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione e sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Buongiorno, ho modificato il codice e come da lei richiesto ho letto il punto 15 riguardo la sicurezza.
Vorrei solo assicurarle che è tutto svolto in sicurezza, i cavi, contatti sono isolati e indosso attrezzatura adeguata, a richiesta che ho fatto è perché devo portare a termine un progetto e sarebbe davvero un peccato non riuscire a far funzionare una cosa così.
La ringrazio per la gentile risposta. saluti.

... manca sempre la presentazione nell'apposito thread :wink: e, indipendetemente dal fatto che il lavoro sia svolto in sicurezza o meno, qui comunque NON si parla di nulla che coinvolga tensioni oltre la "bassissima tensione" (ed il punto 17.1 del REGOLAMENTO chiarisce il perché) quindi ... mi raccomando di evitare di entrare in dettagli con schemi o parti di codice che dovessero coinvolgere tensioni superiori. Grazie,

Guglielmo

Buongiorno, la discussione ha un suo argomento perché ho inserito categoria software, inoltre non specifico a che tensione lavoro ma solo che è corrente alternata. Non capisco con thread cosa si intende con thread, ho inserito la discussione in problemi software

Scusa effettivamente ho sbagliato a fare copia e incolla, ora sono giusti

Ma perché leggete sempre con poca attenzione quello che vi si scrive ...

... e poi ...

Più chiaro di così ... :roll_eyes:

Guglielmo

Vabbè sentite, non pensavo fosse così complicato fare una semplice richiesta di aiuto.
La discussione ha il suo argomento.
Se ritenete necessario chiuderla pazienza, mi arrangio in un altro modo

Discussione chiusa, utente bannato per mancato rispetto del regolamento.

Guglielmo