//LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
// Definizione dei pin
const int stepPin = 3; // Motore LR
const int dirPin = 2; // Motore LR
const int stepPin2 = 9; // Motore UP & DOWN
const int dirPin2 = 8; // Motore UP & DOWN
int stepsToMove = 100; // Numero di step da eseguire alla volta per il motore LR
int stepsToMove2 = 75; // Numero di step da eseguire alla volta per il motore UP & DOWN
int stepCounter = 0; // Tiene traccia degli step eseguiti per il motore LR
int stepCounter2 = 0; // Tiene traccia degli step eseguiti per il motore UP & DOWN
int direction2 = 1; // Direzione del motore UP & DOWN: 1 per avanti, -1 per indietro
// Tempo totale per 100 step (3 secondi), diviso per ciascun step
int stepDelay = 15000; // 15.000 microsecondi per ciascun HIGH o LOW del segnale per il primo motore
int stepDelay2 = 15000; // 15.000 microsecondi per ciascun HIGH o LOW del segnale per il secondo motore
unsigned long startTime; // Tempo di partenza del primo motore
bool secondMotorStarted = false; // Flag per sapere se il secondo motore è stato avviato
void setup() {
// Imposta i pin STEP e DIR come output
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(stepPin2, OUTPUT);
pinMode(dirPin2, OUTPUT);
//lcd
lcd.begin(16, 2);
// Inizializzazione della comunicazione seriale per debug
Serial.begin(9600);
// Imposta la direzione iniziale dei motori
digitalWrite(dirPin, HIGH); // Motore LR sempre avanti
digitalWrite(dirPin2, HIGH); // Motore UP & DOWN inizia avanti
// Inizializza il tempo di partenza
startTime = micros(); // Usa micros() per avere precisione in microsecondi
}
void loop() {
//lcd
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Clorophilla");
// Primo motore (LR): Muove in avanti fino a 400 step
if (stepCounter < 400) {
// Esegui un blocco di 100 step per il primo motore
for (int i = 0; i < stepsToMove; i++) {
digitalWrite(stepPin, HIGH); // Impulso alto sul pin STEP
delayMicroseconds(stepDelay); // Mantiene HIGH per il tempo definito
digitalWrite(stepPin, LOW); // Impulso basso sul pin STEP
delayMicroseconds(stepDelay); // Mantiene LOW per il tempo definito
stepCounter++;
}
// Debug per il primo motore
Serial.print("Motore LR ha completato ");
Serial.print(stepCounter);
Serial.println(" step.");
// Pausa di mezzo secondo quando raggiunge 100 o 300 step
if (stepCounter == 100 || stepCounter == 300) {
Serial.println("Pausa di 500 millisecondi per il Motore LR...");
delay(500); // Pausa di 500 millisecondi
}
// Fermarsi definitivamente dopo 400 step
if (stepCounter == 400) {
Serial.println("Motore LR si ferma definitivamente.");
}
}
// Controlla se è passato mezzo secondo per avviare il secondo motore
if (!secondMotorStarted && (micros() - startTime >= 500000)) { // 500 millisecondi = 500000 microsecondi
secondMotorStarted = true; // Marca il secondo motore come avviato
Serial.println("Motore UP & DOWN inizia il suo ciclo.");
}
// Se il secondo motore è stato avviato, muovilo
if (secondMotorStarted) {
// Secondo motore (UP & DOWN): Muove avanti o indietro per 75 step
for (int i = 0; i < stepsToMove2; i++) {
digitalWrite(stepPin2, HIGH); // Impulso alto sul pin STEP del secondo motore
delayMicroseconds(stepDelay2); // Mantiene HIGH per il tempo definito
digitalWrite(stepPin2, LOW); // Impulso basso sul pin STEP del secondo motore
delayMicroseconds(stepDelay2); // Mantiene LOW per il tempo definito
stepCounter2++;
}
// Debug per il secondo motore
Serial.print("Motore UP & DOWN ha completato ");
Serial.print(stepCounter2);
Serial.println(" step.");
// Quando il motore UP & DOWN ha completato 75 step, cambia direzione
if (stepCounter2 >= 75) {
stepCounter2 = 0; // Resetta il contatore
direction2 = -direction2; // Inverte la direzione
digitalWrite(dirPin2, direction2 == 1 ? HIGH : LOW); // Cambia la direzione del motore
Serial.println(direction2 == 1 ? "Motore UP & DOWN ora va avanti." : "Motore UP & DOWN ora va indietro.");
}
}
}