Arduino - MySQL

Arduino peut collecter des données de capteurs et les stocker dans une base de données MySQL. Arduino peut également récupérer des données (commandes) depuis une base de données MySQL et contrôler des LED, moteurs, actionneurs, appareils...

Dans ce tutoriel, nous allons apprendre :

Arduino MySQL

Le tutoriel fournit le code Arduino pour deux cas :

Préparation du matériel

1×Arduino UNO R4 WiFi
1×USB Cable Type-C
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

Alternatively if using Ethernet:

1×Arduino Uno
1×USB 2.0 cable type A/B
1×Arduino Ethernet Shield 2
1×Ethernet Cable
1×(Optional) 9V Power Adapter for Arduino
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

Arduino - MySQL

Si vous n'avez pas beaucoup de connaissances en architecture système, deux termes : Base de données MySQL et Serveur MySQL peuvent être compris comme étant la même chose. Vous découvrirez les différences plus tard lorsque vous en saurez davantage sur l'architecture du système.

Il existe deux manières pour Arduino d'interagir avec la base de données MySQL :

  • Arduino interagit directement avec le serveur MySQL via une connexion MySQL (appelé méthode directe)
  • Arduino interagit indirectement avec le serveur MySQL via une connexion HTTP (appelé méthode indirecte)

Trouvons le meilleur.

Arduino interagit directement avec le serveur MySQL.

arduino directement à MySQL

Cela semble plus simple mais il y a de nombreux inconvénients :

  • Cela permet à un compte utilisateur MySQL d'accéder à distance à la base de données MySQL ⇒ C'est dangereux du point de vue de la sécurité, même si des privilèges limités ont été accordés au compte utilisateur.
  • Les données DOIVENT être traitées dans Arduino et/ou le serveur MySQL ⇒ Cela augmente la complexité du code Arduino et du script MySQL. Surtout, cela consomme beaucoup de ressources Arduino (utilisation de la mémoire et du CPU).
  • Le serveur MySQL peut renvoyer une très grande quantité de données à Arduino dans certains cas ⇒ Cela peut provoquer l'épuisement de la mémoire d'Arduino.
  • La plupart des bibliothèques MySQL disponibles ne prennent pas en charge SSL/TLS. Les données, y compris le nom d'utilisateur/le mot de passe, seront envoyées en texte clair ⇒ un autre problème de sécurité.

Arduino interagit indirectement avec le serveur MySQL via HTTP/HTTPS.

Cette méthode indirecte résout tous les problèmes que présente la méthode directe. Avant de voir comment la manière indirecte surmonte les inconvénients de la manière directe, voyons d'abord comment elle fonctionne.

Comment cela fonctionne

  • Étape 1 : L'Arduino effectue une requête HTTP vers le serveur Web
  • Étape 2 : Le serveur Web exécute un script PHP
  • Étape 3 : Le script PHP récupère les données de la requête HTTP, traite les données, puis interagit avec la base de données MySQL.
  • Étape 4 : Le script PHP traite le résultat et renvoie le résultat à l'Arduino via la réponse HTTP
Arduino MySQL HTTP

Dans ce tutoriel, le serveur Web et le serveur MySQL seront installés sur un PC.

Cela semble compliqué, mais ce ne l'est pas. Voyons maintenant comment la manière indirecte surmonte les inconvénients de la manière directe.

  • En installant le serveur MySQL et le serveur HTTP sur le même serveur physique, nous pouvons limiter un compte utilisateur MySQL à accéder uniquement à localhost. De plus, le nom d'utilisateur et le mot de passe du compte MySQL sont stockés sur le serveur (étape 3), ce qui rend le système plus sécurisé.
  • Les données sont traitées par un script PHP (étape 3 et étape 4). Cela réduit le travail et la complexité pour les serveurs Arduino et MySQL. Traiter les données à l'aide du code PHP est beaucoup plus facile que le code Arduino et le script MySQL.
  • Le script PHP peut traiter les données et envoyer uniquement les données nécessaires à Arduino (étape 4) pour éviter que Arduino ne manque de mémoire.
  • La plupart des bibliothèques Ethernet/WiFi prennent en charge TLS/SSL, ce qui nous permet de faire une requête HTTPS. En utilisant HTTPS, les données sont cryptées et échangées de manière sécurisée sur Internet.

À l'étape 1, nous pouvons utiliser un autre nom d'utilisateur/mot de passe pour effectuer l'authentification entre Arduino et le serveur Web. Veuillez noter que le nom d'utilisateur/mot de passe HTTP devrait être différent du nom d'utilisateur/mot de passe MySQL pour des raisons de sécurité.

Avec ces avantages, la suite de ce tutoriel présentera comment utiliser Arduino avec MySQL de manière indirecte.

Arduino - MySQL via HTTP/HTTPS

Nous devons faire l'étape suivante :

  • Installez le serveur MySQL, le serveur Web et PHP sur votre PC
  • Activez le serveur MySQL et le serveur Web
  • Créez un compte utilisateur MySQL
  • Créez une base de données MySQL
  • Créez une table MySQL
  • Écrivez un ou plusieurs fichiers de script PHP
  • Écrivez du code Arduino

Faisons-le étape par étape.

Installez le serveur MySQL, le serveur Web et PHP sur votre PC.

Heureusement, le paquet XAMPP inclut tout cela. Nous avons juste besoin de l'installer une seule fois.

  • Téléchargez XAMPP depuis ce lien
  • Installez-le.

Après l'installation, vous verrez le dossier C:\xampp\htdocs sur votre PC. C'est là que vous placez le code PHP (voir plus tard).

2. Activer MySQL et le serveur Web

  • Ouvrez le Panneau de Contrôle XAMPP
  • Cliquez sur le bouton Démarrer pour activer MySQL et le serveur Web (Voir l'image ci-dessous)
Arduino XAMPP

3. Créer un compte utilisateur MySQL

Nous créerons un compte MySQL qui pourra se connecter à la base de données MySQL depuis localhost uniquement.

  • Même si le nom d'utilisateur/le mot de passe sont révélés, les attaquants ne peuvent toujours pas accéder à votre base de données MySQL à moins de prendre le contrôle de votre PC.
  • Comme PHP et MySQL sont installés sur le même PC, PHP peut utiliser ce nom d'utilisateur/ce mot de passe pour se connecter à la base de données MySQL.

Créons un compte utilisateur MySQL avec le nom d'utilisateur Arduino et le mot de passe ArduinoGetStarted.com :

  • Ouvrez l'invite de commande sur votre PC. Ne la fermez pas jusqu'à la fin du tutoriel.
  • Tapez la commande suivante dans l'invite de commande :
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\youruser>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>
  • Par défaut, MySQL possède un compte root sans mot de passe. Vous devriez ajouter un mot de passe.

(par exemple votre-mot-de-passe-root) pour le compte root en tapant la commande suivante dans l'invite de commande :

mysqladmin -u root password your-root-password
Command Prompt
C:\xampp\mysql\bin>mysqladmin -u root password your-root-password C:\xampp\mysql\bin>
  • Tapez la commande suivante dans l'invite de commande :
mysql.exe -u root -p
  • Tapez votre mot de passe root et appuyez sur Entrée.
Command Prompt
C:\xampp\mysql\bin>mysql.exe -u root -p Enter password: ****************** Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.4.6-MariaDB mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
  • Créez un compte utilisateur MySQL avec comme nom d'utilisateur Arduino et comme mot de passe ArduinoGetStarted.com en copiant les commandes ci-dessous et en les collant dans l'invite de commande :
CREATE USER 'Arduino'@'localhost' IDENTIFIED BY 'ArduinoGetStarted.com'; GRANT ALL PRIVILEGES ON *.* TO 'Arduino'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
Command Prompt
MariaDB [(none)]> CREATE USER 'Arduino'@'localhost' IDENTIFIED BY 'ArduinoGetStarted.com'; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'Arduino'@'localhost' WITH GRANT OPTION; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]>

Vous avez maintenant créé un compte utilisateur MySQL avec succès. Mémorisez le nom d'utilisateur et le mot de passe, ils seront utilisés dans le script PHP.

4. Créer une base de données MySQL

Créons une base de données nommée db_arduino en tapant la commande suivante dans l'invite de commande :

CREATE DATABASE db_arduino CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci';
Command Prompt
MariaDB [(none)]> CREATE DATABASE db_arduino CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci'; Query OK, 1 row affected (0.003 sec) MariaDB [(none)]>

5. Créer une table MySQL

Créons une table nommée tbl_temp en copiant les commandes ci-dessous et en les collant dans l'invite de commande :

USE db_arduino; CREATE TABLE tbl_temp ( temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT, temp_value FLOAT DEFAULT 0.00, PRIMARY KEY (temp_id) );
Command Prompt
MariaDB [(none)]> USE db_arduino; Database changed MariaDB [db_arduino]> MariaDB [db_arduino]> CREATE TABLE tbl_temp ( -> temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> temp_value FLOAT DEFAULT 0.00, -> PRIMARY KEY (temp_id) -> ); Query OK, 0 rows affected (0.044 sec) MariaDB [db_arduino]>

6. Écrire un ou plusieurs fichiers PHP

Créez un fichier PHP nommé insert_temp.php qui récupère la température à partir de la requête HTTP et l'insère dans la base de données.

<?php if(isset($_GET["temperature"])) { $temperature = $_GET["temperature"]; // get temperature value from HTTP GET $servername = "localhost"; $username = "Arduino"; $password = "ArduinoGetStarted.com"; $dbname = "db_arduino"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO tbl_temp (temp_value) VALUES ($temperature)"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . " => " . $conn->error; } $conn->close(); } else { echo "temperature is not set"; } ?>
  • Placez ce fichier dans le dossier C:\xampp\htdocs
  • Obtenez l'adresse IP de votre PC. Si vous ne savez pas comment faire, recherchez-le sur Google.
  • Testez le code PHP en ouvrant un navigateur web (par exemple, Chrome) et accédez à ce lien : http://192.168.0.26/insert_temp.php?temperature=27.5 . Notez que vous devez remplacer l'adresse IP ci-dessus par celle de votre PC.
  • La sortie sur le navigateur web.
Test MySQL
  • Vérifiez si les données sont stockées dans la base de données en tapant la commande suivante dans l'invite de commande :
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_arduino]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 27.5 | +---------+------------+ 1 row in set (0.001 sec) MariaDB [db_arduino]>

Comme vous pouvez le voir, la température de 27,5 est enregistrée dans la base de données. L'étape suivante consiste à écrire un programme Arduino qui effectue une requête HTTP similaire à votre PC.

7. Écrire du code Arduino

Nous utiliserons Arduino Uno et Ethernet Shield ou Arduino Uno R4 WiFi pour le test.

Le code Arduino ci-dessous effectue une requête HTTP vers votre PC pour insérer une température de 29,1°C dans la base de données.

Code Arduino pour Arduino Uno R4 WiFi

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-mysql */ #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // change your network SSID (name) const char pass[] = "YOUR_WIFI_PASSWORD"; // change your network password (use for WPA, or use as key for WEP) WiFiClient client; int status = WL_IDLE_STATUS; int HTTP_PORT = 80; String HTTP_METHOD = "GET"; char HOST_NAME[] = "192.168.0.26"; // change to your PC's IP address String PATH_NAME = "/insert_temp.php"; String queryString = "?temperature=29.1"; void setup() { Serial.begin(9600); // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); // connect to web server on port 80: if (client.connect(HOST_NAME, HTTP_PORT)) { // if connected: Serial.println("Connected to server"); // make a HTTP request: // send HTTP header client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // end HTTP header while (client.connected()) { if (client.available()) { // read an incoming byte from the server and print it to serial monitor: char c = client.read(); Serial.print(c); } } // the server's disconnected, stop the client: client.stop(); Serial.println(); Serial.println("disconnected"); } else { // if not connected: Serial.println("connection failed"); } } void loop() { }

Code Arduino pour Arduino Uno/Mega et Ethernet Shield

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-mysql */ #include <SPI.h> #include <Ethernet.h> // replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; EthernetClient client; int HTTP_PORT = 80; String HTTP_METHOD = "GET"; char HOST_NAME[] = "192.168.0.26"; // change to your PC's IP address String PATH_NAME = "/insert_temp.php"; String queryString = "?temperature=29.1"; void setup() { Serial.begin(9600); // initialize the Ethernet shield using DHCP: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to obtaining an IP address using DHCP"); while(true); } // connect to web server on port 80: if(client.connect(HOST_NAME, HTTP_PORT)) { // if connected: Serial.println("Connected to server"); // make a HTTP request: // send HTTP header client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // end HTTP header while(client.connected()) { if(client.available()){ // read an incoming byte from the server and print it to serial monitor: char c = client.read(); Serial.print(c); } } // the server's disconnected, stop the client: client.stop(); Serial.println(); Serial.println("disconnected"); } else {// if not connected: Serial.println("connection failed"); } } void loop() { }

Étapes rapides

  • Si vous utilisez le Shield Ethernet, empilez le Shield Ethernet sur Arduino Uno
  • Connectez le câble Ethernet au Shield Ethernet
  • Connectez l'Arduino Uno au PC via un câble USB
  • Modifiez l'adresse IP dans le code par l'adresse IP de votre PC
  • Compilez et téléchargez le code sur Arduino
  • Ouvrez le moniteur série
  • Le résultat sur le moniteur série
COM6
Send
Connected to server HTTP/1.1 200 OK Date: Tue, 12 Jan 2021 07:52:22 GMT Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/7.3.8 X-Powered-By: PHP/7.3.8 Content-Length: 31 Connection: close Content-Type: text/html; charset=UTF-8 New record created successfully disconnected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Vérifiez si les données sont stockées dans la base de données en tapant la commande suivante dans l'invite de commande :
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_arduino]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 27.5 | | 2 | 29.1 | +---------+------------+ 2 rows in set (0.000 sec) MariaDB [db_arduino]>

Comme vous pouvez le voir, la température de 29,1 est enregistrée dans la base de données.

Comment Arduino insère, met à jour ou récupère des données vers/depuis une base de données MySQL

Dans l'exemple ci-dessus, nous avons appris comment insérer des données dans la base de données MySQL. Pour mettre à jour et obtenir des données de la base de données, cela est similaire. Vous devez seulement changer les requêtes MySQL dans le script PHP. Vous pouvez en apprendre davantage sur W3Schools

Utilisation Avancée

Pour renforcer la sécurité

  • Vous pouvez modifier le code Arduino pour utiliser HTTPS au lieu de HTTP. Voir Arduino - HTTPS
  • Vous pouvez utiliser un nom d'utilisateur/mot de passe pour réaliser une authentification entre l'Arduino et le serveur Web. Voir Authentification par accès de base

※ NOTE THAT:

Pour créer un système complet avec le niveau de sécurité le plus élevé, nous devons en faire plus (comme la prévention des injections MySQL, faire en sorte que HTTPS devienne une API REST, utiliser le format Json pour les données...). Cependant, ce tutoriel est destiné aux débutants pour apprendre l'Arduino. Nous l'avons rendu aussi simple que possible. Après avoir appris ce tutoriel, les utilisateurs pourront l'étendre.

Vidéo

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!