Метеостанция на arduino с выгрузкой статистики в IoT
Добрых суток!
Сегодня мы соберем метеостанцию с выгрузкой статистики в инет.
Для этого нам понадобятся:
- стабилизатор напряжения АМS1117-3.3 ($0.85/10шт);
- датчик температуры и влажности DHT11 ($0.80);
- датчик температуры и давления GY68 ($4);
- Arduino Pro Mini ($1.24);
- модуль Wi-Fi на ESP-8266 (ESP-01) ($1.9);
- сопротивления 4,7к и 10к;
- электролиты 100 и 1000 мФ на 10+В;
Итого: около $9 (225грн);
Все легко находится на алиэкспрессе, так что ссылок не будет.
Начнем мы с нашего WiFi модуля ESP-01:
Питание: 3.0 - 3.6 В;
Ток: 60-220 мА (в зависимости от режима 802.11 и настроек энергосбережения);
Для работы нужно подтянуть вывод CH_PD к питанию через резистор 10 кОм.
Как подключить модуль, подробно написано здесь.
Конкретно про обновлении прошивки - здесь.
Я использовал прошивку с АТ-командами версии 0.25. Между версиями существуют небольшие различия, так что решайте сами, что вам проще: изменить код скетча или прошить модуль.
Распиновка такая:
ESP-01 > Arduino
Tx > 10
Rx > 11
CH_PD > через 10 кОм на +3.3В
Vcc > +3.3
Gnd > Gnd
Для проверки заливаем в ардуину скетч из примеров SoftwareSerial.ino, проверив чтобы строка
SoftwareSerial mySerial(10, 11); // RX, TX
соответствовала наши ногам ардуины. Напомню, что выводы данных подключаются крест-накрест, Rx->Tx и Tx->Rx
Теперь нам понадобится программа ESP8266 Config. Подключаемся к порту с модулем на скорости 115200. Если вместо картинки
Firmware builder: esp8266.ru
ready
Вводим в том же окне команду тестовую АТ. Нам должен придти ответ ОК. Если ответ приходит, читаем дальше, нет - отписываемся в комментах, помогу чем смогу.
Далее, нам нужно установить нужные нам скорость порта по-умолчанию и параметры сети.
1. Параметры порта, команда вида AT+UART_DEF=<baudrate>,<databits>,<stopbits>,<parity>,<flow control>. Параметры можно посмотреть в диспетчере устройств->свойства порта
т.е. наша команда будет такой AT+UART_DEF=9600,8,1,0,0
вводим, получаем ОК, перегружаем модуль и переподключаемся со скоростью 9600.
2. В окне ESP8266 Config нажимаем List AP, получаем список всех доступных сетей. Выбираем нужную, вводим пароль, жмем Join AP. В консоли должно появиться
AT+CWJAP="SSID","PASSWD"
WIFI CONNECTED
WIFI GOT IP
OK
Для получения адреса у меня в роутере включен DHCP с раздачей IP по МАС.
Формат всех команд можно посмотреть в файле "ESP8266 AT Instruction Set_v0.25"
DHT11: Довольно хреновый датчик, иногда выдающий данные с сильным разбросом (лучше возьмите DHT22, он еще и от 3.3+В питается (об этом ниже) - я брал просто самый дешевый с измерением влажности).
Питание: 3.5 - 5.5 В;
Ток до 0.3 мА;
Диапазон измерений:
- влажность 20-95% (+-5%). Если влажность больше (96-100%), модуль все равно покажет 95%:
- температура 0-50 гр. (+-2 гр.). По факту ниже +3-4 гр. не покажет даже при сильном морозе.
- время между считываниями показаний не меньше 10 сек (иначе будет выдавать практически рандом).
При длине провода больше 20 м или напряжении питания меньше 5 В нужен подтягивающий резистор в 4,7 кОм на сигнальную линию. Я решил поставить, на всякий случай.
GY69: датчик давления и температуры на основе чипа BMP-180.
Питание: 1.68 - 3.6 В;
Ток около 5 мкА (мало верится, но сам не мерял);
Диапазон измерений:
- давление: 300-1100 гПа (-500 - 9000 м над ур.моря);
- температура: -40 ... +85 гр. (при температуре меньше ноля падает точность);
- время замера 4,5 ... 25 мкс;
По даташиту нужно сигнальные линии (SDA/SCL) нужно подтянуть к питанию резисторами по 4,7 кОм, но я не заморачивался.
Питание я взял от старой ЮСБ-зарядки, 5В 250мА. Т.к. оказалось, что ESP-01 очень требователен к питанию (предыдущий отладочный вариант питался от аккума на 3.7 В и сгорел через неделю), то отталкиваться будем именно от него - понижать напряжение до 3.3 В. Однако это меньше, чем нужно DHT11, поэтому его придется запитать от 5В.
Для включения ESP-01 необходимо подать через резистор 10 кОм питание на ногу CH_PD. Однако из-за того, что у микрухи самого WiFi распаяны не все ноги (они "висят в воздухе"), она сильно греется даже в отсутствие передачи данных. Ну а т.к. передавать статистику мы будем раз в 10 минут, нам совершенно не нужно держать модуль постоянно включенным (и расходовать заряд аккума, если питание от него).
Поэтому CH_PD мы подключим к 13й ноге контроллера и для включения связи будем подавать на неё высокий уровень.
Схема подключения стабилизатора напряжения AMS1117-3.3 (ток до 1А) особой оригинальностью не отличается и взята из даташита.
Итого, имеем схему (да,я знаю про fritzing, но мне лень в ней разбираться):
Для проверки схему нужно залить скетч test_sensors.ino (ссылка на архив в конце поста). В порт должны полететь данные о температуре/давлении/влажности.
Выгрузка статистики.
Регистрируемся на сайте thingspeak.com.
Создаем новый канал
Тут выставляем по полю на каждый измеряемый параметр.
Кроме этого, можно настроить видимость канала (все/только вы), высоту нашей станции над уровнем моря, координаты и т.д. Создаем.
Далее идем в Channel Settings и переписываем Channel ID, идем в API keys и переписываем Write API Key. По двум этим параметрам мы будем писать данные.
Проверить работоспособность канала можно, перейдя в броузере по адресу 184.106.153.149/update?key=[ВАШ_Write_API_Key]&field1=0
Откроется страница с номером текущей порции данных (для первого раза 0, потом 1, и т.д.).
Открываем скетч WiFiMeteostationIoT.ino и исправляем строки:
14 String remote_key = "KEY";// passkey
на ваш Write API Key.
105 dps.init(MODE_STANDARD, N, true);
N замените на вашу текущую высоту (в МЕТРАХ, несмотря на то, что в даташите написано про сантиметры) - это нужно для точно определения давления. Узнать ее можно либо с помощью GPS, либо на этой страничке.
Для отправки одной "порции" данных нужно отправить на модуль WiFi команды:
AT+CIPSTART=2,"TCP","184.106.153.149",80 //создать соединение №2, протокол ТСР, адрес, порт
AT+CIPSEND=2,N //через соединение №2 отправить пакет длинной в N байт
GET /update?key=[ВАШ_Write_API_Key]&field1=25 //сам пакет
AT+CIPCLOSE=2 //закрыть соединение
Обратите внимание на переносы строк \r\n в коде. Так надо.
Скетч в архиве.
Сам канал по мере заполнения примет такой вид:
Схема потребляет около 80 мА при передаче данных и 15-20 мА при простое.
Что можно улучшить:
- заменить DHT-11 на что-нибудь получше, тот же DHT-22;- сделать фильтрацию замеренных значений (по тому же Калману (пост) ).
- отсылать на статистику не сразу после включения, а через 10 минут, предварительно отфильтровав;
- подтянуть GPIO ESP-01 на питание через 10 кОм;
- подтягивать DHT-11 по-хорошему надо было не на +5, а на +3.3 В;
- не заставлять ардуину впустую гонять delay(), а сделать полноценный сон с "разбудкой" по таймеру;
- оба датчика потребляют намного меньше допустимой нагрузки на ногу ардуины (40 мА), можно запитать их через контроллер и включать только по надобности;
P.S. первый, и, скорее всего, крайний пост - не подписывайтесь ;)
А зачем тут Arduino? На Esp8266 вполне можно сделать то же самое. Она даже программируется в той же среде. Зачем два контроллера вместо одного?
Ничего не понял, но ты давай все обратно меняй, а то на улице минус 42.
Это как? IoT - это "интернет вещей", туда нельзя ничего "выгрузить".
гугл диск уехал.
кому все еще нужны исходники
http://dropmefiles.com/wEivr
http://files. ДП .ua/file?source=17122111564093014207
http://files.d-lan. ДП .ua/download?file=43e5b655445220e94b2b60ae800d0c89
https://ru.files.fm/u/x5mzzehh
https://fex.net/get/089887455386/158745573
Если ссылки нерабочие, мои соболезнования.