Um projeto usando o ESP8266 ESP-12E Nodemcu e um Globo Terrestre de Mesa.
🟢 O Globo Terrestre IoT usa de várias tecnologias sem fio e web para ser totalmente acessível a partir de qualquer dispositivo. Controlado a partir de WebApp com comunicação via WebSocket ele tem uma resposta quase em tempo real do comando enviado pelo WebApp.
🟤 Este projeto foi construido sobre minha curiosidade de entender melhor a comunicação por Wi-Fi dos microcontroladores ESP8266. E por meio dela realizar a integração desse microcontrolador com Windows, OSX, Linux, iOS e Android.
🔵 Todo algoritmo foi desenvolvido para ficar armazenado na memória do ESP8266 bem como o WebSite Estático. O ESP8266 quando conectado a uma rede, ele deixa acessivel na sua porta 80 o WebSite e API, assim apenas acessando o IP ou o mDNS dele é possivél obter a resposta de ambos os serviços. Ele deixa acessivél também em sua porta 81, o WebSocket que recebe mensagens para o posicionamento do Globo Terrestre.
🟣 O ESP8266 possui 4MB de memória FLASH, neste projeto ela foi particionada de forma que 1MB seja para o web server. Assim ele não possui memória suficiente para salvar todas as bibliotecas usadas pelo WebApp, somente as essenciais estão salvas, então é necessário que exista uma conexão com a internet para o dispositivo que acessou ao Webapp baixar essas bibliotecas do repositorio oficial online.
🟡 Foi configurado neste repositório a integração contínua usando o GitHub Actions, onde é refeito o Build
a cada atualização. Mais detalhes de cada Build aqui: Actions globo-terrestre-iot
WebApp Dispositivos Móveis
WebApp Navegador PC
Documentação da API no padrão OpenAPI e do WebSocket no padrão AsyncAPI
- Globo Terrestre IoT
- Imagens
- Tecnologias exploradas no projeto:
- Resumo sobre as tecnologias usadas
- Como usar
- Estrutura do projeto
- Pastas
- Web Server local para desenvolvimento do File System do ESP8266
- Visualização online do File System do ESP8266 usando raw git
- Sobre o File System do ESP8266 - Website Estático (HTML, CSS e Javascript)
- Documentação da API e do WebSocket implementados no ESP8266
- Sobre o Firmware do ESP8266 (C++)
- lista de tarefas
- Alguns comandos
- Autor
- Atribuição
- Licença
- Wi-Fi
- IP e Porta
- Atualização Over-The-Air (OTA)
- Transmission Control Protocol (TCP)
- User Datagram Protocol (UDP)
- Hypertext Transfer Protocol (HTTP)
- WebSocket
- multicast DNS (mDNS)
Tecnologia | Ultilidade no projeto |
---|---|
Wi-Fi | Troca de informações sem fio entre dispositivos. |
IP e Porta | Endereçar o dispositivo na rede e chamar serviço sendo executado em uma porta. |
OTA | Atualização/Reprogramação do ESP8266 de forma remota usando apenas o Wi-Fi. |
UDP | Protocolo usado para debugar e obter remotamente logs do ESP8266. |
HTTP | Protocolo usado nas requisões da API implementada e páginas hospedadas no ESP8266. |
WebSocket | Usado para realizar uma conexão quase em tempo real de baixa latência entre o cliente e o ESP8266. |
mDNS | Para não digitar sempre o IP do ESP8266, ultiliza-se o mDNS. Ex: http://globo.local |
Camada | Protocolos |
---|---|
Aplicação | HTTP, WebSocket, mDNS ... |
Transporte | TCP, UDP |
Rede | IP |
Interface de Rede | Ethernet, Wi-Fi ... |
O Over-The-Air não é um protocolo e sim uma forma de enviar um Firmware para o dispositivo sem necessidade de cabos. O OTA permite reprogramar o microcontrolador através da rede Wi-Fi sem a necessidade de removê-lo do local que ele está instalado.
O protocolo TCP é mais utilizado por oferecer confiabilidade durante a comunicação. O TCP garante que os pacotes de dados trafegados permaneçam inalterados e que cheguem na mesma ordem com que foram enviados.
O UDP é um protocolo que não garante a chegada dos dados. Por esse motivo o UDP é mais rápido que o TCP, pois não realiza a verificação de erros nos pacotes de dados.
O HTTP é um protocolo unidirecional (a transmissão ocorre só de uma ponta para a outra), onde o cliente envia a requisição e o servidor retorna a resposta, finalizando ali a conexão.
WebSocket é um protocolo que permite a criação de um canal de comunicação cliente-servidor com transmissão bidirecional onde ambos os lados (cliente e servidor) podem transmitir dados simultaneamente. WebSocket veio para suprir as deficiências do protocolo HTTP para esse objetivo.
O mDNS é um protocolo DNS Multicast. Um "multicast" repassa a mesma mensagem para vários pontos em uma rede. O mDNS é um método para descoberta de vizinhos de uma rede, indicado para redes pequenas sem servidores DNS próprios.
O projeto foi desenvolvido usando o PlatformIO IDE no VS Code.
- Instale o
VS Code
code.visualstudio.com - Instale a extensão do
PlatformIO IDE
platformio.org/install/ide?install=vscode - Na barra esquerda do
VS Code
irá aparecer o icone doPlatformIO IDE
, clique nele. - Dentro do
PlatformIO
, acessePlatforms
e instale a plataformaEspressif 8266
platformio.org/platforms/espressif8266
- Baixe o ZIP do projeto no GitHub e extraia em alguma pasta.
- Na barra esquerda do
VS Code
clique no icone doPlatformIO IDE
- Abra a Home do
PlatformIO
, pressione emOpen Project
e selecione a pasta onde o projeto foi extraido. - O arquivo principal do projeto é o
src/main.cpp
- Crie um arquivo dentro da pasta
include
chamadoglobeSecrets.h
- Cole nele o conteudo do arquivo de exemplo
globeSecrets.h.example
- Preencha com as credenciais de acesso da sua rede Wi-Fi
- Na barra esquerda do
VS Code
clique no icone doPlatformIO IDE
- Pressione
Build
Passos para carregar o programa pela primeira vez no ESP8266.
- Para carregar o projeto pela primeira vez no ESP8266 é necessário uma conexão USB. Pois o OTA ainda não está em funcionamento.
- Para a primeira vez também é necessário comentar a linha
upload_port = ...
do arquivoplatformio.ini
- Na barra esquerda do
VS Code
clique no icone doPlatformIO IDE
, pressioneUpload
- Aguarde o processo concluir
- Na barra esquerda do
VS Code
clique no icone doPlatformIO IDE
, pressioneUpload File System image
- Aguarde o processo concluir
Passos para carregar o programa no ESP8266.
- Certifique-se que a linha
upload_port = ...
do arquivoplatformio.ini
contém o IP do ESP8266 - Na barra esquerda do
VS Code
clique no icone doPlatformIO IDE
, pressioneUpload
- Aguarde o processo concluir
- Se houver alguma alteração na pasta data (
File System do ESP8266
) execute o passo 5. Caso contrário não é necessário. - Na barra esquerda do
VS Code
clique no icone doPlatformIO IDE
, pressioneUpload File System image
- data ➡️ Esta pasta é compilada e gravada na memória do ESP8266 como o File System dele.
- docs ➡️ Esta pasta contém arquivos para auxiliar na descrição do repósitorio no GitHub.
- include ➡️ Esta pasta inclui todos os Arquivos de cabeçalho (Header files) do projeto. Esses arquivos contém protótipos de funções e constantes.
- lib ➡️ Esta pasta inclui todos arquivos das bibliotecas (Libraries) usadas no projeto. Como AccelStepper, ArduinoJson e WebSockets
- scripts ➡️ Esta pasta contém scripts para auxiliar no projeto, em Javascript e
Python. Por exemplo, possui o script para iniciar um servidor UDP, possui o script para gerar a documentação do AsyncAPI 2.0. Mais detalhes em scripts/node/ e scripts/python/ - server ➡️ Esta pasta contém uma aplicação em Node.js que inicia um servidor web estático com o conteúdo da pasta
data
- src ➡️ Contém toda a implementação do projeto, sendo o arquivo
main.cpp
o principal.
O File System do ESP8266 é um Website Estático, então podemos executá-lo localmente para desenvolvermos e testarmos.
Node.js: Leia as instruções aqui server/
Python
# Acesse a pasta contendo o Filesystem do ESP8266
cd data
# Veja a versão do python
python -V
# Se a versão do Python retornada acima for 3.X
python3 -m http.server
# No windows, tente "python" em vez de "python3"
# Se a versão do Python retornada acima for 2.X
python -m SimpleHTTPServer
O File System do ESP8266 é um Website Estático, então podemos visualizá-lo online usando um raw git. Qualquer um dos links abaixo exibirá o conteúdo da pasta data
do repositório no GitHub.
OBS: Você receberá o erro "Mixed content blocked"
se tentar enviar alguma requisicao para o ESP8266 a partir de uma conexão HTTPS. Para a visualização funcionar, o git raw deve usar HTTP.
http://ghcdn.rawgit.org/guilhermerodrigues680/globo-terrestre-iot/master/data/index.html
http://raw.githack.com/guilhermerodrigues680/globo-terrestre-iot/master/data/index.html
A pasta data
do projeto é o File System do ESP8266, sempre que uma requisicao chega, ele verifica se há alguma rota para aquela requisição, se não houver, ele checa se tem um arquivo com essa rota. Se não encontrar nem a rota e nem o arquivo retorna um 404 - Not Found.
Por exemplo:
- O arquivo
data/about.html
é servido sempre que a rota/about.html
é chamada, como emhttp://192.168.2.108/about.html
O código possui comentários explicativos em todas as partes que juguei necessário.
A API implementada no ESP8266 foi documentada no padrão OpenAPI 3.0, ela está acessivel na rota /openapi/index.html
do File System do ESP8266
O WebSocket implementado no ESP8266 foi documentado no padrão AsyncAPI 2.0, ela está acessivel na rota /asyncapi/index.html
do File System do ESP8266
O firmware (programa) desenvolvido para o ESP8266 foi dividido em vários modulos e cada modulo pertece a uma namespace. Assim cada implementação do programa tende a ser o mais idenpendete possível.
O padrão de nomeclatura usado foi a de o nome do arquivo ser o mesmo do namespace. Ex: globeCoordinates.cpp
, globeCoordinates.h
e namespace globeCoordinates
Para acessar o namespace, primeiro inclui-se o arquivo de cabeçalho e em seguida usa nomeDoNamespace::função
// inclusão do cabeçalho
#include "globeWebSocket.h"
// Chamada da função
globeWebSocket::startWebSocket();
O código possui comentários explicativos em todas as partes que juguei necessário.
- Implementar PWA no Globo Terrestre IoT
- Rota para desligar o sistema
- Desligar Motor após movimentar
- Melhorar documentação
platformio device list --mdns
platformio run --target uploadfs
Guilherme Rodrigues |
Você pode verificar a licença completa aqui
Este projeto está licenciado nos termos do MIT License.