ENG-1450
Microcontroladores e
Sistemas Embarcados
– NodeMCU –
[Link]
Roteiro
Parte A
[Link] – Hw + Sw
[Link] de funções
[Link]ção à linguagem LUA
[Link] - A
Parte B
[Link] de Interface Web
[Link] de uso
[Link] - B
NodeMCU – HW + SW
NodeMCU DevKit
Flash Rst
ESP8266 12E
Radio
MCU
WIFI
USB → Serial
Regulator
5v → 3.3v Memory
NodeMCU
ESP8266 12E
NodeMCU – Pin definition
Programação – ESP8266
● Ambientes + Biblioteca do fabricante
– Diversos ambientes de programação → ?
● Biblioteca do fabricante (Espressif)
– Timer, Sleep Mode, Task, etc..
– Flash memory
– WI-FI – AP, Station, SNTP, WPA2
– TCP/IP, UDP/IP
– GPIO, ADC, UART/Serial, I2C, PWM
Ambientes de programação
SDKs para ESP8266
● C ● Basic
– Espressif SDK – Esp8266 BASIC
– Arduino – Zbasic for ESP8266
● Python ● JavaScript
– MicroPython – Espruino
● Lua
– NodeMCU
– LuaNode
Obs: Alguns SDKs são mais instáveis que outros.
ESPlorer - “IDE” para nodeMCU
Conexão
USB
Comandos
disco interno
Saída da execução
Área de edição
Comandos salvar+upload
Conexão USB
Porta USB selecionada Verifica portas disponíveis
Selecionar Baudrate
115200
Abre ou Fecha a conexão USB
Obs: Para evitar erro de time-out na conexão, ao conectar o ESPlorer deve-se apertar o
botão de reset no NodeMCU.
Biblioteca NodeMCU
Lua 5.1.4
NodeMCU SDK
[Link]
Módulos
NodeMCU SDK
[Link]
● Módulos instalados no NodeMCU do LCA
– GPIO
● ADC, GPIO, PWM
– Rede e Comunicação
● MQTT, HTTP, Net(TCP,UDP), WiFi
– Interfaces seriais
● UART, SPI, 1-wire, I²C
– Suporte
● Node, Timer, File, Bit
– Sensor Humidade/Temperatura DHT11
● DHT
Exemplos de uso
-- Configura pin 1 como output e escreve valor alto
pin = 1
[Link](pin, [Link])
[Link](pin, [Link])
– - Configura WIFI como Ponto de Acesso (AP)
[Link]([Link])
[Link]({ssid=” RedeTeste” ,pwd=” 12345678” })
[Link]({ip=” [Link]” ,netmask="[Link]",gatew
ay=” [Link]” })
Linguagem LUA
[Link]
Learn Lua in 15 Minutes
[Link]
[Link]
Reference Manual (5.1)
[Link]
Book Programming in Lua (5.0)
[Link]
Google....
Learn Lua in 15 Minutes
[Link]
Tarefas – Parte A
1. Timer + Print
• [Link]() + print()
2. LED Blink
• [Link]() + [Link]() + [Link]()
3. Sensor de Temperatura e Humidade DHT11
– [Link]() + [Link]() 3.3v
+ print()
Web Server no NodeMCU
● Servidor para conexões TCP/HTTP.
● Permite conexões de navegadores Web.
● Quantidade limitada a 5 conexões.
● A aplicação tem que processar a requisição
HTML e gerar uma página HTML.
● Qualquer uso exagerado do sistema implica
em falhas e estouro de memória.
● Ideal para páginas simples e acesso de um
usuário.
Facilitador de
Interface Web
Controles pré-definidos
para facilitar as
construções HTML.
Facilitador de
Interface Web
[Link](label,text)
[Link]()
[Link](label,id,text_true,text_false)
[Link](label, valor, formato, unidade)
html.pin_wr(label,pin,text_high,text_low)
html.pin_rd(label,pin,text_high,text_low)
[Link](label,optTable,id)
[Link](label,id, min, max)
[Link](label,id,size)
Facilitador de
Interface Web
[Link](label,text) → Imprime label+text
[Link]() → Imprime o relógio interno e memória restante.
[Link](label,id,text_true,text_false) → Controle para variável True/False
[Link](label, valor, formato, unidade) → Imprime valor+unidade do sensor
html.pin_wr(label,pin,text_high,text_low) → Controle de High/Low diretamente no pino
html.pin_rd(label,pin,text_high,text_low) → Exibe o valor do pino.
[Link](label,optTable,id) → Seleção de um item de uma lista
[Link](label,id, min, max) → Seleção de um valor dentro de um faixa
[Link](label,id,size) → Entrada de valor digitado.
Caracteres alfanuméricos e ( ) [ ] : ; . , - _ *
Uso dos controles
Por exemplo, a definição do seguinte controle:
page = page .. [Link]("Teste",{"Opt1","Opt2"},"myOpts");
espera a função myOpts dentro da tabela [Link]
[Link] = {
myOpts = function(value)
print("myOpt:", value);
end,
}
Facilitador de Interface Web
● Programa principal do framework:
– [Link]
– Obs: Normalmente não deve ser alterado pelo usuário
● Usuário define um módulo para ser usado pelo “framework”.
– [Link]
● Arquivos auxiliares para criação/conexão da/na rede
– [Link] ou [Link]
– Contém a conexão do AP ou da Station.
– A configuração fica no [Link]
Componentes do [Link]
local user = {}
[Link]={ssid="LCA-10",pwd="12345678",ip="[Link]"}
-- [Link]={ssid="terra_iot",pwd="projeto_iot"}
function [Link]()
...
end
function [Link](html)
...
end
[Link] = {
newRequest = function() … end,
setPin = function(pin,value) … end,
… – – Outras funções dos controles do usuário.
}
return user
Ações/Funções dos controles
[Link](label,text)
[Link]()
[Link](label,id,text_true,text_false) → id(value); value: 0 ou 1
[Link](label, valor, formato, unidade)
html.pin_wr(label,pin,text_high,text_low) → setPin(pin,value); pin: #pin; value: 0 ou 1
html.pin_rd(label,pin,text_high,text_low)
[Link](label,optTable,id) → id(value); value: Posição da opção na lista
[Link](label,id, min, max) → id(value); value: valor selecionado
[Link](label,id,size) → id(value); value: Texto digitado
Obs: Id(value) → id = function(value) …. end;
Exemplo simples para
[Link]
local user = {}
[Link]={ssid="LCA-10",pwd="12345678",ip="[Link]"}
-- Configuração do pino do LED
local gbl={ledPin = 3}
function [Link]()
-- ----------------------------------------------------------
-- Configurações/Inicialização dos pinos utilizados
-- ----------------------------------------------------------
[Link]([Link], [Link])
[Link]([Link], [Link]);
end
-- ----------------------------------------------------------
-- Definição/Customização da Interface WEB
-- ----------------------------------------------------------
function [Link](html)
local page="";
page = page .. [Link]();
page = page .. html.pin_wr("Led 1",[Link], "ON", "OFF");
return page;
end
-- ----------------------------------------------------------
-- Tratadores dos comandos do usuário para os select/options, sliders e setPin
-- ----------------------------------------------------------
[Link] = {
-- Função chamada após cada comando select/options, sliders e setPin.
-- É executado antes de montar a página HTML
newRequest = function()
-- Faz nada...
end,
-- Função chamada para todos setPins
setPin = function(pin,value)
[Link](pin,value);
print("setPin_"..pin .." = " .. value);
end,
}
return user;
Configuração da comunicação
entre o NodeMCU e o PIC
Baudrate da USB no NodeMCU
● Só tem uma UART. No reset aponta para USB.
● O default do NodeMCU é 115200.
● O NodeMCU tenta identificar diferentes baudrates logo
após o reset.
● Baseado nas mensagens enviadas logo após o reset o
novo baurate é descoberto.
● Por exemplo, pode-se acionar o botão “Heap” no
ESPlorer até o NodeMCU responder um texto legível.
PIC + NodeMCU
● O maior valor de baudrate no PIC que não dá
erro de comunicação é 57600.
● Integração NodeMCU ↔ PIC via UART/Serial
– Conectar o Tx/Rx no Rx/Tx:
● PIC:Tx(C6) → NodeMCU:Rx2(D7)
● PIC:Rx(C7) → NodeMCU:Tx2(D8)
● PIC:GND → NodeMCU:GND
– Configurar o ESPlorer, o PIC e o NodeMCU com o
mesmo baudrate, por exemplo 57600.
– Na conexão do ESPlorer, fazer o reset no
NodeMCU e acionar o “Heap” até acertar o texto.
PIC + NodeMCU
● Programação no NodeMCU
– [Link](1) e [Link](0)
● 1 - Redireciona a UART da USB para os pinos D7 e D8.
● 0 – Desfaz o redirecionamento.
– [Link](0,57600,8,uart.PARITY_NONE,uart.STOPBITS_1,1)
● Configura a UART
– printOn() e printOff()
● Ativa/Desativa a saída do print().
– [Link](0,text)
● Escreve text na UART selecionada.
PIC + NodeMCU
● Programação PIC
– UART1_Init(57600);
● Inicializa a UART
– UART1_Data_Ready()
● Verifica se existe alguma byte para ser lido
– UART1_Read()
● Lę um byte da UART
Tarefas – Parte B
1. Controle WEB
• Ligar/Desligar LED
• Ativar/Desativar Blink
• Alterar frequência do Blink
2. Controle WEB + PIC
• NodeMCU – enviar comando via UART.
• PIC – Imprimir comando da UART no LCD