[Из песочницы] Метеостанция (Arduino pro mini, BME280, LCD1602)
Введение
Что можно вывести на двухстрочный экран, кроме «Hellow world!»? Почему бы не отображать температуру влажность и давление?
Датчики предлагаемые как учебное пособие к arduino (DHT11, DHT22) показывают температуру и влажность воздуха. В учебных целях (для университета) понадобилось наблюдать так же и за давлением. Естественно на кафедре есть барометр, но почему бы не собрать свой? К тому же можно в дальнейшем накапливать показания в автоматическом режиме, и это неплохой опыт в изучении arduino.
Так или иначе из Китая были заказаны комплектующие и собрано данное устройство.
Необходимые комплектующие
Arduino Pro Mini
I2C для LCD (можно было заказать сразу в сборе, но так вышло чуть чуть дешевле)
LCD 1602
BME280
Для отправки скетча в arduino был использован UBS-UART. Так же можно было использовать Raspberry Pi или компьютер с COM портом.
Схема подключения для прошивки и код программы
Из Китая USB-UART пришёл с набором проводков:
Их вполне хватило. Перемычку оставил на 3.3 вольта, несмотря на то что моя версия arduino питается от 5 вольт.
UART — Arduino
5v — VCC
TXD — RXD
RXD — TXD
GND — GND
CTS — DTR (опционально, у меня не работал, возможно потому что напряжение сигналов осталось 3.3В)
Если не подключать DTR, то после отправки прошивки arduino нужно перезагрузить встроенной кнопкой, начнётся активный обмен данными в обе стороны (о чём свидетельствуют светодиоды на USB-UART), после успешной загрузки прошивки, она сама перезагрузится.
Необходимые сторонние библиотеки:
SparkFunBME280
LiquidCrystal I2C
Непосредственно код, с комментариями из примеров (на случай, если кому то понадобится что то менять).
#include
#include "SparkFunBME280.h"
#include "Wire.h"
#include "SPI.h"
#include
//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);
}
Адрес датчика можно угадать, их всего два.
Как узнать адрес своего дисплея, можно посмотреть тут. В зависимости от микросхемы, есть две таблички.
В данном случае:
И адрес будет 0×3F т.к. A0 — A2 разомкнуты:
Светодиод который обведён в овал лучше можно выпаять.
Схема подключения
Резистор выбирался как половина от сопротивления датчика (между VVC и GND), чтобы падения напряжения на нём было 1.7 вольта. Так же схему можно запитать от входа RAW, другим напряжением (например от кроны).
На фотографии видно, что для компактности можно взять питание на датчик и дисплей с другого пина. Так же там видно ответвление оранжево-жёлтой пары проводов, на них висит резистор на 100 Ом, для уменьшения яркости подсветки (можно оставить джампер, но будет резать глаза).
В моём случае всё питается от старого компьютерного блока питания. Можно питать от USB. Все комплектующие были приклеены оказавшемся под рукой клеем «Момент».
Итог
На рабочем месте появился 1602 прикрученный к столу, который показывает давление, влажность, температуру. Arduino можно перепрошить не снимая (возможно станет бегущей строкой).
Рабочее место, общий вид.
Вид спереди.
Вид сзади.