Arduino - MySQL

O Arduino pode coletar dados de sensores e armazená-los em um banco de dados MySQL. O Arduino também pode obter dados (comandos) do banco de dados MySQL e controlar LED, motor, atuador, dispositivo...

Neste tutorial, vamos aprender:

arduino MySQL

O tutorial fornece o código Arduino para dois casos:

Arduino - MySQL

Se você não tem muito conhecimento sobre a arquitetura do sistema, os dois termos MySQL Database e MySQL Server podem ser entendidos como a mesma coisa. Você vai descobrir as diferenças mais tarde, quando souber mais sobre a arquitetura do sistema.

Existem duas formas de o Arduino interagir com o banco de dados MySQL:

  • O Arduino interage diretamente com o MySQL Server por meio de uma conexão MySQL (chamada de forma direta)
  • O Arduino interage indiretamente com o MySQL Server por meio de uma conexão HTTP (chamada de forma indireta)

Vamos descobrir qual é a melhor.

O Arduino interage diretamente com o MySQL Server

arduino diretamente com o MySQL

Isso parece mais simples, mas há muitas desvantagens:

  • Isso permite que uma conta de usuário MySQL acesse remotamente o banco de dados MySQL ⇒ Isso é perigoso do ponto de vista da segurança, mesmo que privilégios limitados tenham sido concedidos à conta de usuário.
  • Os dados PRECISAM ser processados no Arduino e/ou no servidor MySQL ⇒ Isso aumenta a complexidade do código Arduino e do script MySQL. Principalmente, consome muitos recursos do Arduino (uso de memória e CPU).
  • Em alguns casos, o servidor MySQL pode retornar uma quantidade muito grande de dados para o Arduino ⇒ Isso pode fazer o Arduino ficar sem memória.
  • A maioria das bibliotecas MySQL disponíveis não suporta SSL/TLS. Os dados, incluindo usuário/senha, serão enviados em texto puro ⇒ outro problema de segurança.

O Arduino interage indiretamente com o MySQL Server via HTTP/HTTPS

Esta forma indireta resolve todos os problemas que a forma direta tem. Antes de ver como a forma indireta supera as desvantagens da forma direta, vamos ver primeiro como ela funciona

Como funciona

  • Passo 1: O Arduino faz uma requisição HTTP para o servidor web
  • Passo 2: O servidor web executa o script PHP
  • Passo 3: O script PHP obtém os dados da requisição HTTP, processa os dados e depois interage com o banco de dados MySQL.
  • Passo 4: O script PHP processa o resultado e retorna o resultado para o Arduino via resposta HTTP
Arduino MySQL HTTP

Neste tutorial, o servidor web e o servidor MySQL serão instalados no PC.

Parece complicado, mas não é. Agora vamos ver como a forma indireta supera as desvantagens da forma direta.

  • Instalando o servidor MySQL e o servidor HTTP no mesmo servidor físico, podemos limitar uma conta de usuário MySQL para acessar SOMENTE pelo localhost. Além disso, o usuário/senha da conta MySQL fica armazenado no servidor (passo 3), o que torna o sistema mais seguro.
  • Os dados são processados por um script PHP (passo 3 e passo 4). Isso reduz o trabalho e a complexidade para o Arduino e os servidores MySQL. Processar dados com código PHP é muito mais fácil do que com código Arduino e script MySQL.
  • O script PHP pode processar os dados e enviar apenas os dados necessários para o Arduino (passo 4), evitando que o Arduino fique sem memória.
  • A maioria das bibliotecas Ethernet/WiFi suporta TLS/SSL, o que nos permite fazer requisições HTTPS. Usando HTTPS, os dados são criptografados e trocados com segurança pela Internet.

No passo 1, podemos usar outro usuário/senha para fazer a autenticação entre o Arduino e o servidor web. Observe que o usuário/senha HTTP deve ser diferente do usuário/senha do MySQL por motivos de segurança.

Com essas vantagens, o restante deste tutorial vai mostrar como usar o Arduino com MySQL pela forma indireta.

Arduino - MySQL via HTTP/HTTPS

Precisamos seguir os seguintes passos:

  • Instalar o servidor MySQL, o servidor web e o PHP no seu PC
  • Ativar o MySQL e o servidor web
  • Criar uma conta de usuário MySQL
  • Criar um banco de dados MySQL
  • Criar uma tabela MySQL
  • Escrever um ou mais arquivos de script PHP
  • Escrever o código Arduino

Agora vamos fazer isso passo a passo.

1. Instalar o servidor MySQL, o servidor web e o PHP no seu PC

Felizmente, o pacote XAMPP inclui tudo isso. Só precisamos instalar uma vez

Depois da instalação, você verá a pasta C:\xampp\htdocs no seu PC. É aqui que você coloca o código PHP (veja mais adiante).

2. Ativar o MySQL e o servidor web

  • Abra o XAMPP Control Panel
  • Clique no botão Start para ativar o MySQL e o servidor web (veja a imagem abaixo)
Arduino XAMPP

3. Criar uma conta de usuário MySQL

Vamos criar uma conta MySQL que só pode se conectar ao banco de dados MySQL a partir do localhost.

  • Mesmo que o usuário/senha sejam revelados, os invasores ainda não conseguem acessar o seu banco de dados MySQL, a menos que tomem o controle do seu PC.
  • Como o PHP e o MySQL estão instalados no mesmo PC, o PHP pode usar esse usuário/senha para se conectar ao banco de dados MySQL.

Vamos criar uma conta de usuário MySQL com o usuário Arduino e a senha ArduinoGetStarted.com:

  • Abra o Prompt de Comando no seu PC. Não feche até o final do tutorial.
  • Digite o seguinte comando no Prompt de Comando:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\youruser>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>
  • Por padrão, o MySQL tem uma conta root sem senha. Você deve adicionar uma senha

(por exemplo, your-root-password) para a conta root digitando o seguinte comando no Prompt de Comando:

mysqladmin -u root password your-root-password
Command Prompt
C:\xampp\mysql\bin>mysqladmin -u root password your-root-password C:\xampp\mysql\bin>
  • Digite o seguinte comando no Prompt de Comando:
mysql.exe -u root -p
  • Digite your-root-password e pressione 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)]>
  • Crie uma conta de usuário MySQL com o usuário Arduino e a senha ArduinoGetStarted.com copiando os comandos abaixo e colando no Prompt de Comando:
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)]>

Pronto, você criou com sucesso uma conta de usuário MySQL. Memorize o usuário/senha, eles serão usados no script PHP.

4. Criar um banco de dados MySQL

Vamos criar um banco de dados chamado db_arduino digitando o seguinte comando no Prompt de Comando:

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. Criar uma tabela MySQL

Vamos criar uma tabela chamada tbl_temp copiando os comandos abaixo e colando no Prompt de Comando:

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. Escrever um ou mais arquivos PHP

Crie um arquivo PHP chamado insert_temp.php que obtém a temperatura da requisição HTTP e a insere no banco de dados.

<?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"; } ?>
  • Coloque este arquivo dentro da pasta C:\xampp\htdocs
  • Descubra o endereço IP do seu PC. Se você não sabe como fazer isso, pesquise no Google.
  • Teste o código PHP abrindo um navegador (por exemplo, o Chrome) e acessando este link: http://192.168.0.26/insert_temp.php?temperature=27.5 . Observe que você precisa substituir o endereço IP acima pelo endereço do seu PC.
  • A saída no navegador
Teste do MySQL
  • Verifique se os dados foram armazenados no banco de dados digitando o seguinte comando no Prompt de Comando:
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]>

Como você pode ver, a temperatura de 27.5 está armazenada no banco de dados. O próximo passo é escrever o código Arduino que faz uma requisição HTTP parecida para o seu PC.

7. Escrever o código Arduino

Vamos usar o Arduino Uno e o Ethernet Shield ou o Arduino Uno R4 WiFi para o teste

O código Arduino abaixo faz uma requisição HTTP para o seu PC para inserir a temperatura de 29.1°C no banco de dados

Código Arduino para Arduino Uno R4 WiFi

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/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() { }

Código Arduino para Arduino Uno/Mega e Ethernet Shield

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/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() { }

Passos Rápidos

  • Se estiver usando o Ethernet Shield, encaixe o Ethernet Shield no Arduino Uno
  • Conecte o cabo Ethernet ao Ethernet Shield
  • Conecte o Arduino Uno ao PC via cabo USB
  • Troque o endereço IP no código pelo endereço IP do seu PC
  • Compile e faça o upload do código para o Arduino
  • Abra o Serial Monitor
  • O resultado no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
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
Ln 11, Col 1
Arduino Uno on COM15
2
  • Verifique se os dados foram armazenados no banco de dados digitando o seguinte comando no Prompt de Comando:
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]>

Como você pode ver, a temperatura 29.1 está armazenada no banco de dados.

Como o Arduino insere, atualiza ou obtém dados no/do banco de dados MySQL

No exemplo acima, aprendemos como inserir dados no banco de dados MySQL. Para atualizar e obter dados do banco de dados, é parecido. Você só precisa alterar as consultas MySQL no script PHP. Você pode aprender mais no W3Schools

Uso Avançado

Para aumentar a segurança

※ Nota:

Para criar um sistema completo com o mais alto nível de segurança, precisamos fazer mais (como prevenção de MySQL injection, transformar o HTTPS em REST API, usar o formato Json para os dados ...). No entanto, este tutorial é dedicado a iniciantes que estão aprendendo Arduino. Nós o fizemos o mais simples possível. Depois de aprender este tutorial, os usuários podem expandi-lo.

Vídeo

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!