Go Down

Topic: consigli per Contagiri a lancetta (Read 6 times) previous topic - next topic

ratto93

#10
Jul 08, 2011, 02:08 pm Last Edit: Jul 08, 2011, 02:19 pm by ratto93 Reason: 1
Basta che gli dai i gradi al servo... è il metodo più semplice per fare una mappatura ti serve una roba di questo tipo....
o una funzione che a seconda dei giri rilevati apre più o meno il servo, oppure memorizzi tutti i giri in un vettore e per ogni giro dai l'apertura della valvola......
è una cosa molto sperimentale.... ;)
Se corri veloce come un fulmine, ti schianterai come un tuono.

superlol

però scusa ma non capisco che centrava la ventola sensored dei pc allora, quello che vuoi fare tu è con la ruota della moto  :smiley-eek-blue:

guardati le discussioni in rilievo, quelle smepre in cima c'è un contagiri della bici che potrebbe interessarti  8)
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

z3us

no bhe, volevo capire come effettuare il calcolo!

il conteggio dei giri verrà poi fatto con un sensore IR o Hall direttamente sull'albero motore!

darò comunque un'occhiata a quel post di cui parli!

z3us

lo scarno e inutile codice attuale! vedrò di postare gli sviluppi man mano!

Code: [Select]
//Costanti*******************************

//Variabili******************************
volatile unsigned int rpm = 0;
volatile unsigned long timeold = 0;
volatile byte cycle = 0;

//include********************************
#include <LiquidCrystal.h>

//inizializza display********************
LiquidCrystal lcd(8, 7, 6, 5, 4, 3);


void setup()
{
   Serial.begin(9600);
   attachInterrupt(0, rpm_fun, FALLING);
   digitalWrite(2, HIGH);
   lcd.begin(16, 2);
}

void loop()
{
   lcd.clear();
   lcd.setCursor(0, 1);
   lcd.print("Valve |");
   lcd.setCursor(15, 1);
   lcd.print("|");
   lcd.setCursor(0, 0);
   lcd.print("RPM ");
   lcd.print(rpm);
   lcd.print(" T=   ");
   lcd.write(223);
   delay(100);
   
 
}

void rpm_fun()
{
  cycle++;
  if(cycle == 10) {
    rpm = 0;
    rpm = (60000/(millis()-timeold)*10);
    Serial.println(rpm);
    timeold = millis();
    cycle = 0 ;
    }
}


non fate caso all'accozzaglia di cose inutili che ho scritto sul display, è solo per vedere gli ingombri delle varie cose da visualizzare!

z3us

ho avuto modo di lavorarci un po su. ma ancora la strada è lontana!

Quote

//Costanti*******************************
#defineTermostatoA0
#defineVentola13
#defineCassa9
#defineDivisor5

//Variabili******************************
volatileunsigned int rpm = 0;
volatileunsigned long timeold = 0;
volatilebyte cycle = 0;
int analogValue =0;
int temp1 =0;

//include********************************
#include<LiquidCrystal.h>
#include<Servo.h>

//inizializzadisplay********************
LiquidCrystal lcd(8, 7, 6, 5, 4, 3);

//inizializzaservo**********************
Servo lancetta;
Servo Valve;


void setup()
{
Serial.begin(9600);
attachInterrupt(0, rpm_fun, FALLING);
digitalWrite(2, HIGH);
pinMode(Ventola, OUTPUT);
lcd.begin(16, 2);
lancetta.attach(11);
Valve.attach(10);
}

void loop()
{
analogValue=analogRead(Termostato);
temp1=map(analogValue, 0, 1023, 0, 130);

lancetta.write(rpm/100);
lcd.clear();
lcd.noBlink();
lcd.setCursor(0, 1);
lcd.print("Valve |");
lcd.setCursor(0, 0);
lcd.print("RPM ");
if(rpm >= 500){
lcd.print(rpm); }
else {
lcd.print("0"); }
//lcd.setCursor(9, 0);
lcd.print(" T=");
lcd.print(temp1);
lcd.write(223);
if(temp1 >= 95) {
digitalWrite(Ventola, HIGH);
tone(Cassa, 4186, 50); }
else if(temp1 <=90) {
digitalWrite(Ventola, LOW); }
//Serial.println(rpm/100);

if(rpm <= 1000) {
lcd.setCursor(7, 1);
lcd.print("        |");
Valve.write(0);   
}
if(rpm > 1000) {
lcd.setCursor(7, 1);
lcd.write(255);
lcd.print("       |");
Valve.write(20);   
}
if(rpm > 2500) {
lcd.setCursor(8, 1);
lcd.write(255);
lcd.print("      |");
Valve.write(30);   
}
if(rpm > 4000) {
lcd.setCursor(9, 1);
lcd.write(255);
lcd.print("     |");
Valve.write(50);   
}
if(rpm > 5500) {
lcd.setCursor(10, 1);
lcd.write(255);
lcd.print("    |");
Valve.write(70);   
}
if(rpm > 6500) {
lcd.setCursor(11, 1);
lcd.write(255);
lcd.print("   |");
Valve.write(100);   
}
if(rpm > 8000) {
lcd.setCursor(12, 1);
lcd.write(255);
lcd.print("  |");
Valve.write(120);   
}
if(rpm > 9500) {
lcd.setCursor(13, 1);
lcd.write(255);
lcd.print(" |");   
}
if(rpm > 10000) {
lcd.setCursor(14, 1);
lcd.write(255);
lcd.print("|");   
}
delay(100);


}

void rpm_fun()
{
cycle++;
if(cycle == Divisor) {
rpm=0;
rpm=(60000/(millis()-timeold)*Divisor);
timeold=millis();
cycle=0;
}
}



ancora è tutto in abozzo, e molte cose sono da rifinire!

adesso mi servono un paio di aiuti.

per creare la visualizzazione a barre sull'LCD che indica il movimento del servo per la valvola, ho usato una serie di IF. Ma ho subito capito che il sistema non può essere usato, perche ogni volta invia i comandi di tutti gli IF.
idem per il servo che viene controllato. Si incasina con le troppe informazioni che riceve!

di contro, il contagiri funziona bene, e il sensore di temperatura pure. poi verrà modificato per leggere un termistore.

avete consigli su modifiche da apportare? snellimenti del programma? urla per incompetenza?  :smiley-roll-sweat:

grazie!

Go Up