Go Down

Topic: acquisizione segnale analogico e misurazione della frequenza (Read 3534 times) previous topic - next topic


allora ho provato e il led che esce dal buffer è sincorno con il led che sta prima del buffer... com'è sta cosa che non prende  alcuni battiti? alcune volte il led si accende poco e l'arduino non li prende... altre volte il led si accende del tutto e non li prende...

qsecofr


allora ho provato e il led che esce dal buffer è sincorno con il led che sta prima del buffer... com'è sta cosa che non prende  alcuni battiti? alcune volte il led si accende poco e l'arduino non li prende... altre volte il led si accende del tutto e non li prende...


allora significa che il segnale di input in realtà non è un vero 5 volt pulito come si pensava ma delle volte è meno. Fai questa sostituzione (pseudocodice)

int val = analogread(cardiopin)
if val >100
  stato = HIGH
else
  stato = LOW
endif

e poi continui... vediamo cosa esce: prelevo un segnale più basso...

a... sarebbe bello vedere anche come lo attacchi questo affare... ci sono resistenze di pulldown?

mm no ho collegato direttamente al pin di arduino l'ucita del sensore.... a che servono queste resistenze di cui parli?

qsecofr


mm no ho collegato direttamente al pin di arduino l'ucita del sensore.... a che servono queste resistenze di cui parli?


dipenda un po' da che tipo di uscita hai da gestire. La prima cosa che ti invito a fare è gestire in analogica l'uscita di modo che se il segnale non è esattamente 5 volt lo becchiamo lo stesso.
Le resistenze di pulldown sono delle resistenze, di solito grandine, che si mettono tra il pin e massa: questo evita che eventuali disturbi possano alzare il pin... non sempre sono necessarie: sono necessarie ad esempio se metti un tasto... non so se servono: probabilmente non servono però va provato.

ciao allora guarda alla fine è tutto a posto va bene cosi... volevo chiederti una cosa.... a seconda dei valori della variabile bpm devo regolare con la pwm la velocità di un motore..... questo è il pezzo di codice che ho scritto alla fine del programma... ma non accade nulla, la velocità del motore rimane sempre la stessa e non so se sia il massimo o un volero intermedio.... l'interfacciamento del motore è ok, ho provato con il programma fading e funziona non so perche non funziona con quest'altro programma... puoi aiutarmi?
if ( 0 <= bpm <= 70)
  { analogWrite(tappetopin, 255);}
if ( 70 < bpm <= 80)
  { analogWrite(tappetopin, 229);}
    if ( 80 < bpm <= 100)
    {analogWrite(tappetopin, 204);}
    if ( 100 < bpm <= 120)
  { analogWrite(tappetopin, 178);}
      if ( 120 < bpm <= 140)
  { analogWrite(tappetopin, 153);}
if ( 140 < bpm <= 160)
  { analogWrite(tappetopin, 125);}
if ( 160 < bpm)
  { analogWrite(tappetopin, 102);}

qsecofr


ciao allora guarda alla fine è tutto a posto va bene cosi... volevo chiederti una cosa.... a seconda dei valori della variabile bpm devo regolare con la pwm la velocità di un motore..... questo è il pezzo di codice che ho scritto alla fine del programma... ma non accade nulla, la velocità del motore rimane sempre la stessa e non so se sia il massimo o un volero intermedio.... l'interfacciamento del motore è ok, ho provato con il programma fading e funziona non so perche non funziona con quest'altro programma... puoi aiutarmi?
if ( 0 <= bpm <= 70)
  { analogWrite(tappetopin, 255);}
if ( 70 < bpm <= 80)
  { analogWrite(tappetopin, 229);}
    if ( 80 < bpm <= 100)
    {analogWrite(tappetopin, 204);}
    if ( 100 < bpm <= 120)
  { analogWrite(tappetopin, 178);}
      if ( 120 < bpm <= 140)
  { analogWrite(tappetopin, 153);}
if ( 140 < bpm <= 160)
  { analogWrite(tappetopin, 125);}
if ( 160 < bpm)
  { analogWrite(tappetopin, 102);}



si non si fa così il test... si fa
if ((a > 100) && (a < 120))

grazie mille mi hai aiutato moltissimo, è il mio progetto di maturità, te ne sono grato... un ultima richiesta che ti faccio se è possibile... potresti spiegarmi i passaggi di questo pezzo di codice? all'esame dovro saper spiegare bene tutti i passaggi e quellli su cui ho delle perplessità sono questi
Code: [Select]
void loop() {
   
   
  stato = digitalRead(CardioPin);
  if (stato != ultimoStato) {

    if (stato == HIGH) {
      //sistole...fronte di salita...
      digitalWrite(ledPin, HIGH);
      if ( millis()- oldMillis_antiBounce  > 10)
              {  // se impiega meno di 10 millisecondi per cambiare di stato è un rimbalzo e non lo conto
              contatore ++;
              oldMillis_antiBounce = millis();

              };
                   
      } else {
      // else stato = low significa che sono in diastole
              digitalWrite(ledPin, LOW);
     
     
    }
    ultimoStato = stato;  // lo stato è variato
  }

   if ( millis()- oldMillis  > 15000) {
     //15 secodi di statistica... calcolo media

ecc.

qsecofr

... dovresti sforzarti di capirlo se no è un imbroglio non un esame... ho messo anche dei commenti...
in ogni caso leggo lo stato della porta, se cambia di stato entro nell'if. All'interno dell'if se il segnale è high significa che siamo facendo una sistole, c'è un if di antirimbalzo che forse non serve e viene incrementato un contatore del battito. quando il segnale torna low significa che si è in fase di diastole e quindi modifica solo lo stato ed aspetta la prossima sistole.



grazie mille mi hai aiutato moltissimo, è il mio progetto di maturità, te ne sono grato... un ultima richiesta che ti faccio se è possibile... potresti spiegarmi i passaggi di questo pezzo di codice? all'esame dovro saper spiegare bene tutti i passaggi e quellli su cui ho delle perplessità sono questi
Code: [Select]
void loop() {
   
   
  stato = digitalRead(CardioPin);
  if (stato != ultimoStato) {

    if (stato == HIGH) {
      //sistole...fronte di salita...
      digitalWrite(ledPin, HIGH);
      if ( millis()- oldMillis_antiBounce  > 10)
              {  // se impiega meno di 10 millisecondi per cambiare di stato è un rimbalzo e non lo conto
              contatore ++;
              oldMillis_antiBounce = millis();

              };
                   
      } else {
      // else stato = low significa che sono in diastole
              digitalWrite(ledPin, LOW);
     
     
    }
    ultimoStato = stato;  // lo stato è variato
  }

   if ( millis()- oldMillis  > 15000) {
     //15 secodi di statistica... calcolo media

ecc.


PUPI

Ciao a tutti, mi intrometto nella discussione.
Sono nuovo in tutti i sensi, sia di Arduino e conseguentemente del forum.
Poichè sono anche io interessato ad acquisire segnali analogici con Arduino, e anche io sono interessato a questo ambito, volevo chiedervi come alla fine avete implementato il sistema: con un display seriale o con tre display a 7 segmenti? Come avete collegato il tutto?
Comunque pensavo di produrre una modifica al circuito analogico, invece del secondo amplificatore identico al primo, sarebbe più interessante provare ad usare un comparatore a finestra con isteresi.... vediamo che mi viene.

Go Up