salve, dovrei aprire e chiudere un cancello ad un orario preciso,
in rete ho trovato questo progetto
sarebbe quasi adatto, il problema è che impostato un orario mi deve dare solo un impulso di mezzo secondo.
Ho provato con dei delay che se non impostati i timer nel modo giusto va in loop.
Qualcuno può darmi una mano, questo è il codice di controllo relè:
void relayAction(int adrON, int adrOF, int pos, int pin) {
myRTC.updateTime();
int MinToday = (myRTC.hours * 60) + myRTC.minutes;
int MinEprON = (EEPROM.read(adrON) * 60) + EEPROM.read(adrON + 1);
int MinEprOF = (EEPROM.read(adrOF) * 60) + EEPROM.read(adrOF + 1);
lcd.setCursor(pos, 1);
if (MinEprON == MinEprOF) { // jika sama berarti tidak dipake
lcd.print(" ");
digitalWrite(pin, LOW);
}
else if (MinEprON < MinEprOF) { // kondisi ON terjadi di hari yg sama
if ((MinEprON <= MinToday) && (MinEprOF > MinToday)) {
lcd.print("*");
digitalWrite(pin, LOW);
}
else {
lcd.print("-");
digitalWrite(pin, HIGH);
}
}
else if (MinEprON > MinEprOF) { // kondisi ON terjadi sampai besoknya
if ((MinEprON >= MinToday) || (MinEprOF < MinToday)) {
lcd.print("*");
digitalWrite(pin, LOW);
}
else {
lcd.print("-");
digitalWrite(pin, HIGH);
}
}
}
Provo a mostrarti un esempio da completare mettendo le giuste librerie e il codice mancante.
E' solo una base di codice per azionare un relè una sola volta dato un orario.
int AperturaAbilitata=0;
/*Inpostazione ora e minuti di apertura cancello*/
int ora=4;
int minuti=35;
void setup(){
}
void loop(){
relayAction();
}
void relayAction() {
myRTC.updateTime();
if(myRTC.hours == ora && myRTC.minutes== minuti && AperturaAbilitata==0){
digitalWrite(pin,HIGH); //apro cancello
delay(500);// Attendo tempo
digitalWrite(pin,LOW);// Disattivo relè
AperturaAbilitata=1; // in questo modo apre il cancello una sola volta con lo stesso orario
}
else if(myRTC.hours == ora && myRTC.minutes== minuti +2){
AperturaAbilitata=0; // passati due minuti abilito di nuovo l'apertura cancello
// con l'orario, essendo l'orario cambiato, l'apertura avverrà il giorno sucessivo
}
Premetto che l'apertura di un cancello, o meglio un cancello con apertura automatica deve e dovrebbe avere sistemi di sicurezza, come fotocellule che interrompono la chiusura se c'è un ostacolo "persona o cosa" e riapre il cancello, altrimenti si potrebbero fare danni a cose o persone. ATTENZIONE.
Grazie torn24, funziona alla perfezione,
avevo pensato ad un controllo ma programmato in modo sbagliato,
ora funziona, in più ho altri canali da programmare senza loop.
Pubblico il codice così se qualcuno vuole utilizzarlo.
Il canale 3 che sarebbe il pin 2 è il cancello,ON apertura, OF chiusura.
Nel mio caso impiega 20 secondi per aprirsi.
void relayAction(int adrON, int adrOF, int pos, int pin) {
myRTC.updateTime();
int MinToday = (myRTC.hours * 60) + myRTC.minutes;
int MinEprON = (EEPROM.read(adrON) * 60) + EEPROM.read(adrON + 1);
int MinEprOF = (EEPROM.read(adrOF) * 60) + EEPROM.read(adrOF + 1);
lcd.setCursor(pos, 1);
if (MinEprON == MinEprOF) { // jika sama berarti tidak dipake
lcd.print(" ");
digitalWrite(pin, LOW);
}
else if (MinEprON < MinEprOF) { // kondisi ON terjadi di hari yg sama
if ((MinEprON <= MinToday) && (MinEprOF > MinToday) && pin != 2) {
lcd.print("*");
digitalWrite(pin, HIGH);
}
else {
lcd.print("-");
digitalWrite(pin, LOW);
}
}
else if (MinEprON > MinEprOF) { // kondisi ON terjadi sampai besoknya
if ((MinEprON >= MinToday) || (MinEprOF < MinToday) && pin != 2) {
lcd.print("*");
digitalWrite(pin, HIGH);
}
else {
lcd.print("-");
digitalWrite(pin, LOW);
}
}
if(MinEprON == MinToday && pin == 2 && AperturaAbilitata==0){
digitalWrite(pin,HIGH); //apro cancello
delay(500);// Attendo tempo
digitalWrite(pin,LOW);// Disattivo relè
delay(20000);//
digitalWrite(pin,HIGH); //apro cancello
delay(500);// Attendo tempo
digitalWrite(pin,LOW);// Disattivo relè
AperturaAbilitata=1; // in questo modo apre il cancello una sola volta con lo stesso orario
}
else if( MinEprON == MinToday +2){
AperturaAbilitata=0; // passati due minuti abilito di nuovo l'apertura cancello
// con l'orario, essendo l'orario cambiato, l'apertura avverrà il giorno sucessivo
}
if(MinEprOF == MinToday && pin == 2 && AperturaAbilitata==0){
digitalWrite(pin,HIGH); //apro cancello
delay(500);// Attendo tempo
digitalWrite(pin,LOW);// Disattivo relè
AperturaAbilitata=1; // in questo modo apre il cancello una sola volta con lo stesso orario
}
else if( MinEprOF == MinToday +2){
AperturaAbilitata=0; // passati due minuti abilito di nuovo l'apertura cancello
// con l'orario, essendo l'orario cambiato, l'apertura avverrà il giorno sucessivo
}
}
@spanky81 Sicuramente qualcuno molto più esperto di me di avvertirà in modo ancora più preciso, comunque l'avvertimento fatto da @torn24 è bene che tu lo prenda in forte considerazione. Se si sta parlando di un cancello automatico reale dove cose, persone, animali, bambini, ecc. transitano il tuo programma (ma più in generale l'uso di Arduino) è sicuramente un ottima fonte di grossissimi guai. In fase di apertura quel delay(20000) blocca tutto il programma e non c'è traccia di interrupt di sorta quindi mi vien da pensare che stai pilotando direttamente il motore senza alcuna protezione (schiacciamento, fine corsa, fotocellule, ecc.) che sono obbligatorie per legge. Arduino non è certificato ne certificabile per usi in ambiti domestici o industriali.
Magari a te non interessa ma chi in futuro leggerà il topic e dovesse utilizzare il tuo codice lo meterebbe a rischio di denunce penali.
Se invece stiamo parlando di un modellino in scala dimostrativo, ecc. allora nessun problema ma ne dubito visto che parli di 20 secondi per l'apertura
È un comune cancello automatico, con fotocellule e sensori di contatto, l'impianto già esiste, è come premere il pulsante a distanza, non fa altro che dare impulso per farlo chiudere. Credo che non ci sia niente di pericoloso se fatto su un impianto a norma.