» Eletrônicos » Arduino »Estação meteorológica doméstica no GY-BMP280-3.3 e Ds18b20

Estação meteorológica doméstica em GY-BMP280-3.3 e Ds18b20


Eu quero colecionar faça você mesmo instrumento que medirá a pressão e a temperatura atmosféricas. O sensor de temperatura deve ser remoto e apertado, pois deve medir a temperatura a uma certa distância do dispositivo. Eu gostaria de ter um dispositivo portátil com uma faixa de trabalho de -30 ° C a 50 ° C. Mas isso requer que todos os componentes possam trabalhar nessa faixa de temperatura. Os componentes que podem trabalhar em uma faixa de temperatura estendida são mais caros e é mais difícil comprá-los.
Para realizar meu sonho, serei ajudado pelo quadro, que descrevi no artigo "Placa GY-BMP280-3.3 para medir pressão barométrica e temperatura».

Na prática, sabe-se que durante a montagem e configuração eletrônico produtos antes de sua fabricação, é necessário verificar a manutenção de todos os materiais e componentes de cada um separadamente. Caso contrário, você poderá se confundir mais tarde e, como resultado, o produto eletrônico não funcionará e será muito difícil encontrar a causa do mau funcionamento.

Vamos começar.

Primeira etapa. Instale um shell de software gratuito no seu computador Arduino IDE para escrever programas (esboços), compilando-os e depois gravando-os no microcontrolador Mega328P instalado na placa. Eu recomendo que você baixe a versão shell do ARDUINO 1.6.5. Porque Inicialmente, o projeto ARDUINO era único, agora os desenvolvedores se dispersaram e continuam a desenvolver o sistema ARDUINO, mas cada um à sua maneira, com pequenas nuances. Eu usei a versão ARDUINO 1.6.5. Ele deve ser instalado e testado para colaboração com a placa Arduino Uno usando os exemplos mais simples.

Segunda etapa. Verificamos a placa GY-BMP280-3.3 para medir pressão e temperatura barométrica. Pegamos 4 fios, conectamos GY-BMP280-3.3 e Arduino Uno, como mostra a foto e o diagrama. Linhas finas e multicoloridas curvas são condutores.



Vamos começar a verificar a placa GY-BMP280-3.3. Para fazer isso, você precisa instalar a biblioteca no IDE do Arduino, escrita por programadores que trabalham no site. Como regra, depois de instalar a biblioteca no IDE do Arduino, exemplos (amostras) de código são exibidos. Alterando ligeiramente o código de amostra, podemos compilá-lo em dados que o microcontrolador entende e enviá-lo para a memória do microcontrolador. Você pode encontrar um exemplo (amostra) prestando atenção nas duas fotos da tela abaixo.


Após gravar os dados no microcontrolador da placa Arduino Uno, ele inicia imediatamente a execução do programa (código) e envia os dados via cabo USB para o computador ao qual a placa Arduino Uno está conectada.E o resultado da medição da placa GY-BMP280-3.3, podemos ver na janela do Arduino IDE, chamada "monitor de porta serial".


Podemos ver o resultado das medições na placa GY-BMP280-3.3 no programa Windows Hyper Terminal padrão, depois de fechar o shell do Arduino Uno e configurar uma sessão no programa Hyper Terminal. Ou seja, podemos obter os resultados da placa GY-BMP280-3.3 conectando o Arduino Uno a qualquer computador com um cabo USB no qual o driver da placa Arduino Uno esteja instalado. Existem várias bibliotecas para trabalhar com o GY-BMP280-3.3. Tudo funcionou para mim na biblioteca. O arquivo que você baixa deste site terá a seguinte aparência: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Ele precisa ser renomeado como: iarduino_Pressure_BMP.zip. Agora precisamos instalar a biblioteca iarduino_Pressure_BMP no shell do Arduino IDE.


Inicie o Arduino IDE, vá para o menu Sketch / Include Librari / Add.ZIP Library ... selecione o arquivo iarduino_Pressure_BMP.zip e clique no botão Abrir. Você também precisa instalar as bibliotecas:,. Após instalar as bibliotecas, reinicializamos o shell do Arduino IDE, ou seja, fechamos e iniciamos novamente. Em seguida, selecione o menu Arquivo / Amostras / iarduino Pressure BMP (sensores de pressão) / exemplo.

Vemos o código na janela.

O código precisará ser ligeiramente modificado.

Na quinta linha, remova duas barras "//" e adicione (0x76) ou (0x77) na décima primeira linha. (0x76) é o endereço da placa do barômetro. Minha placa GY-BMP280-3.3 conectada ao barramento I2C acabou tendo o mesmo endereço (0x76). Como descobrir o número do dispositivo conectado ao barramento I2C? Você receberá a resposta para esta pergunta lendo o artigo completo.

Assim, corrigimos o código na janela, agora começamos a verificar e compilar o código no menu Sketch / Check / Compile. Se a verificação e compilação do código for bem-sucedida, no menu Esboço / Carregamento, iniciaremos a gravação do programa no Arduino Uno.

Se o download for bem-sucedido, ao abrir o monitor de porta serial no menu: Ferramentas / Monitor de porta serial, veremos os dados enviados pela placa GY-BMP280-3.3.

Na captura de tela a seguir, o resultado da placa GY-BMP280-3.3 trabalhando em um computador no qual o shell do Arduino IDE não está instalado. Os dados são recebidos pelo programa PuTTY.

Ao mesmo tempo, foi fotografado um barômetro aneróide de laboratório, localizado próximo à placa GY-BMP280-3.3. Ao comparar as leituras do instrumento, você mesmo pode tirar conclusões sobre a precisão da placa GY-BMP280-3.3. Barômetro aneroide certificado pelo laboratório estadual.


Terceira etapa. Verificando a tela LCD com o módulo de interface I2C. Encontramos um monitor LDC com um módulo de interface que se conecta através do barramento I2C ao UNO do Arduino.
Estação meteorológica doméstica em GY-BMP280-3.3 e Ds18b20

Verificamos sua operação usando exemplos do shell do Arduino IDE. Mas antes disso, determinamos o endereço do módulo de interface. Meu módulo de interface possui um endereço 0x3F. Inseri este endereço na linha de esboço: LiquidCrystal_I2C lcd (0x3F, 16.2);
Eu determinei esse endereço usando o esboço “scanner de endereço de dispositivo I2C” descrito em
Lancei o shell do Arduino IDE. No artigo, copiei o código do programa e colei a janela do Arduino IDE.

Comecei a compilação e, em seguida, escrevi o código na placa UNO do Arduino, à qual estavam conectadas a placa GY-BMP280-3.3 e a tela LDC com o módulo de interface I2C. Então, no monitor da porta serial, obtive o seguinte resultado. Meu módulo de interface possui um endereço 0x3F.

Quarta etapa. Verificando o sensor de temperatura DS18b20. Nós o conectamos da seguinte maneira.

A OneWire Arduino Library para trabalhar com o sensor de temperatura DS18b20 já está instalada.

Abra a amostra DS18x20_Temperature, compile, carregue, observe o resultado da medição no monitor da porta serial. Se tudo funcionar, avance para o próximo passo.

Quinta etapa. Assembléia casa estações meteorológicas no GY-BMP280-3.3 e Ds18b20.
Montamos o dispositivo de acordo com o esquema:

Recebi o código do dispositivo combinando todos os exemplos em um e configurando a saída na tela do LDC. Aqui está o que eu tenho:

// Não comentado para uma implementação de software do barramento I2C: //
// #define pin_SW_SDA 3 // Atribua qualquer pino do Arduino para funcionar como uma linha SDA do barramento de software I2C.
// #define pin_SW_SCL 9 // Atribua qualquer pino do Arduino para operar como uma linha SCL no barramento de software I2C.
// Descomente para compatibilidade com a maioria das placas: //
#include
#include // A biblioteca do iarduino usará os métodos e funções da biblioteca do Wire.
#include // Biblioteca para trabalhar o LDC tipo 1602 no barramento I2C

                                                            //
#include // Conecte a biblioteca iarduino_Pressure_BMP para trabalhar com o BMP180 ou BMP280.
sensor iarduino_Pressure_BMP (0x76); // Declara um objeto sensor para trabalhar com um sensor de pressão usando as funções e métodos da biblioteca iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0x3F, 16.2);
OneWire ds (10);
configuração nula () {
    lcd.init ();
    lcd.backlight ();
    Serial.begin (9600); // Inicie a transferência de dados para o monitor da porta serial em 9600 baud.
    atraso (1000); // Estamos aguardando a conclusão dos transitórios ao aplicar energia
    sensor.begin (73); // Inicia o trabalho com o sensor. A altitude atual será calculada em 73 m - a altura da cidade de Buzuluk acima do nível do mar
} //
loop vazio () {
// Leia os dados e exiba: temperatura em ° C, pressão em mm. rt., alteração na altura relativa à especificada na função de início (padrão 0 metros).
lcd.setCursor (0,0); // define o ponto de saída "P =" no LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // divida o valor de P emitido pelo BMP280 por 1000 e defina a saída de 3 casas decimais
lcd.setCursor (12.0); // define o ponto de saída "kPa" no LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (sensor.temperature, 1); // define a saída de 1 casa decimal
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1);
    if (sensor.read (1)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + pressão do sensor + "\ tMM.PT.CT, \ t T = "+ sensor.temperature +" * C, \ t \ t B = "+ sensor.altitude +" M. ");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
// Leia os dados e exiba: temperatura em ° C e pressão em Pa, pressão em mm. rt., alteração na altura relativa à especificada na função de início (padrão 0 metros).
    if (sensor.read (2)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa, \ t \ t T =" + sensor.temperature + "* C, \ t \ t B =" + sensor.altitude + "M.");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
    byte i;
  byte presente = 0;
  byte type_s;
  dados de bytes [12];
  byte addr [8];
  float celsius, fahrenheit;
  if (! ds.search (addr)) {
    Serial.println ("Chega de endereços.");
    Serial.println ();
    ds.reset_search ();
    atraso (250);
    retornar
  }
  Serial.print ("ROM =");
  para (i = 0; i & lt; 8; i ++) {
    Serial.write ('');
    Serial.print (endereço [i], HEX);
  }
  if (OneWire :: crc8 (endereço, 7)! = endereço [7]) {
      Serial.println ("CRC não é válido!");
      retornar
  }
  Serial.println ();
  // o primeiro byte da ROM indica qual chip
  switch (endereço [0]) {
    caso 0x10:
      Serial.println ("Chip = DS18S20"); // ou DS1820 antigo
      type_s = 1;
      quebrar;
    caso 0x28:
      Serial.println ("Chip = DS18B20");
      type_s = 0;
      quebrar;
    caso 0x22:
      Serial.println ("Chip = DS1822");
      type_s = 0;
      quebrar;
    padrão:
      Serial.println ("O dispositivo não é um dispositivo da família DS18x20.");
      retornar
  }
  ds.reset ();
  ds.select (endereço);
  ds.write (0x44, 1); // inicia a conversão, com o parasita ligado no final
  
  atraso (1000); // talvez 750ms seja suficiente, talvez não
  // podemos fazer um ds.depower () aqui, mas a redefinição cuidará disso.
  presente = ds.reset ();
  ds.select (endereço);
  ds.write (0xBE); // Ler Scratchpad
  Serial.print ("Dados =");
  Serial.print (presente, HEX);
  Serial.print ("");
  para (i = 0; i & lt; 9; i ++) {// precisamos de 9 bytes
    dados [i] = ds.read ();
    Serial.print (dados [i], HEX);
    Serial.print ("");
  }
  Serial.print ("CRC =");
  Serial.print (OneWire :: crc8 (dados, 8), HEX);
  Serial.println ();
  // Converte os dados para a temperatura real
  // porque o resultado é um número inteiro assinado de 16 bits, ele deve
  // ser armazenado em um tipo "int16_t", que é sempre 16 bits
  // mesmo quando compilado em um processador de 32 bits.
  int16_t bruto = (dados [1] & lt; & lt; 8) | dados [0];
  if (type_s) {
    cru = cru & lt; & lt; 3; // padrão de resolução de 9 bits
    if (dados [7] == 0x10) {
      // "contagem restante" fornece resolução total de 12 bits
      bruto = (bruto & amp; 0xFFF0) + 12 - dados [6];
    }
  } mais {
    byte cfg = (dados [4] & amp; 0x60);
    // em baixa resolução, os bits baixos são indefinidos, então vamos zerá-los
    if (cfg == 0x00) raw = raw & amp; ~ 7; // resolução de 9 bits, 93,75 ms
    caso contrário, se (cfg == 0x20) raw = raw & amp; ~ 3; // resolução de 10 bits, 187,5 ms
    caso contrário, se (cfg == 0x40) raw = raw & amp; ~ 1; // resolução de 11 bits, 375 ms
    //// o padrão é resolução de 12 bits, tempo de conversão de 750 ms
  }
  celsius = (flutuante) bruto / 16,0;
  fahrenheit = celsius * 1,8 + 32,0;
  Serial.print ("Temperature =");
  Serial.print (celsius);
  Serial.print ("Celsius");
  Serial.print (Fahrenheit);
  Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // define o ponto de saída "Tds =" no LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
    atraso (3000);
}


Aqui está o que eu tenho:


A placa GY-BMP280-3.3 libera pressão em pascal, o que não é muito conveniente. Não consegui resolver o problema de como fazer os dados da pressão de saída da placa GY-BMP280-3.3 em kilopascal. Eu resolvi esse problema na linha de saída da tela LDC.

lcd.print (sensor.pressure / 1000.3); // divida o valor de P emitido pelo BMP280 por 1000 e defina a saída de 3 casas decimais
A placa GY-BMP280-3.3 também fornece valores de altitude.

sensor.begin (73); // Inicia o trabalho com o sensor. A altitude atual será calculada em 73 m - a altura da cidade de Buzuluk acima do nível do mar
Se você relaxar no mar e mudar "sensor.begin (73);" em "sensor.begin (0);" no código e, em seguida, compile e salve o programa na estação meteorológica doméstica no GY-BMP280-3.3 e Ds18b20 e faça uma saída de altura no visor LDC, você também obterá um altímetro.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // Imprime os valores da altura em metros com uma casa decimal
A energia é fornecida ao circuito na minha versão através de um cabo USB. Você pode usar um conversor de impulso de baixa voltagem de 5V / 600 mA e sua estação meteorológica se tornará portátil. Este tipo de fonte de alimentação está bem descrito em artigo.

Compilação bem sucedida!
5
8.8
6.3

Adicionar um comentário

    • sorrirsorrisosxaxaoknão seiyahoonea
      chefearranhartolosimsim simagressivosegredo
      desculpedançardance2dance3perdãoajudabebidas
      pararamigosbomgoodgoodapitodesmaiarlíngua
      fumaçapalmascraydeclararirônicodon-t_mentionbaixar
      calorirritantelaugh1mdareuniãomoskingnegativo
      not_ipipocapunirlerassustarsustospesquisar
      provocarthank_youistoto_clueumnikagudoconcordar
      malbeeeblack_eyeblum3corargabar-setédio
      censuradobrincadeirasecret2ameaçarvitóriayusun_bespectacled
      sacudirrespektlolpreviubem vindoKrutoyya_za
      ya_dobryiajudantene_huliganne_othodifludproibirfechar

Aconselhamos que você leia:

Entregue-o para o smartphone ...