Rfid + ethernet + database mdb

Ciao a tutti,
avrei bisogno di alcune deludicidazioni per un progetto che voglio provare a fare.
Ho acquistato Arduino lunedì e sto iniziando a scoprire questo meraviglioso mondo da appassionato. Mi sono letto alcuni manuali trovati online. Insomma non sono un esperto!
Vorrei creare un sistema per una mensa.
in pratica dotare tutti di badge. Caricare su un database MS access l'anagrafica degli utenti in una tabella 'utenti' così strutturata:
nome - codicecard - crediti
Pippo - 0x0d0f0ax0 - 5

Quando Pippo passa la card dal lettore rfid gestito da Arduino vorrei che
-Arduino si collegasse al database (in rete locale o in remoto devo ancora decidere comunque tramite ethernet)
-venisse controllato se il codicecard esiste e se crediti è maggiore di zero.

Se maggiore di zero decrementare di 1 i crediti e inserire in un'altra tabella chiamata 'pastidioggi', data e nome creando così un elenco automatico di coloro che saranno a pranzo alla mensa.

Se va a buon fine restituire poi ad Arduino il segnale ok (accendere un led verde oppure stampare su LCD la una scritta ok)
Teoricamente sembra facile... Ma in concreto?
Innanzi tutto cosa mi serve di hardware? Per ora ho Arduino UNO rev 3, una ethernet shield, rfid module, leds, LCD e tanta voglia di riuscire a implementare il tutto! Basta?!
Potete darmi qualche dritta? Ho visto su internet che ci sono molti progetti già pronti e ben spiegati ma non usano mdb e non usano asp (lo so che è roba vecchia ma per ora io so gestire questi!)
Quello che mi domando è: visto che di Arduino non so molto mentre un po' di più di asp classic come mi conviene organizzare il tutto?
Passo la variabile con il codice card a una pagina .asp e poi faccio tutti i controlli li? Però poi non ho il feedback in Arduino, giusto?
Oppure faccio fare il più possibile ad Arduino? come posso programmarlo? Non chiedo il codice bello e pronto ma solo un aiuto per la pianificazione del programma. Inoltre non riesco a capire bene come settare i cavi ai vari Pin. Dove potrei studiare questa cosa? Che differenza c'è tra i vari Pin?
Grazie

Buona sera,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Hai ragione scusami. Ho rimediato!
Grazie!

Arduino non può accedere ad un database.

Visto che conosci ASP, una soluzione molto semplice è:

  • arduino chiama fa una richiesta HTTP (la tua pagina asp) inserendo il codice nella chiamata (GET o POST)
  • la pagina ASP fa quel che deve fare con il database e restituisce l'esito (response.write se ricordo bene)

L'hardware che hai già ora credo sia più che sufficiente.

silvioz:
Arduino non può accedere ad un database.

eh si questo l'ho scoperto amaramente!

silvioz:

  • arduino chiama fa una richiesta HTTP (la tua pagina asp) inserendo il codice nella chiamata (GET o POST)
  • la pagina ASP fa quel che deve fare con il database e restituisce l'esito (response.write se ricordo bene)

Lato ASP non ho problemi a realizzarlo. Credo di riuscira a programmare anche arduino.

Il mio problema nasce proprio sulla restituzione dell'esito.
Posso restituire l'esito su arduino proveniente da asp?
In pratica come faccio a far comunicare la pagina asp con arduino per far dire ad arduino (che sarebbe il mio lettore di card all'ingresso della mensa) accesso negato o accesso consentito? Magari con un messaggio su LCD o un semplice LED rosso o verde?
grazie

Non ho idea se con la libreria ethernet ci sia già il metodo/proprietà che restituisca l'http response, non l'ho mai usata, in ogni caso o con quella libreria o con altra libreria di tipo http client una volta che in asp hai scritto response.write("OK") e response.end, quell'OK te lo ritrovi in Arduino...

Ho preso questo codice e riadattato un minimo alle mie esigenze.
Lo sketch che utilizzo (attraverso la libreria mysql) si connette al database direttamente e retituisce sulla seriale se il codice letto è valido o no...in teoria!
Solo che non si connette al database.
Rimane la scritta connecting sulla seriale.
Ho provato a caricare uno sketch dagli esempi di arduino ide per la ethernet che esegue una query sul database e ricava i dati tranquillamente. quindi il server locale va...ciò che non va è il mio codice arduino.

in cosa sbaglio?
grazie.
questo è il codice che uso

#include <SPI.h>
#include <Ethernet.h>
#include <sha1.h>
#include <mysql.h>
#include "RFID.h"
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define LEDGREEN 13
#define LEDRED 12
  
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 

/* Setup for Ethernet Library */
byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(192, 168, 1, 105); 



/* Setup for the Connector/Arduino */
Connector my_conn;        // The Connector/Arduino reference

char user[] = "root";
char password[] = "root";
char QUERY_SQL[] = "Select * From auth.codes as AK Where AK.code='%s'";
char query[65];


void setup() {
 
 /* Abilita SPI*/
 SPI.begin(); 
 /* Viene inizilizzato RFID reader */
 RC522.init();
 pinMode(13,OUTPUT);
 
Ethernet.begin(mac_addr);
 Serial.begin(115200);
delay(1000);
  Serial.print("Connecting...");
  if (my_conn.mysql_connect(server_addr, 3306, user, password)) {
    delay(500);
    Serial.println("Success!");
  } else {
    Serial.println("Connection failed.");
  }
}
void loop() {
   /* Temporary loop counter */
    Serial.println(user);
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
  
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    char charBuf[12];
    codiceLetto.toCharArray(charBuf, 12); 
    Serial.println(codiceLetto);
    if(isAuthorized(charBuf)){
      Serial.println("Tessera autorizzata");
      accendiLed(LEDGREEN);
    }else{
      Serial.println("Tessera non autorizzata");
      accendiLed(LEDRED);
    }
  delay(delayRead);  
  }
 }
  
// Controlla se un codice è autorizzato
boolean isAuthorized(char code[]){
   
sprintf(query, QUERY_SQL, code);
  
my_conn.cmd_query(query);
my_conn.get_columns();
row_values *row = NULL;
 int number = 0;
 while (row = my_conn.get_next_row()) {
number++;
 my_conn.free_row_buffer();
   
 }
   
 my_conn.free_columns_buffer();
 if(number==0){
   return false;
 }else{
  return true; 
 }
}
 
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
  digitalWrite(ledPin,HIGH);
  delay(delayRead);
  digitalWrite(ledPin,LOW);
}

Può essere che il firewall ti blocchi la porta di mysql, oppure che mysql non sia settato per accettare connessioni da esterno, oppure la libreria è buggata
Devo dire però, e credimi non voglio fare la maestrina, che a livello concettuale la tua soluzione è una bestemmia in termini di architettura software. Mi riferisco all'accesso diretto di un client Arduino al database. Per N motivi.
Però se a livello pratico riesci a farla funzionare e ti va bene così, infischiatene :slight_smile:

miomiomio:
eh si questo l'ho scoperto amaramente!

Forse non ti è chiaro cos'é e per cosa é nato/pensato Arduino.
Arduino Uno/Mega ha una piccola MCU (microcontrollore) per gestire la logica di circuiti e quindi fare prototipazione rapida di circuiti.
NON è un piccolo PC tipo Raspberry su cui gira un sistema operativo tipo Linux.
Molte volte si usa l'accoppiata Arduino per "pilotare" i circuiti, Raspberry per gestire la parte web/database (Raspberry ha un gpio ma molto limitato).
In alternativa Arduino Yun, che ha una parte Arduino Leonardo e una parte su cui gira un Linux Openwrt

silvioz:
una volta che in asp hai scritto response.write("OK") e response.end, quell'OK te lo ritrovi in Arduino...

ma in questo caso come farei a recuperare il valore "ok" in arduino?

ho optato per non bestemmiare in arduinese e sto provando con php (o se on riesco in asp) e non connettendo aruino direttamente al database.

grazie di cuore per l'auito e i consigli.

Tutto funziona alla grande!!!
Ho messo il database anche online e funziona anche in remoto!!! Fantastico!!!
Ho provato anche a configurare LCD ma non va... Sarà guasto perché ho collegato solo quello ad Arduino e fatto un hello world e non compare niente. Boh?!

Comunque l'inserimento e il controllo avviene veloce e correttamente. La pagina asp controlla se esiste il codice. Se esiste inserisce i dati e decrementa il credito.
manca solo una cosa. Il feedback in Arduino. Ho provato a fare response.write("ok") response.end ma non riesco a ricavare tale valore in Arduino per far poi accendere led verde o rosso se ricevo 'KO'. Potreste aiutarmi a capire come si fa per favore? Vi ringrazio.

per favore potreste darmi qualche dritta su come ottenere i valori dalla pagina che ha aperto arduino e metterli in una variabile per far accendere i led?
c'è un get response? grazie

Ma scusa, hai guardato gli esempi della libreria Ethernet? Tu stai facendo una connect()? È banale, vedi: Ethernet - Arduino Reference

Forse non ho capito la tua risposta o forse non sono riuscito a spiegare ciò di cui ho bisogno.
Non mi serve una risposta dell'avvenuta connessione.
Ho bisogno di ricavare dei dati su cosa la pagina asp a cui arduino si connette ha eseguito.
In particolare la pagina asp riceve da arduino il codice della card.
controlla se esiste nel database e se ha credito, inserisce l'anagrafica nella tabella prenotapasto.
avrei bisogno di inviare ad arduino una variabile che dica che è stato effettuato linserimento con successo. cioè se il codice della pagina asp viene eseguito fino a questo punto allora inviare ad arduino l'informazione "OK".
Così la utilizzo per far accendere un led verde.
in caso contrario led rosso.
È una cosa fattibile? e se si, come?

if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

Cosa credi facciano queste righe?

io non ho capito. non riesco in nessun modo ad avere un response.
Ti ringrazio per il tuo codice ma non riesco a impostarlo per farlo funzionare :frowning:

ricapitolando, il mio sketch è il seguente

#include<SPI.h>
#include<MFRC522.h>
#include<SoftwareSerial.h>
#include <Ethernet.h>
#define SS_PIN 4 //FOR RFID SS PIN BECASUSE WE ARE USING BOTH ETHERNET SHIELD AND RS-522
#define RST_PIN 9
#define No_Of_Card 3
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "www.xxxxxxxx.it";   //YOUR SERVER
IPAddress ip(192, 168, 1, 177);
EthernetClient client;
SoftwareSerial mySerial(8,9);     
MFRC522 rfid(SS_PIN,RST_PIN);
MFRC522::MIFARE_Key key; 

byte i;
byte id_temp[3][3];
 String codice;


void setup()
{
  pinMode(2, OUTPUT); //led verde
  pinMode(6, OUTPUT); //buzzer
  Serial.begin(9600);
  mySerial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  for(byte i=0;i<6;i++)
  {
    key.keyByte[i]=0xFF;
  }
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
  }
  delay(1000);
  Serial.println("connecting...");
 }


void loop()
{
  codice="";
int m=0;
  if(!rfid.PICC_IsNewCardPresent())
  return;
  if(!rfid.PICC_ReadCardSerial())
  return;
  for(i=0;i<4;i++)
  {
   id_temp[0][i]=rfid.uid.uidByte[i]; 
   codice=codice+rfid.uid.uidByte[i];
   Serial.print(rfid.uid.uidByte[i]);
                    Serial.print(" ");
             delay(50);
  
  }
  Sending_To_DB();
 



     // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
 //Serial.println(" \nil codice è: "+codice);

 
 }

 void Sending_To_DB()   //CONNECTING WITH db
 {
   if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.print("GET  /index.asp?allow="+codice);     //YOUR URL
   client.print(" ");      //SPACE BEFORE HTTP/1.1
    client.print("HTTP/1.1");
    client.println();
    client.println("Host: www.xxxxxxx.it");
    
    client.println("Connection: close");
    client.println();

  client.stop();
Serial.println(" \nIl pasto è stato prenotato con il codice: "+codice);

  digitalWrite(2, HIGH);//led verde
    digitalWrite(6, HIGH); //buzzer
delay(50);
digitalWrite(2, LOW);
digitalWrite(6, LOW);
delay(150);
digitalWrite(2, HIGH);
digitalWrite(6, HIGH);
delay(500);
digitalWrite(2, LOW);
digitalWrite(6, LOW);
delay(10);

/* for(i=0;i<50;i++)
  {
 digitalWrite(2, HIGH);//led verde

delay(80);
digitalWrite(2, LOW);

delay(80);
     }*/

  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }

 }

Nella pagina asp ho due response.write a seconda che l'inserimento nel database vada a buon fine Response.write("1")
oppure
Response.write("0").
Non riesco a impostare il codice in arduino per ottenere questi valori.
Potete spiegarmi comesi fa?
Vi ringrazio per la pazienza e per l'aiuito.

qualcuno può aiutarmi per favore? :confused:

ok ho capito che non è cosa fattibile e che non siete disposti ad aiutarmi

miomiomio:
... e che non siete disposti ad aiutarmi

... forse NON ti è chiaro che chi sta qui ci stà volontariamente, senza essere pagato e dedicando parte del suo tempo libero a cercare di rispondere ai quesiti.

NESSUNO qui è obbligato ad aiutare nessuno e tutto lo fanno nei limiti delle loro conoscenze. Nella pagina precedente hai avuto una serie di aiuti da almeno tre utenti che ti hanno suggerito cosa fare ... quindi ... mi sembra che hanno cercato di aiutarti.

NON accetto pertanto da parte tua battute di questo tipo che ritengo offensive nei confronti di chi, comunque, ha dedicato del tempo al tuo problema.

Considera che ... quasi certamente, NON è scrivendo queste cose che otterrai maggior aiuto.

Guglielmo