Para ser continuado. A parte anterior .
Sumário:
Unidade central. De software
Finalmente, chegamos à parte mais difícil para qualquer programador - descrever em termos humanos o que ele havia feito lá.
O código fonte do servidor tem cerca de 1300 linhas, incluindo recuo, mas isso não deve assustá-lo. O texto fonte é fornecido com comentários detalhados; nesse sentido, não me enganarei se disser que minhas fontes são descritas melhor do que quaisquer outras que você só pode encontrar. Nos comentários, no código-fonte, você encontrará todas as pinagens para conectar os módulos e todos os links necessários para a documentação externa. O segredo é simples - escrevi comentários para mim constantemente, "no decorrer da peça", de modo que não tive dificuldades com a documentação.
Como já escrevi, você pode começar sem ter todos os módulos em mãos. Por exemplo, você pode iniciar sem ter um módulo de rádio ou o ESP8266. O sensor de pressão barométrica BMP180 também pode estar ausente. Adicione mais tarde. É verdade que, nesse caso, você (pode) precisa comentar de forma independente no esboço as seções do código responsáveis pela interação com os blocos ausentes, mas provavelmente isso não será necessário. O principal é que pelo menos algo se reuniu e ganhou, então é mais divertido continuar.
Especificamente, agora, neste ponto da história, ainda não montamos um módulo sem janelas (externo) e não temos nosso próprio servidor da Web com um banco de dados, ainda não precisamos dele (mas, se houver, conecte-o imediatamente para que você não precise cavar):
- módulo de rádio nRF24L01 +
- Módulo WiFi ESP8266.
E, no entanto, provavelmente começarei com o ESP8266, como o mais problemático na programação e operação do módulo. O motivo está na variedade de desempenho dos próprios módulos e seu firmware.
Como eu escrevi o firmware AT padrão para ele, existem várias desvantagens:
- eles ainda estão úmidos (a partir de 2016)
- Não consegui encontrar uma biblioteca normal para o Arduino controlar o módulo ESP8266 usando os comandos AT, tive que "fazer uma fazenda coletiva".
Não publiquei o código do ESP8266 em uma biblioteca separada, mas simplesmente escrevi as funções necessárias; portanto, o esboço saiu por tanto tempo. Além disso, implementei apenas a funcionalidade necessária. Toda a programação para ESP usando comandos AT se resume a analisar seqüências de caracteres e definir atrasos entre os comandos.
Você pode encontrar e baixar o código-fonte do servidor (módulo central) server.ino aqui .
Em seguida, coloquei o firmware do ESP8266 no firmware/AT23-SDK101-nocloud.bin
e a documentação dos curiosos está no mesmo diretório. Ao piscar o firmware indicado, você pode ter certeza de que meu esboço funcionará com o WiFi conforme pretendido. Eu não experimentei com outro firmware AT. O fato é que consegui encontrar o firmware não avançado “AT” e até participar um pouco de sua criação, o que é perfeitamente adequado para nossos propósitos ( aqui está o esp-link ). No entanto, como muitas vezes acontece, tudo aconteceu depois que o trabalho na versão atual da estação meteorológica foi concluído, por isso foi decidido deixá-lo como está.
Portanto, no início, você precisa piscar o firmware AT especificado. Não há nada complicado, mas também simples. Como fazer isso é descrito muito em que lugar na rede - ESP8266 - conectando e atualizando o firmware .
Como o meu conversor USB-TTL não possuía energia atual suficiente e a porta USB caiu constantemente (é uma vez!), Conectei eletricamente o módulo para o firmware usando o método “Arduino como um simples conversor USB-para-Serial TTL”.
Desde que eu trabalho no Linux, eu estava esptool.py
. Para a conveniência do firmware, eu "nakolhozil" uma pequena placa auxiliar com interruptores (não descritos aqui).
Depois de piscar, você precisa definir a velocidade da porta para 57600 (já que para o SoftSerial, a velocidade da porta em 115200 é grande e não garante operação estável) com o comando
AT+UART_DEF=57600,8,1,0,0
Em seguida, você precisa modificar levemente as bibliotecas padrão do Arduino IDE, a saber, no arquivo arduino/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h
, altere a linha correspondente para
#define _SS_MAX_RX_BUFF 128
no arquivo arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.h
altere as linhas correspondentes para
#define SERIAL_TX_BUFFER_SIZE 128 #define SERIAL_RX_BUFFER_SIZE 128
e no arquivo arduino/hardware/arduino/avr/cores/arduino/USBAPI.h
altere a linha correspondente para
#define SERIAL_BUFFER_SIZE 128
Estritamente falando, isso está errado, porque ao atualizar o SDK do Arduino, esses arquivos provavelmente serão substituídos e você precisará repetir todas as correções novamente. Na ciência, devemos inventar nossa própria biblioteca, que manipula os valores especificados (se possível), mas isso não é para todos.
De um jeito ou de outro, as manipulações preliminares terminaram.
Agora passamos diretamente para o código da unidade central (servidor) server.ino
Nas primeiras linhas, você deve alterar as configurações de acesso ao seu ponto WiFi
const String SSID = "..."; const String PASSWORD = "...";
o trabalho com o servidor da web será discutido em detalhes posteriormente.
A seguir, são apresentadas as definições de depuração (comentadas):
//#define DEBUG //#define DEBUG_RF //#define DEBUG_ESP //#define DEBUG_LOG_SD
Se algo der errado, você sempre pode descomentá-los, recompile e recarregue o esboço e obtenha mais informações de depuração no console ou grave-o em um arquivo no cartão SD. E você pode descomentar apenas o que precisa. Por exemplo, o módulo nRF24L01 +? Em seguida, remova o comentário apenas de DEBUG_RF etc.
A seguir, há extensos comentários com pinagens, inicialização e uma descrição detalhada de toda a periferia.
Aqui você pode alterar o número do canal de rádio para nRF24L01 +
#define RF_CHANNEL 73
Em seguida, vem a void setup()
, que fica clara a partir de comentários detalhados. Bem, e então void loop()
, o código para trabalhar com o servidor da web ainda não foi considerado.
Depois de preencher o esboço, sua unidade central voltará à vida e algo será exibido, mas não imediatamente, mas após 10 minutos - o valor DELAY_LOCAL_SENSOR
. Você pode mudar isso, é claro.
O visor deve mostrar: temperatura ambiente e umidade (dados do sensor DHT11) e pressão barométrica (do BMP180).
As seguintes funções são responsáveis pela exibição no LCD 16 × 4:
void lcdClearRow(int row) // , void lcdPrintOutdoor(int temperature, int humidity, float voltage) // , void lcdPrintHome(int temperature, int humidity, int pressure) void lcdPrintInfo(char info[LCD_MAX_COLS]) void lcdPrintStatus() void lcdPrintLastSensorTime()
O design da tela LCD1604 é o seguinte.

A primeira linha (superior) imprime um ícone estilizado (homem andando) projetado para indicar o clima na rua (saiu na rua, desce a rua). Eu mesmo criei o ícone; portanto, se você tem uma idéia melhor (que se encaixa em 5x8 pixels), pode especificá-lo nos comentários (como uma matriz de bytes). Você pode praticar pixel art aqui Gerador de caracteres personalizados para os módulos LCD HD44780 . Na mesma linha, a tensão do módulo da janela é impressa.
A segunda linha imprime "clima na casa" e pressão atmosférica. O ícone da casa é padrão, compreensível para todos.
Na terceira linha, lcdPrintLastSensorTime()
imprime quanto tempo se passou (em segundos) a partir do momento em que as últimas leituras dos sensores foram feitas, respectivamente na rua e, separadas por vírgula, na casa. É útil ter certeza de que a estação meteorológica não mostra o clima de ontem. De fato, trata-se de informações de depuração e podem ser removidas na versão final.
E na última quarta linha da tela usando a função lcdPrintStatus()
, as informações de status são impressas, onde
- s é um sensor de pressão local
- e é um módulo ESP8266
- eu sou uma conexão WiFi
- w é a disponibilidade do servidor da web
- l - arquivo de log no cartão SD
Após cada uma dessas letras convencionais, haverá um sinal de mais ou menos, o que significa que não há ou há erros, problemas na operação dos módulos correspondentes.
Voltando à questão da escolha do ferro, explicarei as vantagens de escolher um display LCD1604 em vez de um gráfico. O fato é que os módulos LCD1604 adquiridos de vários vendedores na maioria dos casos serão os mesmos e previsíveis em conexão e fáceis de programar. O que não se pode dizer sobre telas gráficas, embora você possa desenhar e mostrar muito mais sobre elas. A legibilidade de uma imagem a uma distância de vários metros é novamente melhor com uma exibição de texto; sim, sim, posso criar uma fonte maior em uma exibição gráfica, mas quanto posso caber nela?
Próximo. Assim que você preencher o esboço e garantir que tudo funcione como deveria, você poderá reconectar a "placa-mãe" do Arduino Mega a uma fonte de energia externa. Ou deixe como está, conectado ao USB do computador para ver toda essa beleza no console de depuração.
Se você não tiver todos os blocos montados, poderá comentar o código desnecessário. Embora, repito, deva funcionar assim, basta receber mensagens de erro no console. Como contornar isso?
Por exemplo, você não adquiriu um sensor de pressão atmosférica BMP180. No esboço server.ino , procuramos as linhas responsáveis por conectar as bibliotecas correspondentes; no nosso caso, é
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP085_U.h>
Comentando sobre este bloco.
Em seguida, no IDE do Arduino, começamos a compilar o código (não o firmware) e olhamos para quais linhas o compilador jura. Comentamos sobre estas linhas. Repetimos a operação até que o código seja coletado normalmente, sem erros. Antes da edição, é uma boa prática criar uma cópia do esboço para que, quando o sensor desejado chegar da ensolarada China, não repita todas as operações.
Os links para as bibliotecas usadas são fornecidos no código fonte. Se não houver esse link, a biblioteca IDE do Arduino padrão foi usada.
Por precaução, todas as bibliotecas (exceto as padrão) que eu usei são armazenadas no diretório de bibliotecas . A rigor, isso está errado. Você deve baixar as versões mais recentes das bibliotecas de seus repositórios oficiais (com bugs corrigidos, novos recursos), mas, caso sejam difíceis de encontrar, elas já foram excluídas ou as versões antigas não são suportadas, apenas nesse caso salvei todas as bibliotecas usadas.
Em seguida é a montagem do transdutor, portanto, esta peça ficou curta para não se misturar.