ESP8266

You are currently browsing articles tagged ESP8266.

O Pushbullet é um serviço muito útil que permite enviar notificações instantâneas com o texto que você quiser para smartphones, tablets, browsers, etc. Antes de usar este exemplo certifique-se de que o serviço Pushbullet funciona para você usando o que está explicado neste outro post.

Este exemplo foi baseado neste aqui que por sua vez é baseado no exemplo HTTPSRequest.ino da biblioteca. Eu incluí algumas modificações que gosto de fazer.

Não tem checagens de erro, mas por sem bem simples fica também simples de entender.

Note que por usar HTTPS requer muita RAM. Eu incluí uma função para mostrar o impacto disso.

 

 

 

 

 

Tags:

Este exemplo é uma aplicação desse.

Está configurado para mandar dois e-mails diferentes para um mesmo destinatário. Um quando a condição for ativada (repetindo a cada x minutos) e outro quando for desativada.

Para criar uma versão com criptografia, veja instruções neste post.

 

Tags:

Eu não sou programador. Tudo o que garanto é que nas condições certas o programa funciona.

Correções e aperfeiçoamentos são bem-vindos.

Você precisa de:

Preencha os dados da sua rede sem fio e da sua conta Cloudflare e faça o upload. Se tudo estiver certo o procedimento do programa será o seguinte:

Ao inicializar:

  • Verifica o IP registrado para o host na sua conta Cloudflare;
  • Verifica com checkip.dyndns.org qual o seu IP externo atual;
  • Se forem diferentes atualiza a sua conta Cloudflare;
  • Guarda o IP para não precisar mais consultar a conta;

A cada 10 minutos

  • Verifica com checkip.dyndns.org qual o seu IP externo atual;
  • Compara com o ip armazenado e atualiza sua conta se forem diferentes;

Em caso de erro o programa reduz o intervalo entre checagens para 2 minutos. Retorna a 10 minutos após o primeiro sucesso.

 

A melhorar:

  • As rotinas de parse ainda são uma gambiarra;
  • Não testei se minhas checagens de erro realmente funcionam;
  • Com mais alguns GETs e parses JSON é possível obter o zone_id e o host_id a partir do host_name. Isso simplifica a vida de quem não sabe obter essas informações.

O programa não prossegue se o fingerprint do certificado for diferente do esperado. Infelizmente isso significa que quando o certificado da Clouflare for atualizado o programa deixará de funcionar até que um novo fingerprint seja inserido. Você pode remover esse requerimento mas fica sujeito a roubo de suas credenciais num ataque MITM. Uma sugestão seria armazenar o fingerprint em um arquivo no SPIFFS e fazer o programa ao não conseguir mais validar o certificado mandar uma mensagem para você e passar a procurar por uma atualização de fingerprint no seu domínio, em arquivo criptografado por você.

Infelizmente não parece haver meio do ESP8266 verificar a validade de certificados em tempo real. A checagem de fingerprints foi o melhor que a impressionante equipe por trás do desenvolvimento conseguiu fazer.

Ferramentas online úteis ao debugar esse projeto:

  • Teste da ArduinoJSON – Você pode testar algumas idéias sem ter que fazer upload para um arduino
  • dostring.com – Não sabe qual o tamanho do JSON em bytes? String Length diz.
  • JSON Parser Online – Não consegue visualizar a árvore mentalmente? Permite colapsar estruturas;

Tags:

esp8266_esp01_automalabsUsando a IDE Arduino com Board ESP8266 é realmente muito simples. Não é preciso usar uma biblioteca I2C específica como é o caso de rede e seus programas já existentes devem funcionar exceto por um detalhe: você precisa especificar na inicialização da biblioteca Wire os pinos que você está usando para I2C no ESP8266.

Wire.begin(SDApin, SCLpin);

No ESP-01 você provavelmente vai ter que usar GPIO0 e GPIO2, por isso a inicialização fica assim:

Wire.begin(0, 2);

Em todos os casos você deve colocar resistores de pull-up de 4k7 nos GPIO que você escolheu para I2C. Atente para o fato de que alguns módulos i2C já vem com esses resistores.

No desenho SDA e SCL estão invertidos. Depois eu corrijo isso.

ESP-01_PCF8574_I2C

Tags: ,

Certas operações podem falhar silenciosamente nesse modo porque duas redes são criadas: a do AP e a do STA.

Por exemplo, se o ESP8266 estiver conectado a um roteador WiFi na sua rede (modo STA) e estiver com o modo AP habilitado, se o ESP8266 enviar um broadcast UDP para 255.255.255.255 esse broadcast não vai ser transmitido para a sua rede e sim para a rede criada pelo AP.

Mas se você mandar um broadcast para o endereço de broadcast da sua sub-rede, funciona, porque aí a biblioteca UDP sabe para onde mandar.

Por exemplo, se sua rede for da faixa 10.0.0.x:

resultado=udp.beginPacket(IPAddress(255, 255, 255, 255), 2391); //Não funciona

resultado=udp.beginPacket(IPAddress(10, 0, 0, 255), 2391); //Funciona mesmo com o AP habilitado

Claro, há situações em que mandar um broadcast para a sub-rede não é o bastante, pois você pode estar procurando o ESP8266 em outra sub-rede e não vai receber a mensagem. No momento eu não conheço outro jeito que não seja desligar o AP para enviar o broadcast.

Tags:

A sugestão vem da equipe Node MCU em um de seus diagramas, cujo detalhe eu adapto a seguir:

 

  • esp8266_nodemcu_autoreset_automalabs.com.br
  • O valor dos resistores não é crítico;
  • Os transistores podem ser qualquer NPN de uso geral;
  • Você, claro, precisará de um adaptador serial que tenha os sinais DTR e RTS.

Exemplo de como fazer uma “montagem aranha” mais ou menos elegante:

NodeMCU_ESP8266_reset_DSC02728_automalabs.com.br
E mais dois fios vindo da porta serial e dois indo para o ESP8266.

NodeMCU_ESP8266_reset_DSC02730_automalabs.com.br

Ao usar o IDE Arduino, selecione “nodemcu” como método de reset e o IDE controlará DTR e RTS de forma que ao fazer o upload o ESP8266 entre automaticamente em modo de programação

arduino_esp8266_ResetMethod_automalabs.com.br

Tags:

Do jeito que vem da fábrica a velocidade de CPU do ESP8266 é 80MHz mas com um simples comando você pode mudar para 160MHz. E faz diferença. Um processo gráfico que leva 5,7s a 80MHz terminou em 3,5s a 160MHz.

Existe um pequeno aumento no consumo de corrente e não sei que efeito tem na longevidade da CPU.

Usando o IDE Arduino e a versão 2.0.0 do board package ESP8266 deveria ser possível configurar a freqüência em Tools->CPU Frequency. Mas aparentemente é preciso contornar um bug.

Acrescente isso à área de definições gerais

E isto em setup():

Dessa forma você consegue rodar a 160MHz mesmo que em Tools->CPU Frequency esteja selecionado 80MHz. Eu até prefiro desta forma, porque está claro no sketch a que velocidade eu estou rodando.

Tags:

ILI9341_DSC01460_automalabs.com.br

  • Área visível: 2.2 polegadas;
  • Resolução: 320×240;
  • Alimentação: 5 ou 3.3V (veja adiante);
  • Sinalização: 3.3V;
  • A operação do leitor SD é completamente independente;
  • Esta tela não tem touchscreen.

ILI9341_fundo_DSC01453_automalabs.com.br

Componentes relevantes

  • U1: regulador de tensão XC6206P332MR/LM6206N3 de 3.3Vx250mA.
  • Q1: transistor de controle do backlight;
  • U3: posição para memória flash SPI, como a EN25F80 (o pinout desta confere com o do módulo). Essa memória é selecionada pelo terminal F_CS e os demais sinais SPI são compartilhados com os do cartão SD.
  • Os resistores R1, R2 e R3, todos de 10K, funcionam como pull-ups para os terminas SS (SD_CS), SI (SD_MOSI) e SCK (SD_SCK) do cartão SD, respectivamente.

O leitor SD

Tenha em mente que apesar do leitor SD ter um conector quase exclusivo, você ainda precisa alimentá-lo pelo conector da tela. E cartões SD operam com 3,3V na alimentação e sinalização, por isso é recomendável que você conecte os terminais SPI do leitor SD aos terminais SPI da tela para aproveitar qualquer level shifter que você esteja usando. Eu fiz isso para aproveitar os terminais do HCF4050 (veja explicação adiante) e não encontrei nenhum problema.

A presença dos resistores R1 a R3 poderia interferir com o funcionamento da tela, que não tem esses pull-ups. Na realidade a resistência medida dos terminais SPI da tela para +3,3V é de 10M e para GND varia de 130 a 250K, então é possível argumentar que a tela usa resistores de pull-down nos terminais SPI, mas aparentemente não interferiu. É possível que essa diferença é que tenha feito o projetista do módulo separar os terminais SPI.

Terminais da tela

  • SDO/MISO: Não é realmente necessário usar e pode ser deixado desconectado. O terminal MISO é usado para “ler” informações do dispositivo SPI escravo e em quase 100% dos casos você não precisa ler nada de uma tela;
  • LED: Aciona o transistor Q1 para ligar o backlight. Isso significa que você não precisa se preocupar com a corrente neste terminal e qualquer sinal positivo ligará o backlight com brilho máximo. Acionar este terminal por PWM controla o brilho do backlight. Nos meus testes, o valor 10 no comando analogWrite já foi o bastante para leitura do display;
  • SCK: Clock SPI. Precisa ser ligado a um terminal do microcontrolador.
  • SDI/MOSI: Dados SPI. Precisa ser ligado a um terminal do microcontrolador.
  • DC/RS: Data/Command. Usado para alternar entre o modo de dados e o modo de comando da tela. Precisa ser ligado a um terminal do microcontrolador.
  • RESET: Pode ser deixado permanentemente ligado a +3,3V para operação normal do display, mas dessa forma o display só pode ser resetado desligando a alimentação e o ideal é que o display possa ser restado depois da alimentação ter estabilizado. Em algumas situações o display pode travar justamente ao ser conectada a alimentação  e levar algumas tentativas de desligar/religar até que o display “colabore”. Se você tiver uma saída sobrando no arduino/ESP8266, conecte-a a RESET e configure a biblioteca de acordo porque assim o display poderá ser resetado pelo programa e a operação será mais confiável.
  • CS: Chip Select da tela. Se você não estiver usando mais nada no bus SPI (como o leitor SD) pode ser deixado permanentemente ligado a GND para operação normal do display.
  • GND: Alimentação
  • VCC: Alimentação. Como o display tem um regulador de 3,3V você precisa alimentar aqui com 5V. Se quiser alimentar o display com 3,3V você precisa unir o jumper J1 com um ponto de solda. Pode ser que o módulo funcione com 3,3V aqui mesmo sem unir o jumper, mas você deverá notar o backlight tremeluzir e o funcionamento da tela pode não ser estável.

Tenha em mente que apesar de você poder escolher entre alimentar o módulo com 5V ou 3,3V, a sinalização precisa ser de 3,3V. Aparentemente o módulo não é danificado se você sinalizar com 5V (ligar direto a um Arduino) mas não aparecerá imagem. Algumas pessoas tiveram sucesso usando divisores de tensão com resistores mas eu prefiro usar um “level shifter” como o HCF4050. Outras opções são o HEF4050, o 74LVX245 e o 74AHC125

Mas se você usar um módulo microcontrolador de 3.3V como o ESP8266, pode e deve ligar os terminais diretamente. A propósito, este módulo foi testado com sucesso ligado a um ESP-03.

Sugestão de interface para uso com microcontroladores de 5V como o Arduino

Eu usei um HCF4050, que é o modelo de alta velocidade do 4050, mas é possível que funcione com o modelo tradicional, CD4050. O chip é colado com uma gota de cola Super Bonder ao header.

No exemplo abaixo eu fiz RST e CS passarem pelo level shifter, mas se você optar por não controlar esses sinais (leia todo o texto) isso não é necessário.

ILI9341_interface_4050_DSC01478_automalabs.com.br

interface_ili9341_4050_automalabs.com.br

Reparação

A informação a seguir foi obtida por medições enquanto eu reparava um módulo defeituoso e só é importante se você também precisar reparar um módulo. a tela pode ser descolada passando com cuidado um estilete entre ela e a placa.

ILI9341_DSC01456_automalabs.com.br

  • 1 – GND
  • 2 – RST
  • 3 – SCK
  • 4 – DC/RS
  • 5 – CS
  • 6 – MOSI
  • 7 – MISO
  • 8 – GND
  • 9 e 10 – +3,3V
  • 11, 12, 13 e 14 – Para o transistor Q1 (controle do backlight)

Problemas com alimentação

Se o display estiver apresentando estranhos pontos aleatórios piscando ou mudanças inesperadas de cor (por exemplo, uma região programada para ser verde aparecer parcial ou totalmente em outra cor e permanecer assim até ser redesenhada), experimente usar uma fonte de alimentação melhor. O display não é realmente exigente mas fontes chaveadas muito vagabundas podem causar problemas.

Bibliotecas

É importante escolher a biblioteca com cuidado se você vai controlar o display com um arduino. A velocidade e o consumo de flash variam muito entre bibliotecas.

Este módulo funciona igualmente com as versões ILI9340 e ILI9341 das bibliotecas Adafruit e também outras. Neste texto eu vou usar a medição de velocidade do exemplo graphicstest da Adafruit

Todas as variações a seguir requerem a biblioteca Adafruit_GFX instalada.

Adafruit_ILI9341 original

Download aqui.
Operação total leva cerca de 42s (removendo delays)

Adafruit_ILI9341_AS

Esta é uma modificação que encontrei para download aqui. Esta biblioteca tem o dobro da velocidade mas requer muito espaço na flash do Arduino. Só por usá-la você já precisa de 25KB. A biblioteca Adafruit original requer menos de 17KB na mesma situação.

Operação total leva cerca de 17s (removendo delays)

Adafruit_ILI9341_by_casemod
Download aqui (post 191)

Testada no arduino 1.0.5 em conjunto com Adafruit GFX Library version=1.1.3

Para adaptar o exemplo graphicstest para esta versão basta declarar assim:
Adafruit_ILI9341 tft = Adafruit_ILI9341();
em vez de
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, _rst);

Mas o display precisa estar ligado assim (hardware SPI):

  • DC: D9
  • CS: 10
  • SCLK: D13
  • MOSI: D11
  • RESET: +3,3V

Operação leva cerca de 22s (removendo delays)

Esta versão leva cerca de 20% a mais de tempo que a versão AS, mas compila graphicstest para apenas 20K. O mesmo que a versão original.
Esta versão tem suporte e um demo para ler um arquivo do cartão SD e exibir na tela, mas não testei ainda.

Apenas para comparação, aqui está o benchmark quando rodando em um ESP8266 @80MHz (biblioteca não registrada)

ESP8266 @160MHz (biblioteca não registrada)

Tags: , ,

ESP-03_DSC01438_automalabs.com.br

Este módulo não é diretamente compatível com protoboard pois o espaçamento entre terminais é de apenas 2mm. O espaçamento “tradicional” é de 2.54mm.

Este módulo não possui qualquer LED. Não existe qualquer indicação visual de funcionamento.

O componente onde está escrito “Rainsun” é uma antena cerâmica.

Memória flash de 512KB.

Pinout

Os pequenos retângulos coloridos sem texto representam as cores que eu costumo usar na fiação.

Na figura do módulo eu sobrepus as ligações que normalmente são indispensáveis para que o programa rode: CH_PD ligado a +3v3 e GPIO15 a GND através de um resistor.

Com a chave entre GPIO0 e GND fechada o módulo entra no modo de programação pela UART0.

Este módulo, ao contrário do ESP-01, não tem o sinal RESET disponível nos terminais, mas você pode alcança-lo se for bom com soldagem. Basta ligar o pad indicado abaixo ao terminal NC.

ESP8266-03_detalhe_reset_automalabs.com.br

Como este módulo opera com 3.3V, usando apenas o módulo eu consegui exibir imagens em um display ILI9341. E funciona muito mais rápido que usando um Arduino. Eu ainda não testei controlar o display e usar o WiFi no mesmo programa.

Tags:

O estado das portas de entrada e saída de propósito geral 0, 2 e 15 do ESP8266 determina como vai ser o boot:

GPIO15 GPIO0 GPIO2 Modo Descrição
L L H UART Programação via porta serial UART0
L H H Flash Boot pela flash SPI (a flash que vem no módulo)
H x x SDIO Boot por cartão SD

Segundo o que é relatado aqui, essas três GPIO já contam com pull-ups fracos internamente, então você pode deixar ou flutuando se quiser que o estado seja alto ou usar pull-downs.

Para usar essas três GPIO no seu projeto é preciso planejar cuidadosamente.  Por exemplo, você pode até ter três botões nessas portas, desde que você faça o pull-up/pull-down necessário e que o botão em GPIO15 ao ser pressionado mande um sinal de nível alto (3.3V) e os outros dois mandem GND. E que você tenha uma razoável certeza de que ninguém vai estar pressionando os botões na inicialização.

Também tenha em mente que GPIO2 opera como UART1 TX durante a gravação da flash. Se você colocar um LED ali vai vê-lo piscar durante a gravação. E segundo o que é reportado aqui, algo similar ocorre com GPIO0. Isso significa que não é boa idéia ligar esses GPIO diretamente a VCC ou GND. Sempre use resistores. Aliás, como regra geral nunca ligue qualquer GPIO, de qualquer dispositivo, diretamente a +VCC ou GND.

Se você já tentou usar os médulos ESP-01 e ESP-03 pode ter ficado confuso com o fato de que de que o processo de boot/programação nos módulos parece diferente. Na verdade o processo é o mesmo mas no ESP-01 GPIO15 já fica permanentemente ligado a GND e para completar o ESP-01 tem o sinal RST disponível enquanto o ESP-03 não tem. Os tutoriais do ESP-01 fazem parecer que o RST é necessário para a programação, mas não é. O que importa é o estado desses três GPIO durante o boot e a função do RST é apenas provocar o boot. Você pode conseguir o mesmo efeito desligando e ligando a alimentação do módulo.

Tags:

« Older entries § Newer entries »