#include <Servo.h>
// Definizioni dei pin per facilitare la gestione dei collegamenti
#define PULSANTE_PIN 7
#define RELAY_PIN 5
#define SERVO_PIN 3
// Variabili globali per lo stato del sistema
int velocita = 0; // Velocità del servo (0 = lento, 100 = veloce)
bool statoPompa = false; // Stato iniziale della pompa (false = spenta)
unsigned long ultimoDebounceTime = 0; // Timer per il debounce del pulsante
const long debounceDelay = 50; // Tempo di attesa per il debounce (in millisecondi)
bool statoPrecedentePulsante = HIGH; // Stato precedente del pulsante
unsigned long tempoPrecedenteServo = 0; // Timer per il ritardo del servo
const long ritardoServo = 2000; // Ritardo tra i movimenti del servo (in millisecondi)
Servo servo1; // Creazione dell'oggetto Servo
// Funzione per calcolare la velocità del servo in base alla variabile 'velocita'
int calcolaVelocita() {
// Mappa la velocità da un range di 0-100 a un ritardo in millisecondi (120-20)
return map(velocita, 0, 100, 120, 20);
// Mappa la velocità da un range di 0-100 a un ritardo in millisecondi (200-20)
//return map(velocita, 0, 100, 200, 20);
}
void setup() {
servo1.attach(SERVO_PIN); // Collega il servo al pin corrispondente
servo1.write(90); // Posiziona il servo al centro (90 gradi)
pinMode(PULSANTE_PIN, INPUT_PULLUP); // Imposta il pin del pulsante come input con resistenza di pull-up
pinMode(RELAY_PIN, OUTPUT); // Imposta il pin del relay come output
digitalWrite(RELAY_PIN, statoPompa); // Imposta lo stato iniziale del relay
Serial.begin(9600); // Avvia la comunicazione seriale a 9600 bps
}
void loop() {
int lettura = digitalRead(PULSANTE_PIN); // Legge lo stato del pulsante
// Verifica se lo stato del pulsante è cambiato
if (lettura != statoPrecedentePulsante) {
if ((millis() - ultimoDebounceTime) > debounceDelay) {
// Se sono passati più di debounceDelay millisecondi dall'ultimo cambio di stato
if (lettura == LOW) {
statoPompa = !statoPompa; // Cambia lo stato della pompa
digitalWrite(RELAY_PIN, statoPompa); // Aggiorna lo stato del relay
Serial.println(statoPompa ? "Pompa accesa" : "Pompa spenta"); // Comunica lo stato della pompa via seriale
}
ultimoDebounceTime = millis(); // Resetta il timer del debounce
}
statoPrecedentePulsante = lettura; // Aggiorna lo stato precedente del pulsante
}
static unsigned long ultimoCambio = millis(); // Timer per il movimento del servo
static int pos = 90; // Posizione iniziale del servo (centro)
static bool incremento = true; // Direzione del movimento del servo (true = incremento)
// Movimento del servo senza bloccare il loop principale
if (millis() - tempoPrecedenteServo > ritardoServo) {
// Movimento del servo senza bloccare il loop principale
if (millis() - ultimoCambio > calcolaVelocita()) {
if (incremento) {
pos++; // Incrementa la posizione del servo
if (pos >= 180) {
incremento = false; // Cambia direzione quando raggiunge 180 gradi
tempoPrecedenteServo = millis(); // Resetta il timer per il ritardo del servo
Serial.println("Ritardo, attendere..."); // Avviso di ritardo sulla seriale
}
} else {
pos--; // Decrementa la posizione del servo
if (pos <= 0) {
incremento = true; // Cambia direzione quando raggiunge 0 gradi
tempoPrecedenteServo = millis(); // Resetta il timer per il ritardo del servo
Serial.println("Ritardo, attendere..."); // Avviso di ritardo sulla seriale
}
}
servo1.write(pos); // Aggiorna la posizione del servo
ultimoCambio = millis(); // Resetta il timer per il movimento del servo
Serial.print("Servo: "); // Comunica la posizione del servo via seriale
Serial.println(pos);
}
}
}