Andrea ha come quasi sempre ragione. Io ho scritto di collegare due relay da 5V alla scheda Arduino UNO di AstroDome, ma è una semplificazione e di questo mi scuso (ed aggiornerò quanto prima la pagina web sul mio sito). In realtà si trovano facilmente in commercio delle schedine già pronte con uno o più relay su cui sono già presenti tutti i componenti accessori. Hanno un aspetto simile a questo
Allegato:
SchedaRelay.jpg [ 228.32 KiB | Osservato 2598 volte ]
e si alimentano prelevando 5V dall'alimentatore che utilizzerai per AstroDome o se ti è più comodo dal pin +5V di Arduino UNO.
Forse arrivo tardi, ma da quanto ho capito tu oggi hai due pulsanti, uno attiva il motore e l'altro determina il senso di rotazione. Potresti in questo caso collegare i due nuovi relay di AstroDome invece di questi pulsanti e modificare il codice in questo modo:
Codice:
void roofOpen(){
// Apertura del tetto
if(meteoAlarm == HIGH){ // Verifica che non sia attivo l'allarme meteo
if(digitalRead(endSwitch1) == HIGH){ // Verifica che il tetto non sia già aperto
Serial.println(2);
oldRoofStatus = 2;
// +++ MODIFICA +++
// digitalWrite(relay1, LOW); // Vecchia linea, da eliminare
digitalWrite(relay1, LOW); // Attiva il contatto di inversione del movimento
delay(500); // Pausa di mezzo secondo
digitalWrite(relay2, LOW); // Avvia il movimento di apertura del tetto
// +++ FINE MODIFICA +++
boolean roofMove = true; // Quando questa variabile diventa falsa il tetto si ferma
long timer = 0; // Variabile usata come cronometro
while(roofMove) { // Avvia un ciclo di verifica
delay(10); // Pausa di un decimo di secondo
timer++; // Incrementa il valore del cronometro
if(timer > motorTimeOut){roofMove = false;} // È stato raggiunto il valore di timeout?
if(digitalRead(endSwitch1) == LOW){roofMove = false;} // Il tetto è giunto a fine corsa?
if(Serial.read() == 72){roofMove = false;} // Il PC ha richiesto l'annullamento con il carattere "H"?
if(digitalRead(manualSwitch2) == LOW){roofMove = false;} // È stato premuto il pulsante di chiusura?
}
// +++ MODIFICA +++
// digitalWrite(relay1, HIGH); // Vecchia linea, da eliminare
digitalWrite(relay2, HIGH); // Interrompi il movimento del tetto
delay(500); // Pausa di mezzo secondo
digitalWrite(relay1, HIGH); // Rilascia il contatto di inversione
// +++ FINE MODIFICA +++
while(digitalRead(manualSwitch2) == LOW){ // Attendi che il pulsante di chiusura venga rilasciato
delay(10);
}
delay(500); // Pausa di mezzo secondo
}
}
}
void roofClose(){
// Chiusura del tetto
if(digitalRead(endSwitch2) == HIGH){ // Verifica che il tetto non sia già chiuso
Serial.println(3);
oldRoofStatus = 3;
// +++ MODIFICA +++
// digitalWrite(relay2, LOW); // Vecchia linea, da eliminare
digitalWrite(relay1, HIGH); // Disattiva il contatto di inversione del movimento
delay(500); // Pausa di mezzo secondo
digitalWrite(relay2, LOW); // Avvia il movimento di apertura del tetto
// +++ FINE MODIFICA +++
boolean roofMove = true; // Quando questa variabile diventa falsa il tetto si ferma
long timer = 0; // Variabile usata come cronometro
while(roofMove) { // Avvia un ciclo di verifica
delay(10); // Pausa di un decimo di secondo
timer++; // Incrementa il valore del cronometro
if(timer > motorTimeOut){roofMove = false;} // È stato raggiunto il valore di timeout?
if(digitalRead(endSwitch2) == LOW){roofMove = false;} // Il tetto è giunto a fine corsa?
if(Serial.read() == 72){roofMove = false;} // Il PC ha richiesto l'annullamento con il carattere "H"?
if(digitalRead(manualSwitch1) == LOW){roofMove = false;} // È stato premuto il pulsante di apertura?
}
// +++ MODIFICA +++
// digitalWrite(relay2, HIGH); // Vecchia linea, da eliminare
digitalWrite(relay2, HIGH); // Interrompi il movimento del tetto
// +++ FINE MODIFICA +++
while(digitalRead(manualSwitch1) == LOW){ // Attendi che il pulsante di apertura venga rilasciato
delay(10);
}
delay(500); // Pausa di mezzo secondo
}
}
Spero di non averti creato troppa confusione Emilio.