Salve avrei necessità di visualizzare su display il numero di giri di un motore tramite sensore induttivo 12vdc npn collegato a Arduino mega 1280. Questo è il codice che ho caricato su Arduino trovato in rete e un po' adattato da me ma sinceramente ci capisco poco e non funziona! Mi aiutate a capire dove sbaglio?
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Larghezza OLED
#define SCREEN_HEIGHT 64 // Altezza OLED
#define OLED_RESET -1 // Reset non è utilizzato
#define SCREEN_ADDRESS 0x3C // Indirizzo I2C del display OLED
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
volatile int num_giri = 0; // Variabile per memorizzare il numero di giri
void setup() {
pinMode(2, INPUT_PULLUP); // Imposta il pin digitale come input con resistore di pull-up
attachInterrupt(digitalPinToInterrupt(2), contaGiri, RISING); // Configura l'interruzione
// Inizializza il display OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
for(;;); // Loop infinito se il display non viene inizializzato correttamente
}
display.clearDisplay();
display.display();
}
void loop() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("RPM: ");
display.print(num_giri);
display.display();
delay(1000); // Aggiorna il display ogni secondo
num_giri = 0; // Resetta il conteggio dei giri per il prossimo intervallo
}
void contaGiri() {
num_giri++; // Incrementa il numero di giri ogni volta che viene rilevato un impulso
}
Il codice va racchiuso nei tag < code / > che vedi in alto nell'editor dei messaggi. Usa il pulsante con la matita e modifica il mesg che hai postato.
Detto questo, hai un sensore NPN (open collector, spero e suppongo), lo colleghi ad un input con pullup (e va bene), ma quand'è che speri di vedere il "RISING" cioè il fronte di salita che hai specificato nell'attachInterrupt()?
@72fioretto: come ti è stato indicato, fosse anche per una sola riga, come richiesto al punto 7 del REGOLAMENTO, il codice va racchiuso tra i tag CODE, per cui, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmdT su un Mac, sempre all'interno del IDE).
Grazie,
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farlo al più presto.
L'unico problema macroscopico che vedo è che dopo il secondo di delay (tempo in cui si accumula il conteggio degli impulsi) azzeri la variabile, per cui alla stampa risulta sempre zero.
Il conteggio comunque indica gli impulsi al secondo. Per avere gli RPM sarà da dividere o moltiplicare per un valore opportuno.
Praticamente mi visualizza solo RPM=0 e li rimane,non fa altro nonostante io impegni o no il sensore che vedo la luce in testa allo stesso si accende e si spegne lui non dà nessun numero!
Questo sistema mi deve semplicemente visualizzare il numero di giri ai quali sta girando il mio tornio usando questo sensore appunto induttivo 12vdc npn che vede un spessore di ferro intorno all albero principale e legge il numero di rotazioni che al massimo sono 2000 tutto qua
Se il sensore chiude a massa, quando chiude va giù e quando riapre torna su... Comunque, per ogni giro si hanno una transizione a livello basso e una a livello alto.
Il numero di giri contati in un secondo è, appunto, il numero di giri al secondo; per avere il numero di giri al minuto bisogna moltiplicare i giri al secondo per 60, ma si avrà una risoluzione di 60 giri al minuto: 0, 60, 120, 180, ..., 1500, 1560, 1620... Per avere una risoluzione maggiore ci sono due possibilità:
aumentare il tempo di misura: con due secondi si avrà: 0, 30, 60, 90, .., 1500, 1530, ...
anziché contare i giri in un secondo, contare quanto tempo occorre per un giro: in questo caso, per 1200 giri al minuto (20 al secondo) il periodo sarà 50ms, con la risoluzione tipica di Arduino Uno di 4us, quindi 1200, 1200,1, 1200,2, ... che può essere arrotondato all'unità.
Considera pure che tutta questa cosa è lentissima e va a incrementare i 1000ms del delay(1000)!
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("RPM: ");
display.print(num_giri);
display.display();
delay(1000); // Aggiorna il display ogni secondo
num_giri = 0; // Resetta il conteggio dei giri per il prossimo intervallo
Hai ragione! Sembrava corretto, perché azzera dopo l'attesa, ma stampa prima!
Comunque rimane il discorso dell'imprecisione del sistema. Solo per iniziare, molte cose, compresa la scritta "RPM:", dovrebbero stare nel setup, cancellando poi solo il numero di giri mediante riscrittura in nero o rettangolo nero, ma la temporizzazione non va fatta con un delay.
Allego un piccolo schema fatto a mano giusto per farvi vedere dove ho collegato il sensore come.
Ho aggiunto anche una r di pullup anche se mi sembra che sia dichiarata di usare quella interna.
Io sinceramente non so cosa vuol dire ilguargua nel post 2 perché ho poche conoscenze di programmazione e ripeto che questo sketch l ho trovato da internet
Purtroppo non ho sigla c'è solo scritto 10-30vdc npn.
La targhetta non si vede.
Comunque ho anche altri tipi di sensori anche per esempio uno uguale ma pnp ed avrei un 4n35 per isolare il positivo di 12v. Dimmi te purtroppo sigla non c'è lho
In pratica ti hanno detto che stampi num_giri quando è a zero, l'interrupt che aumenta num_giri viene eseguito soprattutto durente la delay(1000) ma ormai hai già stampato.
... tocca procedere sperimentalmente, senza Arduino e capire SE e COME il sensore funziona.
Staccalo da Arduino, alimentalo a 12V, metti una resistenza di pull-up tra il pin OUT e il +12V, dopo di che mettiti con un multimetro (se hai un oscilloscopio è ancora meglio) tra il pin OUT ed il GND e vedi cosa succede avvicinando e allontanando una massa di ferro.