Vai al contenuto
PLC Forum


millis concatenato


kemosabe

Messaggi consigliati

Salve a tutti, sto cercando di realizzare uno sketch con vari void che accendono dei led, mi sto impantanando perchè, sebbene sappia che un void sia a ciclo continuo, vorrei che per ogni void che chiamo possa impostare un tempo per quel voi e poi esca e passi al successivo.

Ho provato in vari modi, con while, con for, ecc, poi ho provato con dei millis, ma sempre con lo stesso risultato, ovvero che appena entra nel primo void non ne esce piu'.

Se potete consigliarmi e aiutarmi a capire, ve ne sarei grato

 

Grazie

Link al commento
Condividi su altri siti


  • Risposte 91
  • Created
  • Ultima risposta

Top Posters In This Topic

  • kemosabe

    30

  • Livio Orsini

    22

  • ilguargua

    21

  • GiRock

    6

Non specifichi il dispositivo ma, presumo, si tratti di arduino.

 

Per prima cosa "void" indica il tipo di funzione, non la funzione, tipo queste:

 

void setup() 
{...
...
}
void loop()
{
.....
}

 

Le due funzioni void esemplificate sopra hanno modi di agire differenti, la prima è la funzione di inizializzazione e si esegue una sola volta; la seconda è il programma pruincipale o "main" e si esegue in continuazione.

 

 

vorrei che per ogni void che chiamo possa impostare un tempo per quel voi e poi esca e passi al successivo.

 

Non è una cosa difficilissima, anzi per chi sa programmare è abbastanza semplice.

Però da come scrivi sembra che tu non abbia proprio nemmeno i rudimenti fondamentali di programmazione.

 

Potrei scriverti io la funzione ma non mi pare corretto.

 

Io invece ti consiglio di seguire uno dei tanti tutorial per arduino che si trovano in rete.

Seguilo passo passo senza saltare alcun paragrafo o capitolo ed arriverai a realizzare la funzione che desideri.

Qualsiasi edificio, che sia una torre o una baracca, deve essere costruito secondo logica, partendo dalle fondamenta sino ad arrivare al tetto.

la funzione che vuoi realizzare tu è come il terzo piano di un edificio, se sotto non hai altri 2 piani solidi, ben appoggiati su di una solida fondazione, il tuo piano non si regge.

 

I tutorials, se ben fatti, sono concepiti proprio per guidarti in questo percorso di costruzione della conoscenza; non si può pensare di risolvere un'equazione, anche di primo grado, se non si conoscono i fondamenti dell'algebra.

Link al commento
Condividi su altri siti

Buongiorno, grazie per la risposta, si mi sono dimenticato di dire che sto sperimentando con Arduino.

Si conosco i void principali di controllo.

Forse mi sono spiegato male, vediamo se riesco a dimostrarlo meglio:

 

void setup(){

}

void loop()
{          

primo();

secondo();

terzo();

}

void primo(){

tempo}

void secondo(){

tempo}

void terzo(){

tempo}

 

ho scritto tempo all'interno dei void, ma non so se va li, in quanto dopo svariate prove non funziona.

il secondo problema è che all'interno dei void c'è già un millis per il controllo del gioco dei led

grazie

Link al commento
Condividi su altri siti

 

Si conosco i void principali di controllo.

Allora chiamale con il loro nome, funzioni. void è il tipo di valore restituito, in questo caso essendo appunto "void" significa che la funzione non restituisce alcun valore.

 

 

ho scritto tempo all'interno dei void,

Come ti ha già fatto notare Livio, bisogna che ti studi magari le basi della programmazione in C/C++,  per capire cosa e quali sono i tipi di variabili, la visibilità delle stesse e perlomeno i costrutti condizionali principali (if/else, while, switch, etc.), altrimenti vai poco lontano.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

 

tempo all'interno dei void,

 

Insisti con void.:smile:

Allora una volta per tutte. In inglese void corrisponmte all'aggettivo vuoto/vuota.

Nel linguaggio "C", ed arduino usa una sottospecie del "C", "void" è una "keyword" (parola chiave) che da indicazioni al compilatore.

In genere, anzi per definizione, ci si aspetta che una funzione restituisca uno o più valori, ponendo void davanti la dichiarazione della funzione, si dice al compilatore che la funzione non restituisce alcun valore.

Compreso ora cosa è e a cosa serve la keyword "void"?

 

A parte il fartto che è meglio non usare le funzioni delay (x) perchè sono bloccanti, ovvero il programma si blocca li sino a che non è trascorso il tempo impostato, comunque la sintassi è  delay(100), dove 100 è il tempo espresso in millisecondi

 

int ledPin = 13;              // LED connected to digital pin 13

void setup() {
  pinMode(ledPin, OUTPUT);    // sets the digital pin as output
}

void loop() {
  digitalWrite(ledPin, HIGH); // sets the LED on
  delay(1000);                // waits for a second
  digitalWrite(ledPin, LOW);  // sets the LED off
  delay(1000);                // waits for a second
}

 

Ora se tuo vuoi cambiare il tempo di lampeggio del LED, ad esempio, modifichi il programmino di cui sopra così

int ledPin = 13;              // LED connected to digital pin 13

void setup() {
  pinMode(ledPin, OUTPUT);    // sets the digital pin as output
}

void loop() {
  digitalWrite(ledPin, HIGH); // sets the LED on
  delay(1000);                // waits for a second
  digitalWrite(ledPin, LOW);  // sets the LED off
  delay(1000);                // waits for a second
  digitalWrite(ledPin, HIGH); // sets the LED on
  delay(500);                // waits for a second
  digitalWrite(ledPin, LOW);  // sets the LED off
  delay(500);                // waits for a second
  digitalWrite(ledPin, HIGH); // sets the LED on
  delay(750);                // waits for a second
  digitalWrite(ledPin, LOW);  // sets the LED off
  delay(750);                // waits for a second

}

 

Questa è una funzione che fa lampeggiare il LED con 3 differenti tempi.

 

Poi se vuoi divertirti, puoi provare a generare un numero casuale con l'apposit funzione di libreria di arduino, e passare il parametro di volta in volta; dovrai usare il primo esempio ed andare a sostituire la costante 1000 con una variabile generata dalla funzione random.

Link al commento
Condividi su altri siti

 

Vi chiedo scusa , evidentemente non riesco a spiegarmi.

 

Non devi scusarti,ma devi seguire le indicazioni che ti abbiamo date.

Non riesci a spiegarti perchè non conosci l'argomento di cui vuoi parlare.

 

Comincia dagli esempio che ti ho dato, fai la variante randomi9zzata.Prima di arrivare a scrivere funzioni parametriche, perchè è quello che ti necessita, devi imparare a dominare bene le cose semplici.

Link al commento
Condividi su altri siti

no, forse .... insisto, non riesco a spiegarmi........

Non vi sto chiedendo di farmi capire come funzionano i delay, nemmeno come funzionano i millis, vi sto solo chiedendo se si puo' far funzionare due millis uno dentro l'altro.

Si lo so che non ho studiat, ho la terza media, quindi non so nulla sulle programmazioni, ma di programmazione di Arduino, e solo di quello ne so poco. ma qualcosina so.

comunque non importa vedo che la comunicazione viaggia su due frequenze diverse grazie ancora.

 

Link al commento
Condividi su altri siti

Guarda se questo può fare al caso tuo :

 




// pin a cui sono collegati i led
uint8_t led1 = 2;
uint8_t led2 = 3;
uint8_t led3 = 4;



void setup(){
    pinMode(led1,OUTPUT);
    pinMode(led2,OUTPUT);
    pinMode(led3,OUTPUT);
    
}


void toggleLed(uint8_t led){
    digitalWrite(led, ! digitalRead(led));
}

void led1Blink(){
    static unsigned long lastToggle = 0;
    uint16_t toggleTime = 1000;
    if(lastToggle + toggleTime < millis()){
        toggleLed(led1);
        lastToggle = millis();
    }
}

void led2Blink(){
    static unsigned long lastToggle = 0;
    uint16_t toggleTime = 2000;
    if(lastToggle + toggleTime < millis()){
        toggleLed(led2);
        lastToggle = millis();
    }
}

void led3Blink(){
    static unsigned long lastToggle = 0;
    uint16_t toggleTime = 3000;
    if(lastToggle + toggleTime < millis()){
        toggleLed(led3);
        lastToggle = millis();
    }
}

void loop(){
    led1Blink();
    led2Blink();
    led3Blink();
}

BTW, anche io non ho studiato e ho la terza media (che però ai miei tempi era perlomeno fatta bene... :smile:).

 

Ciao, Ale.

 

Link al commento
Condividi su altri siti

invece di offendere e fare gli spiritosi, dovreste cercare di capire e aiutare, visto che i "saputi" siete voi, e voi state qui per insegnare agli altri stupidi come me.

Link al commento
Condividi su altri siti

 

invece di offendere e fare gli spiritosi

Io non ho offeso nessuno, ho anche perso tempo a sviluppare un esempio che riprendesse il più possibile quello che avevi postato, ti ho già detto che non sono "saputo" perchè ho il tuo stesso titolo di studio, visto che insisti a fare il permaloso e a questo punto non sembri assolutamente interessato nè ad imparare nè a discutere degli esempi che ti sono stati postati, io mi fermo qui, altrimenti comincio ad offendere (peso) sul serio (e sono livornese, quindi so come si fa).

 

 

Link al commento
Condividi su altri siti

beh guarda, se vuoi imparare ad offendere, quello te lo insegno io .....visto che sono Aretino............

non è che non voglio imparare, siete voi che presumete di sapere quali siano le mie conoscenze rimandandomi ad esempi o a studi di questo e di quello.

Visto che perlomeno avete studiato, penso che dobbiate capire almeno le difficoltà che possa avere una persona in base alle domande che vi fa.

Se uno vi chiede qualcosa sul millis, visto che quello che vedo in giro non è sempre di facile comprensione a differenza del delay, dovreste capire che magari uno il delay lo ha già capito, ma vuole passare ad un livello superiore di conoscenza.

Quello che mi fa spece è che non leggete nemmeno le domande che uno vi fa supportate anche da esempi.

Vi mettete solo a rimandare a studiare quello o quell'altro, invece di aiutare, non dando soluzioni, ma dando spiegazioni, che magari con il ragionamento aiutano, a capire, come funziona una cosa.

Comunque chiedo scusa dello sfogo, ma vi ho solo chiesto aiuto. Evidentemente non capisco io.

 

Grazie

Link al commento
Condividi su altri siti

Invece che ringraziare per gli esempi e dire "scusate ma non ho capito, spiegatemi meglio"  reagisci così?

 

Nulla è dovuto. Non abbiamo nessun obbligo di insegnare niente a nessuno...

Link al commento
Condividi su altri siti

e allora mi domando che cosa ci stai a fare qui?

sei tu che offendi e scherzi .

E poi dici che non devo reagire? cosa devo fare stare qui a pendere dalle tue labbra con reverenza aspettando che tu mi conceda qualche goccia di sapienza?

Se poi non devi niente a nessuno e spiegare nemmeno, ribadisco, che ci fai qui??????? 

Link al commento
Condividi su altri siti

Io son livornese per linea paterna, ma tu sei sicuro di essere aretino e non pisano?:lol:;)

 

Invece di fare tanto il permaloso pubblica uno dei tuoi tentativi e vediamo se riusciamo a capiro cosa vuoi fare e perchè non vanno.

 

Ricordati che non è il titolo di studio a far la competenza, ma è quello che si sa realmente.

Inoltre per imparare è indispensabile di avere almeno l'umiltà di riconoscere le proprie manchevolezze.

Link al commento
Condividi su altri siti

Giusto per informazione sono di Castiglion Fiorentino....presente? 

Comunque, di prove ne avrei molte da farti vedere, ti metto un pezzo di quella da cui sono partito e poi ti dico cosa vorrei fare......grazie

int R = 7;
int G = 6;
int B = 8;

int color = 0;
int oldColor = 0;

unsigned long tempo;

byte stato = 1;
int val = 0;

unsigned long durata =0;
unsigned long temp =0;
 unsigned long rgb = 0;
unsigned long t1 = 0;
unsigned long t2 = 0;
unsigned long zero = 0;
void setup()
{
    
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);  
 
  Serial.begin (9600);
}

void loop() 
{
  _0_Random_RGB();

   _1_Blink_R();  

}


 
void _0_Random_RGB(){

  
  do{
    color = random(7);
  }
  while(color==oldColor);//Continua a generare numeri finché sono uguali al precedente
  
     oldColor=color; // E' uscito dal while perché ha generato un numero diverso dal precedente
     
     switch(color){
        case 0:
             digitalWrite(R, HIGH);
             digitalWrite(G, LOW);
             digitalWrite(B, LOW);
          break;

          case 1:
             digitalWrite(R, HIGH);
             digitalWrite(G, HIGH);
             digitalWrite(B, HIGH);
          break;
 
          case 2:
             digitalWrite(R, LOW);
             digitalWrite(G, HIGH);
             digitalWrite(B, LOW);
          break;
  
          case 3:
             digitalWrite(R, HIGH);
             digitalWrite(G, LOW);
             digitalWrite(B, HIGH);
          break;
          
          case 4:
             digitalWrite(R, LOW);
             digitalWrite(G, LOW);
             digitalWrite(B, HIGH);
          break;
        
          case 5:
             digitalWrite(R, LOW);
             digitalWrite(G, HIGH);
             digitalWrite(B, HIGH);
          break;
       
          case 6:
              digitalWrite(R, HIGH);
              digitalWrite(G, HIGH);
              digitalWrite(B, LOW);
             
          break;
     }
  }

}
void _1_Blink_R()
{
 
  digitalWrite(G, LOW), digitalWrite(B, LOW);
  if (millis() -  zero >= 500 )
  {
   zero = millis();  //Tiene in memoria l'ultimo lampeggio
   
    //Se il LED è spento lo accende e viceversa
    if (Rv == LOW)
      Rv = HIGH;
    else
      Rv = LOW;
    digitalWrite(R, Rv);
  }
}

allora, come vedi nel void _1_Blink_R() c'è già un millis che da la scadenza .

Quello che ho provato è inserire un un while, un for, un if con gli stati, ecc è poi un millis in tutti e due i voi, per poter dare un tempo di esecuzione di ogni voi.

Visto che vengono chiamati dal void loop pensavo che potessero ciclare uno dopo l'altro, ma quando metto a monte un for ecc o un millis , quando parte il primo, void _0_Random_RGB(){, si blocca li e non ne esce , quindi non passa al secondo.

La mia domanda primaria era: cosa posso fare, con if o for o millis o altro per farli ciclare uno dopo l'altro dopo un certo tempo di ciclo di ognuno?

 

 

grazie

Link al commento
Condividi su altri siti

 

cosa posso fare,

 

Non sono sicuro di aver capito, vedo di riassumerese ho compreso bene.

Allora hai 3 Leds: giallo, rosso e blù. Vuoi farli accendere in sequenza con tempi che variano. E ccosì che vuoi fare?

 

PS. eppure tu devi averci qualche cosa di pisano, che so un nonno o un bisnonno?:smile:

Non te la prendere sto scherzando.

Link al commento
Condividi su altri siti

siamo una famiglia da sempre di qui, mi spiace, a parte che mi piacerebbe che finisse sta storia con i pisani, non vedo perchè qualcosa successo molto tempo fa si debba continuare a perseguire..........

Comunque, ho una striscia led rgb, e vorrei farle fare vari giochi, per esempio due come quelli nei void.

per ognuno dei giochi(void) vorrei che ci fosse un tot di tempo di esecuzione prima di passare al successivo void.

Ti chiedo, non di darmi la soluzione, ma farmi capire come posso procedere, grazie

Link al commento
Condividi su altri siti

 

Ti chiedo, non di darmi la soluzione, ma farmi capire come posso procedere, grazie

 

Ora sono un po' preso, però spero in giornata di farti un esempio su come procedere.

Però ti consiglio di iniziare da subito almeno ad usare la terminologia corretta, non è uno sfizio. Tu puoi anche usare il termine "beb" per indicare una bicicletta, però lo capisci solo tu.

Quelle che tu chiami void, sono funzioni e quelli che tu indichi con millis sono temporizzazioni!

 

 

non vedo perchè qualcosa successo molto tempo fa si debba continuare a perseguire..........

 

Lascia stare, non c'entra alcun episodio datato, è uno scherzo che capiscono bene i livornesi e, a volte, anche i pisani.:P

 

Link al commento
Condividi su altri siti

Prova a sviluppare questo

 

 


void setup() {
  pinMode(ledPin_G, OUTPUT);    // sets the digital pin as output
  pinMode(ledPin_B, OUTPUT);    // sets the digital pin as output
  pinMode(ledPin_R, OUTPUT);    // sets the digital pin as output
}

void loop() {

  int itim_R = 200;
  int itim_G = 1000;
  int itim_B = 500;
esegue un loop di 20 con tempi variabili
  for( i = 0; i = 19; i++)
     {
          digitalWrite(ledPin_R, HIGH); 
		  itim_R = itim_R + 50;
          delay(itim_R);       
          digitalWrite(ledPin_R, LOW); 
//
          digitalWrite(ledPin_G, HIGH); 
		  itim_R = itim_G -75;
          delay(itim_G);       
          digitalWrite(ledPin_G, LOW); 
//
          digitalWrite(ledPin_B, HIGH); 
		  itim_R = itim_B + 100;
          delay(itim_B);       
          digitalWrite(ledPin_B, LOW); 
      }
//ricarica tempi con valore iniziale
  itim_R = 200;
  itim_G = 1000;
  itim_B = 500;


}

 

Questo programma accende i 3 LEDs in sequenza con tempi variabili. Puoi anche randomizzare i tempi e fare altro

 

Se vuoi invece avere contemporaneità di LEDS accesi e spenti non devi usare la funzione delay(), ma la  funzione millis() come nell'esempio di Ale (Ilguargua)

Link al commento
Condividi su altri siti

no, scusa, ma non riesco a spiegarmi bene.

Vediamo se ci riesco in un'altro modo.

Dunque prendiamo l'esempio dato dall'ide di Arduino, blink witout delay....ok.

se io volessi temporizzare per un certo tot i due lampeggi come posso fare? passando per esempio poi ad un'altro tempo che mi faccia lampeggiare altri due led con tempi diversi e per un tempo di lampeggio totale diverso dal primo, per poi ricominciare da capo..

 

in pratica:

blink 1

tempo tot

red acceso tempo

red spento tempo

 

blink 2

tempo tot

green acceso 

green spento

ricomincia

 

il tutto usando il millis sia per i tempi totali che per i tempi di lampeggio

 

dai dimmi che hai capito meglio, non riesco a spiegarmi bene, sono un po tardo.....

 

grazie

Link al commento
Condividi su altri siti

ok prendendo quello, se ad ognuno dei tre cicli volessi dare un tempo di esecuzione

io ci ho provato:

// pin a cui sono collegati i led
uint8_t led1 = 2;
uint8_t led2 = 3;
uint8_t led3 = 4;



void setup(){
    pinMode(led1,OUTPUT);
    pinMode(led2,OUTPUT);
    pinMode(led3,OUTPUT);
    
}


void toggleLed(uint8_t led){
    digitalWrite(led, ! digitalRead(led));
}

void led1Blink(){
    static unsigned long lastToggle = 0;
    uint16_t toggleTime = 1000;
    if(lastToggle + toggleTime < millis()){
        toggleLed(led1);
        lastToggle = millis();
    }
}

void led2Blink(){
    static unsigned long lastToggle = 0;
    uint16_t toggleTime = 2000;
    if(lastToggle + toggleTime < millis()){
        toggleLed(led2);
        lastToggle = millis();
    }
}

void led3Blink(){
    static unsigned long lastToggle = 0;
    uint16_t toggleTime = 3000;
    if(lastToggle + toggleTime < millis()){
        toggleLed(led3);
        lastToggle = millis();
    }
}

void loop(){
   unsigned long a =millis();
    if(millis() - a < 1000){ 
      a=millis();  
        led1Blink();}
   unsigned long b =millis();
    if(millis() - b < 1000){ 
      led2Blink();}
    unsigned long c =millis();
      if(millis() - c < 1000){ 
        led3Blink();
}

 

il problema è che si ferma nel primo " led1Blink();"  e si blocca li.

 

non capisco perchè non prosegue nel secondo e poi nel terzo

 

 

grazie

Link al commento
Condividi su altri siti

Ospite
Questa discussione è chiusa alle risposte.

×
×
  • Crea nuovo/a...