Продолжение. Начало здесь.
Софт. Выбор компонентов
Выбор железа и софта тесно взаимосвязан как «курица и яйцо». С чего начать, с железа, с софта? Если у вас хорошее железо, но к нему нет драйверов, библиотек и софта (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 сервера. Вы можете начать «клепать» метеостанцию уже сейчас не имея доступа в интернет и/или
Для считывания данных с датчиков типа 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 В)
Вот распиновка модуля.
Некоторые советуют сразу же припаять керамический конденсатор 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 прикрутил всё остальное.
Как видим в этом месте всё питание осуществляется от пинов Ардуино, т.е. к блоку питания напрямую ничего не идёт, и пока мощи хватает.
Вроде всё. Ничего не забыл.
Паяйте, соединяйте. В следующей части будет приведен рабочий скетч для центрального блока и наша метеостанция уже что-то покажет.
Автор: tim4dev