problema con pulseIn

ciao, ho riscontrato un problema con la funzione pulseIn che non riesco a risolvere. quando avvio il programma la funzione non va come dovrebbe, e mi ritarda il programma di circa un secondo come se fosse un delay. qualcuno sa spiegarmi il motivo?
il programma è banale, do semplicemente un uscita alta per un certo tempo, e la pulsein dovrebbe restituirmi il tempo in questo caso 100ms. sul serial read, mi restituisce invece 0 e me lo scrive ogni secondo circa, invece dovrebbe scrivermelo ogni circ 100ms.
il programma è questo:


void setup() {
Serial.begin (9600);
pinMode(2, OUTPUT);
pinMode(3, INPUT_PULLUP);
}
void loop() {
digitalWrite(2, HIGH);
delay(100);
digitalWrite(2, LOW);
duration = pulseIn(3, HIGH);
Serial.println(duration);
}

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

La funzione pulseIn restituisce un unsigned long integer che deve essere dichiarato:

unsigned long duration;

Inoltre, c'è un timeout di 1 secondo che puoi modificare:

duration = pulseIn(3, HIGH, 1000); // timeout = 1000 μs = 1 ms

si è vero grazie,ho saltato una riga
però non mi va lo stesso

unsigned long duration;

void setup() {
  Serial.begin (9600);
  pinMode(2, OUTPUT);
  pinMode(3, INPUT_PULLUP);
}

void loop() {
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  duration = pulseIn(3, HIGH);
  Serial.println(duration);
}

anche se non cambio il timeout, con questo programma non dovrebbe restituitmi sul serial.read la durata dell' impulso in questo caso 100ms quindi 100000us?

Quale impulso ?
A meno che non tu lo invii dall'esterno, va' sempre in timeout

e mi ritarda il programma di circa un secondo come se fosse un delay. qualcuno sa spiegarmi il motivo?

è fisiologico; funziona cosí.

do semplicemente un uscita alta per un certo tempo, e la pulsein dovrebbe restituirmi il tempo in questo caso 100ms.

Vuoi misurare con il pin 3 collegato al pin2 di quanto lungo é l' impulso creato col delay?
Non puó funzionare perché la misura del impulso lo fai partire dopo che hai creato l' impulso.

Ciao Uwe

ho capito grazie ad entrambi. ma quindi come dovrei fare? se metto il delay alla fine del programma e quindi dopo la istruzione pulseIn non è sbagliato lo stesso?

Devi usare 2 Arduini; uno per creare l'impulso e l' altro per leggerlo.
Ciao Uwe

perfetto ho capito grazie!

nel caso in cui invece ho un sensore ad ultrasuoni srf05 e il programma è il seguente:

void setup() {
  Serial.begin (9600);
  pinMode(2, OUTPUT);  // trigger pin
  pinMode(3, INPUT_PULLUP); // echo pin
}

void loop() {
  unsigned long duration;
  digitalWrite(2, HIGH);
  delay(10);
  digitalWrite(2, LOW);
  duration = pulseIn(3, HIGH);
  Serial.print(duration/58);
  Serial.println(" cm");
}

Ieri mi andava poi ho riaperto il programma dopo una decina di minuti e non mi andava più, segnandomi sempre 0 sul uscita seriale e dandomi i problemi di cui stavamo discutendo prima, ovvero che il pulsein mi funziona diciamo come un delay da 1 secondo. le uscite sull arduino non sono bruciate e i programmi senza il pulseIn vanno. com' è possibile che fino ad un certo punto questo programma è andato e poi basta?

qual' è il problema?

Si é staccato qualche cavetto?

Ciao Uwe

ora va, era un problema con i tempi..grazie!