ciao scusate l'assenza ma oggi sono andato a farmi una sciata!!!
sul boolean ..ho qualche problema... mi potresti fare un esempio pratico?
grazie
bye
massi
ciao scusate l'assenza ma oggi sono andato a farmi una sciata!!!
sul boolean ..ho qualche problema... mi potresti fare un esempio pratico?
grazie
bye
massi
ciao...boolean è una variabile che può avere "solo" due valori true o false ...potresti scrivere così:
if (IDOK == IdTest && boolVar==false)
{
Serial.println("Accesso consentito");
opendoor();
IdTest = "";
controllo = true;
boolVar=true;
}
in questo modo questo pezzo di codice viene svolto solo se boolVar è false...ci sono due cose implicite...la prima è che devi dichiarare "boolean boolVal = false;" nelle globali; la seconda è che da qualche parte devi ritornarla false altrimenti non ti eseguirà più questo pezzo di codice.
grazie Orso,
provo anche questa soluzione....
ma secondo voi servirebbe agire sugli interrupt ??
massi
ciao...di solito l'interrupt, almeno quello che gestisci con il comando attachedInterrupt(), è legato ad un pin impostato come ingresso; quando questo pin assume lo stato prefissato ( LOW, CHANGE, RISING, FALLING) attiva una funzione legata ad esso e che ha precedenza su tutto il resto del programma...di solito viene usato per conteggio impulsi quando vuoi essere sicuro di non perdere "colpi"...tipo la lettura di un encoder...penso che con quanto vuoi fare tu, al momento, non centri molto.
grazie! allora provo con boolean!
buonasera,
ho provato a fare alcune modifiche ... purtroppo non riesco a risolvere il problema...
se avete altri consigli da provare!
grazie mille
#include <SPI.h>
#include <SoftwareSerial.h>
int rxPin = 4;
int txPin = 5;
SoftwareSerial RFID (2, 3); // RX and TX
SoftwareSerial bluetooth(rxPin, txPin);
int rele = 9;
byte val = 0;
String IdTest ;
String IDOK [] = {"18002CA2F9","18002CA2F8"};
char data [14];
String message;
// boolean boolVar = false ;
unsigned long previousMillis = 0;
long interval =10;
void setup ()
{
Serial.begin(9600);
bluetooth.begin(9600);
RFID.begin (9600);
SPI.begin();
pinMode (rele, OUTPUT);
digitalWrite (rele ,LOW);
Serial.println("Ingresso CANTINA");
Serial.println("RFID registrati n --> "+String(sizeof(IDOK)/sizeof(String)));
Serial.println("In attesa di lettura scheda/bluetooth");
}
void loop ()
{
// Serial.println("BLUETOOTH CANTINA");
while(bluetooth.available()){
message+=char(bluetooth.read());
}
if(!bluetooth.available())
{ if(message!="") //if data is available
{
if(message == "1"){
digitalWrite(rele, LOW);
Serial.println("Accesso Bluetooth attivato");
delay(20);
Serial.println("rele ON"); //show the data
delay(20);
message=""; //clear the data
}
if(message == "0"){
digitalWrite(rele, HIGH);
Serial.println("rele OFF"); //show the data
delay(20);
message=""; //clear the data
}
if(message == "3"){
digitalWrite(rele, LOW);
Serial.println("Relè ON");
delay(1000);
digitalWrite(rele, HIGH);
Serial.println("Relè OFF");
delay(20);
message=""; //cear the data
}
}
unsigned long currentMillis = millis ();
if (currentMillis - previousMillis > interval){
previousMillis = currentMillis;
String IdTest="";
if (RFID.available ()> 0) {
for (int i = 0; i <14; i ++)
{
data [i] = RFID.read ();
Serial.println(i);
}
for (int i = 1; i <11; i ++)
{
char d = data [i];
IdTest+= d;
Serial.println(IdTest);
}
Serial.print("RFID tag rivelato --> ");
Serial.println(IdTest);
Serial.println("");
boolean controllo = false;
boolean boolVar = false ;
for (int i = 0; i <sizeof (IdTest)/sizeof(String); i ++)
{
if (IDOK [i] = IdTest && boolVar==false)
{
Serial.println("Accesso consentito");
opendoor();
IdTest = "";
controllo = true;
boolVar=true;
break ;
}
if(!controllo){
Serial.println("Accesso vietato");
Serial.println("");
delay (1000);
break;
}
}
Serial.println();
Serial.println("In attesa di lettura...");
Serial.println("");
}
}
}
}
void opendoor ()
{
digitalWrite (rele,HIGH);
tone (8, 1800, 600);
Serial.println("Rele ON");
delay (1000);
digitalWrite (rele,LOW);
Serial.println("Rele OFF");
}
ciao...prova lo sketch allegato...in pratica ho messo boolVar nelle globali; ho aggiunto una ulong per una verifica con millis() ed un if alla fine che dopo 5000 ms (penso siano sufficienti...altrimenti incrementa) resetta boolVar se true...fammi sapere.
#include <SPI.h>
#include <SoftwareSerial.h>
int rxPin = 4;
int txPin = 5;
SoftwareSerial RFID (2, 3); // RX and TX
SoftwareSerial bluetooth(rxPin, txPin);
int rele = 9;
byte val = 0;
String IdTest ;
String IDOK [] = {"18002CA2F9", "18002CA2F8"};
char data [14];
String message;
boolean boolVar = false ;
unsigned long previousMillis = 0;
unsigned long boolVarMillis;
long interval = 10;
void setup ()
{
Serial.begin(9600);
bluetooth.begin(9600);
RFID.begin (9600);
SPI.begin();
pinMode (rele, OUTPUT);
digitalWrite (rele , LOW);
Serial.println("Ingresso CANTINA");
Serial.println("RFID registrati n --> " + String(sizeof(IDOK) / sizeof(String)));
Serial.println("In attesa di lettura scheda/bluetooth");
}
void loop ()
{
// Serial.println("BLUETOOTH CANTINA");
while (bluetooth.available()) {
message += char(bluetooth.read());
}
if (!bluetooth.available())
{ if (message != "") //if data is available
{
if (message == "1") {
digitalWrite(rele, LOW);
Serial.println("Accesso Bluetooth attivato");
delay(20);
Serial.println("rele ON"); //show the data
delay(20);
message = ""; //clear the data
}
if (message == "0") {
digitalWrite(rele, HIGH);
Serial.println("rele OFF"); //show the data
delay(20);
message = ""; //clear the data
}
if (message == "3") {
digitalWrite(rele, LOW);
Serial.println("Relè ON");
delay(1000);
digitalWrite(rele, HIGH);
Serial.println("Relè OFF");
delay(20);
message = ""; //cear the data
}
}
unsigned long currentMillis = millis ();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
String IdTest = "";
if (RFID.available () > 0) {
for (int i = 0; i < 14; i ++)
{
data [i] = RFID.read ();
Serial.println(i);
}
for (int i = 1; i < 11; i ++)
{
char d = data [i];
IdTest += d;
Serial.println(IdTest);
}
Serial.print("RFID tag rivelato --> ");
Serial.println(IdTest);
Serial.println("");
boolean controllo = false;
//boolean boolVar = false ;
for (int i = 0; i < sizeof (IdTest) / sizeof(String); i ++)
{
if (IDOK [i] = IdTest && boolVar == false)
{
Serial.println("Accesso consentito");
opendoor();
IdTest = "";
controllo = true;
boolVar = true;
boolVarMillis = millis();
break ;
}
if (!controllo) {
Serial.println("Accesso vietato");
Serial.println("");
delay (1000);
break;
}
}
Serial.println();
Serial.println("In attesa di lettura...");
Serial.println("");
}
}
}
if (millis() >= boolVarMillis + 5000 && boolVar == true) {
boolVar = false;
}
}
void opendoor ()
{
digitalWrite (rele, HIGH);
tone (8, 1800, 600);
Serial.println("Rele ON");
delay (1000);
digitalWrite (rele, LOW);
Serial.println("Rele OFF");
}
ciao grazie mille..stasera lo metto su!
solo una questione riguarda all'utilizzo del Millis... avevo letto che essendo legato al tempo iniziale in cui viene attivato arduino ... dopo tot tempo .. non funziona più correttamente perchè necessiterebbe di un reset...
la cosa non andrebbe bene per il mio utilizzo perchè una volta assemblato il tutto non potrò più fare nessun intevento sulla board.... mi puoi spiegare qualcosa in più--
grazie
massi
ciao...per il momento ti rispondo copiando un cazziatone che mi ha dato Giglielmo qualche giorno fa proprio su millis():
Esempio pratico : Primo valore letto 4294967000, secondo valore letto 705 ... quanto è passato ?
705 - 4294967000 = -4294966295 ma ... il numero è un unsigned long quindi NON può avere segno per cui il valore che assume è il massimo di un unsigned long (4294967296) meno il valore 4294966295 che da ... 1001 che è il tempo passato
Provare per credere ...
Guglielmo
suggerendomi al tempo stesso di rileggermi QUESTO link...cosa buona e giusta!
in codesto link trovi 2 modi per risolvere l'overflow di millis().
EDIT: ad ogni modo con le modifiche fatte lo sketch funziona?
massibal:
solo una questione riguarda all'utilizzo del Millis... avevo letto che essendo legato al tempo iniziale in cui viene attivato arduino ... dopo tot tempo .. non funziona più correttamente perchè necessiterebbe di un reset...
Ancora con queste sciocchezze ? ? ? :o :o :o
Ma fatele un po' di ricerche qui sul forum ... se ne parla in continuazione ... l'ultima volta pochi giorni fa, da QUI in poi !!! Chi parla di reset di millis() NON ha capito come usare la funzione !
Guglielmo
P.S.: Che poi vi sfido a resettare una funzione ... al limte è possibile vedere quale contatore essa restituisce ed azzerare il contatore ...
buongiorno orso ,
ho provato la tua modifica, purtroppo anche mettendo 10000 continua a darmi lo stesso errore!!
se passo il tag velocissimo allora funziona e legge una sola volta ... ma se sono un pò più lento.legge 2 o 3 volte !!!
peccato.!!
funzione Millis() ... andrò a leggere il forum... ma non mi è mai piaciuta e se riesco la evito .. forse per questo che non l'ho ancora capita... in ogni caso se si resetta arduino... cosa succeda alla funzione ??
grazie
ciao
massibal:
... in ogni caso se si resetta arduino... cosa succeda alla funzione ??
Niente. La funzione funziona! E' il contatore che si resetta.
Purtroppo millis() prima o poi la devi "digerire".
Vuoi una soluzione facile facile? metti un bel delay(2000) dopo che hai riconosciuto l'RFID e hai tutto il tempo di toglierlo dal lettore.
Naturalmente in quei 2 secondi non puoi fare assolutamente niente. Se a te va bene...
ciao
pippo72
massibal:
funzione Millis() ... andrò a leggere il forum... ma non mi è mai piaciuta e se riesco la evito ..
Molto male perché è fondamentale e ... se NON capisci esattamente come si usa, NON potrai mai fare una applicazione che durante un periodo di attesa può fare altre cose dato che l'alternativa, delay(), è una funzione bloccante !
Se vuoi fare qualche cosa di appena più complesso, NON c'è altra strada ... devi studiare (non leggere) come si usa la millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... c'è tutto quello che occorre sapere.
Guglielmo
lo so e vi ringrazio per le preziose indicazioni sul Millis!
..era un post un pò irriverente
.. se qualcosa è stato creato ... prima o poi sarà indispensabile!!
per pippo :
il delay l'ho già provato ovunque ...anche nel caffè , ma continua farmi lo stesso errore di lettura ripetuta.. se hai modo di vedere il mio programma .. mi puoi dire esattamente dove dovrei inserirlo..
grazie
buon lavoro
massi
ciao...forse mi sono accorto di un errore...prova questo:
#include <SPI.h>
#include <SoftwareSerial.h>
int rxPin = 4;
int txPin = 5;
SoftwareSerial RFID (2, 3); // RX and TX
SoftwareSerial bluetooth(rxPin, txPin);
int rele = 9;
byte val = 0;
String IdTest ;
String IDOK [] = {"18002CA2F9", "18002CA2F8"};
char data [14];
String message;
boolean boolVar = false ;
unsigned long previousMillis = 0;
unsigned long boolVarMillis;
long interval = 10;
void setup ()
{
Serial.begin(9600);
bluetooth.begin(9600);
RFID.begin (9600);
SPI.begin();
pinMode (rele, OUTPUT);
digitalWrite (rele , LOW);
Serial.println("Ingresso CANTINA");
Serial.println("RFID registrati n --> " + String(sizeof(IDOK) / sizeof(String)));
Serial.println("In attesa di lettura scheda/bluetooth");
}
void loop ()
{
// Serial.println("BLUETOOTH CANTINA");
while (bluetooth.available()) {
message += char(bluetooth.read());
}
if (!bluetooth.available())
{ if (message != "") //if data is available
{
if (message == "1") {
digitalWrite(rele, LOW);
Serial.println("Accesso Bluetooth attivato");
delay(20);
Serial.println("rele ON"); //show the data
delay(20);
message = ""; //clear the data
}
if (message == "0") {
digitalWrite(rele, HIGH);
Serial.println("rele OFF"); //show the data
delay(20);
message = ""; //clear the data
}
if (message == "3") {
digitalWrite(rele, LOW);
Serial.println("Relè ON");
delay(1000);
digitalWrite(rele, HIGH);
Serial.println("Relè OFF");
delay(20);
message = ""; //cear the data
}
}
unsigned long currentMillis = millis ();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
String IdTest = "";
if (RFID.available () > 0) {
for (int i = 0; i < 14; i ++)
{
data [i] = RFID.read ();
Serial.println(i);
}
for (int i = 1; i < 11; i ++)
{
char d = data [i];
IdTest += d;
Serial.println(IdTest);
}
Serial.print("RFID tag rivelato --> ");
Serial.println(IdTest);
Serial.println("");
boolean controllo = false;
//boolean boolVar = false ;
for (int i = 0; i < sizeof (IdTest) / sizeof(String); i ++)
{
if (IDOK [0] == IdTest || IDOK[1] == IdTest && boolVar == false)
{
Serial.println("Accesso consentito");
opendoor();
IdTest = "";
controllo = true;
boolVar = true;
boolVarMillis = millis();
break ;
}
if (!controllo) {
Serial.println("Accesso vietato");
Serial.println("");
delay (1000);
break;
}
}
Serial.println();
Serial.println("In attesa di lettura...");
Serial.println("");
}
}
}
if (millis() >= boolVarMillis + 5000 && boolVar == true) {
boolVar = false;
}
}
void opendoor ()
{
digitalWrite (rele, HIGH);
tone (8, 1800, 600);
Serial.println("Rele ON");
delay (1000);
digitalWrite (rele, LOW);
Serial.println("Rele OFF");
}
se funziona sta nella verifca di IDOK
Ciao orso,
solo un dubbio alla riga
if (IDOK == IdTest || IDOK == IdTest && boolVar == false)
essendo sotto un ciclo for
non ci dovrebbe essere la * cioè*
_ if (IDOK * == IdTest || IDOK == IdTest && boolVar == false)[/color]*_
grazie
massi
scusa ..
`` if (IDOK* == IdTest || IDOK == IdTest && boolVar == false)*
scusa ma non capisco non mi prende la parentesi quadra !!
if (IDOK i == IdTest || IDOK == IdTest && boolVar == false)
Come non ti prende le parentesi quadre ? ... magari le interpreta ... :
NON PER NULLA il regolamento dice di chiudere sempre il codice nei tag CODE, perché altrimenti le sequenze di caratteri possono essere prese per emoticons o BBcode !
Ecco un banale esempio: ( i * 8 ) ... se lo scrivo senza gli spazi guarda come interpreta la parte finale (i*8) ... mentre se lo chiudo nei tag CODE:
(i*8)
non ho alcun problema.
Guglielmo
ok
però se guardi la mia reply #36 li avevo usato il CODE ... ma le parentesi quadre con la i non me le ha prese ?
if (IDOK[i] == IdTest || IDOK == IdTest && boolVar == false)