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
}
}
``