|
Op. Cristian
Voltarel |
Spinner Speed di IZ3GAK – 27/08/2017
Descrizione:
In fase di test su breadbord.
Ho utilizzato una scatola per impianti elettrici.
Io all'opera...
3 batterie sono più che sufficienti per farlo funzionare per molto tempo... consuma pochissimo.
Il risultato finale; i fotodiodi sono montati su 2 squadrette alla stessa altezza.
Componenti e materiale:
* SPINNER SPEED V1.0 - 27/08/2017 * alcune parti sono state prese da internet e modificate per rendere il gioco più carino */ #include <LiquidCrystal_I2C.h> // initialize the library with the numbers of the interface pins LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
const unsigned long sampleTime = 100; const int maxRPM = 5000; // indicare il valore massimo della barra LCD int rpmMaximum = 0;
//definisce le uscite usate per l'accensione dei LED #define led_r 4 //rosso #define led_g 5 //giallo #define led_v 6 //verde
//definisce le velocità limite per l'accensione dei relativi LED int vel_min = 2000; int vel_max = 4000;
int val; long last=0; int stat=LOW; int stat2; int contar=0; int time;
/* leggere il valore VAL da monitor seriale e impostare circa 10-20 sens= in meno rispetto al valore letto * senza passaggio di ostacoli. Attenzione che ogni volta che si cambiano le misure del TX - RX * bisogna ricalibrare il valore di sens= */ int sens=80;
int nPalas=3; // numero di pale dello spinner
int milisegundos=500; // il tempo di ogni lettura void setup() { lcd.begin(16, 2); Serial.begin(9600); pinMode(13,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT);
//scrivi sul display messaggio di benvenuto lcd.setCursor(0, 0); lcd.print("SPINNER SPEED"); lcd.setCursor(0, 1); lcd.print("Edoardo Andrea"); delay(3000);
//scrivi sul display velocità dei led lcd.clear(); lcd.setCursor(0, 0); lcd.print("I LED INDICANO:"); lcd.setCursor(0, 1); lcd.print("Rosso = SCARSO"); delay(3000);
//scrivi sul display velocità dei led lcd.clear(); lcd.setCursor(0, 0); lcd.print("Giallo = MEDIO"); lcd.setCursor(0, 1); lcd.print("Verde = FORTE"); delay(3000); }
void loop() { val=analogRead(0);
//if(val>100) time = millis()/1000; //tempo trascorso in secondi da finire... per la prossima versione
if(val<sens) stat=LOW; else stat=HIGH; digitalWrite(13,stat); //sul pin13 si vede lo stato del circuito //acceso quando il fascio viene ricevuto
if(stat2!=stat){ //conta quando lo stato cambia da scuro a chiaro e viceversa contar++; stat2=stat; } if(millis()-last>=milisegundos){ double rps=((double)contar/nPalas)/2.0*1000.0/milisegundos; double rpm=((double)contar/nPalas)/2.0*60000.0/(milisegundos);
Serial.print((contar/2.0));Serial.print(" RPS ");Serial.print(rps); Serial.print(" RPM");Serial.print(rpm);Serial.print(" VAL ");Serial.println(val);Serial.println(time);
if (rpm > rpmMaximum) rpmMaximum = rpm; lcd.clear(); displayRPM(rpm); displayBar(rpm);
if (rpmMaximum <= vel_min) { digitalWrite(led_r, HIGH); } else if (rpmMaximum > vel_min && rpmMaximum <= vel_max) { digitalWrite(led_g, HIGH); } else if (rpmMaximum > vel_max) { digitalWrite(led_v, HIGH); }
contar=0; last=millis(); } }
void displayRPM(int rpm) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(rpm,DEC); lcd.setCursor(7,0); lcd.print(rpmMaximum, DEC); lcd.setCursor(13,0); lcd.print("MAX"); Serial.print("RPM = "); Serial.print(rpm); Serial.print(" MAX RPM = "); Serial.println(rpmMaximum); }
void displayBar(int rpm) { int numOfBars=map(rpm,0,maxRPM,0,15); lcd.setCursor(0,1); if (rpm!=0) { for (int i=0; i<=numOfBars; i++) { lcd.setCursor(i,1); lcd.write(1023); } } } |