ESP 32 PROGRAMAÇÃO
https://wokwi.com/
ESP 32
ESP 32
TIPOS DE DADOS
Em microcontroladores que possui baixa capacidade de memória a escolha dos tipos de dados são
Importantes para a otimização de espaço de armazenamento e processamento.
TIPO FAIXA DE VALORES TAMANHO EM BYTES
signed char -128 a 127 1
char 0 a 255 1
int -32.768 a 32767 2
unsigned int 0 a 65.535 2
unsigned long int 0 a 4.294.967.295 4
long int -2147483647 a 2147483647 4
float 1.17549e-38 a 3.40282e38 4
double 2.23e-308 a 1.7e308 8
long double 2.23e-308 a 1.7e308 8
ESP 32 PROGRAMAÇÃO
Pisca LED
#define LED 2
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
COMANDOS CONDICIONAIS - IF
if (condição) comando;
O comando IF só é ativado em uma condição verdadeira, caso contrário o comando não tem efeito e o
programa lê a próxima linha. Para a linguagem C a condição verdadeira é nível 1 é falso é 0
1
IF
0 COMANDO
COMANDOS CONDICIONAIS - IF
Exemplo de um botão de um controle remoto
chave=digitalRead(terminal);
1 if (chave)
CHAVE
else 0 LED LIGADO digitalWrite(led, HIGH)
LED DESLIGADO digitalWrite(led, LOW)
ESP 32 PROGRAMAÇÃO
#define led 4 LIGA E DESLIGA
#define terminal 14
int chave;
void setup()
{
pinMode(led, OUTPUT);
pinMode(terminal, INPUT_PULLUP);
void loop()
{
chave=digitalRead(terminal);
if(chave){digitalWrite(led, LOW);}
else {digitalWrite(led, HIGH);}
}
MICROCONTROLADORES – PORTAS
Nível 0 em DDRB Nível 1 em DDRB
libera este buffer e libera este buffer e
temos a porta temos a porta
configurada como configurada como
entrada. saída.
Configuramos o
PULL UP para
garantir o nível
baixo na porta
PTB, pode enviar um
nível lógico para saída
do microcontrolador ou
receber um nível e
enviá-lo para CPU
Para fazer a configuração da porta devemos usar o DDR antes de enviar um comando PT.
DDRA, estaremos configurando a porta A do microcontrolador
DDRB, estaremos configurando a porta B do microcontrolador
PTA, estaremos enviando (1) ou recebendo (0) uma informação pela porta A
PTB, estaremos enviando (1) ou recebendo (0) uma informação pela porta B
ESP 32 PROGRAMAÇÃO
#define led 4 LIGA E DESLIGA SEM PULLUP GERA INSTABILIDADE NA SAIDA
#define terminal 14
int chave;
void setup()
{
pinMode(led, OUTPUT);
pinMode(terminal, INPUT);
void loop()
{
chave=digitalRead(terminal);
if(chave){digitalWrite(led, LOW);}
else {digitalWrite(led, HIGH);}
}
ESP 32 PROGRAMAÇÃO
#define led 4 LIGA E DESLIGA COM PULLUP GERA ESTABILIDADE NA SAIDA
#define terminal 14
int chave;
void setup()
{
pinMode(led, OUTPUT);
pinMode(terminal, INPUT_PULLUP);
void loop()
{
chave=digitalRead(terminal);
if(chave){digitalWrite(led, LOW);}
else {digitalWrite(led, HIGH);}
}
ESP 32 PROGRAMAÇÃO
#define led 4 LIGA E DESLIGA COM INPUT E RESISTOR GERA ESTABILIDADE NA SAIDA
#define terminal 14
int chave;
void setup()
{
pinMode(led, OUTPUT);
pinMode(terminal, INPUT);
void loop()
{
chave=digitalRead(terminal);
if(chave){digitalWrite(led, LOW);}
else {digitalWrite(led, HIGH);}
}
#define led 4 ESP 32 PROGRAMAÇÃO
#define terminal 14
int chave;
Utilização do modo monitor como ponta de prova
void setup() Interessante para analisar o comportamento do programa
{
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(terminal, INPUT);
void loop()
{
chave=digitalRead(terminal);
if(chave){digitalWrite(led, LOW);}
else {digitalWrite(led, HIGH);}
Serial.println("Condição da chave");
Serial.println(chave);
}
COMANDOS REPETIÇÃO – FOR
for (inicialização;condição;incremento) comando;
Para trabalharmos com o FOR, adotamos uma variável o qual fica na CONDIÇÃO, onde esta
pode ser INCREMENTADA (acima ou abaixo – X++ ou X--) o qual fica sempre comparada
com a INICIALIZAÇÃO. Quando este processo estiver em igualdade a CONDIÇÃO com a
INICIALIZAÇÃO o laço FOR terá terminado, mas enquanto isto não acontecer ele ficará em
seu laço e com o devido COMANDO funcionando.
INCREMENTO
COMANDO
? N
INICIALIZAÇÃO = CONDIÇÃO
S
#define LED 4
int x; ESP 32 PROGRAMAÇÃO
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
for (x=0;x<5;x++)
{digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);}
delay(3000);
for (x=0;x<10;x++)
{digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);}
delay(3000);
}
COMANDOS REPETIÇÃO – WHILE
WHILE
While é utilizado para processos de repetição quando
não sabemos quantas vezes deve ser repetido.
Uma condição externa irá informar quando deve 0
acontecer a finalização do while CONDIÇÃO
FIM DO WHILE
1
COMANDOS
#define led 4 ESP 32 PROGRAMAÇÃO
#define terminal 14
int chave;
void setup()
{
pinMode(led, OUTPUT);
pinMode(terminal, INPUT_PULLUP);
}
void loop()
{
while(digitalRead(terminal)==HIGH)
{
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
delay(500);
}
digitalWrite(led, LOW);
}
COMANDOS CONDICIONAIS – SWITCH CASE
switch (expressão)
{
case (expressão 1): comando; comando; comando n; break;
case (expressão 2): comando; comando; comando n; break;
case (expressão n): comando; comando; comando n; break;
default: comando; comando; comando n;
}
CASE (E1) COMANDOS BREAK
SWITCH
CASE (E2) COMANDOS BREAK
CASE (En) COMANDOS BREAK
DEFAULT
Este comando permite a escolha de uma opção entre várias variáveis.
Uma vez escolhida é comparada a SWITCH com o devido CASE. Uma vez escolhido,
os comandos contidos no CASE serão executados até a chegada do comando
BREAK. Logo em seguida retorna novamente ao comando SWITCH para novo
COMANDOS teste. Caso não exista nenhuma relação do SWITCH com os CASES disponíveis o
programa irá para o comando DEFAULT e executará um ou mais comandos
determinado pelo programador
COMANDOS CONDICIONAIS – SWITCH CASE
TECLADO
controle=1;
CASO 1 COMANDOS BREAK
digitalWrite(led_vermelho,HIGH);
digitalWrite(led_verde,LOW);
SWITCH
CASO 2 COMANDOS BREAK
digitalWrite(led_vermelho,LOW);
digitalWrite(led_verde,HIGH);
digitalWrite(led_vermelho,LOW);
DEFAULT
digitalWrite(led_verde,LOW);
BREAK
# define led_vermelho 4 ESP 32 PROGRAMAÇÃO
# define led_verde 2
int controle;
void setup() {
pinMode(led_vermelho, OUTPUT);
pinMode(led_verde, OUTPUT);}
void loop() {
controle=1;
switch(controle) {
case 1:
digitalWrite(led_vermelho, HIGH);
digitalWrite(led_verde, LOW);
break;
case 2:
digitalWrite(led_vermelho, LOW);
digitalWrite(led_verde, HIGH);
break;
default:
digitalWrite(led_vermelho, LOW);
digitalWrite(led_verde, LOW);
break;}}
Conversor Analógico / Digital – A/D
Um conversor A/D se faz necessário para processar
as informações dentro do Microcontrolador (Digital –
10100...).
O processo se dá desta forma:
1. Amostragem:
Analisa o sinal ponto a ponto em um intervalo;
2. Quantização:
Adequa esse ponto ao nível de tensão mais
próximo – levando em conta a quantidade de
bits;
3. Codificação:
A sequencia binaria para cada nível de tensão
representada no processo de quantização.
MICROCONTROLADORES – CONVERSOR ANALÓGICO / DIGITAL
CHANNEL SELECT
Responsável para habilitar os pinos
do HC para fazer a conversão A/D
ADC
Conversor Analógico Digital de 8 bits
ADC DATA REGISTER
Local onde ficará registrado o valor
Convertido em HEXADECIMAL
CLOCK GENERATOR
Responsável pela velocidade de
conversão do ADC
INTERRUPT LOGIC
Ao termino da conversão é habilitada
uma interrupção avisando que o dado
esta no ADC DATA REGISTER
PORTA ANALÓGICA
Portas de entrada analógicas são importantes para adquirir valores como temperatura, pressão, luminosidade
e outros valores que não são de estado binário.
O Arduino possui 18 entradas analógicas com resolução de 12 bits = 2^12 = 4096
O valor de conversão analógica é de 4096
A tensão de entrada máxima de entrada desta porta é de 3,3V
Portanto teremos uma resolução de:
VR = 3,3/4096 = 805 uV
PORTA ANALÓGICA
Mapeamento do ADC 1
•ADC1_CH0 >>>GPIO36
•ADC1_CH1 >>>Não disponível nesta placa Devkit DoIT ( versão de 30 pinos)
•ADC1_CH2 >>> NA
•ADC1_CH3 >>>GPIO39
•ADC1_CH6 >>>GPIO34
•ADC1_CH7 >>> GPIO35
•ADC1_CH4 >>> GPIO32
•ADC1_CH5 >>>GPIO33
PORTA ANALÓGICA
Mapeamento do ADC 1
•ADC2_CH0 >>>GPIO0
•ADC2_CH1 >>> Este canal não está disponível na placa Devkit DOIT
•ADC2_CH2 >>>GPIO2
•ADC2_CH3 >>> GPIO15
•ADC2_CH4 >>> GPIO13
•ADC2_CH5 >>> GPIO12
•ADC2_CH6 >>>GPIO14
•ADC2_CH7 >>> GPIO27
•ADC2_CH8 >>> GPIO25
•ADC2_CH9 >>> GPIO26
PORTA ANALÓGICA
PORTA ANALÓGICA
# define entrada_analogica 1 // entrada analógica
# define led 2
# define adc_referencia 3300.0 // tensão de referência = 3,3v
# define adc_resolucao 4096.0 // pino do conversor A/D (ADC0)
int valor_pot;
float mili_volts;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(115200);
}
void loop() {
//leitura da tensão do potênciometro
valor_pot=analogRead(entrada_analogica);
// converter o valor do potênciometro em milivolts
mili_volts=valor_pot*(adc_referencia/adc_resolucao);
digitalWrite(led, HIGH);
delay(mili_volts);
digitalWrite(led, LOW);
delay(mili_volts);
Serial.println("tensão em mili volts");
Serial.println(mili_volts);
}
VISUAL STUDIO CODE – ESP32
Visual Studio Code é um editor de código-fonte desenvolvido pela Microsoft.
Pode escrever em diversas linguagens
- C/C++
- Python
- JavaScript e outras
Pode ser instalado nos sistemas operacionais
- Windows
- Linux
- Mac Os
Tamanho do arquivo 57 MB
VISUAL STUDIO CODE – ESP32
Instalação do Visual Studio Code
Acessar o link abaixo e fazer o download para a versão do Windows
https://code.visualstudio.com/download
Durante a instalação confirme as configurações de tela como mostra a sequencia apresentada nos
próximos slides.
VISUAL STUDIO CODE – ESP32
VISUAL STUDIO CODE – ESP32
VISUAL STUDIO CODE – ESP32
Ao termino da instalação, irá apresentar a tela inicial do Visual Studio Code
VISUAL STUDIO CODE – ESP32
Instale pela Microsoft Store a versão mais recente do Python (opcional para quem desejar programar em Python)
VISUAL STUDIO CODE – ESP32
Para programar em ESP32 ou Arduino é necessário instalar a extensão PlatformIO IDE
1. Clique em Extensions
2. Busque por PlatformIO IDE
3. Selecione a primeira opção
4. Clique em Install
VISUAL STUDIO CODE – ESP32
Após a PlatformIO IDE estiver instalada, verifique se a mesma está habilitada (enable)
VISUAL STUDIO CODE – ESP32
Para acessar a extensão da Plataform IO IDE clique na casinha (rodapé) ou no ícone do E.T.
VISUAL STUDIO CODE – ESP32
Conecte o seu ESP32 na porta USB e perceba que um LED vermelho irá ligar.
Este LED vermelho informa que o ESP32 está energizado.
Mas não existe nenhum programa ainda no ESP32.
Nos próximos passos será apresentado as configurações necessárias para a programação do ESP32
ATENÇÃO!!! Existem cabos que energizam o ESP32, mas não transmitem os dados do programa
VISUAL STUDIO CODE – ESP32
Criar um programa para piscar o LED 2 Azul que existe na placa do ESP32
Na extensão do PlatformIO IDE clique em New Project
VISUAL STUDIO CODE – ESP32
Ao criar um novo projeto, devemos dar um nome e localizar a placa.
- O nome fica por escolha do programador -> Sugestão “Blink_LED”
- A placa deve ser DOIT ESP32 DEVKIT V1
- O framework será ARDUINO
VISUAL STUDIO CODE – ESP32
Ao acessar o nome do projeto do programa é possivel ver todas as opções de arquivos.
VISUAL STUDIO CODE – ESP32
O próximo procedimento é configurar a taxa de transmissão de dados.
Isto é importante para transmitir o programa criado no Visual Studio Code para a placa do ESP32
Acesse o platformio.ini e inclua o monitor_speed = 115200
VISUAL STUDIO CODE – ESP32
Para localizar onde será desenvolvido o programa deve-se ir em src e em seguida main.cpp
É possível perceber que não existe nenhum programa neste momento.
Somente a área de configuração void setup () e o laço principal void loop ()
VISUAL STUDIO CODE – ESP32
Escreva o programa exemplo para testar o LED azul da placa piscar
VISUAL STUDIO CODE – ESP32
Compilação
O próximo passo é compilar
o programa para ver se não
existe problemas de sintaxe
Clique no rosto do E.T.
Acesse PROJECT TASKS
Clique em BUILD
Caso tudo der certo a tela
terminal irá mostrar o resultado
abaixo.
VISUAL STUDIO CODE – ESP32
Carregamento
O próximo passo é carregar
o programa para a placa do ESP32
Clique no rosto do E.T.
Acesse PROJECT TASKS
Clique em UPLOAD
Caso tudo der certo a tela
terminal irá mostrar o resultado
abaixo.
VISUAL STUDIO CODE – ESP32
Monitor
O próximo passo é ativar o monitor
Ele irá apresentar no terminal
em que passo o programa está
sendo executado
Clique no rosto do E.T.
Acesse PROJECT TASKS
Clique em MONITOR
Caso tudo der certo a tela
terminal irá mostrar o resultado
abaixo.
VISUAL STUDIO CODE – ESP32
Programa carregado na placa
Feito todo este procedimento,
o Visual Studio Code se encarrega
de fazer a carga do programa na
placa do ESP 32.
A figura ao lado mostra o LED 2 azul
operando em modo pisca pisca.
PROTOCOLO MQTT
(Message Queuing Telemetry Transport)
O protocolo MQTT realiza o transporte de dados por meio de enfileiramento sendo utilizado em telemetria.
O seu conceito vem da comunicação M2M (Machine To Machine).
O MQTT precisa de pouco processamento de CPU e pouca memória RAM para enviar os dados.
Seu consumo de largura de banda é muito baixo durante a transmissão dos dados.
O consumo de energia no processo de transmissão é baixo, aumentando a durabilidade das baterias
Pode ser usado em diversas linguagens de programação – C, C++, Python e Java.
Utilizado em aplicações com IoT (Internet das Coisas).
O ESP 32 é indicado para projetos que necessitam de conectividade com a internet.
O protocolo MQTT pode ser implementado para o ESP32.
Também pode ser implementado em ambiente de nuvem – IBM, Google, AWS, Azure e outras.
PROTOCOLO MQTT
(Message Queuing Telemetry Transport)
Broker é um servidor de comunicação MQTT que fica na nuvem (instância).
Esta topologia faz com que o Broker seja acessível em qualquer lugar do mundo mediante conectado na internet.
Sua escalabilidade é altíssima e não existe limites de publishers e subscriber (publicar e assinar).
PROTOCOLO MQTT
(Message Queuing Telemetry Transport)
A arquitetura publishers – subscriber (publicar e assinar) é um padrão de mensagens para serem enviadas a um
receptor específico, chamado de assinantes.
Os assinantes (subscriber) só irão receber as mensagens de seu interesse.
Os assinante desconhecem os editores (publishers) que enviam as mensagens.
Este método é uma alternativa de cliente e servidor usado em redes em comunicações end point.
O processo publishers – subscriber separa o remetente e o destinatário de uma
mensagem específica. Portanto o remetente (Pub) e o destinatário (Sub)
não se conhecem e necessitam de um terceiro chamado de Broker.
Este tipo de controle são feitas por APIs específicas.
Uma API (Application Programming Interface – Interface de Programação
de Aplicativos), tem a finalidade de realizar a comunicação de dois ou mais
programas de computadores se comunicarem entre si.
Portanto o Broker tem como finalidade de fazer a gerência na troca de mensagens.
O Broker sincroniza o envio e recebimento de mensagens publishers – subscriber.
Comunicação MQTT
O MQTT usa filtragem de mensagens baseadas em assunto.
Os editores (Publishers) enviam as mensagens relacionada ao tópico.
Os assinantes (Subscribe) recebem as mensagens se tiverem assinado o tópico
Isto é conhecido como chave – Identificação da mensagem realizado por uma
string, por exemplo – MQTTValorDaTemperatura.
Este tipo de comunicação Pub-Sub é importante saber o endereço IP do Broker
para que ocorra a comunicação.
O campo Payload (Carga útil) é onde está a informação a ser transmitida.
Esta informação pode ser a temperatura do sensor, exemplo, 25°C.
Operação e fluxo de mensagens do MQTT
CONNECT – Cliente para Broker (Servidor), solicita a conexão CLIENTE #1 para BROKER.
CONNACK – Broker para Cliente, reconhecimento da conexão CLIENTE #1 para BROKER.
SUBSCRIBE – Cliente para Broker, solicitação de inscrição para o cliente.
SUBACK – Broker para cliente, reconhecimento da inscrição.
PUBLISH – Cliente para Broker ou Broker para Cliente,
publicar a mensagem.
PUBREC – Cliente para Broker ou Broker para Cliente,
mensagem recebida
Transmissão, portas e segurança
Sistemas IoT que utilizam o protocolo MQTT, possuem somente um Servidor (Broker) e diversos Clientes (MQTT).
Isto elimina a necessidade de ter uma infraestrutura de rede configuradas para os clientes.
Não existe o redirecionamento de portas e nem a liberação de endereços IPs para os clientes.
As portas utilizadas no MQTT são:
Porta 1883: Conexão com o Broker MQTT sem encriptação – transmissão dos dados em forma de texto – sem segurança.
A falta de segurança dos dados abre a possibilidade de invasão da rede pelos dispositivos IoT.
A utilização desta porta (1883) tem como finalidade testes de protótipos e estudos acadêmicos. Não sendo utilizada para
produtos finais comerciais.
Porta 8883: Conexão com o Broker MQTT com encriptação – transmissão de dados codificados em TLS/SSL – com segurança.
Ao utilizar a porta 8883 com TLS/SSL, pode ocorrer falta de compatibilidade com os dispositivos IoT e assim não ocorrendo
a conexão. Nesta condição, deve-se consultar o manual do fabricante do microcontrolador e suas bibliotecas PubSubClient.