Главная » 2018»Ноябрь»11 » Метеостанция своими руками (Часть 2) - Arduino проект
Метеостанция своими руками (Часть 2) - Arduino проект
20:22
Часть 2 (подключаем LAN модуль HR911105A (ENC28J60) )
Замечу, что данная часть статьи никак пока не связана с предыдущей частью, т.е. все выполняется на "голой" ардуинке и я игнорирую тут подключенный в предыдущей части экран и датчик BMP085. Хотя я их и на самом деле и не отключал, но пока эта часть никак не завязана с первой, поэтому сделаю вид, что LAN модуль и предыдущий "навес" никак к друг другу не относятся, что бы не перегружать статью. Позже я пришел к тому, что экран для метеостанции на основе Arduino с использованием сетевого модуля вовсе не нужен, поскольку гораздо удобнее установить виджет для смартфона и иметь доступ ко всей информации даленно. А вот датчик влажности и температуры позже все же подключил чуть позже.
Ну вот и пришлось повозиться. Виновником напряга оказался сетевой модуль HR911105A (ENC28J60). Перепробовал достаточно много разных библиотек по работе с ним, мне не удавалось даже проверить работоспособность. В итоге помогло мне видео Дмитрия Осипова, где приведены ссылки на актуальные библиотеки и рабочий скрипт по управлению светодиодами через web. Правда и тут столкнулся с тем, что не сразу завелась шарманка. Пока коротко законспектирую, что проблема была с постоянным IP в сети с роутером, который сам назначает IP адреса (DCHP сервер). И еще интересный момент - проблема чудесным образом разрешилась после запуска монитора последовательного порта, хотя его и ранее запускал не раз. Ну и еще заковыка была в том, что мой модуль имел на борту гребенку на 12 контактов, а не на 10 (как у всех) и питание требовал 5В, а не 3,3В.
Итак, теперь по порядку о том, как подключить ENC28J60. В видео идет речь о подключении 10-тиконтактного модуля. У меня на руках был модуль с двенадцатью выводами на борту. Вот так он выглядит внешне:
Четкого описания и схемы по нему я не нашел в инете. Было лишь одно упоминание на одном из форумов по ардуино, что контакт SI на десяти-контактном шилде соответствует контакту ST в двенадцати-контактной версии. Вместо 3,3в используется питание 5в. Питание брал прямо с ардуинки, вроде держит, правда ручаться за такой вариант не буду, т.к. по правилам требуется все-таки питать шилд отдельно, но при этом стоит объединять GND ардуины и GND отдельного источника питания.Но, в этом вопросе я не эксперт, надеюсь знающие люди подтянутся и в комментариях подтвердят мою версию или сделают мне замечание, что бы я своим дилетантством не смущал массы ардуиноменов и ардуиновуменш :)
Вместо таблицы соответсвия контактов приведу более наглядную схему подключения сетевого модуля к ардуино:
/* Дмитрий Осипов. http://www.youtube.com/user/d36073?feature=watch
v.01 Управляем Arduino с Web страницы Webserver Ethernet ENC28J60 Enternet HR911105A Pin ON OF Relays.
-----
Что нам понадобится:
1). ENC28J60 Ethernet LAN / Network Module.
http://www.ebay.com/sch/i.html?_from=R40&_sacat=0&_nkw=ENC28J60&rt=nc&LH_BIN=1
2). Библиотека / Library - "ethercard".
EtherCard is a driver for the ENC28J60 chip, compatible with Arduino IDE.
https://github.com/jcw/ethercard
или берем здесь. https://yadi.sk/d/R57sVoglbhTRN
3).
Скачать sketch.
v.01 Управляем Arduino с Web страницы Webserver Ethernet ENC28J60 Enternet HR911105A Pin ON OF Relays.
-----------------------
Подключаем Pins "ENC28J60 Module" к Arduino Uno.
VCC - 3.3V
GND - GND
SCK - Pin 13
SO - Pin 12
SI - Pin 11
CS - Pin 10 Можно выбрать любой.
Подключаем "ENC28J60 Module" например к Router, загружаем sketch, открываем страницу
в браузере например 192.168.1.222 , на странице можем включать выключат Pins / реле.
---------
Примечание: "ENC28J60 Module" питается от 3.3 volts, и потребляет по документации 250mA.
Arduino Uno Максимальный допустимый ток, получаемый с 3V3 контакта — 50 мА.
У меня прекрасно всё работает с 3V3 контакта Arduino Uno.
На всякий случай, предупреждаю.
------------------
*/
// По умолчанию в Библиотеке "ethercard" (CS-pin) = № 8.
// if (ether.begin(sizeof Ethernet::buffer, mymac) == 0).
// and change it to: Меняем (CS-pin) на 10.
// if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0).
if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0);
if (!ether.dhcpSetup());
// Выводим в Serial монитор IP адрес который нам автоматический присвоил наш Router.
// Динамический IP адрес, это не удобно, периодический наш IP адрес будет меняться.
// Нам придётся каждый раз узнавать кой адрес у нашей страницы.
ether.printIp("My Router IP: ", ether.myip); // Выводим в Serial монитор IP адрес который нам присвоил Router.
// Здесь мы подменяем наш динамический IP на статический / постоянный IP Address нашей Web страницы.
// Теперь не важно какой IP адрес присвоит нам Router, автоматический будем менять его, например на "192.168.1.222".
ether.staticSetup(myip);
ether.printIp("My SET IP: ", ether.myip); // Выводим в Serial монитор статический IP адрес.
//-----
for(int i = 0; i <= 8; i++)
{
pinMode(LedPins[i],OUTPUT);
PinStatus[i]=false;
}
}
// --------------------------------------
void loop()
{
delay(1); // Дёргаем микроконтроллер.
word len = ether.packetReceive(); // check for ethernet packet / проверить ethernet пакеты.
word pos = ether.packetLoop(len); // check for tcp packet / проверить TCP пакеты.
data += 5;
if (data[0] == ' ') {
homePage(); // Return home page Если обнаружено изменения на станице, запускаем функцию.
for (int i = 0; i <= 7; i++)digitalWrite(LedPins[i],PinStatus[i+1]);
}
else {
// Page not found
bfill.emit_p(http_Unauthorized);
}
}
ether.httpServerReply(bfill.position()); // send http response
}
}
Отмечу несколько комментариев по скетчу и особенности работы:
Скетч уже содержит достаточно подробные комментарии и в нем приведены ссылки на оригинал скетча и библиотек, но что бы Вам было удобнее приведу тут тоже прямые ссылки на необходимую библиотеку ethercard
Еще раз напомню, что мой модуль с 12 контактами питается от 5v (это прямо указано на самой плате). Не перепутайте с 10ти-контактным модулем, у которого питание составляет 3,3v. В скетче есть комментарий по питанию, но он не учитывает, что бывают пяти-вольтовые модули.
Мac-адрес, на сколько я понял, что можно задать весьма случайное значение.
Выдержка с сайта народного мониторинга:
MAC - Уникальный серийный номер устройства мониторинга
Предназначен для идентификации устройства в проекте и привязки к его владельцу и к карте в разделе Датчики. Состоит из 12-18 символов A-Z и 0-9 иногда разделенных '-' или ':'. Для обеспечения уникальности рекомендуется использовать MAC-адрес сетевого интерфейса вашего устр-ва мониторинга или компьютера, который можно узнать выполнив командной строке getmac или ipconfig в Windows и ifconfig в Linux. Допускается привязка нескольких устр-в с разными MAC к одному владельцу.
Постоянный IP - обратите внимание, что бы он не повторял ни один другой IP в вашей домашней локальной сети, иначе будет конфликт и работоспособности от модуля вы не добьетесь.
Массив пинов, к которым подключаются светодиоды тоже имеет заковыку. Расскажу просто об этой "незадокументированной особенности"... При попытке включить LED1 на втором пине веб-страница переставала отвечать, т.е. то ли контроллер зависал, то ли еще какая-то бяка, но я с этим вопросом решил даже не разбираться, просто сообщаю, что у меня LED1 не работал, хотя на 3 и 4 пинах все работало отлично.
Совсем малость я позволил себе подкорректировать оригинальный скетч от Дмитрия - я изменил шрифт на web странице, т.о., что стало возможно управлять светиками и со смартфона. В оригинале шрифт мелкий и попасть пальцем в нужную строку было проблематично.
Итак, мы уже умеем выводить значение температуры и давления с датчика на экран и умеем взаимодействовать по сети. Остается объединить эти 2 части и наша метеостанция уже сможет сиять в народном мониторинге.
Процесс объединения этих 2-х частей был мной реализован гораздо позже и этому была пара причин:
1) Работа с сетью отнимает значительное количество оперативной памяти и не позволяет особо развернуться. Возможно частично побороть оптимизацией кода.
2) Отказавшись от подключения экрана к метеостанции я не пожалел, т.к., во-первых экран пригодится для других Arduino проектов, а во-вторых, сервис Народного мониторинга предлагает несколько приложений для смартфонов. Имея показания на экране смартфона уже нет необходимости обращаться к отдельному экрану метеостанции.
С сетевой частью и отправкой данных на сервер Народного мониторинга пришлось изрядно повозиться. Все еще осложнялось тем, что на развлечение с Arduino`й я выделял время только изредка по вечерам и такая эпизодическая деятельность заставляла вновь и вновь освежать в памяти казалось бы прописные истины. Поэтому совет дам такой: если что-то не получается постарайтесь выделить время и заняться вопросом до победного, что бы не приходилось тратить лишнее время на восстановление в памяти уже известных вещей.
Опишу проблемы с которыми столкнулся я:
Периодически отсутствовал физический контакт сетевого модуля ENC28J60 и Arduino.
Питания от USB может едва хватать на работу Ардуино с сетевым модулем, т.к. последний кушает около 250мА.
Библиотеки для работы с сетевым модулем. Их невероятное количество. Это, пожалуй, самый серьезный фактор, с которым мне пришлось бороться.
Теперь подробнее по каждому пункту:
1) Отследить эту проблему не самая большая трудность. Главное - добиться работы любого скетча для работы сетевого модуля. Я проверял все скетчем от Дмитрия Осипова, что упоминается выше в видео. Т.е. добившись раз верной работы его скетча я загружал его вновь если сталкивался с неправильной работой других скетчей и иногда оказывалось, что скетч Дмитрия для управления светодиодами с Web-страницы тоже не работает. В этом случае приходилось шевелить проводками и периодически перезагружать Arduino до тех пор пока все не налаживалось. В идеале, конечно все соединения паять, но первый раз проект, как правило, собирается на макетной плате и проблема может быть банальна - отсутствие контакта. И тут два пути - все прозванивать тесетром или тот, что описан в этом пункте.
2) Не уверен, что я сталкивался именно с этой проблемой, но исключать ее нельзя. По крайней мере иногда передернуть USB шнур из одного порта в другой помогало обойти проблему. Но, четкой зависимости я не заметил и если вы уверены в том, что все должно работать, но не работает советую проверить мультиметром напряжение питания Arduino и напряжение питания сетевого модуля ENC28J60. Если проблема есть, то ее может не стать при автономном питании Arduino от батареек или от блока питания, но если проблемы нет при питании от USB, то она наоборот может появиться на автономном устройстве. Решение: использование надежного источника питания и возможно отдельного стабилизатора напряжения для сетевого модуля. Я для другого проекта приобретал на Али такой модуль XM1584 DC-DC преобразователь 3а регулируемый на основе LM2596. Работает, хотя в данном случае все обошлось без него.
3) С библиотеками у меня была самая засада. Во-первых самих сетевых модулей и шилдов (расширений) для Arduino существует много разных и для большинства из них свои библиотеки со схожими названиями. По началу я даже не сразу понял, что брал библиотеку одну, а в скетче пытался использовать методы от другой библиотеки. Так что знайте библиотека Ethernet и Ethercard это не одно тоже. :) Для сетевого модуля ENC28J60 лично мне подошла библиотека Ethercard, хотя вроде бы существуют и другие библиотеки пригодные для данного сетевого модуля, но у меня заставить их хоть как-то мало-мальски работать так и не получилось.
Но это еще не все. Мало того, что библиотеки существуют разные, так еще и одна и та же библиотека имеет разные версии (в зависимости от даты релиза) и в зависимости от этой же даты она имеет в себе те или иные ошибки, которые не позволят ничего толком запустить. Но! И это еще не все. Версии среды разработки скетчей тоже влияют на компиляцию или возникновение всевозможных скетчей. Пока искал рабочие варианты находил в некоторых источниках код, но авторы почему-то не прикладывали библиотеки, некоторые авторы отсылали использовать библиотеку с более ранней датой релиза, но не уточняя какой, что сводило пользу от их совета к нулю. В итоге перебрав невероятное количество комбинаций (Версия среды Arduino, версии библиотек и различные скетчи) звезды в итоге сошлись и "Hello World" был отправлен по сети с Arduino на сервис Народного мониторинга. Я собрал в один архив свой рецепт: Arduino 1.6.6 и три библиотеки (две для работы с датчиками и третья библиотека Ethercard для работы с ENC28J60).
Скетч пока недооформлен. Бросаю как есть, это все-таки лучше чем ничего. Постараюсь на днях дооформить и выложу тут же.
Код скетча отправки показаний датчиков на сервис Народный мониторинг под спойлером:
#define REQUEST_RATE 300000 // milliseconds
#define REQUEST_RATE1min 60000 // milliseconds
#define DHT_EXIST 1 // наличие датчика влажности
#define DHT_TEMP 1 // использовать температурный датчик в DHT22
#define DHTPIN 9 // пин подключения датчика влажности DHT22
#define DHTTYPE DHT22 // тип датчика влажности DHT22/DHT11
bool debug = false; //true = режим отладки, false = отправка данных на сервер.
static byte mac[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; // { 0xFF, 0x99, 0x22, 0x11, 0x44, 0x77 }; //В этой строке задайте свой MAC адрес
static byte hisip[] = { 185,245,187,136,8283 };//94,142,140,101,8283 }; //Здесь надо указать IP адрес сайта narodmon.ru
Adafruit_BMP085 bmp; //Переменная для работы с датчиком BMP085 (Измерение температуры и давления)
// Проверка подключения датчика DHT11(22) и определение его типа и пинов подключения.
#if DHT_EXIST == 1
DHT dht(DHTPIN, DHTTYPE);
#endif
String macstring;
int minuta;
byte Ethernet::buffer[700];
static long timer;
static long timer2;
Stash stash;
void setup() {
Serial.begin(57600);
delay(100);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
//Бесконечный цикл для сигнализации на 13 pin (LED моргалка) о неисправности с датчиком BMP на улице.
int k;
for (k = 0; k <10; k++)
{
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(50); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(50);
if (k>2) {
k=1;
}
}
while (1) {}
}
if (ether.begin(sizeof Ethernet::buffer, mac,10) == 0)
Serial.println(F("Failed to access Ethernet controller"));
if (!ether.dhcpSetup())
Serial.println(F("DHCP failed"));
//overwrite DNS with google's if there are problems with DNS setup
static byte dnsip[] = {8,8,8,8};
ether.copyIp(ether.dnsip, dnsip);
if (DHT_TEMP == 1)
{
Temperature = dht.readTemperature();
stash.print("&");
stash.print("T2");
stash.print("=");
stash.print(Temperature);
Serial.print("T2=");
Serial.println(Temperature);
}
stash.print("\n");
stash.save();
// generate the header with payload - note that the stash size is used,
// and that a "stash descriptor" is passed in as argument using "$H"
Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n"
"Host: narodmon.ru" "\r\n"
"Content-Length: $D" "\r\n"
"\r\n"
"$H"),
stash.size(), sd);
// send the packet - this also releases all stash buffers once done
if (debug == false)
{
Serial.println("TCP Sending...");
ether.tcpSend();
Serial.println("Done");
}
else
{
Serial.println("TCP not send. Debug = true.");
}
timer2=- REQUEST_RATE1min;
}
if (millis() > timer2 + REQUEST_RATE1min)
{
timer2 = millis();
Serial.print("minuta - ");
minuta = minuta+1;
Serial.println(minuta);
}
}
По скетчу тоже есть комментарии. Для меня человека далекого от сетевой передачи данных все это выглядит шаманством... отправлять какие-то MAC-адреса и всякие казалось бы несвязанные значения между кракозябрами #, /n, & и т.п. Постараюсь так же рассказать как эти вещи усвоил я и как это реализовано в скетче. И обязательно отмечу особенности отправки показаний погодных датчиков на сайт http://narodmon.ru/ с погодной станции сделанной своими руками.
Как приложение к статье приведу ссылку на невероятно подробнейшее описание работы с ENC28J60. Правда, это далеко выходит за рамки данной статьи, но может быть кому-то будет полезно. Кстати статья в 3-х частях и при перелопачивании кучи материалов про сетевой модуль я наткнулся на эту статью уже после того, как надобность в ней отпала. Странно, что поисковики так низко ранжируют эту статью.
Статья еще не закончена. Постараюсь продолжить статью в ближайшие дни. Заглядывайте почаще...
Метеостанция уже достаточно давно работает, но руки не доходят довести статью до ума. Из планов: - Опубликовать плату в формате layout для вытравливания и сборки всего устройства в компактном, аккуратном и надежном виде. - Опубликовать окончательную версию скетча для ардуино. - Представить фотографии оформления уличного датчика и самого устройства дома.
Если вдруг у кого-то будет большое желание увидеть все это побыстрее - пишите в комментариях. Комменты я проверяю практически ежедневно и постараюсь ответить в кратчайшие сроки.
Получилось передать данные на сервер народного мониторинга с использованием модуля Enc28j60 и библиотеки к нему EtherCard.
Хренокод в спойлере в следующем комментарии. Этот код пока адовый и его задача была просто тупо передать хоть что-то, хоть куда-то ибо пару месяцев мучений перед этим были безуспешны. Конечно не 24 часа в сутки я этому уделял, в среднем наверно даже не более получаса-часа в день. Но все-таки уйма времени ушла на разбор кучи различных библиотек и их версий. Готового рабочего скетча для Arduino с отправкой данных на народный мониторинг модулем Enc28j60 мне, увы, не попалось. Поэтому пришлось изрядно повозиться.
Постараюсь в скором времени заняться его настройкой и отладкой и детальным описанием что к чему. А то, большинство подобных статей написаны какими-то гиками и пойди в их сленге разберись. Хуже иностранцев, хотя вроде и по русски многие статьи читал.
Уперся в проблему подключения к Народному мониторингу (передачи на него данных). Сетевая библиотека съедает 79% памяти Ардуино и на остальные библиотеки не остается места...