Comment relier une base de données MYSQL avec une carte Arduino ?

C'est un projet de groupe...
La tâche peut être (doit être?) répartie entre les membres de l'équipe.
Il n' y a rien d'insurmontable si l'on s'organise simplement.

Coyotte

je vois python/mysql
le nono envoie les datas sur le port serie
python récupère les datas, les insère dans mysql

jètes un oeil ICI

regardes à partir de Installation de MySQL pour python

Soit votre prof n'en connais pas une sur le sujet, soit il ne discerne pas suffisamment le problème auquel il vous a convié et la tache est ardu pour un novice. Ici tu ne trouveras de l'aide que sur un programme dans lequel un dysfonctionnement t'échappe et auquel cas on pourrait t'aider.

soit les élèves n'en foutent pas une rame et ne cherchent pas par eux même :wink:
on peut aider à condition qu'il y ait un minimum fournit en information et travail

je pense qu'il doit être possible de causer entre le PC et Arduino de manière assez simple grâce à une interface dans Excel. J'ai déjà bidouillé des trucs comme ça, à l'époque des GPS portables qui avaient un port série et je récupérais le tout dans Excel.

Il existe des modules qui savent causer "Serial". Ensuite alimenter une feuille de calcul, une BDD MySQL ou un site de stockage dans le cloud est un jeu d'enfant.

allez voir excel-downloads pour ça. Beaucoup de forumeurs passionnés.

please, is anyone here found the solution for this topic ?

Hello Amall,
I think that whoever opened this topic (frgoldeagle not to name it) 3 years ago had to find a solution, but did not return to post his finds. But in 3 years things have evolved and with ESPxx everything is possible (or almost). I access myself to databases in my connected objects, but for simplicity I do it through php pages on my dedicated server. But I think there are possibilities. Be careful though, a database can not (should not be) usable remotely, for obvious security reasons.
Regards

Bonjour Amall,
Je pense que celui qui a ouvert ce topic (frgoldeagle pour ne pas le nommer) il y a 3 ans a dû trouver une solution, mais n'est pas revenu poster ses trouvailles. Mais en 3 ans les choses ont évolués et avec les ESPxx tout est possible (ou presque). J'accède moi même à des bases de données dans mes objets connecté, mais par simplicité je le fait au travers de pages php sur mon server dédié. Mais je pense qu'il y a des possibilités. Attention tout de même, une base de données ne peut être (doit pas être) utilisable à distance, pour des raisons de sécurité évidente.
Cordialement.

Bonjour tous le monde, je travaille sur un projet similaire à ce projet, j'ai écris le programme qui affiche l'ID du tag sur le moniteur série du mon IDE arduino, d'autre côté je veux connecter l'arduino à mon base de données Mysql (phpMyadmin) de tel sorte que l'ID du tag affiché sur le moniteur série sera automatiquement inséré dans mon tableau de ma base de donées... j'ai testé l'exemple ci-dessous "basic_insert_esp8266" de la bibliothèque "MySQL Connector/Arduino" et je peux insérer manuellement des valeurs sur la base que j'utilise:

#include <ESP8266WiFi.h> // Use this for WiFi instead of Ethernet.h
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

IPAddress server_addr(10,0,1,35); // IP of the MySQL server here
char user[] = "root"; // MySQL user login username
char password[] = "secret"; // MySQL user login password

// Sample query
char INSERT_SQL[] = "INSERT INTO test_arduino.hello_arduino (message) VALUES ('Hello, Arduino!')";

// WiFi card example
char ssid[] = "your-ssid"; // your SSID
char pass[] = "ssid-password"; // your SSID Password

WiFiClient client; // Use this for WiFi instead of EthernetClient
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;

void setup()
{
Serial.begin(115200);
while (!Serial); // wait for serial port to connect. Needed for Leonardo only

// Begin WiFi section
Serial.printf("\nConnecting to %s", ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

// print out info about the connection:
Serial.println("\nConnected to network");
Serial.print("My IP address is: ");
Serial.println(WiFi.localIP());

Serial.print("Connecting to SQL... ");
if (conn.connect(server_addr, 3306, user, password))
Serial.println("OK.");
else
Serial.println("FAILED.");

// create MySQL cursor object
cursor = new MySQL_Cursor(&conn);
}

void loop()
{
if (conn.connected())
cursor->execute(INSERT_SQL);

delay(5000);
}

qui peut m'aider pour écrire un programme qui insére automatiquement l'ID affiché sur le moniteur dans la base de données? voici le programme qui me permet de lire l'id du tag:

#include "SPI.h"
#include "MFRC522.h"

#define SS_PIN D4
#define RST_PIN D2

MFRC522 rfid(SS_PIN, RST_PIN);

MFRC522::MIFARE_Key key;

void setup() {
Serial.begin(115200);
SPI.begin();
rfid.PCD_Init();
}

void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial())
return;

// Serial.print(F("PICC type: "));
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// Serial.println(rfid.PICC_GetTypeName(piccType));

String strID = "";
for (byte i = 0; i < 4; i++) {
strID +=
(rfid.uid.uidByte < 0x10 ? "0" : "") +
_ String(rfid.uid.uidByte*, HEX) +_
_
(i!=3 ? ":" : "");_
_
}_
_
strID.toUpperCase();_
_
// Lorsque cette partie est atteinte, la variable strID stockera la valeur UID de la balise._
_
// peut être utilisé pour une utilisation, comme entrer dans un IF pour le tube*_
* // le voyant est allumé ou éteint*
* Serial.print("Tap card key: ");*
* Serial.println(strID);*
* rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
_
}[/color]*_
sachant que j'ai fait plusieurs essais mais en vain :frowning: :frowning:
merci d'avance.

Bonjour,
Pour t'aider, il faut comprendre ta demande, tu veux insérer l'ID dans la base MySQL mais de quel ID parles tu?
Dans quel table? Quel champ? donnes plus de détails et si je peux aider ce sera avec plaisir.
Je n'utilise pas la librairie que tu utilises, pour des raisons de sécurité, mais MySQL je connais très bien, n'hésites pas sur les questions.

Merci bien :slight_smile: je travaille sur le lecteur RFID MFRC522 connecté à une carte de développement Nodemcu esp8266 via l'interface SPI et je le programme avec l'IDE arduino (le deuxième sketch que j'ai envoyé), alors lorsque j'approche l'étiquette au module rfid le moniteur série affiche l'UID (identifiant unique) de l'étiquette, vous pouvez consulté ce lien pour bien comprendre le truc: How to use Arduino and RFID - YouTube l'idée c'est de créer un table sur la base de données mysql qui va être rempli automatiquement dés que je passe l'étiquêtte c'est-à-dire un lien qui assure le stockage de la valeurde l'UID affiché sur le moniteur série dans ma base de données: par exemple un table nommé utilisateurs qui contient un seul champ au moins appelé Tag_ID!! je ne sais pas si vous avez compris bien l'idée?! pourquoi vous n'utilisez pas la librairie que j'ai inséré? comment elle n'est pas securisé?

Bonjour,
Tout d'abord, quand je dis non sécurisé, cela sous entend à distance.
Imaginons que nous voulions passer par le WiFi pour accéder à cette base, il faut d'abord paramétrer MySQL pour un accès distant. Du coup la base est ouverte à qui saura craquer le mot de passe et avec MySQL il y a beaucoup de possibilité pour l'obtenir, mais là c'est un autre débat.

Pour le RFID je connais très bien aussi, j'en ai même programmé à mon boulot, mais pour de gros système Oracle...

Pour toi c'est très simple, après connexion à la base (locale ou distante) il faut utiliser une requête qui permette d'enregistrer l'ID dans la base mais sans le retrouver toutes les fois où on passe l'étiquette. Bien entendu, la requête sous entend que tu as déjà créé la table avec les paramètres qui vont bien. Prends aussi l'habitude de nommer tes tables et champs en minuscules ou majuscules (comme tu veux) sans les mélanger, sinon 6 mois après tu risques de ne pas te souvenir du mélange.

Voici la requête qu'il te faut : insert into utilisateurs (tag_id) values ('id à enregistrer') on duplicate key update tag_id = 'id à enregistrer';

MySQL gère les doublons.
Si tu as d'autres questions n’hésites pas.

1 Like

bonjour,
le problème c'est que je ne veux pas enregistrer la valeur du mon tag_id manuellement c'est-à-dire que je ne dois pas écrire à chaque fois la valeur du tag à enregistrer, imaginez que j'ai 10000 utilisateurs qui ont leurs tags_id est ce que je dois taper tous les tags? c'est pas logique, je veux changer la requête pour qu'elle recupére la valeur du tag du moniteur série dés que je passe l'étiquétte, un programme fixe qui va envoyer les valeurs automatiquement à mon tableau!!

Je ne comprend pas, ton id se retrouve bien dans une variable? et avec la librairie MySQL que tu donnes en exemple, tu peux utiliser "cursor->execute(La requête que je t'ai donné);"

je veux une requête statique pour tous les tags_id,, mais je ne sais pas comment !! quel est le rôle de cette ligne du code "cursor->execute(La requête que je t'ai donné);" ??

Elle exécute une requête SQL. Tu te connectes à la base de données avec "MySQL_Connection conn(&client);"
ensuite tu instancies un curseur avec "MySQL_Cursor* cursor;" Un curseur te permet de passer d'enregistrement en enregistrement (ligne si on compare une base à un tableau) ou de créer un enregistrement (ligne là encore) La commande "conn.connect(server_addr, 3306, user, password);" crée la connexion (server_addr = IP du serveur, le port d'échange (généralement 3306 pour MySQL) et le mot de passe de connexion) et "cursor = new MySQL_Cursor(&conn);" crée une nouvelle instance de "cursor" qui te permet les requête (entre autre)

merci :slight_smile: je ne suis pas bonne en programmation :confused: mais je veux essayé!!

Il y a un début à tout et si tu veux essayer c'est déjà un bon début...

Bonjour, j'ai essayé plusieurs fois mais en vain !! :frowning: pouvez-vous m'aider pour préciser l'erreur??

#include <ESP8266WiFi.h> // Use this for WiFi instead of Ethernet.h
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN D2 // Configurable, see typical pin layout above
#define SS_PIN D4 // Configurable, see typical pin layout above

IPAddress server_addr(192,168,43,144); // IP of the MySQL server here
char user[] = "esp"; // MySQL user login username
char password[] = ""; // MySQL user login password
char query[256];
// Sample query
char INSERT_SQL[] = "INSERT INTO rfiddata.tag (tag_id) VALUES ('%s')";

// WiFi card example
char ssid[] = "YO!"; // your SSID
char pass[] = "1234"; // your SSID Password

WiFiClient client; // Use this for WiFi instead of EthernetClient
MySQL_Connection conn(&client);
MySQL_Cursor* cur_mem;

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

void setup() {
Serial.begin(115200); // Initialize serial communications with the PC
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
// Begin WiFi section
Serial.printf("\nConnecting to %s", ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

// print out info about the connection:
Serial.println("\nConnected to network");
Serial.print("My IP address is: ");
Serial.println(WiFi.localIP());

Serial.print("Connecting to SQL... ");
if (conn.connect(server_addr, 3306, user, password))
Serial.println("OK.");
else
Serial.println("FAILED.");

// create MySQL cursor object
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);

SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522
//mfrc522.PCD_DumpVersionToSerial(); // Show details of PCD - MFRC522 Card Reader details
Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop() {
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}

// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}

// Dump debug info about the card; PICC_HaltA() is automatically called
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
sprintf(query, INSERT_SQL, "%s", mfrc522.uid);
if (conn.connected())
cur_mem->execute(query);

}
je n'ai pas du temps à perdre.. c'est pour le projet de fin d'études!!

sachant que le programme est sans erreurs: le moniteur série me montre que le connexion est okey et je peux voir l'ID de l'étiquêtte que j'ai passé!!

mais je n voix rien sur le table de ma base de données!!

Bonjour,
Es-tu certain que la table s'appelle "rfiddata.tag" et le champ "tag_id" ?
Si oui, tu peux ouvrir une console MySQL et tester ta requête directement juste pour voir si la table prend l'enregistrement. En plus s'il y a une erreur, tu auras en retour quelle erreur empêche d'enregistrer.
Malheureusement, je n'ai pas tous les tenants et aboutissants de la base sur laquelle tu travail, il m'est donc difficile de faire la part des choses.

je suis sur et certain qu'il s'appelle rfiddata.tag !!