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.
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!