Projetando estação meteorológica ESP8266 usando OpenWeatherMap

O monitoramento das condições climáticas é uma tarefa importante em muitas atividades humanas. Existem vários campos como agricultura, turismo, transporte, etc., que são afetados pelas mudanças climáticas. Considerando a importância da monitorização meteorológica, existem plataformas globais que monitorizam as condições meteorológicas em todo o mundo. Essas plataformas são ecossistemas IoT que podem ser acessados ​​online. É possível projetar dispositivos eletrônicos personalizados que possam se conectar a tais plataformas e buscar relacionado ao clima dados da plataforma em nuvem.
Uma dessas plataformas globais é o Open Weather Map. O Open Weather Map é um serviço online que fornece dados meteorológicos para serviços da web e aplicativos móveis. Ele fornece mais de 1 bilhão de previsões todos os dias em todo o mundo. Existem mais de um milhão de usuários desta plataforma e milhares de novos assinantes são adicionados a cada dia. A plataforma fornece mais de 20 APIs para renderizar relacionado ao clima dados. Neste projeto, será projetado um dispositivo baseado em ESP8266 que poderá se conectar a uma das APIs fornecidas pelo Open Weather Map e assim exibir os dados meteorológicos em um display LCD.
O dispositivo IoT projetado aqui é uma estação meteorológica construída pela interface de um LCD de caracteres com a placa ESP8266. O dispositivo busca os dados meteorológicos do local em que está instalado e mostrar na tela LCD. Deve-se observar que não há sensores usados ​​neste dispositivo e o dispositivo obtém os dados meteorológicos de uma plataforma IoT, ou seja, Open Weather Map. O dispositivo busca informações de temperatura e precipitação usando chaves API e mostrar no LCD. O ESP8266 é um modem Wi-Fi e pode se conectar a um hotspot ou roteador Wi-Fi conhecendo o SSID e a senha. Usando a chave API, o módulo ESP pode acessar dados do serviço IoT. O ESP8266 é um módulo compatível com Arduino. Ele precisa ser carregado com um firmware que possa buscar dados recebidos pela Internet e exibi-los na tela LCD. O Arduino UNO é usado para atualizar o código do firmware no módulo ESP8266. O módulo ESP também pode ser atualizado com código usando um FTDI conversor como CP2102. O firmware em si é escrito no Arduino IDE.
Protótipo de estação meteorológica baseada em ESP8266 e OpenWeatherMap
Figura 1: Protótipo de estação meteorológica baseada em ESP8266 e OpenWeatherMap
Componentes necessários –
Lista de componentes necessários para fazer estação meteorológica baseada em ESP8266 e OpenWeatherMap
Fig. 2: Lista de componentes necessários para fazer estações meteorológicas baseadas em ESP8266 e OpenWeatherMap
Diagrama de bloco –
Diagrama de blocos da estação meteorológica baseada em ESP8266 e OpenWeatherMap
Fig. 3: Diagrama de blocos da estação meteorológica baseada em ESP8266 e OpenWeatherMap
Conexões de Circuito –
O dispositivo IoT de monitoramento meteorológico projetado neste projeto é construído conectando um LCD de caracteres ao módulo ESP8266. O modelo ESP-01 é utilizado neste projeto que possui apenas dois pinos GPIO. Não é possível fazer interface com um LCD de caracteres com apenas dois pinos GPIO. Portanto, um expansor de E/S de 8 bits para I2C barramento – PCF8574P é usado para fazer a interface do LCD com o PES modem. O modem ESP pode se conectar sozinho a qualquer ponto de acesso Wi-Fi. Para programar o módulo ESP, ele é conectado ao PC via conversor USB FTDI tipo CP2102. Depois que o código é gravado no módulo, ele é alimentado por um circuito regulador de tensão.
Imagem mostrando conexões de circuito do ESP8266 e estação meteorológica baseada em OpenWeatherMap
Fig. 4: Imagem mostrando conexões de circuito do ESP8266 e estação meteorológica baseada em OpenWeatherMap
O dispositivo possui os seguintes componentes conectados conforme mencionado –
Modem Wi-Fi ESP8266 – O próprio modem Wi-Fi ESP8266 controla a funcionalidade do dispositivo. Deve ser carregado com um código de programa que possa acessar a API e controlar o LCD. O código do firmware é escrito usando Arduino IDE. Ele é carregado na placa ESP8266 usando o conversor FTDI USB para serial. Uma placa ESP8266 genérica é usada neste projeto. Esta placa não possui resistores de inicialização, regulador de tensão, circuito de reinicialização e adaptador serial USB. O módulo ESP8266 opera com fonte de alimentação de 3,3 V com corrente maior ou igual a 250 mA. Portanto, o adaptador CP2102 USB para serial é usado para fornecer tensão de 3,3 V com corrente suficiente para executar o ESP8266 de maneira confiável em todas as situações.
O Módulo Wi-Fi ESP8266 é um independente SOC com pilha de protocolo TCP/IP integrada que pode acessar para uma rede Wi-Fi. O ESP8266 é capaz de hospedar um aplicativo ou fora do carregamento todas as funções de rede Wi-Fi de outro processador de aplicativo. Cada módulo ESP8266 vem pré-programado com um firmware de conjunto de comandos AT. O módulo está disponível em dois modelos – ESP-01 e ESP-12. O ESP-12 possui 16 pinos disponíveis para interface, enquanto o ESP-01 possui apenas 8 pinos disponíveis para uso. O ESP-12 possui a seguinte configuração de pinos –
Tabela de listagem de configuração de pinos do módulo ESP8266 ESP-12
Fig. 5: Tabela listando a configuração dos pinos do módulo ESP8266 ESP-12
O modelo ESP-01 é utilizado no projeto. O modelo ESP-01 possui a seguinte configuração de pinos –
Tabela de listagem de configuração de pinos do módulo ESP8266 ESP-01
Fig. 6: Tabela listando a configuração dos pinos do Módulo ESP8266 ESP-01
Os pinos Chip Enable e VCC do o módulo estão conectados para o 3,3 V CC enquanto o pino de aterramento estiver conectado ao aterramento comum. O chip habilitar pino é conectado ao VCC através de um 10K puxar para cima resistor. O pino RESET é conectado ao terra através de uma chave tátil onde o pino é alimentado VCC através de um 10K puxar para cima resistor por padrão. O pino GPIO-0 do módulo é conectado ao terra através de uma chave tátil onde o pino é fornecido VCC através de um 10K puxar para cima resistor por padrão. Esses resistores pull-up atuam como circuito divisor de tensão que protege a placa ESP8266 de alta tensão.
O CP2102, que é um chip único USB para ponte UART, é usado para carregar firmware no PES modem. Ele também fornece fonte de alimentação para o módulo ESP enquanto carregamento de inicialização. Um IC CP2102 tem a seguinte configuração de pinos –
Tabela de listagem de configuração de pinos do chip CP2101 USB para UART
Fig. 7: Tabela listando a configuração dos pinos do chip CP2101 USB para UART
Tabela de listagem de configuração de pinos do chip CP2101 USB para UART
Fig. 8: Tabela listando a configuração dos pinos do chip CP2101 USB para UART
Tabela de listagem de configuração de pinos do chip CP2101 USB para UART
Fig. 9: Tabela listando a configuração dos pinos do chip CP2101 USB para UART
A placa ESP está conectada ao CP2102 para carregamento de inicialização modo e finalidade de uso. Para carregamento de inicialização, o pino TX do ESP-01 é conectado ao pino RX do CP2102 e o pino RX do ESP é conectado ao TX do CP2102 para que ambos possam enviar e receber os dados. O ESP8266-01 precisa de fonte de alimentação de 3,3 V, então o VCC do ESP está conectado ao 3V3 do CP2102 e os GNDs de ambos precisam estar conectados entre si. O pino de reset do ESP8266 junto com o resistor pull-up de 10k (resistor de bootstrap) é conectado ao pino RTS do CP2102. O GPIO0 é um pino de programação usado para colocar o ESP-01 no modo de programação. O GPIO0 junto com o resistor pull-up de 10K é conectado ao pino DTR do CP2102. O pino CHPD do ES-01 é puxado para cima com 10 mil resistor. As conexões do circuito entre o módulo ESP e o CP2102 estão resumidas na tabela a seguir –
Tabela de listagem de conexões de circuito entre o modem ESP8266 ESP-01 e o módulo CP2101
Fig. 10: Tabela listando as conexões do circuito entre o Modem ESP8266 ESP-01 e o Módulo CP2101
Após conectar o módulo ESP ao adaptador CP2102, o adaptador deve ser conectado ao PC e o módulo ESP deve ser carregado com o código do firmware.
Durante a compilação do código, as chaves GPIO0 e RESET devem ser pressionadas. Para fazer upload do programa, a chave RESET deve ser liberada enquanto a chave de programação GPIO0 deve ser deixada pressionado, para que o ESP possa entrar em modo de programação. Após o upload do código, a chave de programação também deve ser liberada.
Então, escreva o código do firmware no Arduino IDE e conecte o conversor FTDI com o PC via cabo USB. Abra o Arduino IDE e vá em Ferramentas->Porta e selecione a placa Arduino (Arduino UNO). Pode parecer /dev/ttyABM0 (Arduino/Genuíno Um). Selecione o nome da porta correto. O nome da porta pode ser diferente em diferentes configurações de IDE. Em seguida, abra o monitor serial no IDE do Arduino navegando até Ferramentas-> Monitor serial e defina a taxa de transmissão para 115.200 bauds por segundo. Passe os comandos 'AT' e 'AT+GMR' para testar a conexão entre o Arduino e o módulo ESP-01. Experimente configurações diferentes para a opção 'Fim de linha' do monitor serial, como NL e CR. Experimente diferentes combinações até que o módulo ESP comece a interagir corretamente com o monitor serial.
Baixar Python, PIP e ESPtool. Apague o firmware pré-carregado se o módulo ESP tiver algum. Atualize o código do firmware para o módulo ESP-01 escrevendo os comandos no monitor serial conforme instruções do ESPtool. Confira o link a seguir para escrever o comando adequado para atualizar o código do firmware usando ESPtool –
Comandos ESPtool
Para fazer upload do programa, a chave RESET deve ser liberada enquanto a chave de programação GPIO0 deve ser deixada pressionada. Após carregar o código, a chave de programação também deve ser liberada. O GPIO2 é um TX alternativo para o modo bootloader.
Remova as conexões. Agora o módulo ESP está pronto para ser instalado no circuito do projeto. Após carregar o código, o módulo ESP acessará automaticamente o ponto Wi-Fi com o SSID fornecido no firmware. No circuito do projeto, o ESP8266 faz interface com o LCD de caracteres via expansor de E/S PCF8574P.
Expansor de E/S PCF8574 – O expansor de E/S PCF8574 é usado para fazer a interface do LCD com o modem ESP. O PCF8574/74A fornece expansão de E/S remota de uso geral por meio do barramento I2C bidirecional de dois fios (relógio serial (SCL), dados seriais (SDA)). Os dispositivos consistem em oito portas quase bidirecionais, interface de barramento I2C de 100 kHz, três entradas de endereço de hardware e saída de interrupção operando entre 2,5 V e 6 V. A porta quase bidirecional pode ser atribuída independentemente como uma entrada para monitorar o status de interrupção ou teclados. , ou como saída para ativar dispositivos indicadores, como LEDs. O mestre do sistema pode ler na porta de entrada ou escrever na porta de saída através de um único registro. O PCF8574P possui a seguinte configuração de pinos –
Tabela de listagem de configuração de pinos do PCF8574P
Fig. 11: Tabela listando a configuração dos pinos do PCF8574P
O display LCD está conectado ao PCF8574P que conecta o display ao PES modem. Os pinos SDA (Pino 14) e SCL (Pino 15) do IC são conectados ao GPIO01 e GPIO2 do ESP8266, respectivamente. As conexões do circuito do módulo LCD com o PCF8574P estão resumidas na tabela abaixo
Tabela de listagem de conexões de circuito entre PCF8574P e módulo LCD
Fig. 12: Tabela listando as conexões do circuito entre PCF8574P e Módulo LCD
Fonte de energia – Assim que o modem ESP for carregado com o código do firmware, ele será conectado em o circuito principal. No o circuito ele é alimentado por uma bateria ou qualquer outra fonte de alimentação CC. O Modem requer 3,3 V DC para funcionar. A alimentação da bateria é regulada para 3,3 V CC usando 1117 IC. A alimentação da bateria é conectada ao pino Vin do IC enquanto a tensão regulada é extraída do pino Vout. O pino de ajuste do IC está aterrado. Existem dois capacitores de 10 uF conectados nos pinos de entrada e saída para suavizar quaisquer ondulações.
Como funciona o circuito –
Depois que o modem estiver instalado no dispositivo e ligado, ele começará a procurar o ponto de acesso Wi-Fi disponível. Ele se conecta a um ponto de acesso Wi-Fi usando SSID e senha codificados no código do firmware. Agora o módulo ESP está pronto para buscar dados do serviço Open Weather Map. Ele se conecta ao OpenWeatherMap.org com uma API de código aberto. A API fornecida pelo Open Weather Map pode ser usada para acessar uma variedade de relacionado ao clima dados de um local. Confira os dados disponíveis da API Open Weather Map no seguinte link do site –
API OpenWeatherMap
O modem ESP está programado para solicitar dados meteorológicos, ou seja, temperatura e umidade atuais de um local do OpenWeatherMap.org. Uma solicitação HTTP pelo método POST é enviada ao serviço de nuvem, ao qual ele responde enviando de volta dados meteorológicos no formato JSON. O dispositivo deve estar inscrito na API do site Open Weather Map.
Captura de tela do site da API OpenWeatherMap
Fig. 13: Captura de tela do site da API OpenWeatherMap
Ao clicar no botão de inscrição, o site navega até os planos disponíveis para o serviço. O plano gratuito é usado aqui para demonstração.
Em seguida, os dados recuperados do site são exibidos na tela LCD. Nisso plano as atualizações de dados meteorológicos a cada 2 horas e previsão para 5 dias podem ser acessadas.
Captura de tela dos planos da API OpenWeatherMap
Figura 14: Captura de tela dos planos da API OpenWeatherMap
Ao clicar no botão obter API e iniciar, o site navega para um assistente onde desenvolvedor precisa se inscrever para obter a chave API.
Captura de tela da assinatura da API OpenWeatherMap
Fig. 15: Captura de tela da assinatura da API OpenWeatherMap
A inscrição pode ser feita com um ID de e-mail. Após a inscrição, o desenvolvedor pode usar a chave API para acessar os dados meteorológicos. A chave API fornecida após bem-sucedido a assinatura é usada no firmware para acessar os dados meteorológicos.
Captura de tela da página de inscrição da API OpenWeatherMap
Fig. 16: Captura de tela da página de inscrição da API OpenWeatherMap
Os dados meteorológicos obtidos do serviço de nuvem são agrupados em strings adequadas e exibidos no módulo LCD. O modem ESP envia os dados para o módulo LCD em protocolo de dois fios que são convertidos em dados paralelos usando o expansor de E/S PCF8574P.
Guia de programação –
O código ESP começa importando as bibliotecas necessárias. Os arquivos de cabeçalho e são importados. A biblioteca é usada pelo modem ESP para executar ping no arquivo JSON, enquanto a biblioteca permite conectar e configurar uma conexão Wi-Fi.
Captura de tela do código C usado para inicialização na estação meteorológica IoT baseada em modem ESP
Figura 17: Captura de tela do código C usado para inicialização na estação meteorológica IoT baseada em modem ESP
As seguintes configurações precisam ser gerenciadas no código do firmware –
a) Inicialização de Variáveis ​​para armazenar os dados recebidos.
a) Inicialização da conexão Wi-Fi com Nome e Senha Wi-Fi usando variáveis ​​SSID e Senha.
b) Definir chave API para acessar dados meteorológicos e fazer a configuração do idioma.
Essas configurações são feitas na função Setup . Uma conexão serial é iniciada usando Serial.begin(115200). A taxa de transmissão é definida como 115200 para comunicação serial. A mesma taxa de transmissão deve ser definida no Serial Monitor do Arduino IDE para ver a saída de resposta do ESP8266. A conexão Wi-Fi é configurar pelo seguinte código –
Wifi.begin(SSIDsenha);
Enquanto o ESP ainda está se conectando, ainda há algum atraso, então algumas mensagens e pontos iniciais são impressos no LCD enquanto o modem se conecta a um ponto de acesso ou roteador. Esses pontos podem ser visualizados após o login no terminal serial. É apenas uma maneira de ver que o pequeno ESP está tentando se conectar. Em seguida, o LCD é inicializado para exibir dados meteorológicos.
Captura de tela do código C usado na função de configuração da estação meteorológica IoT baseada em modem ESP
Figura 18: Captura de tela do código C usado na função de configuração da estação meteorológica IoT baseada em modem ESP
A função loop é executada após a função setup e itera infinitamente. Na função loop , a função getWeatherData é chamada onde se conecta ao api.openweathermap.org para buscar os dados meteorológicos que estão no formato JSON em relação à cidade específica. Em seguida, os dados coletados são armazenados nas variáveis ​​globais declaradas anteriormente. Os valores coletados são impressos na tela LCD para monitoramento.
Captura de tela do código C usado na função Loop da estação meteorológica IoT baseada em modem ESP
Fig. 19: Captura de tela do código C usado na função Loop da estação meteorológica IoT baseada em modem ESP
Confira o código completo na seção de código e experimente.
Esta é uma estação meteorológica simples que usa um serviço IoT para acessar informações meteorológicas. É simples de projetar e pode ser instalado como um gadget inteligente em casa ou escritório.

Código fonte do projeto

###



//Program to

//Libraries for ESP, json and I2C LCD

#include 

#include 

#include 

#include  


WiFiClient client;

WiFiClientSecure sclient;

LiquidCrystal_I2C lcd(0x20,16,2);


//Initialize the Variable for storing the data

String weatherMain = "";

String weatherDescription = "";

String weatherLocation = "";

String country;

int humidity;

int pressure;

int temp;

int tempMin, tempMax;

int clouds;

int windSpeed;

String weatherString;


char tempT(5),tempMinT(5),tempMaxT(5);

char humi(5),presS(5),cloudS(5),WindSpeed(5);


//WiFi Name and Password

const char* ssid     = "********";      // SSID of local network

const char* password = "********";    // Password on network


//openweathermap.org api key:8b2f088e8a9c307c759ef39dcb085ae4

String weatherKey  = "8b2f088e8a9c307c759ef39dcb085ae4";   // openweathermap.org key

String weatherLang = "&lang=en";  //  english or other language


//LCD display of Special Charcters

byte up(8) = {

                      0b00100,

                      0b01110,

                      0b10101,

                      0b00100,

                      0b00100,

                      0b00100,

                      0b00100,

                      0b00000

                    };

  byte down(8) = {

                        0b00000,

                        0b00100,

                        0b00100,

                        0b00100,

                        0b00100,

                        0b10101,

                        0b01110,

                        0b00100

                      };           



void setup  

{

  Wire.begin(2, 0);

  //Baud rate for serial communication

  Serial.begin(115200);

  // initializing the LCD

  lcd.init ; 

  //Enable or turn on the text

  lcd.display ; 

  // Enable or Turn On the backlight 

  lcd.backlight ; 

  lcd.createChar(1,up);

  lcd.createChar(2,down);

  Serial.print("Connecting to WiFi ");

  lcd.setCursor(0,0);

  lcd.print("Connecting to...");

  lcd.setCursor(0,1);

  lcd.print("      WiFi      ");

  WiFi.begin(ssid, password);

  while (WiFi.status  != WL_CONNECTED)

  {

    delay(500);

    Serial.print(".");

  }

  lcd.clear ;

  delay(2000);

  Serial.println("");

  Serial.print("MyIP: "); Serial.println(WiFi.localIP );

  lcd.setCursor(0,0);

  lcd.print("MY Local IP: "); 

  lcd.setCursor(0,1);

  lcd.println(WiFi.localIP );

  delay(4000);

  lcd.clear ;

}


void loop 

{

  

   getWeatherData ;

   delay(5000);

}


const char *weatherHost = "api.openweathermap.org";


void getWeatherData 

{

  Serial.print("connecting to "); Serial.println(weatherHost);

  delay(4000);

  lcd.clear ;

  //connetion to host website to fetch the weather datas

  if (client.connect(weatherHost, 80))

  {

    client.println(String("GET /data/2.5/weather?q=erode,india&") + "&units=metric&apprn" +

                "Host: " + weatherHost + "rnUser-Agent: ArduinoWiFi/1.1rn" +

                "Connection: closernrn");

  }

  else

  {

    Serial.println("connection failed");

    return;

  }

  String line;

  int repeatCounter = 0;

  while (!client.available  && repeatCounter < 10)

  {

    delay(500);

    Serial.println("w.");

    repeatCounter++;

  }

  while (client.connected  && client.available )

  {

    char c = client.read ; 

    if (c == '('    c == ')') c=" ";

    line += c;

  }


  client.stop ;


  DynamicJsonBuffer jsonBuf;

  JsonObject &root = jsonBuf.parseObject(line);

  if (!root.success )

  {

    Serial.println("parseObject  failed");

    return;

  }


  weatherDescription = root("weather")("description").as ;

  weatherDescription.toLowerCase ;

  temp = root("main")("temp");

  humidity = root("main")("humidity");

  pressure = root("main")("pressure");

  tempMin = root("main")("temp_min");

  tempMax = root("main")("temp_max");

  windSpeed = root("wind")("speed");

  clouds = root("clouds")("all");

  Serial.println(String("temp=")+temp);

  Serial.println(String("temp_min=")+tempMin);

  Serial.println(String("temp_max=")+tempMax);

  Serial.println(String("pressure=")+pressure);

  Serial.println(String("humidity=")+humidity);

  Serial.println(String("wind_speed=")+windSpeed);

  Serial.println(String("clouds=")+clouds);

  lcd.setCursor(0,0);

  lcd.print("TEMP:"); 

  lcd.setCursor(5,0);

  lcd.print(temp);

  lcd.setCursor(7,0);

  lcd.print(",");

  lcd.setCursor(8,0);

  lcd.print(tempMin);

  lcd.setCursor(10,0);  

  lcd.write(2);

  lcd.setCursor(11,0);

  lcd.print(",");

  lcd.setCursor(12,0);

  lcd.print(tempMax);

  lcd.setCursor(14,0);  

  lcd.write(1);

  pressHumiCloud ;

}


void pressHumiCloud 

{

  lcd.setCursor(2,1);

  lcd.print("Pressure:"); 

  lcd.setCursor(11,1);

  printDigits2(pressure);

  delay(1000);

  lcd.setCursor(0,1);

  lcd.print("                ");

  lcd.setCursor(2,1);

  lcd.print("Humidity:"); 

  lcd.setCursor(11,1);

  printDigits2(humidity);

  lcd.print("%");

  delay(1000);

  lcd.setCursor(0,1);

  lcd.print("                ");

  lcd.setCursor(1,1);

  lcd.print("WindSpeed:"); 

  lcd.setCursor(11,1);

  printDigits2(windSpeed);

  lcd.print("m/s");

  delay(1000);

  lcd.setCursor(0,1);

  lcd.print("                ");

  lcd.setCursor(2,1);

  lcd.print("Clouds:"); 

  lcd.setCursor(9,1);

  printDigits2(clouds);

  lcd.print("%"); 

  delay(1000);

}


//this void function is really useful; it adds a "0" to the beginning of the number, 

//so that 5 minutes is displayed as "05", rather than "5 "

void printDigits2(int digits)  

{

  if(digits < 1000) 

  {

    lcd.print("0");

    lcd.print(digits);

  }

  else

  {

    lcd.print(digits);

  }

}

###

Diagramas de circuito

Diagrama de circuito-ESP8266-Estação meteorológica baseada em OpenWeatherMap

Vídeo do projeto

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.