Ciao a tutti sono nuovo e se aveste avuto modo di dare un’occhiata nella sezione dedicata alle presentazioni, potrete facilmente realizzare che sono proprio alle prime armi.
Vorrei realizzare un tachimetro sfruttando un sensore hall e un display 7 segmenti a 4 digit, e devo dire che frugando sul forum ho trovato dei grandi aiuti.
Il sensore sono riuscito a farlo funzionare bene grazie a questo codice
int sensorvalue;
int state1 = HIGH;
int state2;
float rpm;
float kmh;
float circonferenza;
long prevMillis = 0;
long interval = 200;
long currentTime;
long prevTime = 1;
long diffTime;
int sensorthreshold = 440;
void setup()
{
Serial.begin(9600);
}
void loop()
{
sensorvalue = analogRead(0);
if(sensorvalue < sensorthreshold)
state1 = HIGH;
else
state1 = LOW;
if(state2!=state1){
if (state2>state1){
currentTime = micros();
diffTime = currentTime - prevTime;
rpm = 60000000/diffTime;
kmh=rpm*circonferenza*60;
unsigned long currentMillis = millis();
if(currentMillis - prevMillis > interval){
prevMillis = currentMillis;
Serial.print(rpm); Serial.println(" rpm");
}
prevTime = currentTime;
}
state2 = state1;
}
}
e per ora facendomi stampare solo i giri risulta essere abbastanza preciso(controllando dal monitor seriale).
Il problema sorge nel cercare di farmi stampare i giri sul display 7 segmenti: in particolare sto usando la libreria sevseg, il mio obiettivo sarebbe quello di far stampare i giri a schermo e lasciarli impressi (quindi no refresh) finchè il programma non aggiorna il valore di rpm ossia finchè non rientra nel terzo if.
Ho provato a scrivere questo codice (che in teoria dovrebbe consentirmi la lettura a display) ma i numeri sul display rimangono accesi per una frazione di secondo rendendo illeggibile la lettura (vedo solo di sfuggita dei segmenti che si accendono…ciò nonostante il numero dei giri letto nel monitor seriale è perfetto(quindi lo sarebbe anche sul display se solo si riuscisse a leggere)
#include <SevSeg.h>
int K=359;
SevSeg sevseg;
//comandi contagiri da qui
int sensorvalue;
int state1 = HIGH;
int state2;
float rpm;
float kmh;
float circonferenza;
long prevMillis = 0;
long interval = 200;
long currentTime;
long prevTime = 1;
long diffTime;
int sensorthreshold = 440;
// this value indicates the limit reading between dark and light,
// it has to be tested as it may change acording to the
// distance the leds are placed.
// to see what number is good, check the sensorvalue variable value
// as printed out in the serial monitor
void setup()
{
Serial.begin(9600);
byte numDigits = 4;
byte digitPins[] = {10, 11, 12, 13}; //Digits: 1,2,3,4 <--put one resistor (ex: 220 Ohms, or 330 Ohms, etc, on each digit pin)
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; //Segments: A,B,C,D,E,F,G,Period
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(10);
}
void loop()
{
sensorvalue = analogRead(0);
if(sensorvalue < sensorthreshold)
state1 = HIGH;
else
state1 = LOW;
if(state2!=state1){
if (state2>state1){
currentTime = micros();
diffTime = currentTime - prevTime;
rpm = 60000000/diffTime;
kmh=rpm*circonferenza*60;
unsigned long currentMillis = millis();
if(currentMillis - prevMillis > interval){
prevMillis = currentMillis;
Serial.print(rpm); Serial.println(" rpm");
static byte decPlace = 0;
sevseg.setNumber((int)rpm,decPlace);
sevseg.refreshDisplay();
}
prevTime = currentTime;
}
state2 = state1;
}
}
questo era il codice descritto prima.
Provando invece a spostare il refreshDisplay() in fondo fuori dagli if prima dell’ultima graffa ho ottenuto quello che desidero: all’accensione visualizzo uno zero fisso, poi se faccio girare il motorino mi stampa i giri e se lo fermo rimane visualizzato l’ultimo valore di rpm rilevato.
Il problema è che in questo modo i giri risultano sballati, quando ad esempio mi dovrebbe segnare 5000 giri ne segna qualcuno a 8000 qualcuno a 3000 e ogni tanto qualcuno a 5000, problema confermato anche dal monitor seriale!
Purtoppo sto imparando ora a programmare qualcosa e fino a qualche giorno fa stentavo a capire come far accendere un singolo led; abbiate pazienza e se c’è qualche anima pia che ha avuto il coraggio di leggersi tutta sto papiro abbia il coraggio di provare ad aiutarmi
grazie a tutti in anticipo