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ì

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.

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);}


carloandrea


carloandrea

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

PaoloP

Se vuoi approfondire puoi leggere queste guide sul linguaggio C++
--> http://www.adjam.org/school/downloads/BasiProgrammazione.pdf
oppure
--> http://www.html.it/guide/guida-c/
--> http://www.html.it/guide/guida-c2/

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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy