Arduino+php+MySQL = дурдом
- Войдите на сайт для отправки комментариев
День добрый, уважаемые!
У меня снова глупый вопрос. Гугл с Яндексом уже откровенно меня посылают, поэтому обращаюсь к вам :)
Имеется: Arduino UNO / NANO (китайские аналоги), DHT11 (или любой другой датчик), ethernet-модуль, удалённый web-сервер с Apache + php 5.3 + MySQL.
Требуется: данные с датчика записывать в БД на удалённом сервере.
Проблема: как передать данные от Ардуинки в базу с помощью GET или POST запроса?
Собственно, с php и mysql я знаком и кое-что там понимаю, а вот с ардуино... Выводить данные на страницу в своей же сети и включать/выключать светодиоды на ней плюс получать данные от датчиков у меня получилось (как здесь). Перепробовал разные примеры отправки данных - ничего не получается.
Нафига это всё надо: собрал я себе дома небольшую метеостанцию. Очень хочется с неё данные видеть на своём сайте, а не только дома. Плюс сюда потом хочу ещё всякого добавить, но без вывода на сайт это всё бесполезно будет :(
Помогите, пожалуйста! Хотя бы, ткните носом в пример работающий, где бы подробно было всё расписано, а не как во многих местах: "тут всё просто, это пропустим" :(
Вам в описание протокола http надо бы.
В простейшем варианте будет GET-запрос в формате:
GET /logger.php?temp=value¶m1=val1¶m2=val2 HTTP/1.1
Host: sitename.ru
Connection: close
Эти три строки запихиваем в строку-буфер, который запихиваем потом при общении в ethernet модуль на отправку(сам не работал с такими модулями, но по работе сайтов много делаю). Переносы строк через \r\n и в конце должен быть двойной перенос строки. Строчку с параметрами склеиваем через тот же sprintf() но следим за размером буфера, лучше брать с запасом.с числами проблем не будет, со строками - надо перекодировать пробелы в %20 и избегать спецсимволов <>&?= на вебсервере в logger.php все переменные попадут в $_GET, получаем их оттуда. sitename.ru --доменное имя вашего сайта.
предполагаю, что по http://sitename.ru/logger.php скриптик сохранения данных доступен через браузер.
Как-то так.
Посмотрите стандартный пример "web-client".
На сервере должен быть php-скрипт, который обслудивает запросы от ардуино.
Уточню ещё разок: я ЗНАЮ, как формируется GET запрос. Благо уже не один сайт сделал, где приходилось его формировать :) А вот чего я НЕ ЗНАЮ, так это как в скетче этот запрос передавать удалённому серверу.
На сервере у меня лежит файлик test.php, который принимает GET-запрос и распихивает данные из него по базе.
Мне бы кусочек скетча, отвечающий за это...
Я попробовал два примера webClient'а. Один от библиотеки Ethernet, второй от EtherCard. Первый не компилится, выдавая кучу ошибок. Второй выводит инфу в монитор порта, проверяя доступность указанного сайта. И всё.
На сервере всё есть: и скриптик, и база. Нет скетча, передающего данные на сервер :(
первый - для w5100
с ENC28J60 я не люблю работать - он кастрированный. Для него у меня нет готового кода.
Эх, попробую подробнее описать.
Есть скетч небольшой погодной станции, который отлично работает на имеющихся у меня UNO и NANO:
На сервере лежит файлик test.php, отвечающий за приём данных и запихивание их в базу:
При вводе на сайте строки вида http://mysite.ru/test.php?t=23&h=35 в базу пишется id записи, дата и время записи, температура (23) и влажность (35).
Вопрос: что надо добавить в скетч, чтобы ардуинка могла передавать данные на удалённый сервак? :)
Это я уже понял. Но w5100 нет под рукой, а ждать месяц, пока оно приедет, как-то не хочется.
да такой же, как и стандартный вывод, после коннекта
ну и смотрите апачевский (или своего сервера лог)
да такой же, как и стандартный вывод, после коннекта
"yourEth.print" - это в смысле ether.print? Так в примере к библиотеке EtherCard, с которой у меня хоть что-то получается, нигде нет ничего похожего, кроме
Если не трудно, можете написать или дать ссылку на подробный пример, где бы был именно кусок кода, формирующий и передающий запрос серверу? Без "стандартный" и "и т.д.". Как для полного дауна, который пытается постичь дзен, но без конкретного примера нифига не может сделать.
Эх. То ли я дурак, то ли лыжи не едут. Перепробовал кучу примеров - не получается ничего с GET-запросом :(
давайте попробуем разобрать Ваш скетч (часть кода или метод отвечающий за отправку)
я недавно делал прием отправку данных (эмуляция dDNS), но правда на W5100, но думаю примерно аналогично должно быть и для модуля.
Мой скетч и файлик на сервере приведены чуть выше. Мне бы просто получить строчку кода, которая будет отправлять GET запрос на удалённый сервер вида sitename.ru/test.php?t=XX&h=YY. Переджелать его под передачу других данных я уже сам смогу, наверное :)
Только данные должны отправляться автоматически, например, раз в 5 минут. Без необходимости обновления страницы каждый раз для этого.
Первая ссылка в поисковике... именно под ваш адаптер ну а переписать ссылку с народмона на свой сервак думаю не сложно.
http://imarh.ru/content/%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-arduino-pro-mini-enc28j60-dht11-ds18b20-%D0%BA-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%83-narodmonru
Ну или идём на гитхаб и смотрим примеры использования библиотеки под ENC28J60, там всё есть.
https://github.com/jcw/ethercard/blob/master/examples/webClient/webClient.ino
Ну или идём на гитхаб и смотрим примеры использования библиотеки под ENC28J60, там всё есть.
https://github.com/jcw/ethercard/blob/master/examples/webClient/webClient.ino
Спасибо, буду изучать. У меня такой ссылки не было. Видимо, мы по-разному запросы поисковые формировали.
Первая ссылка в поисковике... именно под ваш адаптер ну а переписать ссылку с народмона на свой сервак думаю не сложно.
http://imarh.ru/content/%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-arduino-pro-mini-enc28j60-dht11-ds18b20-%D0%BA-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%83-narodmonru
Start!
My IP: 192.168.2.222
GW IP: 192.168.2.1
DNS IP: 93.204.136.6
Server: 93.81.252.64
и дальше тишина.
Мой скетч:
Чтобы выполнять внешние запросы вам нужен веб-клиент на ардуино http://arduino.cc/en/Tutorial/WebClient
Чтобы выполнять внешние запросы вам нужен веб-клиент на ардуино http://arduino.cc/en/Tutorial/WebClient
Чтобы выполнять внешние запросы вам нужен веб-клиент на ардуино http://arduino.cc/en/Tutorial/WebClient
Вы ошибаетесь. Вам нужен именно веб-клиент который будет отправлять GET-запрос на ваш сервер.
Вы ошибаетесь. Вам нужен именно веб-клиент который будет отправлять GET-запрос на ваш сервер.
Простите, накипело :(
Al_Ninyo, вы извините, что даю вам не сильно конкретные советы, просто я исходил из предположения (судя по первому посту), что вы что-то умеете.
Модуль w5100, у меня практически всегда в работе, а ENC28J60 я вспоминаю, как страшный сон. Чтобы дать вам конкретный совет, мне нужно (1) откопать у себя в ящике этот модуль, (2) заставить его работать, (3) написать скетч и выложить его здесь. Если бы не пункт (2) - я бы вам уже давно помог.
Вот посмотрите у Осипова - он этот модуль любит...
https://www.youtube.com/watch?v=PPB2Xvubt4s
https://www.youtube.com/watch?v=e9qeCrK85Fs
https://www.youtube.com/watch?v=Dg78YB3i1Vc
Уважаемый Gippopotam!
Я в первом посте примерно написал, что умею :) Видео эти видел, светодиодами по этим примерам со страницы локальной управлял. Пробовал сделать GET-запрос, в том числе, вот так:
Нифига не получилось. К сожалению, мои познания о программировании Ардуино ещё очень слабые. Я уже кое-что могу сделать, переработав имеющиеся примеры, но, если не вижу конкретного примера, то "додумать" мне пока сложновато.
Про "w5100 vs ENC28J60" я уже понял. К сожалению, пока нормального модуля под рукой нет и когда будет - неизвестно. Придётся ждать прихода wi-fi модулей и пробовать то же самое с ними сделать, видимо :(
Приятно быть уважаемым!
С аглицким дружите?
http://www.mercenarymind.com/arduino/463-ethernet-shield-for-arduino-a-web-client-example
http://www.tweaking4all.com/hardware/arduino/arduino-enc28j60-ethernet/
Приятно быть уважаемым!
Вот за эти ссылки - огромное спасибо! В конце странице по второй ссылке нашёл чудесный линк: http://www.tweaking4all.com/hardware/arduino/arduino-ethernet-data-push/. Пока не пробовал сильно разбираться, но, вроде бы, похоже на нужное! Как опробую - отпишусь. Спасибо!
Так. Всем привет. У меня новый дурдом :)
Пришли на днях ESP8266-01. Подключил к ардуинке, GET-запрос на удалённый сервер передал - работает, из запроса данные в базу записались. НО! Как теперь в это запрос вставить данные от датчиков? Бьюсь уже 2 часа и ничего не получается.
Есть кусок кода, в котором формируется нужный запрос:
В таком виде на удалённый сервак в базу заносятся данные: температура = 22, влажность = 33.
Чуть раньше есть получение данных с DHT11:
Как мне теперь данные от датчика (которые t и h) воткнуть в GET-запрос вместо "22" и "33" соответственно? Помогите идиоту, пожалуйста :( Я очень мало в программировании понимаю, но очень хочется научиться!
Всё же я не безнадёжен :) Решена проблема вот таким кодом:
Сам запрос потом отправляется так:
Всем спасибо, все свободны :)
Хм. Теперь новая проблема. 1-2 раза коннект к удалённому серверу проходит нормально и данные в базу заносятся, а потом начинается веселье в виде:
AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","xx.xx.xx.xx",80
connection failed
disconnecting.
Иногда проскакивает, что коннект вроде как произошёл, но данные в базу не заносятся. Нажму reset на Ардуинке - в базу снова попадает 1-2 значения и опять постоянные ошибки. На серваке в логах никаких ошибок нет. Подскажите, куда копать-то?
Сам запрос потом отправляется так:
ого как эзернет модуль подрос до wi-fi. это где к нему такие драйвера скачать?
Всем спасибо, все свободны :)
дык мы всегда свободны
ого как эзернет модуль подрос до wi-fi. это где к нему такие драйвера скачать?
Я же написал, что пришли wi-fi-модули и с ними теперь мучаюсь.
а вы не мучайтесь, бросьте все нафиг в помойку и идите погуляйте, там весна, свежий воздух и все такое.
вот хрустальный шар показывает что вы видимо 50000 запросов в секунду отправляете. и ваш сервер видимо не выдердживает напора и думает что его ддосят.
Простите, намёк понял :) Использую адскую смесь из стандартного примера webclientRepeating библиотеки ESP8266 со стандартным же примером получения данных от DHT11.
вот вы мне реально скажите, у вас что там каждые 10 секунд температура меняется? просто прям колбасит от минус 270 до плюс 5000?
вот вы мне реально скажите, у вас что там каждые 10 секунд температура меняется? просто прям колбасит от минус 270 до плюс 5000?
Вы предлагаете в процессе отладки ждать 30 минут отсылки новых значений? Конечно же, если это всё заработает, я буду отсылать данные раз в 30 минут/час :)
а не посещала мысль что если температура не изменилась больше чем на полградуса, то вообще нет смысла что то куда то посылать?
Поверьте, если оно начнёт нормально отсылать данные на сервак и записывать их в базу, я начну усиленно думать, как это оптимизировать. В том числе, подумаю о не отсылании данных при остутствии измененийв полградуса. Честно. Но сейчас мне надо это заставить работать! Т.е., мне надо видеть, что данные отправляются на сервер и пишутся в базу. Всё остальное - позже.
Когда вы пишете код, вы тоже сразу пишете с реальными таймерами и условиям? Даже когда данные у вас раз в сутки отправляются? И реально ждёте сутки, чтобы увидеть "облом" и потом начинаете копать код? :)
Поверьте, если оно начнёт нормально отсылать данные на сервак и записывать их в базу, я начну усиленно думать, как это оптимизировать. В том числе, подумаю о не отсылании данных при остутствии измененийв полградуса. Честно. Но сейчас мне надо это заставить работать! Т.е., мне надо видеть, что данные отправляются на сервер и пишутся в базу. Всё остальное - позже.
Когда вы пишете код, вы тоже сразу пишете с реальными таймерами и условиям? Даже когда данные у вас раз в сутки отправляются? И реально ждёте сутки, чтобы увидеть "облом" и потом начинаете копать код? :)
гыыыы спасибо поржал... давайте подумаем ( это значит нужно напрячь то место на котором шапку носите)
ардуина конектится и честно отсылает какое то количество посылок.. а потом сервер перестает ей отвечать... причем тут ардуино?
Попробуйте конект закрывать после ответа сервера
гыыыы спасибо поржал... давайте подумаем ( это значит нужно напрячь то место на котором шапку носите)
ардуина конектится и честно отсылает какое то количество посылок.. а потом сервер перестает ей отвечать... причем тут ардуино?
Есть 2 сервака: один стоит под столом у моего московского друга и на нём крутится Апач+МуСКЛ+ПХП, кучка сайтов и ещё дофига всего; второй - РуЦентровский с ещё одним моим сайтом (хостинг nic.ru). С разными настройками, но ведут себя почти одинаково. Точнее, ник.ру вообще себя по-свински ведёт :( Не заносит ардуинка данные в базу там, хотя при правильном обращении к скрипту на сервере (через браузер) данные в базу исправно заходят и ардуинка в мониторе порта пишет периодически, что коннект прошёл успешно.
Попробую поставить отсылку раз в 20 секунд, что ли. И снова попробую на сервак друга посылать данные. Там хоть через раз, но заносилось в базу.
А не может оказаться проблемы в ESP8266? А то как-то не всегда с первого раза в монитор порта данные начинают идти. Иногда несколько раз надо нажать на ардуинке Reset, прежде чем дело сдвинется дальше команды AT+RST.
А я не ношу шапку :)
видимо в этом и проблема...
просто нужно иметь в виду ESP8266 штука конечно модная, но абсолютно кривая и медленная. то что она там куда то подцепилась на скорости 100500Гигабайт в секунду не значит что она может с этой скоростью работать.
Я честно говоря подозреваю что ESP8266 настолько кривая что работает через раз и только в четверг. Но большинство народа которые ей пользуются закрывают на это глаза и тихонько об этом молчат :)
я бы попробовал отсылать раз в 2-3 минуты. вполне достаточно что бы посмотреть.
Попробуйте конект закрывать после ответа сервера
То, что я - идиот, мною и не скрывается никогда особо, если что :)
А на тему "медленная и кривая"... Что-то мне не везёт :( Купил ethernet-модуль, он УГ оказался. Почитал хвалебные статьи про ESP8266, а оно тоже вон как оказывается. Что же делать-то теперь? У меня их теперь 4 штуки есть и надо как-то использовать.
Попробую раз в 3 минуты отсылать. С 30-ю секундами пока разницы никакой.
Спасибо за ваше терпение!
Почитал хвалебные статьи про ESP8266, а оно тоже вон как оказывается. Что же делать-то теперь? У меня их теперь 4 штуки есть и надо как-то использовать.
Меркетинг он такой маркетинг... 4 штуки=20 баксов... прибей их к стенке если что или подари пионерам в школу, они будут рады.
Меркетинг он такой маркетинг... 4 штуки=20 баксов... прибей их к стенке если что или подари пионерам в школу, они будут рады.
А "пионЭры" пока и так рады, потому что я с ними начал с ардуинкой разбираться немного :)
Т.е. ничего не получится с моей затеей, что ли? Сейчас поставил отправку раз в 2 минуты. Первый коннект через эти самые 2 минуты - failed. Следующий, вроде как, прошёл, но в базе пусто :(
Меркетинг он такой маркетинг... 4 штуки=20 баксов... прибей их к стенке если что или подари пионерам в школу, они будут рады.
А "пионЭры" пока и так рады, потому что я с ними начал с ардуинкой разбираться немного :)
Т.е. ничего не получится с моей затеей, что ли? Сейчас поставил отправку раз в 2 минуты. Первый коннект через эти самые 2 минуты - failed. Следующий, вроде как, прошёл, но в базе пусто :(
почему не получиться? получиться конечно. просто дайте ей поработать минут 20. наберите статистику. сколько конектов будет проходить. просто кроме ардуины у вас еще куча всего.. интернет.. качество связи... сервер... скрипты на сервере.. можно до посинения гадать
Эх... Оставлю на ночь ардуинку работать. Утром посмотрим, чего наработает. Ещё раз спасибо за терпение.
Грррррр. Чувствую себя идиотом полным :( Загрузил скетч не в Arduino IDE 1.6.3, а в версии 1.0.6 - всё работает, блин! Данные в базу раз в 2 минуты пишутся, коннект проходит, сообщений в мониторе порта стало как-то больше... Ну вот как так-то?! :(
Ну вот как так-то?! :(
ну это как раз обьяснимо. разработчики ардуино последний год забили на все болт и резво дернули в сторону интел и линукса. они как бы выросли с ардуино и на все потихоньку ложат..
На арде клиент, на сервере пхп скрипт запускается кроном, обращается к ардовскому клиенту, получает пакет, парсит и рассовывает по мисклу. Далее по вкусу.
На арде клиент, на сервере пхп скрипт запускается кроном, обращается к ардовскому клиенту, получает пакет, парсит и рассовывает по мисклу. Далее по вкусу.
Если что, у меня уже вроде получилось то, что я хотел и гораздо проще (для меня), чем парсить пакеты. Чуть позже до ума доведу и поделюсь.