Go Down

Topic: Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori). (Read 5971 times) previous topic - next topic

Puso

potrebbe essere la soluzione...mo ci provo grazie per il momento

Puso

mi da errore....ho fatto copia incolla ed ho solo corretto il setup
Code: [Select]


void setup() {
pinMode(31, OUTPUT);
pinMode(33, OUTPUT);  

}



void loop() {
 unsigned long currentMillis = millis();

 if (currentMillis - previousMillis >= 20000) {
   previousMillis = currentMillis;
   if (ledState == LOW) {
     ledState = HIGH;
   } else {
     ledState = LOW;
   }
   digitalWrite(ledPin, ledState);
 }

}

docsavage

credo che anche utilizzando

if tempo>millis()....{
comanda_luci(quello che serve)
tempo=millis()+nuova attesa
}

tutto il ciclo completo dei semafori durerebbe sempre 20 secondi.

il ciclo completo certamente

Ma non la loop
Che sarebbe velocissima...

E che naturalmente interromperebbe il ciclo

E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo

Puso

perfetto prima avevo le idee confuse...adesso sto pensando seriamente di fargli leggere il pulsante quando voglio io ......con un martello

-zef-

secondo me vuoi fare il passo più lungo della gamba, inizia a far lampeggiare due led con tempi diversi con millis(), poi intercetta la pressione di un pulsante e fai fare qualcosa di conseguenza ai due led, che so che rimangano accesi per 2  secondi.... una volta che hai le idee ben chiare su come gestire millis() e leggere un input lo espandi per realizzare tutto il semaforo

Puso

mi sa che hai ragione ...è meglio che ricomincio con qualcosa di più semplice....anche perche non so programmare ripeto sono alle prime armi.

anche se il semaforo mi sembrava semplice.

Claudio_FF

Quote from: Puso
mi da errore....ho fatto copia incolla
Molti esempi danno per scontato che determinati nomi presenti nel codice sono variabili o costanti che vanno definite da altre parti. In particolare previousMillis e ledState sono due variabili globali da definire all'inizio del programma, e ledPin è  una costante, che va sempre definita in precedenza. Gli errori del compilatore dovrebbero permettere di capire cosa si è scritto in modo errato e in quale riga.

Quella è comunque la via giusta, il loop cicla continuamente alla massima velocità e testa continuamente il verificarsi di qualche condizione. Solo nell'istante in cui una condizione risulta vera allora si esegue quanto contenuto nell'if (e le operazioni da eseguire a loro volta non devono bloccare o durare molto tempo).

Quote
Fare uno schema a relè/temporizzatori/pulsanti "classici", tradurlo in funzioni logiche equivalenti potrei anche riusirci,resta il fatto che il LOOP,legge le righe in fila ed una volta che è partito non posso aggiungere o toglier niente.
Non ho capito cosa intendi con aggiungere/togliere. Lo schema seguente è un classico marcia/arresto, con in più un timer per l'arresto dopo tot (facciamo 5 minuti):



Questo è un esempio di istruzioni da mettere nella funzione loop, che rappresentano pari pari il circuito:

Code: [Select]
byte STA = digitalRead(STA_PIN);
byte STO = digitalRead(STO_PIN);
A = (A | STA) & !T1out & !STO;
if (!A) { T1time=millis();  T1out=0; } else if (millis() - T1time >= 300000) T1out = 1;
digitalWrite(OUT_PIN, A);

NOTA: si assume che i pulsanti premuti diano un 1 in lettura, e che la luce si accenda con un 1 in scrittura

NOTA2: STA_PIN, STO_PIN, OUT_PIN, sono costanti che indicano i pin usati, mentre A, T1time, T1out, sono variabili di lavoro definite in precedenza:
Code: [Select]
#define STA_PIN  2
#define STO_PIN  3
#define OUT_PIN  4
byte A = 0;
byte T1out = 0;
unsigned long T1time = millis();


Nonostante il tempo del processo timer sia di cinque minuti (300mila ms), il loop gira alla massima velocità e i pulsanti vengono letti continuamente (ad occhio almeno diecimila volte al secondo).

NOTA3: in un circuito reale con pulsanti/contatti meccanici bisogna anche effettuare il debounce (filtro antirimbalzo) degli ingressi.
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

Puso

intendo che :
lo schema elettromeccanico funziona
probabilmente ance come lo hai riportato in funzione logica funziona

pero mettiamo per ipotesi che durante il tempo in cui il timer tiene eccitato il relè, arriva un che vuole accendere una lampadina

a livello elettrotecnico baterebbe mettere in parallelo un interuttore con la lampadina e se arriva uno che la vuole accendere basta che schiaccia l'interruttore indipendentemente da cosa sta facendo il timer (non gli interessa)

a livello logico invece dovrebbe aspettare che il timer abbia finito il suo lavoro.


non so se mi sono spiegato

sorry


Puso

ecco secondo me ci correbbero dei LOOP in parallelo.....mentre adesso mi sembra che ci sia un unico LOOP che funziona in serie

spero di sbagliarmi

Claudio_FF

Quote from: Puso
a livello elettrotecnico baterebbe mettere in parallelo un interuttore con la lampadina e se arriva uno che la vuole accendere basta che schiaccia l'interruttore indipendentemente da cosa sta facendo il timer (non gli interessa)

a livello logico invece dovrebbe aspettare che il timer abbia finito il suo lavoro.
No, visto che l'intera serie di istruzioni è sempre valutata/eseguita migliaia di volte al secondo, basta aggiungere una o due righe per leggere il nuovo interruttore e scrivere la nuova uscita (lo schema si può complicare a piacere con quanti elementi e timer indipendenti si vuole).

Quote
secondo me ci correbbero dei LOOP in parallelo.....mentre adesso mi sembra che ci sia un unico LOOP che funziona in serie
Quello che mi sembra sfugga è il fatto che l'esecuzione di quella serie di istruzioni dura in ogni caso pochi microsecondi (una quindicina), quindi ogni singolo componente dello schema viene virtualmente "eseguito" in parallelo a tutti gli altri ogni pochi microsecondi. La logica e i tempi del processo complessivo sono formati da innumerevoli cicli del loop principale.

NOTA: ad ogni nuovo ciclo i dati di lavoro sono rappresentati dalle letture attuali degli ingressi, e dalle variabili impostate nei cicli precedenti (stato).

Quote
anche se il semaforo mi sembrava semplice
Il semaforo monotask si, ma come in pratica in tutti i progetti "reali" ci si è trovati subito ad avere bisogno del multitasking (cooperativo), che richiede un diverso approccio/design. È abbastanza carne al fuoco tutta in una volta  ;)
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

ORSO2001

Ciao Puso,

forse... e dico forse...per dimostrare la vera differenza che c'è tra usare delay() e millis() prova ad eseguire questi due sketch che ad ogni secondo scrivono su monitor quanti cicli il loop() ha eseguito in un secondo.

con delay()

Code: [Select]
unsigned long ciclo = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay(1000);
  Serial.println(ciclo);
  ciclo++;
}


con millis():
Code: [Select]
unsigned long ciclo = 0;
unsigned long tempo;

void setup() {
  Serial.begin(9600);
  tempo = millis();
}

void loop() {
  if (millis() - tempo == 1000) {
    Serial.println(ciclo);
    tempo=millis();
  }
  ciclo++;
}


...se poi vuoi comunque che il pulsante premuto abbia precedenza su tutto...si deve andare di interrupt...

PaoloP

mi da errore....ho fatto copia incolla ed ho solo corretto il setup
Il codice pubblicato non è completo perché lo trovi già pronto tra gli esempi dell'IDE: Blink without delay

docsavage

Un pochino di masturbazione intellettuale lo vedo, ben spalmata....


Se vogliamo replicare il funzionamento di un circuito a relè  e timer elettromeccanici si può  fare, ma non è  così  che si programma arduino


Io sono quello che ne sa meno di tutti, qui, ma vedo che la strada non è  quella giusta

Torno a dire che un test su millis, che legge da un array di strutture ed esegue le istruzioni codificate è  un approccio modulare, semplice, espandibile




E' stato bello... ma appunto: è stato
Ocio, che adesso c'è qualcuno che dice le stesse cose per le quali mi martellavate... Il tempo è galantuomo

erosb

astrobeed,

nonostante tutto quello che si è scritto, attendiamo volentieri il Tuo PDF.

grazie
 E:B:

Go Up