Estação meteorológica (Arduino pro mini, BME280, LCD1602)

1. Introdução

O que pode ser exibido em uma tela de duas linhas, exceto "Hello world!"? Por que não exibir temperatura, umidade e pressão?

Os sensores oferecidos como auxílio de treinamento para o arduino (DHT11, DHT22) mostram temperatura e umidade. Para fins educacionais (para a universidade), foi necessário observar a pressão da mesma maneira. Naturalmente, o departamento tem um barômetro, mas por que não coletar o seu? Além disso, você pode acumular leituras no modo automático, e essa é uma boa experiência no aprendizado do arduino.

De uma forma ou de outra, os componentes foram encomendados da China e esse dispositivo foi montado.

Componentes necessários

Arduino Pro Mini
I2C para LCD (foi possível encomendar imediatamente montado, mas ficou um pouco mais barato)
LCD 1602
BME280

O USB-UART foi usado para enviar o esboço para o arduino. Também foi possível usar um Raspberry Pi ou um computador com uma porta COM.

Diagrama de conexão para firmware e código do programa

Da China, o USB-UART veio com um conjunto de cabos:

imagem

Eles foram suficientes. Deixei o jumper em 3,3 volts, apesar de minha versão do arduino ser alimentada por 5 volts.

UART - Arduino
5v - VCC
TXD - RXD
RXD - TXD
GND - GND
CTS - DTR (opcional, não funcionou para mim, talvez porque a tensão do sinal permanecesse em 3,3V)

Se você não conectar o DTR, depois de enviar o firmware do arduino, precisará reiniciar com o botão embutido, a troca de dados ativa começará nos dois lados (conforme indicado pelos LEDs USB-UART), depois que o firmware for baixado com êxito, ele será reiniciado.

Bibliotecas de terceiros necessárias:

SparkFunBME280
LiquidCrystal I2C

Diretamente o código, com comentários dos exemplos (caso alguém precise alterar alguma coisa).

Código
#include <stdint.h> #include "SparkFunBME280.h" #include "Wire.h" #include "SPI.h" #include <LiquidCrystal_I2C.h> //Global sensor object BME280 mySensor; LiquidCrystal_I2C lcd(0x3F,16,2); // ,    0x3F void setup() { lcd.init(); lcd.backlight(); //***Driver settings********************************// //commInterface can be I2C_MODE or SPI_MODE //specify chipSelectPin using arduino pin names //specify I2C address. Can be 0x77(default) or 0x76 //For I2C, enable the following and disable the SPI section mySensor.settings.commInterface = I2C_MODE; mySensor.settings.I2CAddress = 0x76; // ,      //For SPI enable the following and dissable the I2C section //mySensor.settings.commInterface = SPI_MODE; //mySensor.settings.chipSelectPin = 10; //***Operation settings*****************************// //renMode can be: // 0, Sleep mode // 1 or 2, Forced mode // 3, Normal mode mySensor.settings.runMode = 3; //    Forced mode,        Normal mode //tStandby can be: // 0, 0.5ms // 1, 62.5ms // 2, 125ms // 3, 250ms // 4, 500ms // 5, 1000ms // 6, 10ms // 7, 20ms mySensor.settings.tStandby = 5; //    //filter can be off or number of FIR coefficients to use: // 0, filter off // 1, coefficients = 2 // 2, coefficients = 4 // 3, coefficients = 8 // 4, coefficients = 16 mySensor.settings.filter = 0; //tempOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.tempOverSample = 1; //pressOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.pressOverSample = 1; //humidOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.humidOverSample = 1; //Calling .begin() causes the settings to be loaded mySensor.begin(); } void loop() { //    ,    ,          . lcd.setCursor(0,0); lcd.print("H="); lcd.print((uint8_t)mySensor.readFloatHumidity()); lcd.print("%"); lcd.print(" T="); lcd.print(mySensor.readTempC()); lcd.setCursor(13,0); lcd.print(" P:"); lcd.setCursor(0,1); int mmH=mySensor.readFloatPressure()/133; lcd.print(mmH); lcd.print("mmH "); lcd.print(mySensor.readFloatPressure()); lcd.setCursor(14,1); lcd.print("Pa"); delay(1000); } 


O endereço do sensor pode ser adivinhado, existem apenas dois deles.

Como descobrir o endereço do seu monitor, você pode ver aqui . Dependendo do chip, existem duas placas.

Nesse caso:

imagem

E o endereço será 0x3F, pois A0 - A2 aberto:

imagem

O LED que circula no oval é melhor evaporar.

Diagrama de fiação

O resistor foi selecionado como metade da resistência do sensor (entre VVC e GND), de modo que a queda de tensão nele era de 1,7 volts. Além disso, o circuito pode ser alimentado a partir da entrada de RAW, outra voltagem (por exemplo, da coroa).

imagem

A foto mostra que, para compacidade, você pode levar a energia do sensor e exibir a partir de outro pino. Também mostra um ramo de um par de fios amarelo-laranja, um resistor de 100 Ohms pendurado neles para reduzir o brilho da luz de fundo (você pode deixar o jumper, mas isso cortará seus olhos).

imagem

No meu caso, tudo é alimentado por uma fonte de alimentação de computador antiga. Pode ser alimentado por USB. Todos os componentes foram colados com cola Moment, que estava à mão.

Sumário

No local de trabalho apareceu 1602 aparafusado à mesa, o que mostra pressão, umidade, temperatura. O Arduino pode ser reflash sem removê-lo ( pode se tornar uma linha rasteira ).

Foto
imagem

Local de trabalho, visão geral.

imagem

Vista frontal

imagem

Vista traseira

Source: https://habr.com/ru/post/pt406693/


All Articles