Введение

Что можно вывести на двухстрочный экран, кроме «Hellow world!»? Почему бы не отображать температуру влажность и давление?

Датчики предлагаемые как учебное пособие к arduino (DHT11, DHT22) показывают температуру и влажность воздуха. В учебных целях (для университета) понадобилось наблюдать так же и за давлением. Естественно на кафедре есть барометр, но почему бы не собрать свой? К тому же можно в дальнейшем накапливать показания в автоматическом режиме, и это неплохой опыт в изучении arduino.

Так или иначе из Китая были заказаны комплектующие и собрано данное устройство.

Необходимые комплектующие

Arduino Pro Mini
I2C для LCD (можно было заказать сразу в сборе, но так вышло чуть чуть дешевле)
LCD 1602
BME280

Для отправки скетча в arduino был использован USB-UART. Так же можно было использовать Raspberry Pi или компьютер с COM портом.

Схема подключения для прошивки и код программы

Из Китая USB-UART пришёл с набором проводков:

image

Их вполне хватило. Перемычку оставил на 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);

}


Адрес датчика можно угадать, их всего два.

Как узнать адрес своего дисплея, можно посмотреть тут. В зависимости от микросхемы, есть две таблички.

В данном случае:

image

И адрес будет 0x3F т.к. A0 — A2 разомкнуты:

image

Светодиод который обведён в овал лучше можно выпаять.

Схема подключения

Резистор выбирался как половина от сопротивления датчика (между VVC и GND), чтобы падения напряжения на нём было 1.7 вольта. Так же схему можно запитать от входа RAW, другим напряжением (например от кроны).

image

На фотографии видно, что для компактности можно взять питание на датчик и дисплей с другого пина. Так же там видно ответвление оранжево-жёлтой пары проводов, на них висит резистор на 100 Ом, для уменьшения яркости подсветки (можно оставить джампер, но будет резать глаза).

image

В моём случае всё питается от старого компьютерного блока питания. Можно питать от USB. Все комплектующие были приклеены оказавшемся под рукой клеем «Момент».

Итог

На рабочем месте появился 1602 прикрученный к столу, который показывает давление, влажность, температуру. Arduino можно перепрошить не снимая (возможно станет бегущей строкой).

Фото
image

Рабочее место, общий вид.

image

Вид спереди.

image

Вид сзади.

Комментарии (33)


  1. AndyPike
    17.09.2017 17:40
    +3

    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 из доступных.

    А в целом, для освоения — почему бы и нет для проекта. Желание было, результат есть. Небольшую критику можно воспринимать как одобрение и направление развития.


    1. Serge78rus
      17.09.2017 19:36
      +1

      разве DHT11 и DHT22 выдают температуры не в целых числах?
      У DHT11 разрешение 1 градус, у DHT22 — 0.1


    1. Anarhist2017 Автор
      19.09.2017 13:15

      Про питание датчика учту, были подозрения что при работе будут изменения, но тестер показывал постоянное напряжение (возможно стоило измерять осциллографом т.к. проседает оно не на долго).
      Дешёвой зарядки хватило бы более чем, но использовался тот вариант что есть, в последствии буду вставлять внутрь Raspberry Pi3 (поэтому лежит разобранный), питание будет тоже избыточным 5V 18А, хотя малине хватит и 3А.
      На передней стороне нет токопроводящих частей, кроме выводов, которые спрятаны за корпус стола, обратная сторона приставлена к стенке (для фото и монтажа стол отодвигал), там вероятность КЗ небольшая.
      Датчик BME280 производитель указывает шум 0.2 Pa, меня интересовал вопрос так ли это. Если отойти от датчика и не дышать, то последние четыре разряда показывают постоянное значение, изменение пятого в приделах +-4. Непосредственно библиотека извлекает из датчика значение в паскалях, с одной цифрой после запятой. Барокамеры что бы проверить точность датчика пока не нашёл.

      За критику спасибо, буду развиваться!


      1. Alexeyslav
        19.09.2017 14:35
        +1

        Точность датчика указана в даташите, а на то что обратили внимание — это разрешающая способность и она никак не связана с точностью датчика.
        В блоке питания даже сверху предостаточно токоведущих частей с высоким напряжением, очень часто радиатор силовых транзисторов находится под высоким напряжением.


        1. Anarhist2017 Автор
          20.09.2017 00:05
          -1

          Была мысль купить штук 10 таких датчиков и сверить их показания, накопив достаточное количество данных — обработать. Но как тему дипломной работы не утвердили. Барокамеры на факультете тоже не оказалось. Значит в ближайшее время исследовать вопрос точности датчика не получиться.
          Насчёт токоведущих частей не задумывался, измерял только на радиаторе в который впаяно 2 диода, там 10 вольт.


          1. Alexeyslav
            20.09.2017 10:00
            +1

            И правильно не утвердили. Потому что это уже проделано производителем и цифра занесена в даташит. Да и тянет такая работа максимум на лабораторку…
            Барокамеры мало, очень мало. Нужен образцовый барометр классом точности повыше, а с этим как раз проблемы. Сомневаюсь, что барометр барокамеры будет выше точностью. Что можно сделать из подручных средств — это классический барометр на основе столба воды, только размер барометра будет 10 метров(примерно 3 этажа). Плотность воды с учетом температуры можно взять из справочника, по столбу воды рассчитать давление и сверить с показаниями барометра. Только не забудь просчитать точность измерения давления с используемыми инструментами — ведь температуру измеряешь с погрешностью, плотность воды известна тоже с каким-то допуском(идеальная вода, где взять?) и в конце концов измерить столб высотой в 10 метров с точностью не хуже миллиметра та ещё задачка(миллиметр водного столба это уже порядка 10 паскаль давления) и если посмотришь доступные средства измерения расстояния то врятли найдёшь таковые с точностью 1мм(а это всего каких-то жалких 4 значащих разряда!) на 10 метрах за приемлемую стоимость.

            Радиатор где впаяно два диода — это по всей видимости низковольтная часть, а ты промерь высоковольтную «горячую» часть блока, там где висят силовые транзисторы. И относительно нуля в розетке. В конце концов… водичка в блоке питания даёт волшебный дым — youtu.be/ISPw39b20EI?t=259


      1. iig
        19.09.2017 14:50

        Картонка + 2 сторонний скотч — при макетировании самое то.


  1. Psychosynthesis
    17.09.2017 18:48
    +4

    Глядя на «готовый девайс» и рабочее место захотелось было отсыпать вам пару сотен грамм инженерной культуры, только что-то и у меня самого её не так много завалялось, так что не буду выпендриваться…


    1. icepro
      17.09.2017 23:37

      Поддерживаю :)
      А завернуть «готовое устройство» можно хоть в мыльницу. Какой никакой а все-таки корпус.


  1. yurijevs
    17.09.2017 18:55
    +1

    Точность показаний давления и температуры конечно хорошо, но прогноз осадков ИМХО имеет более прикладное значение.


    1. Anarhist2017 Автор
      19.09.2017 23:25

      Задумка была, но только для предупреждения дождя, что бы успеть накрыть чехлом мотоцикл. Спасибо за видио, про численное значение +-200 Па ещё найти не успел, пока только наблюдал за своими показаниями.


  1. Mulin
    18.09.2017 00:02

    Резистор выбирался как половина от сопротивления датчика (между VVC и GND), чтобы падения напряжения на нём было 1.7 вольта.
    Можно высоким логическим от МК питать. Если не хватает тока — несколько выводов запараллелить.


    1. Serge78rus
      18.09.2017 16:05
      +1

      Для получения напряжения 3.3В надо ставить маломощный трехвыводный стабилизатор, как выше уже написал AndyPike.


      1. Googlist
        19.09.2017 22:39

        Да достаточно бьіло б делителя на резисторах и кондера, сколько там того потребления от источника в 30А.)


        1. Serge78rus
          20.09.2017 09:59

          На самом деле достаточно было прочитать документацию, а именно строку «Power supply» таблицы «Electrical Characteristics»: Min 3.3, Typical 5, Max 6 и питать датчик от 5В.

          По поводу Вашего предложения

          Да достаточно бьіло б делителя на резисторах и кондера

          Датчик потребляет в простое 50мкА, в активном состоянии — до 1.5мА.
          Вы конденсатором хотите полностью обеспечить пик потребления на время измерения? Тогда, учитывая время нахождения в активном состоянии 5мс и если мы допустим просадку при этом 100мВ, придется ставить емкость 100мФ, что по цене сравнимо со стабилизатором 1117 5V. Если же Вы хотите поставить делитель с учетом потребления в пике, то при той же допустимой просадке на пике потребления (0.1В), через делитель придется постоянно гнать в тепло порядка 50мА (0.25Вт при 5В). Конечно для источника 30А это не проблема, но зачем!?

          Помимо всего вышесказанного стоит помнить, что автор еще только учится (в комментариях он упоминает про дипломный проект), так пусть уж лучше сразу учится делать правильно.


          1. iig
            20.09.2017 12:16

            Для дипломного проекта ВУЗа слабовато выглядит. Как уже заметили — это лабораторная работа, как максимум.
            Дипломная работа слушателя курсов ардуины робототехники?


            1. Serge78rus
              20.09.2017 16:25

              Про диплом — это не я придумал, вот тут автор упоминает диплом:

              Но как тему дипломной работы не утвердили.

              А потом, мы же не знаем специализацию автора, может данная поделка — это только вспомогательный инструмент для основной работы в рамках диплома.


  1. vvzvlad
    18.09.2017 03:23
    +2

    Мне бы было малось стыдно такое показывать.


  1. Hellsy22
    18.09.2017 05:08
    +4

    С одной стороны, статья из серии «как помигать светодиодом на Ардуине», а с другой — это лучше, чем очередная статья про биткоины или сомнительного качества перевод какой-нибудь истерии «зеленых».


  1. iig
    18.09.2017 12:15
    +1

    Что можно вывести на двухстрочный экран, кроме «Hellow world!»? Почему бы не отображать температуру влажность и давление?

    Можно воспользоваться погодным сервисом, openweathermap.org например. Через ихнее API можно получать и текущую информацию (бесплатно), и прогноз (возможно, не бесплатно).
    Из плюсов такого решения — не нужно строить свою метеостанцию, ибо датчик за окном может показывать что угодно.
    Из минусов — нужен интернет, может работать недостоверно в нецивилизованных районах.


  1. Alexeyslav
    18.09.2017 16:27
    +1

    Только по прибору валяющемуся на столе уже многое можно сказать… бардак.
    Что бросается в глаза до кровавых слёз — избыточная точность выводимых данных. Датчики врятли имеют точность выше двух значащих разрядов, а значит не имеет смысла выводить больше. У барометра измерение до десятых долей паскаля — разве что только в динамике, а выводить значение давления — максимум 3-4 значащих разряда, остальное ересь. И не в паскалях выводить надо а в милибарах на крайний случай, или мм.рт.ст. для стариков.
    Ну и само-собой дизайн вывода на дисплей — даже не удосужились перевод строки в нужном месте сделать — символ остался на первой строке а информация на другой.
    И блок питания от компа… плохая идея, лучше взять зарядку от телефона. Тем более открытый БП — это искры, электротравма и КЗ — вопрос лишь времени.


    1. Anarhist2017 Автор
      19.09.2017 13:33

      По поводу приборов лежащих на столе могу сказать лишь то что не видел ни одного рабочего места радиолюбителя с площадью менее двух квадратных метров на котором был бы порядок…

      Про избыточную точность отписал чуть выше, так заявил производитель.

      Дизайн вывода на дисплей был неоднократно нарисован на листике в клеточку. С тем что можно было не писать мм.рт.ст. согласен, тогда можно было бы вывести символ в нужной строке (кстати в коде видно, что перевода строки нет, и пробел " P:" тоже важен, при условии что влажность достигнет 100% (произойдёт сдвиг строки на символ вправо, один разряд температуры не будет отображаться)).

      В дальнейшем БП будет собран, и в нём будет стоять Raspberry Pi, сейчас стоит в таком виде, искр нет, корпус — вопрос лишь времени.


      1. Alexeyslav
        19.09.2017 15:43
        +2

        Нет, я про сам прибор. Как-то мне попались в руки одновременно два таких прибора и показывали они напряжение автомобильного аккумулятора с разницей в 1В с лишним. Поржал и попрощался с ними. Это показометр какой-то, не знаешь что от него ожидать и что он вообще показывает с такой «погрешностью». Всё бы хорошо, если это можно было бы чем-то скомпенсировать, но нет — на плате нет никакой регулировки и более того от прикосновения рук к плате показания плывут а это весьма скверный признак — зависимость от влажности и «чистоты» внутренностей прибора.

        Искр нет до тех пор пока туда что-то металлическое не упадёт — гаечка, шайба например или винт.


        1. Anarhist2017 Автор
          20.09.2017 00:08

          Проверить точность занеся в гидрометцентр ещё не успел. Но там вроде нет доступа для поверки барометра.

          Фото рабочего места в будний, а не в выходной:
          image
          Полотенце на фотках обычно накрывает микшер, что бы не пылился.


  1. Alex_nakhodka
    20.09.2017 00:33
    +1

    Судя по схеме датчика DHT22 нет, и на фото его тоже не видать, так с чего берутся показания влажности и температуры?


    1. Anarhist2017 Автор
      20.09.2017 00:34
      +2

      Датчик BME280 = давление, влажность, температура.


      1. Alex_nakhodka
        20.09.2017 01:27

        Да, действительно, проморгал.


        1. Hellsy22
          20.09.2017 11:32

          Неудивительно, у BME280 это не основная функция. И точность невысока.


  1. ugsm
    20.09.2017 17:33

    как показывает практика, BME работает лучше DHTxx и SHTxx датчиков (которые исключительно температура/влажность). DHT глючат при нестабильном питании, SHT очень сильно врут в плюс (в смысле завышают) при высоких значениях влажности. Кроме того, металлический корпус датчика гораздо быстрее ловит изменение температуры, чем пластиковые конкуренты.
    ЗЫ. во избежание повторения ошибок автора последователям/повторителям лучше брать не Pro mini, а хотя бы nano, дороже рублей на 30-40, но имеет на борту USB (беспроблемная прошивка и питание от любой зарядки) и, хоть и маломощный, но стабилизатор 3.3В (для подобных датчиков хватит).


    1. Alexeyslav
      21.09.2017 08:18

      Корпус не должен ловить изменение температуры, это чисто механическая защита. Дело там вовсе не в корпусе.


      1. ugsm
        21.09.2017 11:54

        Должен, не должен, но факт налицо — датчики в пластиковых корпусах гораздо более инерционны, нежели металлические BMx. Иногда нужно отследить быстрое изменение температуры, DHT на такое не способны, в отличие от BMP/BME


        1. iig
          21.09.2017 12:16

          Теплопроводность металла лучше, чем пластика. (К.О.)


        1. Alexeyslav
          21.09.2017 13:07

          Температуру жидкой среды они одинаково быстро измерять будут. Всё в большей степени зависит от термочувствительного элемента а не от корпуса датчика.
          Когда надо отслеживать быстрое изменение температуры применяют термопару.