Метеоинформер - или мое первое знакомство с ардуино

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Здравствуйте! Хочу свое знакомство с ардуиной начать с изготовления метеоинформера, пожалуй, так его и назову. Почему? Да просто надоело звонить по автоответчику температуры и выслушивать рекламу, ориентироваться на не сбывающиеся прогнозы, да и еще иметь дома несколько часов, которые отстают/убегают по разному и подводить их. Да, причина, банальна. И в поисках ее решения я натолкнулся на ваш форум и ..... меня осинило, ведь сделав такое устройство, можно пользу не только себе принести, но и другим горожанам, для этого достаточно вывести данные уличных датчиков на сайт. 

Цель: собирать информацию о температуре, влажности и давлении как на улице, так и дома, выводить полученную информацию на дисплей, а также информацию с уличных датчиков отображать на сайте. Также хочу, чтобы на дисплее были часы с календарем, которые бы симнхронизировались с сервером времени. Желательно вести статистику данных.

На эту тему нашел несколько статей, перечитал, стало примерно ясно что и как делать, но есть и пробелы. Потому и обращаюсь к вам, поможете (консультативно) довести проект до конца?

Для начала, конечно, надо определиться с оборудованием, что заказать. Пока остановился на следующем:

 

1. Ардуино - Arduino Uno ATmega328P-PU Module ATMEGA8U2 AVR USB Cable Board
2. Езернет - Ethernet Shield W5100 For Arduino 2009 UNO Mega 1280 2560
3. Часы - Arduino I2C RTC DS1307 AT24C32 Real Time Clock Module For AVR ARM PIC
4. Датчик давления - BMP085 Barometric Digital Pressure Sensor Module Board For Arduino
5. Датчик температуры/влажности уличный - DHT22/AM2302 Digital Temperature And Humidity Sensor
6. Датчик температуры/влажности в помещении - DHT11 Digital Temperature And Humidity Sensor
7. Дополнительный датчик температуры уличный - DS18B20
8. Дисплей (пока не определился)
9. Провода и другие компоненты (тож не знаю, какие и сколько)

Вот и первые вопросы:
1. Хватит ли у UNO входов для этого?
2. Какой выбрать дисплей(жалетально с кириллицей, но не обяз.), чтобы на нем поместилась сразу вся информация (дата, время, темп. улица/дом, влажность улица/дом, давление) или можно сделать автоматическую смену информации, попеременно на небольшом дисплее?
3. Датчики DHT11(для дома) ,DHT22 и DS18B20 (для улицы)есть как отдельно, так и спаянные на модуле с обвязкой. Какие лучше брать?
4. Какие потребуются провода, коннекторы или можно будет подобрать от компьютера/материнки?
5. Нужны ли будут еще какие-нибудь компоненты резисторы, диоды, конденсаторы?
6. Может я еще что-то упустил?

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

Буду очень рад вашей помощи.
Денис.

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Софт на w5100 пока не изучал, а под шилд на базе enc28j60 имеет прямо в examples готовый пример веб-сервера с опросом датчиков температуры DS18B20.

У меня аналогичный набор уже работает (http://inet-deal.mpa.ru/articles/arduino-002.html). :) Сейчас меряет температуру с термометра по 1-wire, ток и напряжение, с выдачей всего этого в веб-интерфейс.

Denis_Z
Offline
Зарегистрирован: 19.12.2012

А в examples - это где?

У Вас шилд к нано? Не уверен что смогу к нано и дисплей и часы и все датчики подключить.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Denis_Z пишет:

А в examples - это где?

У Вас шилд к нано?

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

Примеры идут в библиотеке для чипа enc28j60 .


~$ ls -ac1 /usr/share/arduino/libraries/EKitsZoneEtherShield/

enc28j60.c
net.h
keywords.txt
ip_arp_udp_tcp.h
ip_arp_udp_tcp.c
examples
etherShield.h
etherShield.cpp
enc28j60.h

Denis_Z пишет:

Не уверен что смогу к нано и дисплей и часы и все датчики подключить.

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

ustas
Offline
Зарегистрирован: 12.03.2012

Кстати, под эту задачку есть хорошая платка (полно пинов, можно удобно и просто подключить большой дисплей, да еще и куча плюшек типа lan, rtc). Вот тут про нее написал: http://devicter.blogspot.ru/2012/12/iboard-pro.html

По цене получается дешевле, если все "плюшки" покупать шилдами по отдельности.

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

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Подскажите пожалуйста, как оптимальней/лучше/правильней осуществлять обмен данными ардуины с сайтом, имею ввиду передачу показаний датчиков?
1. Ардуина сама передает данные (клиент)
2. Посылать запрос на ардуину и получать ответ с данными (сервер)

ustas
Offline
Зарегистрирован: 12.03.2012

А это как удобнее реализовывать. 

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

Если же посетителей будет много - то дуина загнется под нагрузкой крайне скоро.

Поэтому нужно чтобы с нее данные регулярно кто-то (ОДИН) забирал (или отдавала она сама ОДНОМУ клиенту), а дальше уже занимался отображением и т.п.

На мой взгляд - тут однофигифственно, чем будет дуина - сервером или клиентом, главное, чтобы с дуиной общались "один-на-один" и не слишком часто ;)

Denis_Z
Offline
Зарегистрирован: 19.12.2012

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

Интересно, а этот модуль справится с этой задачей? http://www.buyincoins.com/new_en/details/new-enc28j60-ethernet-lan-netwo...

ustas
Offline
Зарегистрирован: 12.03.2012

Нормальное решение (про то, что сервер раз в 5 минут будет спрашивать дуину).

Ссылка как-то криво вставилась, но вижу там упоминание модуля enc28j60 - не рекомендую, лучше возьмите на базе wiznet w5100 - с ним будет гораздо проще работать (более богатые и простые библиотеки).

С модулем enc28j60 много сложностей (просто поищите его название даже на этом форуме - получите много информации), хотя и с ним можно работать.

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Спасибо, вот еще один вопрос: ethernet займет 10,11.12,13 пины, как в таком случае подключить lcd дисплей? Только serial? Если подключать serial lcd, то на 4 и 5 аналоговых пинах (scl и sda), будут висеть и датчик давления bmp085 и часы ds1307, номально ли это? или можно lcd db5 db6 db7 db8 подключить на любвые цифровые входы/выходы? Просто везде на 10,11,12,13. Я новичек в этом пока только разбираюсь, итак уже понял что bmp085 и ds1307 не особо дружат из-за питания, придется подтягивающие резисторы на 3.3в ставить.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Denis_Z пишет:

Интересно, а этот модуль справится с этой задачей?

Справится. Я там выше ссылку на свой проект давал для кого? :)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Denis_Z пишет:

не особо дружат из-за питания, придется подтягивающие резисторы на 3.3в ставить.

Питание вообще лучше внешнее сделать и для ардуины и для ethernet-шилда отдельно.

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Andrey_Y_Ostanovsky пишет:

Справится. Я там выше ссылку на свой проект давал для кого? :)

По Вашей ссылке он визуально другой, у меня по ссылке маленький, поэтому и засомневаля, а так если функционально одинаковый, то это хорошо.

А про питание может не так выразился, я имел ввиду что  к 4 и 5 аналоговым входам будут подключены устройства с разным питанием (bpmp085 и ds1307), и вроде как это не очень хорошо, какие то уровни надо согласовывать. Нашел только инфу что если подтягивающие резисторы поставить не на 5в, а на 3.3 то часы ds1307 тоже работают нормально.

А почему питание раздельное надо делать?

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Вот нашел где подключают lcd по-другому(http://robocraft.ru/blog/arduino/503.html), значит db4-7 неважно к каким пинам цеплять, как бы еще 11 и 12пины освободить ведь их будет ethernet использовать?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Denis_Z пишет:

А про питание может не так выразился, я имел ввиду что  к 4 и 5 аналоговым входам будут подключены устройства с разным питанием (bpmp085 и ds1307), и вроде как это не очень хорошо, какие то уровни надо согласовывать. Нашел только инфу что если подтягивающие резисторы поставить не на 5в, а на 3.3 то часы ds1307 тоже работают нормально.

Это называется "согласование уровней". :) Если подключать к одному входу два устройства - то их бы лучше диодами дополнительно развязать...

Denis_Z пишет:

А почему питание раздельное надо делать?

Потому, что ethernet-модуль достаточно много потребляет, если длинный провод 1-wire для датчиков - туда тоже лучше свое питание завести, но обязательно надо согласовать их все по земле.

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Т.е уличный датчик можно запитать отдельным блоком питания, а внутренний от ардуины, но gnd у них должны быть соединены?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Denis_Z пишет:

Т.е уличный датчик можно запитать отдельным блоком питания, а внутренний от ардуины, но gnd у них должны быть соединены?

Их надо посадить на одну "землю" в соединительном кабеле. Ну и там еще керамический конденсатор (интегрирующая цепочка) на всякий случай всадить между датой и землей - тут лучше в первоисточник окунуться: http://www.maximintegrated.com/app-notes/index.mvp/id/148

Kenobi
Offline
Зарегистрирован: 16.12.2012

Уважаемый Denis_Z, по профессии своей я бесконечно далек от электроники, поэтому, если мои соображения Вам помогут, буду рад, если нет - не обессудьте.

Первое, о чем я бы задумался, при построении данного проекта, это - а хватит ли у меня памяти arduino UNO для размещения столь сложного скетча.

Читая различные форумы, не помню где, я наткнулся на то, что скетчи к Ethernet Shield W5100 занимают практически всю память. Т.е., на опрос и обработку данных с датчиков ее попросту может не хватить. Поэтому - я бы сделал так: купил бы две arduino UNO - на одну одел бы шилд интернента, ну и, скажем, нацепил бы еще модуль Bluetooth, и она отвечала бы у меня условно за связь с внешним миром. На вторую arduino UNO я бы прицепил что-то типа  Sensor Shield V4 для удобства коммуникации и, поскольку у Вас предполагается большое количество различных датчиков, Mux Shield .

Связь между этими двумя arduino UNO, я бы осуществил через I2C. По принципу - запрос из интернета -> обработка запроса W5100 -> внутренний запрос по шине I2C к ардуине с датчиками -> обратный ответ по той же цепочке в обратном порядке.

Полноценный web-server на W5100 вряд ли возможен, поэтому тут должно быть написано что-то типа web-службы, для ответов на запрос извне. А извне - это как Вам будет удобнее - WPF, WinForms или что-то другое (на вкус и цвет, как говориться).

Да, и по поводу вывода на LCD - его тоже лучше всего подсоединить через I2C, для экономии пинов. И последнее я прикупил бы вот такую детальку , чтобы не было пролем с подключением новых устройств к I2C.

Профессионалам, еще раз замечу, что я дилетант во всем этом, поэтому не судите строго. Это просто мысли вслух.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Под w5100 еще не смотрел, а под enc28j60 у меня скетч, снимающий 4 параметра (1-ds18b20 и 3 АЦП) и отдающий web-страничку, занимает чуть больше 12 килобайт. Про необходимость в этом проекте LCD дисплея я уже автору высказывал мнение, но, судя по всему, услышан не был...

Denis_Z
Offline
Зарегистрирован: 19.12.2012

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

Андрей, а АЦП что такое?

Denis_Z
Offline
Зарегистрирован: 19.12.2012

А вот, после ответа Kenobi, действительно задумался, хватит ли памяти UNO для скетча? Скетч по задумке должен уметь выводить на дисплей дату время (ds1307), температуру (in/out), влажность (in/out), атмосферное давление, а также по запросу через ethernet передавать данные c датчиков на сайт.

Kenobi
Offline
Зарегистрирован: 16.12.2012

Думается мне, что АЦП - это аналого-цифровой преобразователь.

Я вот еще что забыл сказать - на Ethernet Shield W5100 есть помимо интернета еще и micro-SD reader, так вот, имейте ввиду, что одновременно использовать оба эти устройства вряд ли удасться, поскольку они делят между собой внутреннюю шину.

Это я к тому, что если вдруг логи вести какие-нибудь или там web-странички на ней хранить и считывать. Наверное как-то можно, но не уверен. И еще: по-моему этот шилд поддерживает лишь 4 одновременных подключения.

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Долго отсуствовал - ждал ардуину, читал, разбирался. Недавно ардуина пришла - arduino mega 2560. И вот за 2 вечера запустил ардуино, часы ds1307 и вывод информации на дисплей от часов и всех датчиков. Датчики такие - dht11, dht22, ds18b20, bmp085. Подключил шилд ethernet, инициализировал, пингуется. Осталось реализовать передачу данных от датчиков на сайт и синхронизацию часов. Сайт на joomla, но я не программист, и поэтому с нуля написать скрипт не смогу. Подскажите есть ли у кого скрипт, который на сайте принимал бы данные и записывал бы в базу данных? А потом из базы последнне значение буду выводить в модуле на сайте.

Rowser
Offline
Зарегистрирован: 26.02.2012

Denis_Z, присоединяюсь к Вашему вопросу. У вас получилось как то это реализовать?

noxic
Offline
Зарегистрирован: 15.03.2013

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

Rowser
Offline
Зарегистрирован: 26.02.2012

Ну для кого проще а для кого темный лес)

Я так понял ТС не надо мониторить ком порт ( так же как и мне )), для этого есть эзер шиелд на который можно слать запросы и получать ответы. Вопрос скорей всего в том  а скорее зов о помощи в написание скрипта для сервера который будет слать запрос на ардуину с некой переодичностью и записывать полученные данные в базу mysql. Ну и небольшой примерчик для вывода на элементрную простую стрничку)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Rowser пишет:

Denis_Z, присоединяюсь к Вашему вопросу. У вас получилось как то это реализовать?

В сообщении #1 - есть ссылка. Там все достаточно подробно расписано.

Rowser
Offline
Зарегистрирован: 26.02.2012

Да но этот вариант для локально сервера. Или я ошибаюсь? Если нет то можете привести пример для удаленного сервера? Я имею ввиду если эта страничка будет крутится на некоем хостинге. Можно сразу откинуть в получение доступа до ардуино спрятоного за роутером (ну или модемом), это я умею)

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Итакс, продолжу. После длительных поисков и экспериментов мне удалось отправлять данные с датчиков на сайт, там простенький скрипт пишет эти данные в базу, а из базы достает модуль Joomla и выводит на сайте, собственно говоря просто sql запрос.

Но осталась одна проблема: т.к. я не программист мне пока не удалось понять как "скрестить" два куска кода, а именно:

1. Код который постоянно опрашивает датчики и часы и выводит данные на дисплей, т.е выполняется постоянно(имеется).

2. Код который, опрашивает датчики 1 раз в 5 минут (delay) и посылает данные на сайт (тоже есть)

Оба скетча у меня работают, а вот как их объединить в один, чтобы данные на экране были постоянно, а не раз в 5 минут, (там же ведь и часы) и отправлять данные датчиков через определенный интервал(раз в 5 мин).

Догадываюсь что delay использовать не получится, и надо интервал отправки как то в конструкции if else отмерить, но не хотелось бы привязывать к часам (ds1307), они же ведь могут и остановиться/сломаться.

Может кто подскажет? В какую сторону копать?

 

noxic
Offline
Зарегистрирован: 15.03.2013

самое простое - используй переменную и наращивай ее. в коде проверяй, если она достигла какого то значения то выполняй код и обнуляй эту переменную

 

void loop() {

//постоянный код начало

///постоянный код конец

если a>=5000 
{
a=0;

//код периодичный с периодичностью 5000 циклов

} иначе {a++}

}

извеняюсь за синтаксис, сам программист, но не на си )))

Denis_Z
Offline
Зарегистрирован: 19.12.2012

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

Rowser
Offline
Зарегистрирован: 26.02.2012

Denis_Z, а как работает у Вас скрипт? На чем написан? Есть ли где почитать?) 

Я так понимаю Вы переделывали чей то вариант? Если можно то ссылку)) Буду признателен)

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Rowser пишет:

Да но этот вариант для локально сервера. Или я ошибаюсь? Если нет то можете привести пример для удаленного сервера? Я имею ввиду если эта страничка будет крутится на некоем хостинге. Можно сразу откинуть в получение доступа до ардуино спрятоного за роутером (ну или модемом), это я умею)

У меня munin-скрипт ходит с сервера (тут надо просто отметить направление движения) и опрашивает ардуино - результат доступен снаружи. Поскольку сетка работает по tcpip - то ходить оно может откуда угодно, хоть туннелироваться через ssh. :) Если на хостинге можно запускать по крону шелловые скрипты - то будет работать.

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Ардуино обращается к php скрипту расположенному на хостинге и передает данные методом get. Про этот метод передачи информации полно в интернете. Честно говоря, готовых решений не было, я искал так: нашел пример где ардуино посылает данные методом get (гдето на хабре), потом читал про get, как принять данные, переданные этим методом, потом искал как записать данные в таблицу и в итоге это все привело к  этому скрипту php:

<?
if(isset($_GET['t'],$_GET['p'],$_GET['h']))
{
if ($_GET[pass] == 'пароль, который посылает ардуино') { 
$t=$_GET['t'];
$p=$_GET['p'];
$h=$_GET['h'];
mysql_connect("адрес сервера sql","логин к sql",'пароль к sql');
mysql_select_db("имя базы");
mysql_query ("INSERT INTO `имя таблицы`(`temperature`, `pressure`, `humidity`) VALUES ('$t','$p','$h')");
}
}
​?>

 

Denis_Z
Offline
Зарегистрирован: 19.12.2012

 

millis()

Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.

Можно ли эту переменную использовать для вычисления интервала?

Например интервал 5 мин. т.е. 300000 миллисекунд

void loop()
{
#код опроса датчиков и вывода данных и часов на дисплей;
if (millis()%300000 == 0) //т.е. если остаток от деления равен 0
  {
#код, который отправляет данные датчиков на сайт;
  }
}

предвижу проблему, что в момент в момент возвращения millis мы уже пропустим 300000 , т.к. цикл тоже выполняется некоторое время.

 

 

ustas
Offline
Зарегистрирован: 12.03.2012

И правильно предвидите.

Логика должна быть следующая:

1. Объявляете глобальную переменную (unsigned long с, например)

2. Дальше проверяете условие, если millis() больше, чем time2send (это событие уже не пропустите), то отправить данные и что там еще нужно и увеличиваете значение time2send на время интервала между отправками (в миллисекундах).

Rowser
Offline
Зарегистрирован: 26.02.2012

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

ustas
Offline
Зарегистрирован: 12.03.2012

Хоть я и не Денис, но подскажу.

1. Чтобы срабатывал запрос от сервера, "беззащитную и слабую" ардуинку нужно "показать" во внешний мир (нужен реальный IP-адрес и пробросить порты).

Поскольку ардуинка всяческое шифрование не потянет просто из-за своих возможностей - ее очень запросто можно "уложить" совсем небольшим количеством запросов.

2. Организовать регулярные запросы от сервера можно (например crond воспользваться), но не на всех серверах вам такое позволят и разбираться с этим придется.

В случае, если ардуинка постит регулярно данные - оба обозначенные аспекта не играют никакой роли.

Rowser
Offline
Зарегистрирован: 26.02.2012

Просто в случае Дениса это было бы выгоднее, лично моё мнениею. Проблем с белым айпи щас помоему не проблема. Настроить НАТ на роутере тоже не беда.  И прверять в цикле если пришёл запрос - отдавай, нет - молчком дальше выводим всё на дисплей. К тому же многие железки знают и умеют такую вещь как ДунДНС так что это облегчает задачу с динамическими публичными айпи

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Абсолютно верно, главная причина отправки именно ардуиной, это динамический ip, а динднс я считаю костылем :)

И еще раз повторю ардуино все отправляет, т.е. работает как задумано и с интервалом через delay и если бы не было необходимости использовать ее дома еще как часы и метестанцию, то вопросов бы не было.

Несмотря на это, код уже примерно есть, осталось его улучшить, пока мысли такие.


int time =0;//текущее время
int timeold=0;//время прошлой отправки на сайт

void setup()
{

}

void loop()
{
#код опроса датчиков и вывода данных и часов на дисплей;
if (millis() < timeold)//проверяю не сбросился ли счетчик millis
{
timeold = 0; //если счетчик millis сбросился, то обнуляем timeold, иначе следующее условие никогда не выполнится
}
time = millis()+300000; //увеличиваем значение time чтобы следующее условие сразу выполнилось, а не через 300000 миллисекунд
if (time - timeold >= 300000)//проверяем когда текущее время снанет больше времени прошлой отправки данных на 300000 (в первый цикл условие сразу выпоняется из-за прошлой строки)
{
#код, который отправляет данные датчиков на сайт;
timeold = timeold + 300000;
}
}

Есть еще вопрос. Как правильно обьявить переменные time, timeold, чтобы в ним поместились огромные значения millis(), да плюс еще 300000 ?

Denis_Z
Offline
Зарегистрирован: 19.12.2012

 

Unsigned long используется для хранения положительных целых чисел в диапазоне от 0 до 4,294,967,295 (2^32 - 1) изанимает 32 бита (4 байта) в памяти

millis() Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.

Простые подсчеты показали, что в millis значение может быть такое же как и максимальное в unsigned long, а то и больше, .т.е прежде чем счетчик обнулится, у меня в переменные перестанут записываться данные. Это плохо, т.е в какой-то момент мой код не отработает как надо.

Это что остается только перезагружать ардуино на 49 день?

 

ustas
Offline
Зарегистрирован: 12.03.2012

Rowser пишет:

Просто в случае Дениса это было бы выгоднее, лично моё мнениею. Проблем с белым айпи щас помоему не проблема. Настроить НАТ на роутере тоже не беда.  И прверять в цикле если пришёл запрос - отдавай, нет - молчком дальше выводим всё на дисплей. К тому же многие железки знают и умеют такую вещь как ДунДНС так что это облегчает задачу с динамическими публичными айпи

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

Выставьте свою ардуинку через НАТ и помониторьте активность, будете сильно удивлены, что запросы будут не только ваши, но и чьи-то чужие. И активность этих запросов может быть достаточно велика (тут как повезет). 

А мало-мальская нагрузка на "веб-сервер" ардуинки - и она просто не сможет отрабатывать запросы. Оно вам надо?

ustas
Offline
Зарегистрирован: 12.03.2012

Denis_Z пишет:

Это что остается только перезагружать ардуино на 49 день?

У вас ардуинка ярдерным реактором рулит? Обычно ничего страшного не происходит при "переходе" через нуль для unsigned long.

Промоделируйте ситуацию (у вас millis() перейдет через максимальное значение и начнет считать с нуля, но прямо перед этим у вас "время, когда надо измерять" уже тоже через максимальное значение на очередном шаге инкремента тоже через максимальное "перелетит"). 

Denis_Z
Offline
Зарегистрирован: 19.12.2012

ustas пишет:

Промоделируйте ситуацию (у вас millis() перейдет через максимальное значение и начнет считать с нуля, но прямо перед этим у вас "время, когда надо измерять" уже тоже через максимальное значение на очередном шаге инкремента тоже через максимальное "перелетит"). 

С millis все понятно, кроме того что не знаю какое максимальное значение принимает перед тем как обнуляется, предполагаю что такое же как и максимальное в unsigned long.

И еще непонятно что будет если я в переменную unsigned long , буду присваивать значение которое заведомо больше максимально возможного для размещения в ней. Ошибка будет, в ней останется прежнее значение или запишет значение равное превышению над мксимально возможным.

 

ustas
Offline
Зарегистрирован: 12.03.2012

Denis_Z пишет:

И еще непонятно что будет если я в переменную unsigned long , буду присваивать значение которое заведомо больше максимально возможного для размещения в ней. Ошибка будет, в ней останется прежнее значение или запишет значение равное превышению над мксимально возможным.

Напишите тестовый скетч в "3 строчки" и посмотрите, что будет.

Rowser
Offline
Зарегистрирован: 26.02.2012

ustas пишет:

Rowser пишет:

Просто в случае Дениса это было бы выгоднее, лично моё мнениею. Проблем с белым айпи щас помоему не проблема. Настроить НАТ на роутере тоже не беда.  И прверять в цикле если пришёл запрос - отдавай, нет - молчком дальше выводим всё на дисплей. К тому же многие железки знают и умеют такую вещь как ДунДНС так что это облегчает задачу с динамическими публичными айпи

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

Выставьте свою ардуинку через НАТ и помониторьте активность, будете сильно удивлены, что запросы будут не только ваши, но и чьи-то чужие. И активность этих запросов может быть достаточно велика (тут как повезет). 

А мало-мальская нагрузка на "веб-сервер" ардуинки - и она просто не сможет отрабатывать запросы. Оно вам надо?

Странно... И как она будет отрабатывать все эти левые заросы?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

ustas пишет:

Выставьте свою ардуинку через НАТ и помониторьте активность, будете сильно удивлены, что запросы будут не только ваши, но и чьи-то чужие. И активность этих запросов может быть достаточно велика (тут как повезет). 

Если есть NAT и можно "мониторить активность" - то можно эту активность и отфильтровать как понравится... За мыльницу - не скажу, а на шлюзе с операционной системой можно поднять nginx, который умеет фильтровать запросы, смотреть - что там внутри, да и активность может варьировать.

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

С третьей стороны - а не надо рисовать развесистую и "тяжелую" страницу. Данные на стороне arduino должны быть готовы к отдаче, ну отдали 50 байт по запросу... Кого это напряжет?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Rowser пишет:

Странно... И как она будет отрабатывать все эти левые заросы?

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

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Подскажите, пожалуйста! Есть ответ сервера, получаем его таким кодом:


while (client.available()) {
  char c = client.read();
  Serial.print(c);
}

Вот собственно сам ответ сервера:

HTTP/1.0 200 OK
Date: Sat, 30 Mar 2013 10:33:21 GMT
Server: LiteSpeed
Connection: close
Content-Type: text/html
Content-Length: 0
 

Как проверять код ответа от сервера? Ну т.е если ответ 200, то одно дествие, а если код ответа не 200, то другое действие. Как извлечь код ответа(символы 10,11,12) из переменной c?

Rowser
Offline
Зарегистрирован: 26.02.2012

Denis_Z пишет:

Ардуино обращается к php скрипту расположенному на хостинге и передает данные методом get. Про этот метод передачи информации полно в интернете. Честно говоря, готовых решений не было, я искал так: нашел пример где ардуино посылает данные методом get (гдето на хабре), потом читал про get, как принять данные, переданные этим методом, потом искал как записать данные в таблицу и в итоге это все привело к  этому скрипту php:

<?
if(isset($_GET['t'],$_GET['p'],$_GET['h']))
{
if ($_GET[pass] == 'пароль, который посылает ардуино') { 
$t=$_GET['t'];
$p=$_GET['p'];
$h=$_GET['h'];
mysql_connect("адрес сервера sql","логин к sql",'пароль к sql');
mysql_select_db("имя базы");
mysql_query ("INSERT INTO `имя таблицы`(`temperature`, `pressure`, `humidity`) VALUES ('$t','$p','$h')");
}
}
​?>

 

 

Денис подскажи пажалуйста! Я вот не понял, у тебя пароль так сказать в открытом виде передается вместе с данными? Или же есть какая то спецальная функция или еще че то? Я имею ввиду  к примеру:

http://localhost/test.php?pass=***&t=**&p=**&h=**

В таком виде?

Denis_Z
Offline
Зарегистрирован: 19.12.2012

Да в таком, если передавать данные из браузера, то так и выглядит. Я не совсем понимаю, что значит в открытом виде. Собственно говоря, он и не нужен, ведь для того чтобы кто-то кроме вас передал данные скрипту, нужно знать и наименование параметра в запросе t p h, сделайте параметры уникальными (mytemp и т.п.) и думаю пароль не нужен будет. Вообще такая схема обмена, когда ардуина сама посылает данные, думаю более безопасна, хотя я и не программист.