contagiri tramite interrupt

ciao a tutti sto cercando di realizzare un contagiri tramite un contatto magnetico normalmente aperto, scrivendo poi il numero di giri sopra un lcd 16x2. Il problema sta nel fatto che il contatore non incrementa vi avviso che non sono esperto in programmazione quindi chiedo il vostro aiuto. Grazie in anticipo.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

volatile int stato = LOW;
int conta=0;

void setup() {
  attachInterrupt(0,blink,RISING);
  lcd.begin(16, 2);
  
}



 void blink(){
  conta++;
       
  
 }
 void loop(){
  lcd.print(conta);
  
 }

Ciao, definisci il pin di ingresso nel setup e, come lo hai collegato?

Stefano

Le variabili che usi nella ISR DEVONO essere "volatile" ... ma tu hai dichiarato tale la variabile "stato", mentre, nella ISR, usi la "conta" ...

Poi ...
... come ti ha indicato cam9500 NON hai dichiarato il pin in INPUT e non ci hai detto come lo hai collegato ed infine ... che tipo di contatto magnetico usi ?

Guglielmo

Il contatto ve lo allego in foto ha due fili uno di entrata e l'altro di uscita: ho collegato l'entrata al +5v e l'uscita al pin 1.Non so bene cosa sia le ISR ma mi sono arrangiato. Il programma adesso invece al posto di dare 0 come valore da valori a caso.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

 int stato = LOW;
 volatile int conta=0;

void setup() {
 pinMode(1,INPUT);
  attachInterrupt(0,blink,RISING);
  lcd.begin(9600);
  
}



 void blink(){
  conta++;
       
  
 }
 void loop(){
  lcd.print(conta);
  
 }

Ma almeno volete leggerli i "reference" delle schede che he usate ? ? ? :o

Tu scrivi ...

pinMode(1,INPUT);
attachInterrupt(0,blink,RISING);

... peccato che nel reference ci sia chiaramente scritto:

External Interrupts: 2 and 3. These pins can be configured to trigger an interrupt on a low value, a rising or falling edge, or a change in value. See the attachInterrupt() function for details.

... come pretendi che funzioni qualche cosa ?

Guglielmo

Poi perché stato= LOW? Che centra? Come ti fa notare Guglielmo se metti l'interrupt 0, devi mettere pinMode 2

Ho sistemato quello che mi avete indicato ma mi da ancora valori errati, scustate la mia ignoranza in materia ma e la prima volta che uso questo tipo di comando.

Ma certo e ci sta..... nessuno nasce imparato :wink:
Dovresti però, considerata la poca esperienza, condividere ogni volta le modifiche e spiegare il più possibile così da poterti dare risposte mirate (altrimenti anche chi ti risponde deve perdere un sacco di tempo ad immaginare cosa hai fatto).

Stefano

Secondo me a detta di Cam ci vuole:
Schema elettrico chiaro, anche su un foglio a penna, che stai usando.
Sketch che hai caricato dentro Arduino al momento.
E cosa succede chiaramente che non va e cosa vuoi ottenere.

Poi vedrai quanti consigli! :wink:

Lo schema e il problema sono allegati come foto, quello che voglio ottenere sono i giri per minuto(RPM) di un motore questo grazie al sensore magnetico che girando con il motore da un impulso ad arduino che a sua volta deve contare questi impulsi scrivendoli sopra il mio lcd.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

 
 volatile int conta=0;

void setup() {
 pinMode(2,INPUT);
  attachInterrupt(0,blink,RISING);
  lcd.begin(16, 2);
  
}



 void blink(){
  conta++;
       
  
 }
 void loop(){
  lcd.print(conta);
 delay(1000);
 }

il delay() lo messo per fare la foto se no non si capiva molto grazie per l'attenzione.

Cominciamo dai collegamenti

Il collegamento che hai fatto è errato, cosi' com'è non potrà mai funzionare correttamente, ti prenderà sempre dei valori causali
O aggiungi una resistenza di PullDown, come nel disegno A, oppure usi il collegamento nel disegno B.
In quest'ultimo caso abiliti la resistenza di PullUp interna con pinMode(2,INPUT_PULLUP);

Seconda cosa

Quando fai un lcd.print(.. quello che stampi si accoda a quello inviato precedentemente.
Quindi si usa lcd.setCursor(colonna,riga) per dirgli dove stampare

es

lcd.setCursor(0,1); // Si posiziona all'inizio della seconda riga
  lcd.print(conta);
  delay(1000);

mm9813:
ciao a tutti sto cercando di realizzare un contagiri tramite un contatto magnetico normalmente aperto, scrivendo poi il numero di giri sopra un lcd 16x2. Il problema sta nel fatto che il contatore non incrementa vi avviso che non sono esperto in programmazione quindi chiedo il vostro aiuto. Grazie in anticipo.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

volatile int stato = LOW;
int conta=0;

void setup() {
  attachInterrupt(0,blink,RISING);
  lcd.begin(16, 2);
 
}

void blink(){
  conta++;
     
 
}
void loop(){
  lcd.print(conta);
 
}

il void loop e troppo "semplificato" (secondo me) lcd print va "mandato" con una certa cadenza minima,
mezzo secondo, un secondo, e solo se il valore da visualizzare è diverso da quello mandato prima,

yamm bell yamm :wink: