Arduino Nano - MySQL

Arduino Nano est capable de collecter les données des capteurs et de les stocker dans une base de données MySQL. Il peut également récupérer des données (commandes) de la base de données MySQL et gérer des LED, moteurs, actionneurs et autres dispositifs.

Ce tutoriel vous explique comment utiliser Arduino Nano pour contrôler MySQL. En détail, nous apprendrons :

arduino MySQL

Préparation du matériel

1×Arduino Nano
1×USB A to Mini-B USB cable
1×Arduino Nano Ethernet Shield 2
1×Ethernet Cable
1×(Optional) 9V Power Adapter for Arduino Nano
1×(Recommended) Screw Terminal Expansion Board for Arduino Nano
1×(Recommended) Breakout Expansion Board for Arduino Nano
1×(Recommended) Power Splitter For Arduino Nano

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 Nano - MySQL

Si vous ne connaissez pas bien l'architecture du système, on peut considérer que la base de données MySQL et le serveur MySQL sont une seule et même chose. À mesure que vous approfondirez vos connaissances sur l'architecture du système, vous verrez les distinctions entre eux.

Il existe deux méthodes pour que l'Arduino Nano communique avec la base de données MySQL :

  • Connexion directe au serveur MySQL à l'aide d'une connexion MySQL (désignée comme l'approche directe)
  • Interaction indirecte avec le serveur MySQL via une connexion HTTP (connue sous le nom d'approche indirecte)

Cherchons l'option optimale.

Arduino Nano interagit directement avec le serveur MySQL

arduino directement à MySQL

Cela peut sembler plus simple, mais il y a de nombreux inconvénients :

  • Permettre à un compte utilisateur MySQL d'accéder à distance à la base de données MySQL 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.
  • Traiter des données dans Arduino Nano et/ou sur un serveur MySQL augmente la complexité du code Arduino Nano et du script MySQL et consomme beaucoup de ressources d'Arduino Nano (mémoire et utilisation du CPU).
  • Le serveur MySQL peut retourner une très grande quantité de données à l'Arduino Nano dans certains cas, ce qui peut entraîner une saturation de la mémoire de l'Arduino Nano.
  • La plupart des bibliothèques MySQL disponibles ne prennent pas en charge SSL/TLS, ce qui signifie que les données, y compris le nom d'utilisateur et le mot de passe, seront envoyées en texte clair, posant un autre problème de sécurité.

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

La méthode indirecte résout tous les problèmes que présente l'approche directe. Avant d'explorer comment la méthode indirecte surpasse les inconvénients de l'approche directe, examinons d'abord son fonctionnement.

Comment cela fonctionne

  • Étape 1 : Arduino Nano envoie une requête HTTP au serveur web
  • Étape 2 : Le serveur web exécute un script PHP
  • Étape 3 : Le script PHP extrait les données de la requête HTTP, les traite, puis interagit avec la base de données MySQL
  • Étape 4 : Le script PHP traite le résultat et l'envoie de retour à Arduino Nano dans une réponse HTTP
Arduino Nano MySQL HTTP

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

Il peut sembler complexe, mais ce n'est pas le cas. Explorons comment l'approche indirecte peut pallier les inconvénients de l'approche directe :

  • En installant des serveurs MySQL et HTTP sur le même serveur physique, nous pouvons restreindre un compte utilisateur MySQL pour 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 renforce la sécurité du système.
  • Les données sont traitées par un script PHP (étapes 3 et 4). Cela réduit la charge de travail et la complexité tant pour les serveurs Arduino Nano que MySQL. Traiter les données à l'aide de code PHP est beaucoup plus facile qu'avec le code Arduino Nano ou les scripts MySQL.
  • Le script PHP peut traiter les données et envoyer uniquement les données nécessaires à l'Arduino Nano (étape 4) pour éviter qu'il ne manque de mémoire.
  • La plupart des bibliothèques Ethernet/WiFi supportent TLS/SSL, ce qui nous permet de faire des requêtes 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 nom d'utilisateur/mot de passe différent pour l'authentification entre l'Arduino Nano et le serveur Web. Il est important de se rappeler que le nom d'utilisateur/mot de passe HTTP ne doit pas être identique au nom d'utilisateur/mot de passe MySQL pour des raisons de sécurité.

Le tutoriel suivant démontrera comment utiliser l'Arduino Nano de manière indirecte avec MySQL. Il présente plusieurs avantages qui seront discutés.

Arduino Nano - MySQL via HTTP/HTTPS

Nous devons prendre les mesures suivantes :

  • 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
  • Générez une base de données MySQL
  • Construisez une table MySQL
  • Rédigez un ou plusieurs fichiers de script PHP
  • Écrivez le code Arduino Nano

Prenons les choses étape par étape. Nous pouvons avancer progressivement. Avançons pas à pas.

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

Heureusement, le package XAMPP inclut tout cela.

Il suffit de l'installer une seule fois :

  • Obtenez XAMPP depuis ce lien
  • Exécutez l'installation.

Une fois l'installation terminée, vous observerez le dossier C:\xampp\htdocs sur votre ordinateur. C'est là que vous devrez placer votre code PHP (comme cela sera discuté plus tard).

2. Activer MySQL et le serveur Web

  • Ouvrez le panneau de contrôle XAMPP.
  • Appuyez sur le bouton Démarrer pour activer MySQL et le serveur Web. (Voir l'image ci-dessous.)
Arduino Nano 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 et le mot de passe sont exposés, les attaquants ne pourront pas accéder à la base de données MySQL à moins qu'ils ne contrôlent l'ordinateur.
  • Comme PHP et MySQL sont installés sur le même PC, PHP peut utiliser ce nom d'utilisateur et 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 :

  • Démarrez l'invite de commande sur votre ordinateur. Gardez cette fenêtre ouverte jusqu'à ce que le tutoriel soit terminé.
  • Entrez 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 qui n'a pas de mot de passe.
  • Il est recommandé d'y ajouter un mot de passe.

Entrez le your-root-password pour le compte root en tapant cette commande 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>
  • Entrez cette commande dans l'invite de commande :
mysql.exe -u root -p
  • Entrez votre mot de passe root et appuyez sur la touche 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 le nom d'utilisateur Arduino et le 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. N'oubliez pas le nom d'utilisateur et le mot de passe, car ils seront nécessaires pour le script PHP.

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

Créons une base de données intitulée db_arduino en entrant 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 appelé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. Écrivez un ou plusieurs fichiers PHP

Créez un fichier PHP. Nommez-le insert_temp.php. Récupérez la température à partir de la requête HTTP. Insérez la température 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"; } ?>
  • La température 27,5 est enregistrée.
  • Placez ce fichier dans le répertoire C:\xampp\htdocs.
  • Découvrez l'adresse IP de votre PC. Si vous ne savez pas comment faire, cherchez sur Google.
  • Pour tester le code PHP, ouvrez un navigateur web (par exemple, Chrome) et rendez-vous sur ce lien : http://192.168.0.26/insert_temp.php?temperature=27.5. N'oubliez pas de remplacer l'adresse IP par la vôtre.
  • Le navigateur web devrait afficher "La température 27,5 est enregistrée".
Test MySQL
  • Vérifiez si les données sont stockées dans la base de données en saisissant 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]>

Il est évident que la température de 27,5 est enregistrée dans la base de données. L'action suivante consiste à composer un code Arduino Nano qui générera une requête HTTP similaire à votre PC.

7. Écrire le code Arduino Nano

Nous utiliserons l'Arduino Nano et le Shield Ethernet pour le test.

Le code Arduino Nano ci-dessous envoie une requête HTTP à votre PC, avec une température de 29,1°C, pour être insérée dans la base de données.

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-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

  • Affichera l'adresse IP du Shield Ethernet
  • Empilez le Shield Ethernet sur l'Arduino Nano.
  • Connectez un câble Ethernet au Shield Ethernet.
  • Connectez l'Arduino Nano à un PC à l'aide d'un câble USB.
  • Modifiez le code pour refléter l'adresse IP du PC.
  • Compilez et téléchargez le code sur l'Arduino Nano.
  • Ouvrez le moniteur série.
  • La sortie sur le moniteur série affichera l'adresse IP du Shield Ethernet.
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 entrant 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]>

Il est évident que la base de données indique une température de 29,1.

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

Dans l'exemple ci-dessus, nous avons découvert comment saisir des données dans une base de données MySQL. Pour mettre à jour et récupérer des données de la base de données, le processus est similaire. Vous devez simplement modifier les requêtes MySQL dans le script PHP. Pour en savoir plus, vous pouvez visiter W3Schools.

Utilisation avancée

Pour renforcer la sécurité :

※ Note:

Pour créer un système avec la sécurité la plus élevée, nous devons prendre des mesures supplémentaires (par exemple, prévention de l'injection MySQL, transformation du HTTPS en une API REST, utilisation du format Json pour les données...). Néanmoins, ce tutoriel est destiné aux débutants pour apprendre l'Arduino Nano, et a été rendu aussi simple que possible. Après avoir complété ce tutoriel, les utilisateurs peuvent 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!