Operações básicas em um módulo wifi ESP8266 do Arduino

Operações básicas em um módulo wifi ESP8266 do Arduino

Operações básicas em um módulo wifi ESP8266 do Arduino

Quando Expressivo lançou os primeiros módulos do mercado wi-fi com o integrado ESP8266 e pelo firmware para lidar com isso usando comandos AT, o que nos interessava era integrá-lo em assemblies com microcontroladores e os problemas foram reduzidos a conhecer o (anteriormente) escuro Tabela de comando ESP8266 AT, necessidades alimentares ou Atualização de firmware ESP8266.

Tabela de conteúdos

    Então rapidamente surgiram alternativas para programar o ESP8266 e implementações de módulos wi-fi de formatos muito diferentes que suscitaram outras preocupações: qual módulo wifi ESP8266 escolher dependendo do alcance das diferentes antenas (inclusive externas) ou da integração física destes novos módulos em nossos conjuntos.

    Certamente, devido a todas estas mudanças, a ênfase pode não ter sido colocada nos aspectos mais básicos, na gestão mais básica do Módulo wi-fi ESP8266. Apesar polaridade.es Você pode encontrar informações sobre o uso do ESP8266 e existem algumas aplicações que pretendem explicar de forma genérica o funcionamento do Módulo wi-fi ESP8266 usando comandos AT, especialmente no artigo sobre biblioteca para fazer consultas HTTP do Arduino com o módulo wifi ESP8266, as impressões dos leitores sugerem que seria útil adicionar mais algumas informações básicas para ajudar os usuários do ESP8266 para realizar suas próprias implementações.

    Discuta as operações básicas para trabalhar com o ESP8266 e propor soluções genéricas é um objetivo de diversas partes; Para ajudar a acompanhar o conteúdo do artigo, o seguinte índice pode servir de guia:

    Controle o módulo wifi ESP8266 do computador através da porta serial

    De um prato Arduino e usando seu IDE é possível monitorar o funcionamento de um Módulo wi-fi ESP8266, envie o Comandos ESP8266 AT e veja a resposta, mas é muito mais conveniente fazê-lo em um computador com um aplicativo do tipo terminal.

    Usando CuteCom para testar o módulo wifi ESP8266 através da porta serial

    Dependendo de qual placa Arduino usado, apenas uma porta serial de hardware pode estar disponível, o que adiciona um pouco de inconveniência ao envio e recebimento. Alterar a velocidade das comunicações é muito mais confortável em uma aplicação de comunicação serial a partir de um computador e de algumas placas-mãe. Arduino (e em algumas circunstâncias) não suportam bem as velocidades mais altas de comunicações seriais, especialmente 115200 baud, que é a velocidade padrão das versões mais recentes do firmware.

    em Qual programa usar para monitorar o ESP8266 usando porta serial, há muitos para escolher de acordo com necessidades e preferências; ultimamente estou usando mais o clássico CuteCom (aquele na imagem acima) porque é muito confortável para mim repetir certos Módulo wifi ESP8266 em pedidos nos testes do projeto.

    Algumas recomendações já foram dadas aqui sobre programas que funcionam como console serial; Por exemplo, ao falar sobre PuTTY para controlar dispositivos seriais UART a partir do computador. PuTTYAlém de ser um excelente aplicativo, está disponível para a maioria dos sistemas operacionais de desktop. Além disso, como PuTTY pode ser usado para atuar como um console com a porta serial e o Família de protocolos da Internet (TCP/IP), incluindo aqueles que operam em TLS, torna-se uma ferramenta comum que mais do que compensa o (pouco) tempo gasto para configurá-la e se acostumar com seu uso.

    Usando PuTTY para testar o módulo wifi ESP8266 através da porta serial

    Além do software de comunicação serial, para conectar o Módulo wi-fi ESP8266 para o porto USB Um computador também requer um conversor USB para a série TTL. Tal como acontece com o software, existem várias versões, das quais servem apenas para converter a porta USB em uma porta serial TTL (que podem ser obtidos a partir de um euro) até aqueles que podem emular diferentes protocolos (como SPI o I2C).

    Assim como um programa que funciona como um console serial, o hardware para comunicar o computador via USB com um circuito lógico (não apenas o ESP8266) será uma ferramenta comum no trabalho de um desenvolvedor de aplicações microcontroladas, vale a pena tê-la na caixa de ferramentas o mais rápido possível e trabalhar com ela Módulo wi-fi ESP8266 É uma excelente oportunidade para conseguir um.

    Hardware para comunicações seriais USB UART para monitorar o módulo wifi ESP8266

    O conversor USB a UART TTL Também pode ser usado para monitorar o comportamento de um circuito que utiliza o ESP8266, para isso, as saídas que se deseja monitorar são conectadas em série à entrada de dados (RX) do conversor com um diodo rápido (o 1N4148, por exemplo) e um resistor (2K2, por exemplo) em paralelo entre si. Essa configuração funciona como um sniffer serial de hardware.

    Exemplo de sniffer para ESP8266 conectado ao Arduino usando um conversor USB UART TTL

    Embora o farejador da imagem acima seja certamente rudimentar (entre outras coisas, não possui amortecer) é suficiente para monitorar a operação de uma montagem com Arduino e pelo ESP8266.

    Removendo o sniffer do esquema anterior, o esquema mostrando como conectar um Módulo wi-fi ESP8266 para um prato Arduino. Além de alimentá-lo em 3V3, o pino de reset e o pino de ativação do integrado devem estar conectados em nível alto (habilitar). Claro, o pino RX de um deve se conectar ao TX do outro.

    Para simplificar o diagrama anterior, foi representada uma placa Arduino alimentado em 3V3 e para o qual a tensão na porta serial também é assumida como 3V3. Se você usar um microcontrolador será necessário um nível de sinal diferente na porta serial (normalmente 5 V), para não danificar o ESP8266, use um conversor de nível como aqueles nos diagramas abaixo. Este circuito é freqüentemente encontrado em muitas implementações comerciais de módulos prontos para uso.

    Conversor de nível de sinal 5V para 3V3 para módulo WiFi ESP8266 e Arduino

    Atualizar firmware ESP8266

    Os Comandos ESP8266 AT, seu término, a velocidade padrão do módulo... dependem da versão do Firmware ESP8266. É melhor garantir que você tenha a mesma versão em todos os módulos e, se possível, que seja a versão mais recente.

    Infelizmente, a maior parte Modelos de módulo wi-fi ESP8266 Eles têm apenas 4 Mbit, portanto a versão mais recente não pode ser instalada neles. A versão mais recente (oficial) do firmware que pode ser instalada em Módulos wi-fi ESP8266 com 4 Mbit (a maioria) é 0.9.4 que inclui a versão 0.2 do Comandos ESP8266 AT.

    Em resumo, para atualizar o firmware você precisa:

    1. Baixe a versão de firmware correspondente. o versão mais recente (oficial) para um módulo com 4Mbit de memória, encontrada na pasta Espressif no github. No Site Expressif Você pode baixar a versão mais recente do firmware, mas é muito importante verificar se o módulo no qual está instalado possui memória suficiente.

    2. Baixe a versão mais recente da ferramenta de instalação de firmware. Meu favorito é roubar que está escrito em Python, então funciona em qualquer plataforma. Além de ser baixado, também pode ser instalado com pip install esptool (o pip2 o python -m pip…). Claro, Expressivo Ele também oferece sua própria ferramenta, mas atualmente está disponível apenas para Windows.

    3. Preparar arquivos baixados; descompacte-os em uma pasta acessível e, se necessário, torne a ferramenta executável roubar, no meu caso, já que GNU / Linux, com chmod +x esptool

    4. Conecte o módulo ao computador usando um conversor USB UART TTL que funciona em 3V3 ou use um conversor de nível se funcionar em 5 V. Além da alimentação, você terá que conectar TX a RX do conversor USB UART TTL, RX para TX, GPIO0 em baixo nível (GND) e talvez GPIO2 em alto nível (em meus testes funcionou tanto conectando em baixo nível quanto desconectando). Caso o módulo esteja com a conexão GPIO15 livre (como ocorre no ESP-12) ele deve ser conectado em nível baixo. O RESET, que normalmente estaria em nível alto durante a operação, pode ser deixado desconectado ou conectado em nível alto por meio de um resistor (10K, por exemplo), pois antes de iniciar a gravação pode ser necessário reiniciar o dispositivo conectando-o para um nível baixo.
      Ao ligar o módulo, ele estará disponível para atualização, mas, Se for exibido um erro de conexão, será necessário redefini-lo conectando RESET em nível baixo por um instante e depois deixando no ar (sem conectar) para o processo de atualização.
      O módulo tem picos de consumo de meio ampere (até 600 mA, segundo alguns usuários) por isso é importante utilizar uma fonte de alimentação capaz de suportar esse consumo, principalmente para atualização de firmware.

      Módulo wi-fi de conexão ESP8266 ESP-01 para conversor USB UART TTL atualização de firmware

    5. Execute a ferramenta para atualizar o firmware. No meu caso, salvei os documentos da ferramenta e do firmware na etapa 3 na mesma pasta, então executo a partir do console:
      cd ~/Datos/firmwareESP8266 (mude para a pasta que contém a ferramenta e o firmware)
      ./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
      0x00000 ./boot_v1.1.bin \
      0x01000 ./user1.bin \
      0x7C000 ./esp_init_data_default.bin \
      0x7E000 ./blank.bin

      --baud define a velocidade do ESP8266 (115200 baud no meu caso) e --port a porta serial à qual ele se conecta (no meu caso, emulado, o primeiro USB). Os diferentes documentos que compõem o firmware ficam atrás write_flash precedido pelo endereço, com o documento user1.bin contendo a carga de atualização.

      atualização de firmware wifi ESP8266 captura de console esptool

    Envie comandos para o módulo wifi ESP8266

    Para controlar o ESP8266 de um computador teremos que começar com configurar o aplicativo para isso bastará ① escolher a porta à qual o conversor está conectado USB UART TTL, algo parecido /dev/USB0 em GNU/Linux e similares ou algo parecido COM6 no Windows, ② escolha a velocidade com que o ESP8266, provavelmente 115200 baud, ③ definir 8 bits de dados mais um bit de parada, sem paridade ou handshake, e ④ definir fim de linha, dependendo do firmware, quase sempre CR+LF.

    Configure CuteCom para monitorar o módulo wifi ESP8266 usando um conversor USB UART TTL

    Configure o PuTTY para monitorar o módulo wifi ESP8266 com um conversor USB UART TTL

    Depois que o aplicativo for configurado (ou, quando apropriado, armazenado e selecionado), ele será abra a conexão ("open device" e "open", respectivamente, nas capturas de tela dos exemplos acima com CuteCom y PuTTY) e você pode começar a enviar pedidos para ESP8266.

    Como pode ser visto no Tabela de comando ESP8266 AT, o formato para ativar, desativar, definir um valor e consultá-lo é bastante previsível, mas em geral não é fácil lembrar de todos e provavelmente você precisará tê-lo em mãos para consultá-lo.

    O caminho de enviar Em pedidos al Módulo wi-fi ESP8266 de Arduino é muito simples: ① configurar comunicações com Serial.begin(115200); (ou Serial1, Serial2… em placas com diversas portas seriais de hardware) e ② enviar os comandos usando o formato Serial.print(orden+"\r\n");

    O exemplo acima mostra como enviar o Módulo wifi ESP8266 em pedidos de Arduino. Neste caso é ilustrado AT+CWJAP, que é usado para conectar-se a um ponto de acesso. Este comando usa como argumentos o identificador do ponto de acesso (SSID) e a chave, ambas entre aspas, para que se tornem um objeto Srtring e coloque-os entre aspas usando o código de escape (\"). Para concluir o pedido, use \r\n que corresponde a CR y LF.

    Lembrando que a porta serial nem sempre é identificada com Serial (em certas placas pode ser Serial1, Serial2…) o objeto de porta utilizado foi definido atribuindo-o à macro PUERTO_SERIE. Detectar o tipo de placa usada pode adicionar um pouco de inteligência à seleção da porta serial; Mais tarde veremos como você pode descobrir o tipo de Arduino. As restantes definições são as habituais que permitem "nomear" os valores constantes para evitar repeti-los (e cometer erros) e facilitar a sua alteração.

    O exemplo acima deve conectar o Módulo wi-fi ESP8266 ao ponto de acesso indicado, mas já estava conectado antes? A conexão funcionou? Para saber, precisamos “ouvir” o que o ESP8266

    Receba dados do módulo wifi ESP8266

    Ao conectar o sniffer de dados explicado acima ao computador, você pode ver o que Arduino enviou o ESP8266 e sua resposta. Para ler de Arduino e processar as informações nele contidas, será necessário detectar com Serial.available() se algum dado chegou e, em caso afirmativo, carregue-o com Serial.read(). O exemplo a seguir mostra como ler a resposta de AT+CWJAP?, que informará se há conexão com algum ponto de acesso.

    Como em um prato Arduino Uno (e em outros) abrir o monitor serial redefine o programa, pode ser usado para ver no console serial Arduino as informações que você envia para ESP8266 como mostra a captura de tela da imagem abaixo.

    Receba dados do módulo wifi ESP8266 do Arduino. Exemplo básico

    Analise a resposta enviada pelo módulo wifi ESP8266

    Já vimos como ler as informações que chegam Arduino do ESP8266. O problema que você tem que enfrentar é que você não sabe quando vai começar a chegar, quanto tempo vai demorar para chegar, qual será a duração... e não é muito eficiente esperar a resposta do ESP8266 é recebido sem deixar o microcontrolador enquanto isso, execute outras tarefas.

    Uma maneira simples de gerenciar essa circunstância é iterar sobre os dados recebidos em busca de respostas concretas com o qual, por exemplo, ativar indicadores (sinalizadores ou variáveis ​​​​booleanas) que determinarão se deve continuar a pesquisa no texto recebido e quais ações devem ser realizadas com base nas informações que chegam do ESP8266. Enquanto a resposta chega microcontrolador pode se dedicar a outras tarefas, por exemplo, recebendo dados de sensores e processando-os.

    Procure um texto nas informações recebidas do ESP8266

    Para pesquisar o texto que vem do ESP8266 pode ser compare cada carta recebida com aquela que corresponde à mensagem que você procura. Será necessário utilizar um contador (ou ponteiro) que aponte para a letra a ser comparada; Se o personagem que chega do ESP8266 for igual ao que está sendo examinado na mensagem, o contador avança, se for diferente é inicializado.

    Para saber que o fim foi alcançado, consulta-se o próximo caractere da mensagem pesquisada, que será zero (\0) ou o comprimento da mensagem é armazenado para, comparando-a com o contador, saber se a comparação terminou e, portanto, o Módulo wi-fi ESP8266 enviou a mensagem desejada.

    O exemplo a seguir usa o comando AT+CWLAP que retornará uma lista de pontos de acesso e dentro deles será pesquisado um chamado "wifi polaridad.es". Embora tenhamos optado por verificar se o último caractere é zero, como o amortecer Ele armazena apenas o texto pesquisado e seu comprimento é conhecido, também pode ser verificado se esse número de letras corretas foi recebido. Com um CONDUZIU conectado ao pino 2 é relatado que o texto esperado foi encontrado.

    No código do exemplo anterior você também pode ver uma maneira de escolha a porta serial dependendo do tipo de placa Arduino usado. Este exemplo pressupõe que você tenha três tipos de placas para o projeto: uma Arduino Uno, uma arduino mega 2560 e um Arduino Leonardo. Se você trabalha com um Arduino Uno ele será usado Serial e caso contrário Serial1.

    Se você trabalha com um prato Arduino Leonardo Você pode usar o mesmo método para parar o programa e aguardar o console (a porta serial associada ao Serial) está disponível.

    Pesquise vários textos na resposta do ESP8266

    O código do exemplo anterior é utilizado para buscar texto nas informações enviadas pelo ESP8266 mas a resposta pode incluir informações diferentes dependendo da operação. Suponha, para começar com um caso simples no próximo exemplo, que o texto enviado pelo MCU ESP8266 es OK quando a operação é realizada corretamente e ERROR Caso contrário, como acontece com o pedido AT+CWJAP?, que serve para verificar se o Módulo wi-fi ESP8266 já está conectado a um ponto de acesso.

    Esta nova implementação do mesmo método, que procura uma correspondência com várias mensagens possíveis, permite escolher entre diferentes ações dependendo da resposta recebida do ESP8266, basta ligar o CONDUZIU isso corresponde.

    Limite o tempo que leva para receber uma resposta

    Até agora não foi feita qualquer referência a uma questão relevante: a tempo máximo de espera (timeout) antes de considerar que uma operação falhou. Se por algum motivo a conexão com o Módulo wi-fi ESP8266, o módulo com o ponto de acesso, o ponto de acesso com Internet ou, por exemplo, um hipotético servidor não estiver disponível, o programa poderá ficar bloqueado num ponto aguardando indefinidamente, pelo que terá de ser articulada uma resposta a tais circunstâncias. O tempo máximo de espera pode ser configurado para toda a aplicação, normalmente será mais “generoso” nesse caso, ou podem ser programados tempos de espera individuais para cada operação.

    Para verificar se (pelo menos) um determinado intervalo de tempo passou O “tempo” do momento em que a conta é iniciada costuma ser subtraído do “tempo” atual e verifica-se que a diferença é maior que o limite desejado. Este “tempo” não precisa ser em tempo real, normalmente corresponde ao intervalo que passou desde o MCU comece a contar o tempo; Isto não afeta o programa, pois o interessante é o tempo decorrido e não o tempo absoluto.

    Normalmente, para verificar se decorreu determinado intervalo, utiliza-se uma expressão do tipo:

    A variável milisegundos_al_empezar contém o valor de millis() de um determinado momento da execução a partir do qual é cronometrado, por isso não é incomum que seu nome se refira à palavra “cronômetro”. A variável intervalo_de_tiempo contém o número máximo de milissegundos que torna verdadeira a expressão anterior, ou seja, representa o tempo limite; Geralmente é uma constante (ou uma macro) e, como no caso anterior, a palavra “TIMEOUT” aparece frequentemente em seu nome. Se você trabalha com intervalos muito curtos, você pode usar micros() em vez de millis() (microssegundos em vez de milissegundos), embora seja muito menos comum e muito menos preciso.

    Um inteiro longo em Arduino (unsigned long) ocupa 4 bytes (32 bits), então o maior valor que ele pode representar é 4294967295 (2 elevado a 32 menos um, porque começa em zero). num prato Arduino Durante a execução contínua, o contador de milissegundos será redefinido (retornará a zero) aproximadamente a cada 50 dias. Ao subtrair com tipos de dados não assinados, o mesmo comportamento é reproduzido (invertendo o contador), portanto é viável controlar o tempo limite indefinidamente.

    O código acima mostra um implementação muito básica de limitação de tempo limite incorporando as linhas marcadas em relação ao exemplo que o precede. Como a verificação do timeout é realizada após o processamento dos dados que chegam do Módulo wi-fi ESP8266, a operação pode ser considerada bem-sucedida mesmo que a recepção demore mais que o tempo de espera imposto.

    Execute uma operação complexa definida por vários comandos AT

    Para ter um exemplo de referência da finalidade do aplicativo que explora o Módulo wi-fi ESP8266, suponha que seja armazenar informações em um banco de dados acessado através de um serviço web para acompanhar a temperatura. O código a seguir lê um sensor conectado a uma entrada analógica a cada determinado intervalo de tempo, calcula o valor médio e, após um intervalo de tempo maior, envia para o servidor web (estilo Internet das coisas) através de um solicitar HTTP (POSTAR, OBTER…).

    Neste exemplo de registro de temperatura, um servidor web é acessado a cada cinco minutos. Embora a disponibilidade não seja particularmente elevada, era de esperar que a proposta funcionasse, mas se fosse necessária uma frequência de gravação mais elevada, outros recursos teriam que ser implementados, por exemplo, um buffer de dados esperando para ser enviado, para enviar vários quando o servidor puder atender e armazená-los para quando não estiver disponível. Se a frequência com que os dados precisam ser registrados fosse ainda maior, outros tipos de protocolos teriam que ser propostos como alternativa ao HTTP ou até mesmo substituir TCP por UDP ser capaz de enviar a maioria dos dados na velocidade necessária, mesmo ao custo de perder alguns.

    As operações que compõem a tarefa a ser realizada para enviar a temperatura seriam:

    • Reinicialize o módulo wi-fi
    • Desconecte-se do ponto de acesso atual (caso exista uma conexão padrão)
    • Defina as configurações. Para o exemplo, assume-se que o modo de conexão (simples) e o papel nas comunicações Wi-Fi (estação) devem ser configurados.
    • Conecte-se ao ponto de acesso
    • Verifique se a conexão está correta (na verdade, este é o ponto de entrada) Se não houver conexão, inicie o processo desde o início
    • Conecte-se ao servidor
    • Envie a solicitação HTTP com os dados a serem armazenados

    A ordem das operações não precisa ser exatamente assim (embora a operação seja) e cada etapa pode exigir vários Comandos ESP8266 ATPor exemplo, a configuração listada acima precisaria de dois: AT+CIPMUX=0 y AT+CWMODE=1.

    Uma estrutura de dados para representar operações no ESP8266

    Nos exemplos anteriores, embora de forma muito básica, já é sugerida uma solução genérica para o problema: utilizar uma estrutura de dados que armazene as possíveis respostas e as ações que devem ser tomadas em cada caso; envie uma ação, aguarde uma resposta e proceda de acordo com o que a resposta significa. Como cada operação complexa exigirá vários Comandos ESP8266 AT, a estrutura de dados deve vincular uma operação a outras, subsequentes ou anteriores, que devem ser realizadas em cada caso dependendo da resposta do ESP8266.

    Nos exemplos anteriores, uma mensagem foi pesquisada dentro da resposta do ESP8266 e foi interpretado como sucesso ou erro. Além de uma recepção (e análise) de todo o texto recebido, Para ter um mínimo genérico, é aconselhável atender também ao preenchimento da mensagem ou, em outras palavras, à disponibilidade do Módulo wi-fi ESP8266 para receber novos pedidos. Desta forma, a mudança para um estado que poderíamos chamar, por exemplo, de “wifi disponível”, poderia ser o recebimento do nome do ponto de acesso e o recebimento do texto ERROR ou o texto OK significaria que o ESP8266 você terminou a resposta e agora pode enviar a próxima Comando AT para ESP8266.

    O código acima usa um vetor (operacion) para armazenar o texto das operações sucessivas que formam a tarefa completa. Uma matriz bidimensional é usada (mensaje) com as três respostas que são analisadas. Conforme explicado acima, é necessário buscar as mensagens que representam o final da resposta além da mensagem que representa uma resposta correta ou incorreta. Nem todas as operações terão o mesmo número de respostas possíveis; Quando há menos respostas, pode-se utilizar uma mensagem vazia que consuma o menor número possível de ciclos em sua análise (mesmo assim, não é a forma mais ideal). Logicamente será necessário que o número mínimo de respostas buscadas (três no exemplo) inclua todas as possibilidades de atuação, mesmo que nem todas sejam possíveis.

    Ao falar sobre as possíveis respostas, já se percebe que este exemplo não é muito útil para receber dados com formato arbitrário de um Módulo wi-fi ESP8266, mas o fato é que, no contexto de uso com microcontroladores não é usual; O mais comum é enviar dados coletados pelos sensores conectados e/ou receber informações sobre o que fazer com os atuadores que controla. Informações muito valiosas, que podem ser muito bem previstas.

    Na estrutura de dados anterior, assim como é feito para expressar as possíveis respostas que são analisadas, também é utilizada uma matriz bidimensional para determinar a operação que deve ser realizada em cada caso (siguiente_operacion). Especificamente, optamos por responder a três tipos de mensagens: ① um texto arbitrário (LITERAL) para verificar se há conexão com o ponto de acesso Wi-Fi e o servidor, ② um texto para detectar erros no processo (FALLO) e ③ um texto indicando que a operação foi concluída com sucesso (ACIERTO).

    Finalmente, existem mais dois vetores para definir o tempo máximo de espera antes de desistir (timeout) e especifique (configuracion) se a operação terminar sem esperar por uma resposta (ESPERAR_RESPUESTA) e mensagens indicando o fim da comunicação. Este último vetor, para ilustrar um exemplo de como a memória pode ser salva, funciona com os bits de um byte de configuração para indicar os diferentes estados.

    O primeiro Comandos ESP8266 AT da estrutura de dados sempre esperam uma resposta, que pode ser uma mensagem de sucesso ou de erro. Quando ocorre um erro, o módulo é reiniciado e inicia novamente e se a mensagem indicar que a operação está correta, passa para a próxima.

    Quando você se conecta ao servidor, o padrão muda. Neste caso é necessário ① enviar o comprimento do pacote de dados a ser transmitido e ② redigir a solicitação HTTP com um texto fixo mais o valor (da temperatura) que é enviado para ser armazenado no servidor. A preparação destes dados é realizada em cada envio e é necessário dividi-los em dois (avisar o comprimento) ou três (enviar a solicitação HTTP) Para ESP8266 EM pedido. Apenas a última das partes em que a operação está dividida aguardará resposta.

    Neste caso funcionará sem problemas (talvez avisando que o módulo está ocupado) mas quando o comprimento dos dados for maior será necessário dividir os blocos de dados em pedaços menores e pode até ser necessário implementar uma espera, como é feito com a leitura da temperatura, para dar tempo ao módulo de enviar os dados sem preencher seu amortecer.

    Juntamente com outras macros que já foram explicadas anteriormente, o código de exemplo acima mostra como são definidos os diferentes estados para especificar se deve-se esperar por uma resposta e, se for o caso, qual mensagem indica que ela foi concluída.

    Como em diferentes pontos do código será enviada uma operação (quando chegar a hora de enviar a temperatura média, se o tempo de espera de uma operação for ultrapassado, quando a operação atual for concluída com sucesso...) mas como fazer isso é estabelecido globalmente, foi definido um macro ENVIAR_OPERACION que agrupa as etapas envolvidas no envio.

    A seguir está o código do programa principal do exemplo. A tarefa mais externa é a responsável por amostrar a temperatura para calcular a média e, a cada determinado período de tempo, ela é enviada ao servidor através do Módulo wi-fi ESP8266. Uma vez enviada cada operação, a resposta é analisada para determinar qual é a próxima ou se a tarefa de envio de informações foi concluída.

    Logicamente, diversas ações de otimização podem ser realizadas no código anterior mas, como este é um exemplo para entender como o ESP8266 De forma genérica, vale apenas focar em alguns aspectos, sendo o primeiro a estrutura de dados. Parece que o lógico é usar uma estrutura de dados de linguagem de programação (struct) para representar a informação que está sendo processada: o Comandos ESP8266 AT e as mensagens que são analisadas.

    Use uma estrutura (struct) armazenar os dados em vez dos arrays de exemplo (baseados neles) é trivial e, embora possa resultar em um código mais elegante, não implica nenhuma melhoria no resultado. A verdadeira alternativa apresentada pelo uso de struct é implementar, conforme explicado abaixo, comprimentos variáveis ​​em estruturas que contêm dados “internos” que são referidos por eles. Dessa forma, por exemplo, não seria necessário que uma operação tivesse um número fixo de respostas para analisar.

    Esta abordagem sugere que é a melhor forma de implementar a solução, mas a desvantagem é que seria necessário usar alocação dinâmica de memória, uma prática arriscada trabalhando com um microcontrolador o que requer uma medição cuidadosa de quanta memória será usada em tempo de execução, pois dificilmente o compilador conseguirá nos avisar sobre isso e existe certa possibilidade de esgotar a memória (ou a pilha) com consequências fatais para a execução do programa.

    Na linha de otimização do código, é interessante lembrar que, em um programa desse tipo, que utiliza uma grande quantidade de texto, pode economizar espaço de memória SRAM armazenando strings de texto na memória do programa (chamada de conferência) com a macro F(). Nas capturas de tela a seguir você pode ver os diferentes programas e distribuição dinâmica de memória com uso normal de texto e usando a macro F().

    Exemplo de código Arduino usando texto armazenado na memória de programa (flash)
    Exemplo de código Arduino usando texto em SRAM

    Com relação às ações que são executadas de acordo com as informações que chegam do Módulo wi-fi ESP8266, como alternativa à verificação da mensagem do código e realizar uma ou outra de acordo com o que é recebido, podem ser armazenados nesta estrutura de dados ponteiros para funções que executam cada tarefa em vez de indicadores de status (flags) que alertam sobre um determinado estado que a aplicação é responsável por gerenciar, por exemplo, dentro do loop principal.

    A seguir está um exemplo de estruturas para armazenar os dados das solicitações ao ESP8266 (o tipo de dados operacion_esp8266) e suas respostas (o tipo de dados respuesta_esp8266).

    Como a estrutura que representa a operação (os dados que são enviados para o Módulo wi-fi ESP8266) refere-se à estrutura com a qual as respostas são definidas, e a estrutura das respostas à estrutura das operações, é necessário declarar ambos primeiro, definindo o novo tipo de dados e, em seguida, definindo seu conteúdo.

    O exemplo anterior considera que o programa que o inclui optou por utilizar um Indicador de status, que deve corresponder a uma variável acessível a partir do código responsável por realizar uma ou outras operações indicadas pelo referido valor. Se na resposta de ESP8266 Quando um determinado texto é analisado, o estado assume o valor que indica a estrutura da resposta correspondente.

    Como dito anteriormente, outra alternativa, seja para substituir ou complementar um indicador de status, seria armazenar uma função na estrutura de referência (um ponteiro) que seria chamado ao encontrar determinado texto na resposta do Módulo wi-fi ESP8266.

    No exemplo anterior, ele foi adicionado à estrutura de dados usada para processar a resposta do Módulo wi-fi ESP8266 um ponteiro para uma (suposta) função que retorna um dado do tipo float (pode ser o valor ponderado de uma leitura analógica) e para o qual dois bytes são fornecidos como argumentos (dois unsigned char que poderia ser o pino a partir do qual se lê a entrada analógica e aquele que ativa o ENABLE de um integrado hipotético).

    Em desenvolvimento para MCU, ao contrário do que ocorre no estilo de desenvolvimento para sistemas maiores, não é tão incomum a utilização de variáveis ​​globais na definição do comportamento (global) da aplicação que controla um assembly, portanto não será especialmente raro encontrar este tipo de definições como funções sem parâmetros e que não retornam valores, algo como void (*accion)();

    Se você trabalha com essa forma de representar os dados, usando struct de dados de comprimento variável, será necessário alocar memória dinamicamente com malloc() (o new(), se forem usados ​​objetos), que usará a quantidade de memória alocada como parâmetro e retornará um ponteiro para o início da área de memória que está reservada. Com sizeof() Sobre o tipo que está armazenado, multiplicado pelo número de elementos utilizados, você pode obter a quantidade de memória necessária. Um exemplo com e sem uso pode ser visto nas imagens abaixo. malloc(); Cuidado com a memória utilizada pelo programa, no primeiro caso, é necessário carregar a biblioteca que contém esta função.

    Exemplo de alocação de memória com malloc no Arduino

    Exemplo de atribuição de texto sem malloc no Arduino

    Se as operações no Módulo wi-fi ESP8266 irá variar ao longo da execução do programa, será necessário liberar a memória que não é utilizada com free() (o delete(), no caso de serem objetos). Embora seja razoável esperar que o compilador (GCC) otimizará o programa para evitar particionamento de memória, certamente o desempenho não será tão ideal quanto trabalhar com memória alocada estaticamente.

    Embora neste exemplo (em ambas as implementações) não faça muito sentido, para generalizar a operação para poder aplicá-la a outros casos, deve-se notar que O envio dos dados repete sempre o mesmo protocolo: informe a quantidade de bytes que serão enviados, aguarde o indicador (>) e envie os dados.

    Como neste exemplo é utilizado apenas uma vez (toda a requisição é feita em um pacote), não parece muito útil mas, em geral, pode ser necessário realizar vários envios na mesma operação, inclusive casos em que devem ser transmitidas quantidades significativas de dados que devem ser fragmentados para evitar transbordamento da memória do ESP8266.

    Para implementar este comportamento, os dois últimos elementos da conexão podem ser utilizados para que cada vez que os dados sejam enviados, os dados sejam preenchidos com os valores correspondentes: no primeiro caso, o número de bytes enviados e no segundo, o ( parte da solicitação a ser transmitida.

    Para repetir a atribuição e envio dos diferentes elementos que devem ser transmitidos podem ser armazenados em um vetor. Este novo vetor será o que determinará o fim da operação complexa e não a última operação como até agora.

    comentário 1

    usuário de comentários
    ดู บอล สด

    Há definitivamente muito para descobrir sobre este assunto. Eu gosto de todos os pontos que você fez

    Postar Comentário

    Você pode ter perdido