Go Down

Topic: [Risolto] Blink con millis() lettura PPM con pulseIn() Ritardi e Problemi (Read 5551 times) previous topic - next topic

DriftBoy

Devo far lampeggiare 2 led come fossero i lampeggianti della polizia, quindi 2 impulsi 1° e poi 2 impulsi il secondo, ora col delay è semplicissimo da fare, ma tentando di farlo utilizzando millis() sono riuscito a far fare 2 lampeggi e poi si ferma, test fatto con un led singolo... AIUTO!!!!

Code: [Select]
int ledPin = 13;
int led = 0;
int value = LOW;
long previousMillis = 0;
long interval = 100;
long interval2 = 1000;

void setup()
{
 pinMode(ledPin, OUTPUT);
}

void loop()
{



 if(ledPin==HIGH)
 {
   led++;
   if(led<2)
     if (millis() - previousMillis > interval) {
       previousMillis = millis();

       if (value == LOW)
         value = HIGH;
       else
         value = LOW;
       digitalWrite(ledPin, value);
     }
     if (led == 2){
       if (millis() - previousMillis > interval2) {
         previousMillis = millis();    
         led = 0;  
       }
     }
   }  
}


Ricordando che sono un super ignorante in materia

m_ri

cos'è sta roba   if( ledPin=HIGH) ???e poi fa un assegnamento,NON un confronto :smiley-mr-green:

Michele Menniti

Hai visto negli esempi dell'IDE "Blink without delay"?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

DriftBoy

si ed è proprio da quell'esempio che nasce quel che ho scritto, il fatto è che in quell'esempio i tempi d'accensione e spegnimento sono di 1000, io invece devo fare 2 accensioni a 100 con pausa 100 fra loro e pausa lunga a 1000, e una volta fatto ciò devo fare la stessa condizione ad un secondo led che lampeggi nella pausa lunga del primo

PaoloP

Ho buttato giù 2 righe.
Fanno un lampeggio singolo a intervalli diversi.
Come spunto di partenza potrebbe andare.
Code: [Select]
int Led1 = 7;
int Led2 = 8;

long previousMillis1 = 0;
long previousMillis2 = 0;
long interval1 = 100;
long interval2 = 1000;

void setup()
{
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  digitalWrite(Led1, LOW);
  digitalWrite(Led2, LOW);
  previousMillis1 = millis();
  previousMillis2 = millis();
}

void loop()
{
  if (millis() - previousMillis1 > interval1) {
    flash(Led1, 50);
    previousMillis1 = millis();
  }
  if (millis() - previousMillis2 > interval2) {
    flash(Led2, 50);
    previousMillis2 = millis();
  }
}

void flash( int pinled, int duration)
{
  digitalWrite(pinled, HIGH);
  delay(duration);
  digitalWrite(pinled, LOW);
}

Michele Menniti

ma così usi il delay, mi pare che lui non voglia usarlo...
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

PaoloP


ma così usi il delay, mi pare che lui non voglia usarlo...

ok.
La mia voleva essere solo una base di partenza per l'uso di due intervalli di lampeggio diversi.
Dovrebbe, infatti, sostituire alla funzione flash la parte della logica con gli stati HIGH e LOW e, in seguito inserire il secondo lampeggio.

pablos

in teoria potresti farlo con un solo millis visto che il tempo on è uguale a quello off assegnando a delle variabili i passaggi 1-2-3, di conseguenza anche il n° del led cambia a seconda del passaggio in cui si trova il prog, al passaggio n°2 il tempo diventa 1000 per poi ricominciare.
no comment

leo72

La strada è quella di Pablos, si tratta di una sequenza di accensioni/pause per cui è molto facile da gestire.
Ipotizzando che la luce di destra la chiamiamo L1 e la luce di sinistra L2, la sequenza è:
L1-ON-100
L1-OFF-100
L1-ON-100
L1-OFF-100
PAUSA-100
L2-ON-100
L2-OFF-100
L2-ON-10
L2-OFF-100
PAUSA-100

e ripartire da zero. Sono quindi 10 condizioni distanziate di 100 ms l'una dall'altra. Basta usare una variabile per indicare il punto della sequenza. Ogni 100 ms si incrementa questa variabile e poi si controlla quale azione si deve eseguire. Dopo la 10ma azione, si azzera la variabile così che la sequenza riparta.

DriftBoy

il fatto per cui non posso utilizzare il delay è xkè devo in contemporanea leggere 8 ingressi ppm e restituire 10 uscite derivate, di conseguenza il delay mi blocca tutto il resto del programma... ora la cosa folle è che riesco a lavorare con i ppm e non riesco a far lampeggiare 2 led senza che rompano i così detti....

gingardu

scrivi l'esatta sequenza dei lampeggi es led 1 acceso 100 millisecondi spento 200 millisecodi , acceso  ect
scrivi anche se millis ()   e usato anche da qualcos'altro nel programma
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

pablos


scrivi l'esatta sequenza dei lampeggi es led 1 acceso 100 millisecondi spento 200 millisecodi , acceso  ect
scrivi anche se millis ()   e usato anche da qualcos'altro nel programma

l'ha scritta LEO.

no comment

DriftBoy

#12
Sep 13, 2012, 11:25 pm Last Edit: Sep 13, 2012, 11:30 pm by DriftBoy Reason: 1
Led 1          Led 2          Tempo
off              off              0
on               off              100
off              off               200
on               off              300
off              off              400
off              on               500
off              off               600
off              on               700

nessun altro utilizzo per millis
il resto è tutto ricezione ppm ed esecuzione

sto facendo varie prove, ma ogni cosa faccio non riesco ad uscire dalla prima istruzione, nel senso che se gli dico di lampeggiare ogni 100 ms non riesco a fargli fare una pausa di 1000 ms e poi ricominciare il ciclo di 100

pablos

#13
Sep 13, 2012, 11:37 pm Last Edit: Sep 13, 2012, 11:43 pm by pablos Reason: 1
google ricerca "Arduino police led millis"
http://www.cmiyc.com/tutorials/arduino-example-police-lights-with-millis/
http://www.cmiyc.com/blog/2011/01/06/millis-tutorial/
http://pastebin.com/mX2HLVBN
no comment

gingardu


Led 1          Led 2          Tempo
off              off              0
on               off              100
off              off               200
on               off              300
off              off              400
off              on               500
off              off               600
off              on               700

nessun altro utilizzo per millis
il resto è tutto ricezione ppm ed esecuzione

sto facendo varie prove, ma ogni cosa faccio non riesco ad uscire dalla prima istruzione, nel senso che se gli dico di lampeggiare ogni 100 ms non riesco a fargli fare una pausa di 1000 ms e poi ricominciare il ciclo di 100


hai scritto una sequenza di 700 millisecondi
e poi parli di riritardare un secondo,

scrivila completa con le pause complete che vuoi usa la stesso schemino che hai fatto  ma scrivila tutta

scrivi anche su che pin hai i due led
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Go Up