Go Down

Topic: progrmmazione tapis roulant pwm (Read 1 time) previous topic - next topic

carloandrea

Feb 03, 2013, 06:19 pm Last Edit: Feb 03, 2013, 06:42 pm by carloandrea Reason: 1
salve a tutti il mio problema puo sembrarvi banale ma non riesco a venirne a capo! devo regolare la velocita in pwm di un motore di un tapis roulant in base alle pulsazioni cardiache,ma non accade nulla! la velocità rimane la stessa forse o sbagliato il codice , l'interfacciamento è giusto con il programma fading funziona alla grande... ecco il codice vi prego aiutatemi
Code: [Select]
#include <hcf4511be.h>
hcf4511be unita(2,3,4,5);
hcf4511be deci(6,7,8,9);
int bpm;
int decine;
int centinaia;
int unit;
int A;
int tappetopin = 11;
const int  CardioPin = A0;    
const int ledPin = 13;      

long oldMillis;
long oldMillis_antiBounce;

byte contatore = 0;
byte stato = 0;
byte ultimoStato = 0;


void setup() {

 pinMode(CardioPin, INPUT);
 pinMode(ledPin, OUTPUT);
 pinMode(12, OUTPUT);
 // initialize serial communication:
 Serial.begin(9600);
 oldMillis = millis();
 oldMillis_antiBounce = oldMillis;
 
}


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
 
    Serial.print ("bpm:");
    Serial.println ( contatore * 4);
      bpm= contatore*4;

centinaia= bpm/100;
A= bpm- (centinaia*100);
decine= A/10;
unit= A- (decine*10);
Serial.print ("CENTINAIA:");
 Serial.println(centinaia);
Serial.print ("DECINE:");
Serial.println(decine);
Serial.print ("UNITA:");
 Serial.println(unit);
 unita.sendOut(unit);
 deci.sendOut(decine);
 if(centinaia > 0)
 {
   digitalWrite(12, HIGH);
}
 else
{
 digitalWrite(12,LOW);
}
    contatore = 0;
    oldMillis = millis();
    oldMillis_antiBounce =      oldMillis;
    }
 if ( 0 < bpm < 70)
 { analogWrite(tappetopin, 255);}
else if ( 70 < bpm < 80)
 { analogWrite(tappetopin, 229);}
   else if ( 80 < bpm < 100)
   {analogWrite(tappetopin, 204);}
   else if ( 100 < bpm < 120)
 { analogWrite(tappetopin, 178);}
     else if ( 120 < bpm < 140)
 { analogWrite(tappetopin, 153);}
else if ( 140 < bpm < 160)
 { analogWrite(tappetopin, 125);}
else if ( 160 < bpm)
 { analogWrite(tappetopin, 102);}
}


carloandrea

la parte finale è quella che dovrebbe regolare la velocità

PaoloP

#2
Feb 03, 2013, 06:37 pm Last Edit: Feb 03, 2013, 06:45 pm by PaoloP Reason: 1
Ciao,
puoi modificare il tuo primo post (pulsante modify) e inserire il listato tra i tag CODE.
Li trovi nell'editor premendo il pulsante # sopra le faccine.
Deve uscire
Code: [Select]
così
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

carloandrea


PaoloP

Come si collega il cardio?
Il debounce serve per i pulsanti meccanici non per ingressi impulsivi digitali. Per quello è moto meglio usare un interrupt.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

carloandrea

il problema non è quello, il resto del programma fa il suo dovere, il mio problema è la parte dove regolo la pwm co gli if....

PaoloP

Code: [Select]
if ( 0 < bpm < 70)
  { analogWrite(tappetopin, 255);}
else if ( 70 < bpm < 80)
  { analogWrite(tappetopin, 229);}
    else if ( 80 < bpm < 100)
    {analogWrite(tappetopin, 204);}
    else if ( 100 < bpm < 120)
  { analogWrite(tappetopin, 178);}
      else if ( 120 < bpm < 140)
  { analogWrite(tappetopin, 153);}
else if ( 140 < bpm < 160)
  { analogWrite(tappetopin, 125);}
else if ( 160 < bpm)
  { analogWrite(tappetopin, 102);}


La sintassi dell'IF non prevede il doppio controllo almeno di non usare l'and &&
Quindi devi ripensare il tutto.
Visto che li controlli in cascata potresti provare
Code: [Select]
if ( bpm < 70)
  { analogWrite(tappetopin, 255);}
else if ( bpm < 80)
  { analogWrite(tappetopin, 229);}
    else if ( bpm < 100)
    {analogWrite(tappetopin, 204);}
    else if ( bpm < 120)
  { analogWrite(tappetopin, 178);}
      else if ( bpm < 140)
  { analogWrite(tappetopin, 153);}
else if ( bpm < 160)
  { analogWrite(tappetopin, 125);}
else if ( bpm > 159)
  { analogWrite(tappetopin, 102);}
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP


carloandrea


carloandrea

non òa sapevo sta cosa ho sempre pensato che l'if si potesse scrivere anche cosi buono a sapersi

PaoloP

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

fenix87

Ciao, posso chiederti che hardware hai usato per interfacciarti con arduino al motore del tapis roulant? te lo sei costruito o ha trovato qualcosa già assemblato?
grazie

Go Up