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.
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.
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!