Arduino - MySQL

Arduino kan sensorwaarden verzamelen en opslaan in een MySQL database. Arduino kan ook data (commando’s) ophalen uit een MySQL database om een LED, motor, actuator of ander apparaat te besturen.

In deze tutorial leert u:

arduino MySQL

Deze tutorial bevat Arduino-code voor twee situaties:

Benodigde Hardware

1×Arduino UNO R4 WiFi
1×Alternatief: DIYables STEM V4 IoT
1×USB-kabel Type-C

Alternatief bij gebruik van Ethernet:

1×Arduino Uno R3
1×USB 2.0-kabel type A/B
1×Arduino Ethernet Shield
1×Ethernet-kabel
1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno R4
1×(Aanbevolen) Breadboard-Shield voor Arduino Uno R4
1×(Aanbevolen) Behuizing voor Arduino Uno R4
1×(Aanbevolen) Stromsplitter voor Arduino Uno R4
1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Arduino - MySQL

Als u nog niet veel weet over systeemarchitectuur, kunnen de twee termen MySQL Database en MySQL Server als hetzelfde worden beschouwd. De verschillen ontdekt u later zodra u meer kennis opdoet over systeemarchitectuur.

Er zijn twee methoden waarop Arduino kan communiceren met een MySQL database:

  • Arduino communiceert direct met MySQL Server via een MySQL-verbinding (directe manier)
  • Arduino communiceert indirect met MySQL Server via een HTTP-verbinding (indirecte manier)

Laten we de beste methode bekijken.

Arduino communiceert direct met MySQL Server

arduino directly to MySQL

Deze methode lijkt eenvoudiger, maar kent veel nadelen:

  • Dit geeft een MySQL-gebruikersaccount de mogelijkheid om op afstand toegang te verkrijgen tot de MySQL database ⇒ Dit is een beveiligingsrisico, ook als er beperkte rechten zijn toegekend aan het gebruikersaccount.
  • De data MOET worden verwerkt op de Arduino en/of de MySQL server ⇒ Dit maakt de Arduino-code en MySQL-scripts complexer. Vooral verbruikt het veel Arduino-bronnen (geheugen en CPU).
  • De MySQL server kan in sommige gevallen grote hoeveelheden data terugsturen naar Arduino ⇒ Dit kan leiden tot geheugenoverschrijding op Arduino.
  • De meeste beschikbare MySQL bibliotheken ondersteunen geen SSL/TLS. De gegevens, inclusief gebruikersnaam/wachtwoord, worden in platte tekst verzonden ⇒ Een extra beveiligingsprobleem.

Arduino communiceert indirect met MySQL Server via HTTP/HTTPS

Deze indirecte methode lost alle problemen op die de directe manier heeft. Voordat we uitleggen hoe de indirecte manier deze nadelen omzeilt, eerst hoe het werkt:

Hoe het werkt

  • Stap 1: Arduino verstuurt een HTTP-verzoek naar de Webserver
  • Stap 2: De Webserver voert een PHP-script uit
  • Stap 3: Het PHP-script haalt data op uit het HTTP-verzoek, verwerkt deze en communiceert met de MySQL database
  • Stap 4: Het PHP-script verwerkt het resultaat en stuurt dit via HTTP-response terug naar Arduino
Arduino MySQL HTTP

In deze tutorial worden de Webserver en MySQL-server geïnstalleerd op een PC.

Het lijkt ingewikkeld, maar dat is het niet. Laten we nu kijken hoe de indirecte manier de nadelen van de directe manier oplost:

  • Door MySQL-server en HTTP-server op dezelfde fysieke server te installeren, kan het MySQL-gebruikersaccount worden beperkt tot toegang via localhost. Bovendien worden gebruikersnaam en wachtwoord van het MySQL-account opgeslagen op de server (stap 3), wat de beveiliging verbetert.
  • Data wordt verwerkt door het PHP-script (stap 3 en 4). Dit vermindert de werklast en complexiteit voor zowel Arduino als MySQL-server. Data verwerken met PHP is veel eenvoudiger dan met Arduino-code en MySQL-scripts.
  • Het PHP-script kan de data filteren en alleen de noodzakelijke informatie terugsturen naar Arduino (stap 4), zodat Arduino geen geheugenproblemen krijgt.
  • De meeste Ethernet- en WiFi-bibliotheken ondersteunen TLS/SSL, wat het mogelijk maakt om HTTPS-verzoeken te doen. HTTPS zorgt voor versleuteling en veilige overdracht van data via internet.

Bij stap 1 kunt u een aparte gebruikersnaam/wachtwoord gebruiken voor authenticatie tussen Arduino en Webserver. Let op: deze HTTP-gebruikersnaam/wachtwoord moet om veiligheidsredenen verschillen van die van MySQL.

Met deze voordelen zal de rest van deze tutorial uitleggen hoe Arduino MySQL gebruikt via de indirecte methode.

Arduino - MySQL via HTTP/HTTPS

We doorlopen de volgende stappen:

  • Installeer MySQL-server, Webserver en PHP op uw PC
  • Activeer MySQL- en Webserver
  • Maak een MySQL-gebruikersaccount aan
  • Maak een MySQL-database aan
  • Maak een MySQL-tabel aan
  • Schrijf één of meerdere PHP-scriptbestanden
  • Schrijf Arduino-code

Laten we stap voor stap beginnen.

1. Installeer MySQL-server, Webserver en PHP op uw PC

Gelukkig bevat het XAMPP-pakket dit allemaal. U hoeft dit slechts één keer te installeren

  • Download XAMPP via deze link
  • Installeer het

Na installatie vindt u de map C:\xampp\htdocs op uw PC. Hier plaatst u PHP-code (zie later).

2. Activeer MySQL- en Webserver

  • Open het XAMPP Control Panel
  • Klik op de knop Start om MySQL en Webserver te activeren (zie onderstaande afbeelding)
Arduino XAMPP

3. Maak een MySQL-gebruikersaccount aan

We maken een MySQL-account aan dat alleen verbinding mag maken vanuit localhost.

  • Zelfs als gebruikersnaam/wachtwoord uitlekken, kunnen hackers niet bij uw database tenzij ze controle over uw PC krijgen.
  • Omdat PHP en MySQL op dezelfde PC draaien, kan PHP dit gebruikersnaam/wachtwoord gebruiken om verbinding te maken met de database.

Laten we een MySQL-gebruiker aanmaken met gebruikersnaam Arduino en wachtwoord ArduinoGetStarted.com:

  • Open de Opdrachtprompt op uw PC. Sluit deze niet tot het einde van de tutorial.
  • Typ de volgende opdracht in de Opdrachtprompt:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\youruser>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>
  • Standaard heeft MySQL de root-account zonder wachtwoord. U kunt een wachtwoord toevoegen, bijvoorbeeld your-root-password, door de volgende opdracht te typen:
mysqladmin -u root password your-root-password
Command Prompt
C:\xampp\mysql\bin>mysqladmin -u root password your-root-password C:\xampp\mysql\bin>
  • Typ vervolgens de volgende opdracht om in te loggen bij MySQL:
mysql.exe -u root -p
  • Voer uw root-wachtwoord in en druk op Enter
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)]>
  • Maak het MySQL-gebruikersaccount aan met de volgende opdrachten (kopieer en plak in de prompt):
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)]>

U heeft nu succesvol een MySQL-gebruikersaccount aangemaakt. Onthoud de gebruikersnaam en het wachtwoord, deze gebruikt u in het PHP-script.

4. Maak een MySQL-database aan

Creëer een database met de naam db_arduino met de volgende opdracht:

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. Maak een MySQL-tabel aan

Maak een tabel met de naam tbl_temp door onderstaande opdrachten te kopiëren en plakken:

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. Schrijf één of meerdere PHP-bestanden

Maak een PHP-bestand met de naam insert_temp.php dat de temperatuur uit het HTTP-verzoek haalt en deze in de database invoegt.

<?php if(isset($_GET["temperature"])) { $temperature = $_GET["temperature"]; // haal temperatuurwaarde op uit HTTP GET $servername = "localhost"; $username = "Arduino"; $password = "ArduinoGetStarted.com"; $dbname = "db_arduino"; // Maak verbinding $conn = new mysqli($servername, $username, $password, $dbname); // Controleer verbinding 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"; } ?>
  • Plaats dit bestand in de map C:\xampp\htdocs
  • Zoek het IP-adres van uw PC op. Als u niet weet hoe, zoek het via Google.
  • Test de PHP-code door een webbrowser te openen (bijvoorbeeld Chrome) en deze link te openen: http://192.168.0.26/insert_temp.php?temperature=27.5 (Vervang het IP-adres door dat van uw PC).
  • De output in de webbrowser zal als volgt zijn:
MySQL Test
  • Controleer of de data in de database is opgeslagen door in Command Prompt de volgende opdracht te typen:
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]>

Zoals u ziet, is de temperatuur 27.5 opgeslagen in de database. De volgende stap is de Arduino-code te schrijven die een vergelijkbaar HTTP-verzoek naar uw PC maakt.

7. Schrijf Arduino-code

We gebruiken Arduino Uno en de Ethernet Shield of Arduino Uno R4 WiFi voor de test.

De onderstaande Arduino-code maakt een HTTP-verzoek naar uw PC om een temperatuur van 29.1°C in de database in te voegen.

Arduino-code voor Arduino Uno R4 WiFi

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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() { }

Arduino-code voor Arduino Uno/Mega en Ethernet Shield

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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() { }

Snelle stappen

  • Indien u de Ethernet Shield gebruikt, stapel deze op de Arduino Uno
  • Verbind de Ethernet-kabel met de Ethernet Shield
  • Verbind Arduino Uno met de PC via USB-kabel
  • Pas het IP-adres in de code aan naar het IP-adres van uw PC
  • Compileer en upload de code naar Arduino
  • Open de Serial Monitor
  • Resultaat in de Serial Monitor:
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  
  • Controleer of de data is opgeslagen in database met de volgende opdracht:
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]>

Zoals u ziet, is ook de temperatuur 29.1 opgeslagen in de database.

Hoe Arduino data invoegt, bijwerkt of ophaalt uit de MySQL database

In het bovenstaande voorbeeld hebben we geleerd hoe data in de MySQL database wordt ingevoegd. Voor bijwerken en ophalen van data gaat het vergelijkbaar. U hoeft alleen de MySQL-query’s in het PHP-script aan te passen. Meer leren kan via W3Schools.

Geavanceerd gebruik

Om de beveiliging te verhogen:

  • U kunt de Arduino-code aanpassen om HTTPS te gebruiken in plaats van HTTP. Zie Arduino - HTTPS
  • U kunt username en password gebruiken voor authenticatie tussen Arduino en Webserver. Zie Basic access authentication

※ Notiz:

Voor een compleet systeem met het hoogste veiligheidsniveau is meer nodig (zoals bescherming tegen MySQL-injecties, het omzetten van HTTPS naar een REST API, data in Json-formaat verzenden, enzovoorts). Deze tutorial is echter bedoeld voor beginners. We hebben het zo eenvoudig mogelijk gehouden. Na het leren van deze tutorial kunt u het verder uitbreiden.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!