Введение
Что можно вывести на двухстрочный экран, кроме «Hellow world!»? Почему бы не отображать температуру влажность и давление?
Датчики предлагаемые как учебное пособие к arduino (DHT11, DHT22) показывают температуру и влажность воздуха. В учебных целях (для университета) понадобилось наблюдать так же и за давлением. Естественно на кафедре есть барометр, но почему бы не собрать свой? К тому же можно в дальнейшем накапливать показания в автоматическом режиме, и это неплохой опыт в изучении arduino.
Так или иначе из Китая были заказаны комплектующие и собрано данное устройство.
Необходимые комплектующие
Arduino Pro Mini
I2C для LCD (можно было заказать сразу в сборе, но так вышло чуть чуть дешевле)
LCD 1602
BME280
Для отправки скетча в arduino был использован USB-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
Непосредственно код, с комментариями из примеров (на случай, если кому то понадобится что то менять).
Адрес датчика можно угадать, их всего два.
Как узнать адрес своего дисплея, можно посмотреть тут. В зависимости от микросхемы, есть две таблички.
В данном случае:
И адрес будет 0x3F т.к. A0 — A2 разомкнуты:
Светодиод который обведён в оваллучше можно выпаять.
Схема подключения
Резистор выбирался как половина от сопротивления датчика (между VVC и GND), чтобы падения напряжения на нём было 1.7 вольта. Так же схему можно запитать от входа RAW, другим напряжением (например от кроны).
На фотографии видно, что для компактности можно взять питание на датчик и дисплей с другого пина. Так же там видно ответвление оранжево-жёлтой пары проводов, на них висит резистор на 100 Ом, для уменьшения яркости подсветки (можно оставить джампер, но будет резать глаза).
В моём случае всё питается от старого компьютерного блока питания. Можно питать от USB. Все комплектующие были приклеены оказавшемся под рукой клеем «Момент».
Итог
На рабочем месте появился 1602 прикрученный к столу, который показывает давление, влажность, температуру. Arduino можно перепрошить не снимая (возможно станет бегущей строкой).
Что можно вывести на двухстрочный экран, кроме «Hellow world!»? Почему бы не отображать температуру влажность и давление?
Датчики предлагаемые как учебное пособие к arduino (DHT11, DHT22) показывают температуру и влажность воздуха. В учебных целях (для университета) понадобилось наблюдать так же и за давлением. Естественно на кафедре есть барометр, но почему бы не собрать свой? К тому же можно в дальнейшем накапливать показания в автоматическом режиме, и это неплохой опыт в изучении arduino.
Так или иначе из Китая были заказаны комплектующие и собрано данное устройство.
Необходимые комплектующие
Arduino Pro Mini
I2C для LCD (можно было заказать сразу в сборе, но так вышло чуть чуть дешевле)
LCD 1602
BME280
Для отправки скетча в arduino был использован USB-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 <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);
}
Адрес датчика можно угадать, их всего два.
Как узнать адрес своего дисплея, можно посмотреть тут. В зависимости от микросхемы, есть две таблички.
В данном случае:
И адрес будет 0x3F т.к. A0 — A2 разомкнуты:
Светодиод который обведён в овал
Схема подключения
Резистор выбирался как половина от сопротивления датчика (между VVC и GND), чтобы падения напряжения на нём было 1.7 вольта. Так же схему можно запитать от входа RAW, другим напряжением (например от кроны).
На фотографии видно, что для компактности можно взять питание на датчик и дисплей с другого пина. Так же там видно ответвление оранжево-жёлтой пары проводов, на них висит резистор на 100 Ом, для уменьшения яркости подсветки (можно оставить джампер, но будет резать глаза).
В моём случае всё питается от старого компьютерного блока питания. Можно питать от USB. Все комплектующие были приклеены оказавшемся под рукой клеем «Момент».
Итог
На рабочем месте появился 1602 прикрученный к столу, который показывает давление, влажность, температуру. Arduino можно перепрошить не снимая (
Фото
Рабочее место, общий вид.
Вид спереди.
Вид сзади.
Рабочее место, общий вид.
Вид спереди.
Вид сзади.
Комментарии (33)
Psychosynthesis
17.09.2017 18:48+4Глядя на «готовый девайс» и рабочее место захотелось было отсыпать вам пару сотен грамм инженерной культуры, только что-то и у меня самого её не так много завалялось, так что не буду выпендриваться…
icepro
17.09.2017 23:37Поддерживаю :)
А завернуть «готовое устройство» можно хоть в мыльницу. Какой никакой а все-таки корпус.
yurijevs
17.09.2017 18:55+1Точность показаний давления и температуры конечно хорошо, но прогноз осадков ИМХО имеет более прикладное значение.
AndyPike
1) Hellow!
2) Так питать датчики нельзя, хотя и, может быть, пока всё работает. Там импульсное потребление тока, а у вас резистор как делитель. Минимум — поставить C=0.1u+10u между VCC и GND, хотя может на самой плате датчика что-то развязывающее есть. Линейный преобразователь напряжения в виде мсх или R-делитель + npn транзистор, на эмиттере небольшой R, вариантов много, но на VCC не будет так скакать напряжение в зависимости от потребления.
3) «В моём случае всё питается от старого компьютерного блока питания» — 5v 30А? Дешёвой зарядки за 50 руб. — хватит за глаза.
4) «На рабочем месте появился 1602 прикрученный к столу». Судя по рабочей обстановке на рабочем столе, невзначай под индикатор и всё остальное может попасть кусочек оголённого провода, вилка, ложка, и только лёгкий дымок известит о скорой кончине.
5) Давно не в теме, но разве DHT11 и DHT22 выдают температуры не в целых числах? Откуда появились десятые, это только 1/16 в 18s20 из доступных.
А в целом, для освоения — почему бы и нет для проекта. Желание было, результат есть. Небольшую критику можно воспринимать как одобрение и направление развития.
Serge78rus
Anarhist2017 Автор
Про питание датчика учту, были подозрения что при работе будут изменения, но тестер показывал постоянное напряжение (возможно стоило измерять осциллографом т.к. проседает оно не на долго).
Дешёвой зарядки хватило бы более чем, но использовался тот вариант что есть, в последствии буду вставлять внутрь Raspberry Pi3 (поэтому лежит разобранный), питание будет тоже избыточным 5V 18А, хотя малине хватит и 3А.
На передней стороне нет токопроводящих частей, кроме выводов, которые спрятаны за корпус стола, обратная сторона приставлена к стенке (для фото и монтажа стол отодвигал), там вероятность КЗ небольшая.
Датчик BME280 производитель указывает шум 0.2 Pa, меня интересовал вопрос так ли это. Если отойти от датчика и не дышать, то последние четыре разряда показывают постоянное значение, изменение пятого в приделах +-4. Непосредственно библиотека извлекает из датчика значение в паскалях, с одной цифрой после запятой. Барокамеры что бы проверить точность датчика пока не нашёл.
За критику спасибо, буду развиваться!
Alexeyslav
Точность датчика указана в даташите, а на то что обратили внимание — это разрешающая способность и она никак не связана с точностью датчика.
В блоке питания даже сверху предостаточно токоведущих частей с высоким напряжением, очень часто радиатор силовых транзисторов находится под высоким напряжением.
Anarhist2017 Автор
Была мысль купить штук 10 таких датчиков и сверить их показания, накопив достаточное количество данных — обработать. Но как тему дипломной работы не утвердили. Барокамеры на факультете тоже не оказалось. Значит в ближайшее время исследовать вопрос точности датчика не получиться.
Насчёт токоведущих частей не задумывался, измерял только на радиаторе в который впаяно 2 диода, там 10 вольт.
Alexeyslav
И правильно не утвердили. Потому что это уже проделано производителем и цифра занесена в даташит. Да и тянет такая работа максимум на лабораторку…
Барокамеры мало, очень мало. Нужен образцовый барометр классом точности повыше, а с этим как раз проблемы. Сомневаюсь, что барометр барокамеры будет выше точностью. Что можно сделать из подручных средств — это классический барометр на основе столба воды, только размер барометра будет 10 метров(примерно 3 этажа). Плотность воды с учетом температуры можно взять из справочника, по столбу воды рассчитать давление и сверить с показаниями барометра. Только не забудь просчитать точность измерения давления с используемыми инструментами — ведь температуру измеряешь с погрешностью, плотность воды известна тоже с каким-то допуском(идеальная вода, где взять?) и в конце концов измерить столб высотой в 10 метров с точностью не хуже миллиметра та ещё задачка(миллиметр водного столба это уже порядка 10 паскаль давления) и если посмотришь доступные средства измерения расстояния то врятли найдёшь таковые с точностью 1мм(а это всего каких-то жалких 4 значащих разряда!) на 10 метрах за приемлемую стоимость.
Радиатор где впаяно два диода — это по всей видимости низковольтная часть, а ты промерь высоковольтную «горячую» часть блока, там где висят силовые транзисторы. И относительно нуля в розетке. В конце концов… водичка в блоке питания даёт волшебный дым — youtu.be/ISPw39b20EI?t=259
iig
Картонка + 2 сторонний скотч — при макетировании самое то.