Visibilità variabili

Buongiorno e buon anno a tutti vi propongo un problema che non riesco a risolvere

#include<EEPROM.h>
#include<Arduino.h>
#include<rdm6300.h>
long codice
#define RDM6300_RX_PIN 4 
#define READ_LED_PIN 13
Rdm6300 rdm6300;

void setup() {
  Serial.begin(115200);
	pinMode(READ_LED_PIN, OUTPUT);
	digitalWrite(READ_LED_PIN, LOW);
	rdm6300.begin(RDM6300_RX_PIN);
	Serial.println("\nPlace RFID tag near the rdm6300...");
  attachInterrupt(digitalPinToInterrupt(2), verifica, FALLING);
}

void loop() {
  if (rdm6300.get_new_tag_id()){
    codice=(rdm6300.get_tag_id())
  }
attachInterrupt(digitalPinToInterrupt(2), verifica, FALLING);
}

verifica(){
  if(codice==0x123456){
//Codice per la verifica
}
}

Vorrei che la variabile codice, generata dal loop(), fosse disponibile nel verifica().
Dal momento che la funzione verifica() viene richiamata da un intrrupt non posso dichiararla e quindi non la vedo nel blocco verifica().
Ho pensato di salvarla all'interno della EEprom di arduino con EEPROM.put(1000, codice) ma, siccome dovrei memorizzarla ogni volta che leggo un tag, volevo ridurre al minimo l'utilizzo della EEprom.
Suggerimenti, Grazie.

Dichiarala volatile:
volatile long codice;

attachInterrupt, poi, va solo nel setup().

digitalWrite(READ_LED_PIN, LOW); non serve.

Non è chiaro cosa stai facendo

Quando scatta l'interrupt?

Perché leggi il codice nella loop e fai il test nella isr?

Io avrei fatto il contrario

Però magari hai altro hardware

Il test lo faccio in verifica() perché alla chiamata dell'interrupt, alla pressione del tasto, devo verificare la presenza del codice della tessera ed eventualmente memorizzarla se non presente tra quelle memorizzate. Questa è solo una parte del codice che ho fatto per esempio.

Ok grazie proverò a dichiararla così, per la chiamata interrupt mi sembrava che non la faceva se la lasciavo solo in steup() comunque riprovo con più calma, per il digitalWrite è un refuso che non ho cancellato.
Grazie per la risposta.

E usi un interrupt per un tasto?

Per me va bene

Ma non serve tutto sto cinema che hai fatto...
Ti basta verificare nel loop() se il pulsante è premuto, ed in tal caso leggere l'id, una cosa del genere (non l'ho provato, vedi tu):

#include<EEPROM.h>
#include<Arduino.h>
#include<rdm6300.h>
long codice = 0;
#define RDM6300_RX_PIN 4 
#define READ_LED_PIN 13
Rdm6300 rdm6300;
// Io parametrizzerei anche il pin del pulsante...
#define PIN_TASTO 2

void setup() {
  Serial.begin(115200);
  pinMode(READ_LED_PIN, OUTPUT);

  // ...e quindi inizializzato con pullup (se hai una resistenza 
  // esterna di pullup, metti solo "INPUT"):
  pinMode(PIN_TASTO, INPUT_PULLUP);

  digitalWrite(READ_LED_PIN, LOW);
  rdm6300.begin(RDM6300_RX_PIN);
  Serial.println("\nPlace RFID tag near the rdm6300 and press the button...");
}

void loop() {
  // Se il tasto è premuto
  if (digitalRead(PIN_TASTO) == LOW) {
    // Leggo l'id
    if (rdm6300.get_new_tag_id()){
      codice=(rdm6300.get_tag_id());
      // Verifico l'id
      verifica();
    }
  }
}

verifica() {
  // Giusto per debug...
  Serial.print("id=");Serial.println(codice, HEX);

  //Codice per la verifica
  if(codice==0x123456) {
    // ...
  }
}

Ok grazie ma quello che volevo fare era:
1 leggere il tag
2 se presente in quelli memorizzati azionare l'uscita
3 se il pulsante premuto ed il tag già memorizzato nessuna operazione
se il pulsante premuto ed il tag non memorizzato memorizzarlo al primo indirizzo libero.
Comunque ho riscritto il programma senza usare chiamate ed il tutto funziona.

#include <Arduino.h>
#include <rdm6300.h>
#include <EEPROM.h>
#define RDM6300_RX_PIN 4  // read the SoftwareSerial doc above! may need to change this pin to 10...
int PULS = 2;
int i;
int a;
byte PinOutput = 8;
byte PinLed = 13;
long codice_e;
long codice;
bool StatoLed;
int mem;
long tp = 0;
long ritardo = 400;

Rdm6300 rdm6300;

void setup() {
  Serial.begin(9600);
  pinMode(PinOutput, OUTPUT);
  digitalWrite(PinOutput, HIGH);
  digitalWrite(PinLed, LOW);
  digitalWrite(PinOutput, LOW);
  pinMode(PULS, INPUT);
  pinMode(PinLed, OUTPUT);
  pinMode(PinOutput, OUTPUT);
  rdm6300.begin(RDM6300_RX_PIN);
  Serial.println("\nPlace RFID tag near the rdm6300...");
}

void loop() {
  int a = EEPROM.read(1);
  / Cancella la EEprom if (a == 0xFF) {
    for (int i = 0; i < 999; i++) {
      EEPROM.update(i, 0);
    }
    Serial.println("Memoria cancellata");
  }
  for (i = 0; i < 100; i++) {  //Verifica il primo blocco di memoria libero
    int c = i * 4;
    EEPROM.get(c, codice_e);
    if (codice_e == 0) {
      mem = c;
      break;
    }
  }
  if (rdm6300.get_new_tag_id()) {  //Legge il tag
    codice = rdm6300.get_tag_id();
    Serial.println(codice, HEX);
    //Verifica abilitazione
    for (i = 0; i < 400; i = i + 4) {
      EEPROM.get(i, codice_e);
      if (codice_e == codice) {
        //Due tipi di escita nonostabile o bistabile
        //Da selezionare decommentano la parte interessata
        // Bistabile
        Serial.println("Codice valido");
        StatoLed = digitalRead(PinOutput);
        StatoLed = !StatoLed;
        digitalWrite(PinOutput, StatoLed);
        digitalWrite(PinLed, StatoLed);
        //Monostabile
        /*digitalWrite (PinOutput, uscita);
//delay(500);
//uscita=!uscita;
//digitalWrite(PinOutput, 0);
//delay(2000);
*/
        break;
      }
    }
  }
  bool Puls = (digitalRead(PULS));  //Verifica pressione pulsante
  if (!Puls) {
    if ((millis() - tp) > ritardo) {
      tp = millis();
      for (i = 0; i < 400; i = i + 4) {  //Verifica codice già memorizzato
        EEPROM.get(i, codice_e);
        if (codice_e == codice) {
          Serial.print("Codice già memorizzatoin posizione: ");
          Serial.println(i / 4 + 1);
          break;
        }
      }
    }
    if (i > mem) {  //memorizzazione codice
      EEPROM.put(mem, codice);
      EEPROM.update(mem + 3, 0x00);
    }
  }
}

Ok, ovviamente il mio era solo un esempio basato sul codice che avevi postato, ora hai chiarito meglio il funzionamento desiderato.

Ma per favore, indenta bene il codice (premi Ctrl-T nell'IDE e te lo fa lui) perché come lo hai postato è poco leggibile. Dopo averlo indentato, modifica il tuo post #8 e sostituisci il codice con quello corretto (sempre tra i tag "CODE" ovviamente).
Grazie!

Ciao ho capito che il tuo era un esempio. Ho modificato il post. Grazie.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.