Buongiorno a tutti, mi è venuto un dubbio il relè che devo far accendere da remoto attualmente si accende alle 9.10 e si spegne alle 17.10, io vorrei che quando accendo il pulsante da web si spegne per 10 minuti e poi ricontinui con il suo ciclo normale
Nessuno sa aiutarmi? Sono in un vicolo ceco
Nessuna soluzione da suggerirmi?
Devi impostare una nuova variabile con lo stato (di tipo bool) di quello che devi fare. Il codice in base a questa variabile o fa il pezzo in base all'ora oppure spegne e attende i 10 minuti (sfruttando la millis e NON la delay)
Quindi la pressione tasto da web deve solo mettere a true questa variabile stato, alla fine dei 10 minuti la variabile ritorna a false
client.println("<a href=\"./?off\">
Prova a togliere il punto:
client.println("<a href=\"/?off\">
(Anche per l'ON)
Buona sera ho tolto il punto ma non va comunque come posso fare? in poche parole si spegne dal web per 10 minuti e poi ritorna al suo ciclo normale fino le17:10
Io cosa ti ho scritto ? La logica di come devi fare.
ho trovato questo ma non funziona e non capisco perchè?
const int ledPin = 4; // piedino che vuoi attivare per 10 minuti al giorno
int ledState = LOW; // Variabile associata al pin
unsigned long PreviousMillis = 0; // Variabile che memorizza quando e' stato attivato il pin
const long MillisDays = 86400000; // Millisecondi in un giorno (1000 millisecondi * 60 secondi * 60 minuti * 24 ore)
const long MillisDelay = 600000; // intervallo di tempo per il quale deve restare spento (1000 milliseconds * 60 secondi * 10 minuti)
unsigned long CurrentMillis = 0; // Variabile che viene incrementata ogni millisecondo.
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT); // Setto piedino come uscita
digitalWrite(ledPin, LOW);
}
void loop()
{
CurrentMillis++ ; //Incremento la variabile CurrentMillis di 1
if (CurrentMillis >= MillisDays){// se CurrentMillis maggiore dei millisecondi di un giorno
CurrentMillis = 0; // Azzero la variabile contenente i millisecondi passati dato che ha superato i millisecondi in un giorno
Serial.print("Tempo superato");
Serial.println(CurrentMillis);
}
if (CurrentMillis >= (MillisDays - MillisDelay)){// se son gia' passati x millisecondi ( 24 ore - tempo di delay)
digitalWrite(ledPin, LOW); // Spengo il pin in uscita
Serial.print("Led Spento");
Serial.println(CurrentMillis);
}else{
digitalWrite(ledPin, HIGH); // accendo il pin in uscita
Serial.print("Led Acceso");
Serial.println(CurrentMillis);
}
}
Mi pare una boiata. Dove l'hai trovata ? Da per scontato che il loop() dura 1 millisecondo !!
Si usa mills() funzione di Arduino che ritorna i millisecondi del micro.
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/
Poi la millis() richiede variabili unsigned long, quindi meglio siano tutte unsigned long le variabili coinvolte nel calcolo, anche MillisDelay
Per le costanti unsigned long devi aggiungere il post fisso UL
const long MillisDelay = 600000UL;
ma per farla funzionare come posso fare? dove metto i commandi dell loop per fqrloa ndare con il client
Buongiorno non esiste un modo di usarlo per quello che voglio fare io? Spegne per 10 minuti e si riaccende e fa il suo ciclo normale il rele
@Marco porta pazienza. Certo che si può fare, mettendo nel programma la logica di quel che vuoi fare, insieme a quel codice che hai già.
Ma questo non è il forum di assistenza tecnica di una ditta che ti fornisce il programma fatto. Siamo tutti utenti come te e se possiamo e sappiamo rispondiamo. Io stò lavorando e anche rispondendo quando posso.
La tua richiesta è fattibile, ti ho già detto cosa fare come passi logici. E non è semplice per chi come te (mi pare di aver capito) sa poco di programmazione.
Ho bisogno di qualcuno che mi fa capire come fare
marco3020:
Buongiorno a tutti, mi è venuto un dubbio il relè che devo far accendere da remoto attualmente si accende alle 9.10 e si spegne alle 17.10, io vorrei che quando accendo il pulsante da web si spegne per 10 minuti e poi ricontinui con il suo ciclo normale
E questo controllo sull'ora di accensione dove stà ? Nel tuo programma nella loop() non c'e' nulla, solo leggi da RTC ora e data e lo metti su lcd e su pagina web.
Poi aspetti da web se premono on/off e basta. Ma perchè il codice che hai postato è diverso da quello che affermi ?
Come posso dirti modifica qui o la in un codice che hai postato tu e che NON fa quel che dici tu ?
Il codice non riesco a postalo tutto il sito qui mi blocca
marco3020:
Il codice non riesco a postalo tutto il sito qui mi blocca
Non postarlo, allegalo usando la voce "Attachments and other options" sotto a dove scrivi
eccolo
sketch_WEB_SERVER.ino (10.6 KB)
Ora spiega bene quel che vorresti fare.
Dal tuo programma vedo che la parte web pilota rele5, mentre tutta la parte di temporizzazione tramite RTC e temperatura accende/spegne tutt'altro.
A meno che quel NOTTE=43 e rele5=43 voglia dire che stai pilotando la stessa cosa.
Mi pare usi releX e #define per definire LA STESSA cosa. Correggilo e poi ripostalo. Così è un casino immenso capirci qualcosa. Se il pin 43 pilota il rele5 e per te pilota la NOTTE allora chiamalo const byte rele5_NOTTE=5; almeno risulta chiaro. Stessa cosa per gli altri rele
P.S. le dichiarazioni dei pin falle di tipo const byte NON di certo float
float rele1 = 35; ??? deve essere const byte rele1=35;
Altro: questo NON ha senso:
if (temp1 > tempSoglia - 0.2 && - 0.6 )
Il C te lo accetta ma è un non senso. Deve essere un intervallo ? questo AND quello ? devi ripetere le variabili
e con delle parentesi si capisce meglio:
if( (temp1 > tempSoglia - 0.2) && (temp1 > tempSoglia - 0.6) )
Ma non ha senso neppure questa, almeno è corretta come "formula".
Altri suggerimenti: tutte le variabili che sono solo costanti, che non cambi mai metti davanti const.
esempi:
const float riscaldatore = 22.0;
const int delayUV = 360;
Questo è un pò lungo da leggere, puoi abbreviare in una sola riga mettendo il calcolo:
// int oraAlba = 9; eliminarlo
// int minAlba = 10; eliminarlo
const long albas = 9 * 3600 + 10 * 60 ; // Alba: HH:MM
e togli il calcolo fatto nella loop