Arduino Nano - MySQL

O Arduino Nano pode coletar dados de sensores e armazená-los em um banco de dados MySQL. Ele também pode recuperar dados (como comandos) do banco de dados MySQL para controlar dispositivos como LEDs, motores e atuadores.

Este tutorial vai guiar você no uso do Arduino Nano e do módulo Ethernet para interagir com um banco de dados MySQL. Especificamente, vamos abordar:

arduino MySQL

Hardware Necessário

1×Official Arduino Nano
1×Alternatively, DIYables Nano V3.0 Development Board
1×Cabo USB A para Mini-B
1×W5500 Ethernet Module
1×Ethernet Cable
1×Fios Jumper
1×Protoboard
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Arduino Nano - MySQL

Se você é novo em arquitetura de sistemas, tudo bem pensar no Banco de Dados MySQL e no Servidor MySQL como a mesma coisa por enquanto. À medida que ganhar mais conhecimento, você vai entender as diferenças entre eles.

Existem dois métodos para o Arduino Nano se comunicar com um banco de dados MySQL:

  • Conectando-se diretamente ao Servidor MySQL por uma conexão MySQL (a abordagem direta)
  • Comunicando-se com o Servidor MySQL de forma indireta por uma conexão HTTP (a abordagem indireta)

Vamos explorar a melhor opção.

O Arduino Nano interage diretamente com o Servidor MySQL

arduino diretamente com o MySQL

Isso pode parecer mais simples, mas tem várias desvantagens:

  • Permitir que uma conta de usuário MySQL acesse o banco de dados MySQL remotamente traz riscos de segurança, mesmo que a conta tenha privilégios limitados.
  • Processar dados no Arduino Nano e/ou no servidor MySQL aumenta a complexidade tanto do código do Arduino Nano quanto dos scripts MySQL, e consome muitos recursos do Arduino Nano (memória e CPU).
  • Em alguns casos, o servidor MySQL pode devolver uma grande quantidade de dados ao Arduino Nano, o que pode fazer o Nano ficar sem memória.
  • A maioria das bibliotecas MySQL disponíveis não oferece suporte a SSL/TLS, o que significa que dados sensíveis, como nomes de usuário e senhas, serão enviados em texto simples, criando um risco de segurança adicional.

O Arduino Nano interage indiretamente com o Servidor MySQL via HTTP/HTTPS

A abordagem indireta resolve todos os problemas da abordagem direta. Antes de ver como ela supera as desvantagens da abordagem direta, vamos primeiro ver como ela funciona.

Como Funciona

  • Passo 1: O Arduino Nano envia uma requisição HTTP ao servidor web.
  • Passo 2: O servidor web executa um script PHP.
  • Passo 3: O script PHP obtém os dados da requisição HTTP, os processa e interage com o banco de dados MySQL.
  • Passo 4: O script PHP processa o resultado e o envia de volta ao Arduino Nano em uma resposta HTTP.
Arduino Nano MySQL HTTP

Neste tutorial, tanto o servidor web quanto o servidor MySQL serão instalados em um PC.

Pode parecer complicado, mas não é. Veja como o método indireto resolve os problemas da abordagem direta:

  • Ao instalar os servidores MySQL e HTTP na mesma máquina, podemos restringir a conta de usuário MySQL para acessar somente o localhost. Além disso, o nome de usuário e a senha do MySQL ficam armazenados com segurança no servidor (passo 3), melhorando a segurança.
  • Os dados são processados por um script PHP (passos 3 e 4), reduzindo a carga e a complexidade tanto para o Arduino Nano quanto para o servidor MySQL. Processar dados com código PHP é muito mais fácil do que com código do Arduino Nano ou scripts MySQL.
  • O script PHP pode filtrar os dados e enviar ao Arduino Nano somente o que é necessário (passo 4), evitando sobrecarga de memória.
  • A maioria das bibliotecas Ethernet/WiFi oferece suporte a TLS/SSL, permitindo fazer requisições HTTPS. Usar HTTPS garante que os dados sejam criptografados e trocados com segurança online.

No passo 1, podemos usar um nome de usuário e uma senha diferentes para a autenticação entre o Arduino Nano e o servidor web. Por segurança, o nome de usuário e a senha HTTP não devem ser os mesmos das credenciais do MySQL.

O tutorial a seguir mostrará como usar o método indireto com o Arduino Nano e o MySQL, explicando suas muitas vantagens.

Diagrama de Ligação entre o Arduino Nano e o módulo Ethernet W5500

Diagrama de Ligação do módulo Ethernet com o Arduino Nano

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Nano e outros componentes.

image source: diyables.io

Arduino Nano - MySQL via HTTP/HTTPS

Estes são os passos que precisamos seguir:

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

Vamos fazer um passo de cada vez. Vamos percorrer o processo aos poucos.

1. Instale o servidor MySQL, o servidor Web e o PHP no seu PC

Felizmente, o pacote XAMPP inclui todos esses itens.

Só precisamos instalá-lo uma vez:

  • Baixe o XAMPP neste link
  • Execute a instalação.

Depois de instalar, você verá a pasta C:\xampp\htdocs no seu computador. É nela que você deve colocar seu código PHP (como será explicado mais adiante).

2. Ative o MySQL e o servidor Web

  • Abra o Painel de Controle do XAMPP.
  • Pressione o botão Start para ativar o MySQL e o servidor Web. (Veja a imagem abaixo.)
Arduino Nano XAMPP

3. Crie uma conta de Usuário MySQL

Vamos criar uma conta MySQL que possa se conectar ao banco de dados MySQL somente a partir do localhost:

  • Mesmo que o nome de usuário e a senha sejam expostos, os invasores não conseguirão acessar o banco de dados MySQL a menos que controlem o computador.
  • Como o PHP e o MySQL estão instalados no mesmo PC, o PHP pode usar esse nome de usuário e senha para se conectar ao banco de dados MySQL.

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

  • Abra o Prompt de Comando no seu computador. Mantenha esta janela aberta até o fim do tutorial.
  • Digite o seguinte comando no Prompt de Comando:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\YOUR_USER>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>
  • Por padrão, o MySQL tem uma conta root que não tem senha.
  • É recomendável adicionar uma senha a ela.

Defina your-root-password para a conta root digitando este 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 este comando no Prompt de Comando:
mysql.exe -u root -p
  • Digite sua senha root e pressione a tecla 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 nome de usuário Arduino e a senha ArduinoGetStarted.com copiando os comandos abaixo e colando-os 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)]>

Agora você criou uma conta de usuário MySQL. Lembre-se do nome de usuário e da senha, pois eles serão necessários para o script PHP.

4. Crie um banco de dados MySQL

Vamos gerar 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. Crie uma tabela MySQL

Vamos criar uma tabela chamada tbl_temp copiando os comandos abaixo e colando-os 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. Escreva um ou mais arquivos PHP

Crie um arquivo PHP. Dê a ele o nome insert_temp.php. Obtenha a temperatura da Requisição HTTP. Insira a temperatura 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"; } ?>
  • Deve ser "Temperature 27.5 is saved".
  • Coloque este arquivo no diretório C:\xampp\htdocs.
  • Descubra o endereço IP do seu PC. Se não souber como, pesquise no Google.
  • Para testar o código PHP, abra um navegador web (por exemplo, o Chrome) e acesse este link: http://192.168.0.26/insert_temp.php?temperature=27.5. Lembre-se de substituir o endereço IP pelo seu.
  • O navegador web deve exibir "Temperature 27.5 is saved".
Teste do Arduino Nano 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]>

É evidente que a temperatura de 27.5 está armazenada no banco de dados. A ação seguinte é escrever um código para o Arduino Nano que gere uma Requisição HTTP semelhante para o seu PC.

7. Escreva o código do Arduino Nano

Vamos usar o Arduino Nano e o Ethernet Shield para o teste.

O código do Arduino Nano abaixo envia uma requisição HTTP ao seu PC, com uma temperatura de 29.1°C, para ser inserida no banco de dados.

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

Passos Rápidos

  • Conecte o Arduino Nano ao módulo Ethernet de acordo com o diagrama de ligação acima.
  • Conecte um cabo Ethernet ao módulo Ethernet.
  • Conecte o Arduino Nano a um PC usando um cabo USB.
  • Abra a Arduino IDE no seu PC.
  • Selecione a placa Arduino Nano e a porta COM correspondente
  • Clique no ícone Libraries na barra à esquerda da Arduino IDE.
  • Pesquise “Ethernet”, depois encontre a biblioteca Ethernet de Various
  • Clique no botão Install para instalar a biblioteca Ethernet.
Biblioteca Ethernet do Arduino Nano
  • Modifique o código para refletir o endereço IP do PC.
  • Compile e faça upload do código para o Arduino Nano.
  • Abra o Serial Monitor.
  • A saída no Serial Monitor exibirá o endereço IP do Ethernet Shield.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' 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 Nano 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]>

É evidente que o banco de dados contém a temperatura de 29.1.

Como o Arduino Nano insere, atualiza ou obtém dados de/para o banco de dados MySQL

No exemplo acima, aprendemos como inserir dados em um banco de dados MySQL. Atualizar e recuperar dados do banco de dados funciona de forma semelhante. Você só precisa ajustar as consultas MySQL no script PHP. Para mais informações, você pode visitar o W3Schools.

※ Nota:

Para construir um sistema altamente seguro, precisaríamos tomar medidas extras (por exemplo, evitar injeção de MySQL, converter HTTPS em uma REST API, usar o formato JSON para os dados etc.). No entanto, este tutorial foi feito para iniciantes aprenderem com o Arduino Nano, então o mantivemos o mais simples possível. Depois de concluir este tutorial, você pode expandi-lo para adicionar recursos mais avançados.

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!