Продолжение. Предыдущая часть.


Оглавление:



Софт. Выбор компонентов



Выбор железа и софта тесно взаимосвязан как «курица и яйцо». С чего начать, с железа, с софта? Если у вас хорошее железо, но к нему нет драйверов, библиотек и софта (IDE, утилиты для прошивки и т.п.), то оно бесполезно, и наоборот.


Поэтому рассказываю еще раз про выбор между nRF24L01+ и ESP8266 для связи удаленных датчиков с центральным блоком.


Дело в том, что ESP8266 это не просто тупой WiFi адаптер, он имеет на борту микроконтроллер по мощности и объему памяти превосходящий Ардуино. По умолчанию ESP8266 имеет прошивку в виде набора AT команд, в этом случае ESP используется как простой модем. Но есть и более продвинутые прошивки, здесь ESP8266 даже может выступать в роли веб-сервера, ну и конечно же управлять датчиками как и Arduino.


Однако все эти продвинутые прошивки имеют недостатки, которые не позволили (в сумме с железячными вопросами о которых я уже писал) применить ESP8266 в данном проекте:


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

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


В свою очередь стандартные AT-прошивки так же имеют минусы:


  • они всё ещё сыроваты (по состоянию на 2016)
  • мне не удалось найти нормальную библиотеку для Arduino для управления модулем ESP8266 с помощью AT команд, пришлось «колхозить» самому.

С другой стороны радиомодуль nRF24L01+ прост и понятен, для работы с ним есть супер либа RadioHead и никаких проблем с программированием. Библиотека хорошо документирована, что немаловажно.


RadioHead позволяет передавать структуры данных (а не только отдельные числа), что и реализовано в данном проекте. Забегая вперед скажу, RadioHead может надёжно передавать данные, с повторами если не дошло с первого раза. Все эти вещи библиотека берет на себя.


Для энергосбережения использую библиотеку Low Power Library, она проста и содержит только то, что нужно.


Вот кусок кода:


// по умолчанию устанавливается 2.402 GHz (канал 2), 2Mbps, 0dBm
rfdata.init();
// передача данных на сервер (с повторами, если потребуется)
rfdata.sendtoWait((uint8_t*)&dhtData, sizeof(dhtData), SERVER_ADDRESS);
// засыпаем
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);`

Всё!


В случае же применения ESP8266 в заоконном датчике, я был бы вынужден создавать WiFi точку доступа и каким-то образом передавать данные (где прошивки, где софт?). Либо позволить датчику напрямую слать данные на веб-сервер, а центральный блок (который в этом случае перестаёт играть роль «центрального») учить читать данные оттуда, чтобы их отобразить на табло.


Другими словами я пошёл путем большей автономии от WiFi интернета и PHP + MySQL сервера. Вы можете начать «клепать» метеостанцию уже сейчас не имея доступа в интернет и/или хостинга для сервера, в этом случае ESP8266 вам не нужен, просто добавите его потом.


Для считывания данных с датчиков типа DHT есть библиотека Adafruit DHT Sensor Library. Работа с ней проста и понятна.


Для датчика давления подходит библиотека Adafruit BMP085 Unified, которая требует наличия библиотеки абстрактного уровня Adafruit Sensor.


В составе всех библиотек есть примеры скетчей.


Вот и всё пожалуй с теоретической частью. «Наши цели ясны, задачи определены. За работу, товарищи!»


Центральный блок. Железо


Ну наконец-то, после всех заумствований приступаем к сборке!


Примечание. Если вы до этого ни разу не собирали метеостанцию (да ладно!), то вы можете начать и не имея всех деталей под рукой. Например, можно начать не имея радиомодуля и/или ESP8266. Датчик барометрического давления BMP180 также может отсутствовать. Добавите потом. Правда в этом случае вам придется самостоятельно закоментировать в скетче те участки кода, которые отвечают за взаимодействие с отсутствующими блоками, но это не так уж и сложно. Я покажу как.


Главное, чтобы хоть что-то собралось и заработало, тогда веселее продолжать.


Как уже говорилось, центральный блок основан на Arduino MEGA. Ещё нам понадобятся:


  • датчик температуры и влажности DHT11
  • датчик барометрического давления типа BMP180
  • WiFi модуль ESP8266
  • радиомодуль типа nRF24 2,4 Ггц
  • дисплей типа LCD1604 (4 строки по 16 символов), купить можно за $5
  • блок питания с выходом 5-12 В постоянного напряжения (я использовал зарядку от мобильного с USB выходом что удобно)
  • макетная плата под пайку, паяльник, канифоль, припой либо обычная беспаечная arduino-макетная плата. Лично я паял для надёжности, потому что проект явно был долгоиграющим и не хотелось страдать из-за случайно выдернутого из макетки проводка.

Макетную плату для распайки можно купить от $1. Берите размером побольше, чтобы хватило на все соединения. И ещё раз: перед покупкой читайте описание, а не картинку.


Беспаечную плату можно купить от $2. Берите размером побольше, чтобы хватило на все соединения.


Соединительные провода бывают таких нужных нам типов:


  • Dupont кабель «папа-мама» (есть и «папа-папа», «мама-мама»). Это шлейф из нескольких проводов с разными цветами изоляции и коннекторами под штыревые контакты для Arduino. Такими проводами удобно соединять платы и датчики напрямую к Ардуино без использования макетной платы.
  • Обычные соединительные провода под беспаечную макетную плату для Ардуино.
  • Пучок проводков для пайки.

Первым делом распаял табло LCD-1604. Сначала припаял штырьки к табло, затем разъемы к макетной плате.



Вид снизу.



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




Для того чтобы не забыть, где какие разъемы, «покрасил» белым корректором участки платы по соседству и сделал соответствующие надписи. Некрасиво? Зато практично и быстро, это же прототип!



Распиновка и соединение


Дисплей 16?4 LCD1604


Подробнее о дисплее и работе с ним погуглите «Работа с символьными ЖКИ на базе HD44780». Отметим, что нужно внимательно отнестись к полярности подключения питания к ЖК-индикатору и чтобы напряжение питания было в диапазоне +4,5…5,5 В. Невнимательное отношение к этому может привести к выходу индикатора из строя!


Пин LCD 1604 Arduino MEGA Arduino UNO Описание
VSS GND GND GND
VDD 5 V 5 V 4,7 — 5,3V
RS 22 4 Высокий уровень означает, что сигнал на выходах DB0—DB7 является данными, низкий — командой
RW GND GND Определяет направление данных (чтение/запись). Так как операция чтения данных из индикатора обычно бывает невостребованной, то можно установить постоянно на этом входе низкий уровень
E 23 5 Импульс длительностью не менее 500 мс на этом выводе определяет сигнал для чтения/записи данных с выводов DB0-DB7, RS и WR
DB4 24 8 Входящие/исходящие данные
DB5 25 9
DB6 26 10
DB7 27 11
LED A+ +5V или резистор 220 Ом > +5VLED-A
LED B- GND
V0 GND или подстроечник на 10кОм

Программная инициализация будет выглядеть так:


// Arduino MEGA
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);

// Arduino UNO
LiquidCrystal lcd(4, 5, 8, 9, 10, 11);

Температура, влажность DHT11


Подключение датчика температуры и влажности DHT11 (SainSmart). Датчик расположите лицевой стороной вверх, выводы будут описаны слева направо.


DHT11 Arduino Mega
DATA Digital pin 2 (PWM) (см. ниже DHTPIN)
VCC 3,3—5 В (рекомендуется 5 В, лучше внешнее питание)
GND GND

Программная инициализация


#define DHTPIN  2      // цифровой пин Digital pin 2 (PWM)
#define DHTTYPE DHT11  // см. DHT.h

// инициализация
DHT dht(DHTPIN, DHTTYPE);

Барометр BMP180


Подключение датчика атмосферного давления BMP180 (барометр) + температура по интерфейсу I2C/TWI.


BMP180 Arduino Mega
VCC не подключен
GND GND
SCL 21 (SCL)
SDA 20 (SDA)
3,3 3,3 В

Для UNO: A4 (SDA), A5 (SCL).


// инициализация
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); // sensorID

nRF24L01+


Краткие характеристики:


  • Диапазон частот 2,401 — 2,4835 Ггц
  • 126 каналов. Нулевой канал начинается с 2400 Мгц и далее с шагом 1 Мгц, например 70 канал находится соответственно на 2470 Мгц. При установке скорости передачи 2Mbps занимается ширина канала в 2 Мгц
  • Питание 1,9 — 3,6 В (рекомендуется 3,3 В)

Вот распиновка модуля.


Pinout nRF2401L+


Некоторые советуют сразу же припаять керамический конденсатор 100nF (можно 1µF, 10µF) на выводы питания RF для избежания электрических помех.


Распиновка nRF24L01+ (смотреть сверху платы там где чип, пины должны быть внизу) :


пин 2 3,3V пин 4 CSN пин 6 MOSI пин 8 IRQ
пин 1 GND пин 3 CE пин 5 SCK пин 7 MISO

Подключение для метеостанции:


Arduino Mega nRF24L01+
3,3 В VCC пин 2 (лучше внешнее питание)
пин D8 CE пин 3 (chip enable in)
SS пин D53 CSN пин 4 (chip select in)
SCK пин D52 SCK пин 5 (SPI clock in)
MOSI пин D51 SDI пин 6 (SPI Data in)
MISO пин D50 SDO пин 7 (SPI data out)
IRQ пин 8 (Interrupt output) не подсоединен
GND GND пин 1 (ground in)

Программирование радиомодуля будет подробно описано в программной части.


ESP8266


Распиновка ESP8266 (смотреть сверху платы там где чипы, пины должны быть внизу):


GND GPIO2 GPIO0 RX
TX CH_PD RESET VCC

Подключение ESP8266 для метеостанции:


ESP8266 Arduino Mega
TX 10 пин (SoftwareSerial RX)
RX 11 пин (SoftwareSerial TX)
VCC 3,3 В
GND GND
CH_PD Через резистор 10К к 3,3 В Arduino
GPI0 Необязательно. Через резистор 10К к 3,3 В Arduino
GPI2 Необязательно. Через резистор 10К к 3,3 В Arduino

КДПВ


Центральный блок в сборе. «Материнскую плату» вырезал из картонной коробки из-под обуви и к ней винтиками на 3 прикрутил всё остальное.


Центральный блок в сборе


Как видим в этом месте всё питание осуществляется от пинов Ардуино, т.е. к блоку питания напрямую ничего не идёт, и пока мощи хватает.


Вроде всё. Ничего не забыл.


Паяйте, соединяйте. В следующей части будет приведен рабочий скетч для центрального блока и наша метеостанция уже что-то покажет.


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


  1. kvvv
    10.10.2018 13:17

    А как же датчики ветра и дождя? И почему для DHT11 и BMP180 нужно ардуину заводить? Что то я не понял. У меня все это добро прекрасно крутится на есп с еспизи прошивкой и все работает как часы


  1. ionicman
    10.10.2018 13:48

    За DIY, кнечно, плюс.

    Вопрос вот в чем — зачем изобретать велосипед, если протокл общения выносных блоков RST/OREGON на 433MHz давным-давно отреверсен, они есть отдельно в продаже — как оригинальные, так и китайские клоны. Китайский клон стоит на Али от 4-10$, а цифровой приемник этого счастья 2-5$.

    Причем, блок уже оптимизирован, компактен, работает без проводов, содержит датчик влажности/температуры, имеет хороший заводской корпус и гидроизоляцию + питается от солевых батареек AAA (емкость не зависит от температуры вообще) примерно год?

    Блок такого вида:
    image

    Причем их можно к одному приемнику подключить до 4-х.
    На деле можно один внутрь дома поставить — и тогда на базовом блоке вообще ничего городить не надо будет кроме измерения давления.

    Ну и (ИМХО) основной блок не должен быть с питанием от сети — это неудобно.
    Зато удобно повесить основной блок на стенку и никаких проводов.
    Раз в год нужно будет подзаряжать 18650 в нем и все.

    Литий и e-ink (опять-же с али) полностью решает эту проблему.

    Вобщем, не очень понятно, зачем все так сложно делать и героически потом со всем этим бороться?

    Хотя, конечно, это в разы лучше чем просто сидеть и ничего не делать :)


    1. siryoshka
      10.10.2018 14:33

      Так это проект не хуже и во многом не лучше других, по софту конечно ожидал лучшего, что то своего


    1. Process0169
      11.10.2018 11:22

      Ключевое слово в вашем вопросе — это слово «зачем».
      Я подозреваю что человек в курсе, что для того чтобы получить метеостанцию — ее можно просто купить. Причем это будет в разы быстрее, красивее и эффективнее по трудозатратам. Тут цель не состоит в том, чтобы пройти все муки ада, сделать прототип, убедиться что все работает, нарисовать схему, отладить, заказать корпус, плату, комплектующие, сборку и начать продавать метеостанцию. С такими идеями автор опоздал бы лет на 25, ибо нового тут ничего нет. Основная цель — самообразование. И она достигнута.


      1. ionicman
        12.10.2018 13:35

        ее можно просто купить

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

        Однако изобретать велосипед там, где все наши нужды решены и именно так, как нам надо — это весьма не очень. Т.е. если бы покупной датчик не выполнял какие-либо из наших требований — тогда да, есть смысл заморочиться. Здесь же надо измерять температуру / влажность и быть беспроводным и автономным — полностью выполняется. Мало того, если уж делать — то делать хорошо, однако выбор автором старого сенсора, когда давным-давно на рынке есть гораздо лучше, для меня тоже остался загадкой. Ну и изюминка — для получения знаний и создания действительно надежного и мало потребляющего устройства про софт-часть Ардуино надо забыть, как про страшный сон и писать напрямую на Си без всяких обвязок напрямую ATMEGA (328 или 168 — на али такие модули за 1.5-3$ можно отхватить).

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

        Всегда следует соблюдать баланс рациональности.


        1. Process0169
          12.10.2018 14:12

          Мне кажется вы неправильно прочли мой комментарий :) Там есть плохо заметные слова «не» и «бы».
          Тут цель не состоит в том, чтобы…
          … автор опоздал бы лет на…
          Собрал — работает — прикольно. Цель достигнута.


        1. Nick_Shl
          12.10.2018 15:06

          Atmega нужно забыть как страшный сон, переходить на ARM и писать на C++. Лично мне нравятся STM32. Blue Pill с STM32F103C8 на Ali стоит меньше двух баксов, при этом имеет 32-хбитное ядро 72 МГц, 64 Кб Flash(реально 128 Кб) и 16 Кб ОЗУ. Размером эта платка чуть больше Arduino Mini.


          1. iig
            12.10.2018 15:26

            И метеостанция на ардуине STM32 будет мерить температуру на балконе еще точнее? ;)


            1. Nick_Shl
              12.10.2018 17:14

              Зачем изучать зоопарк устройств, если можно изучить одну линейку которая закроет все потребности?
              Если нужно быстро и тяп-ляп — тут Ардуина вне конкуренции. Если нужно качественно от и до, с поманием как все происходит, с хорошо форматированный кодом — тут же надо переходить на «взрослые» IDE. И вот тут возникает вопрос: а зачем переходить оставаясь при этом на камнях прошлого века, как советуют выше?


              1. iig
                12.10.2018 17:42

                Если нужно быстро и тяп-ляп — тут Ардуина вне конкуренции.

                Быстро — не факт. Возможно, код C++ под ардуину пишется значительно быстрее, чем под любую другую платформу… Там API совсем простое… Если да — это же прекрасно, время == деньги.
                Тяп-ляп — не факт. Или во взрослой IDE говнокод откажется компилироваться?


            1. Process0169
              12.10.2018 17:23

              На STM32 можно хотя бы изобразить что-то типа ОСРВ и перестать наконец писать скетчи и начать программировать. Цель ведь самообразование?


          1. Process0169
            12.10.2018 17:18

            Тогда уж будьте последовательным и забудьте про платки. Рисуйте свои, под конкретную задачу со всем необходимым на борту. Это не сложнее чем 100500 проводков воткнуть, зато более информативно и повторяемо. Голый камень STM32F103C8 на али стоит 64руб. 128кб это в STM32F103CB. Всё что разлочивается (если разлочивается) в С8 рано или поздно начинает глючить.
            Тут надо сказать что порог вхождения в Keil uVision на порядок выше чем у mikroC PRO for ARM. Но это всё странно было бы сравнивать с ардуиновским блокнотом.


          1. ionicman
            13.10.2018 11:11

            Я также считаю, но там порог вхождения гораздо выше пока и сообщество гораздо меньше.

            Кстати, пользуясь случаем — какую IDE используете под STM32? Периферию в чем настраиваете?

            Мой вариант: Keil + CubeMX.


    1. alfaterra
      11.10.2018 11:22

      а цифровой приемник этого счастья 2-5$

      имеется ввиду rf модуль 433 мГц супергетеродинный приемник, или что-то более специфичное?


      1. ionicman
        12.10.2018 13:39

        Имелось ввиду вот это


    1. tim4dev Автор
      11.10.2018 11:32

      блок уже оптимизирован, компактен, работает без проводов, содержит датчик влажности/температуры, имеет хороший заводской корпус и гидроизоляцию

      Именно поэтому он и неинтересен :)


      1. ionicman
        12.10.2018 13:41

        Хм, я видимо не так понял чего Вы хотите добиться — я просто думал, что результата (конечного продукта), а оказалось — что процесса.

        Ну тогда все слова беру назад :)


  1. nafgne
    10.10.2018 15:11
    +1

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


  1. iig
    10.10.2018 15:24
    +1

    Про DHT11 пишут такое:

    Характеристики:
    Определение влажности: 20-90% RH ± 5%(макс.)
    Определение температуры: 0-50 ?C ± 2%(макс.)
    Источник arduino.ua/prod185-datchik-vlajnosti-i-temperatyri-dht11

    Наверное, для метеостанции не стоит его использовать.

    Про ESP8266 не понял… Если хочется WiFi вместе с Arduino — в чем проблема писать в Arduino IDE сразу под под ESP8266? На один микроконтроллер в схеме станет меньше…


    1. ginkage
      11.10.2018 00:13

      Вот да, непонятно, почему просто не сделать простейший скетч на ESP8266, который с DHT11 (или лучше, действительно, с BME280) берёт показания с заданной периодичностью и отправляет куда угодно, подключаясь к вашему роутеру, после чего уходит в deep sleep?
      При желании можно даже на самой ESP поднять веб-интерфейс и ходить на него по hostname. И экранчик к ней можно прикрутить, если угодно. Кажется, Arduino в этой схеме слегка лишняя.


      1. tim4dev Автор
        11.10.2018 11:46

        Идея была в том, что wi-fi есть не везде, а может и вообще не нужен. Arduino всё же проще.


        1. iig
          11.10.2018 11:56

          wi-fi есть не везде, а может и вообще не нужен


          Но ESP в схеме все равно уже есть? ;)


          1. tim4dev Автор
            11.10.2018 12:55

            Но может и не быть совсем, или быть попозже.


  1. Nick_Shl
    10.10.2018 17:29

    датчик температуры и влажности DHT11
    датчик барометрического давления типа BMP180
    Зачем??? Используйте датчик BME280 — один датчик измеряющий температуру, давление и влажность.


  1. Dr_Faksov
    11.10.2018 05:04

    Автор, пожалуиста, не показывай свои пайки. Ужас.


    1. tim4dev Автор
      11.10.2018 11:24

      Так я паяю раз в год в лучшем случае.


    1. safari2012
      11.10.2018 16:59

      на макетке лучше не получится.


  1. dimonfofr
    11.10.2018 13:10

    3d печать, готовые корпуса, китайские сервисы по производству печатных плат за 5 долларов спешат на помощь