Бегунок на сайте - Динамическое изменение освещения
- Войдите на сайт для отправки комментариев
Друзья, не пинайте, вопрос серьезный!
Задача: Есть сайт на хостинге в интернете на нем нарисован бигунок, задача что бы при движении бегунка в реалтайме на сколько это возможно удаленная ардуина подключенная только к ethernet shield W5100 меняла силу освещения.
Сразу огооврюсь, меня не интересуют вопросы: Как сделать бегунок, как сделать аяксом отправку данных в php скрипт, как сделать на стороне ардуино освещение и даже как пробросить порты до ардуино, и в конце концов даже как все это собрать что бы работало!
Вопрос намного сложнее!
Итак внимание вопрос.
Как мне динамически с сайте отправлять данные на ардуино НЕиспользуя командную строку? и отправлять только значение от 1 до 255. Что бы не валить на ардуину весь html. Предпологаю мне поможет метод POST, но можно ли передать только значение ввиде цифры? и как?
Если примера не хватит терпения привести, скажите хоть куда копать?
Посылайте запрос на ардуино методом GET с параметром, например
http://myarduino.myhome.ru/index.htm?chislo=100500
Разумеется, адрес Ваш должен быть.
Когда примете, а примете Вы только эту строку и никакой другой грязи, параметр вытаскивайте, а серверу ответьте что-нибудь (хоть пустым ответом).
Чтобы браузер, Ваш ответ сдуру не закешировал, добавьте левый параметр и в него суйте случаное число. Тогда запрос будет каждый раз разным и браузер реально будет обращаться к серверу. Типа вот так
http://myarduino.myhome.ru/index.htm?chislo=100500&nocache=123421
спасибо добрый человек. Впринцепе понятно. Отпишусь по результату
Можно попробовать вебсокеты. Там соединение уже установлено и идет чистый обмен данными - можно хоть один байт отправить.
ага сделал через сокеты:
в консоли получаю такой текст, меня это устраивает.
Это как Вам удобнее. Можете преобразовать в String, можете не преобразовывать.
Большие мальчишки не преобразовывают, а парсят при помощий функции strtok.
ок как разделить строку на массив я понял, спасибо за помощь.
А как мне из большого ответа вычленить именно эту строку na=0&fio=KISELEV&dom=5 что бы с ней работать.
Перед ней есть токен - два подряд перевода строки. Есго и ищите. Как нашли, сразу на ним Ваша строка параметров и начинается.
Правельно я понимаю что это решается вот этой строкой в цикле
char c = client.read();
if (c == '\n') { }
что типа как только найдена пустая строка выполнять что то. ?
Ну, можно и так. Можно по-разному, 100500 способов есть.
Только надо проверить нет ли там ещё и \r врядли, но проверить не помешает.
Пытаюсь разобрать строку, утомился малость уже)))
а почему при таком коде получаю в serial набор ироглифов но когда убераю звездочку у строки char *pch; то получаю тоже набор непонятных символов но уже хоть буквы нормальные. Почему так?
Ой, Вы ж внчале написали, что типа умеете программировать.
strtok принимает первым параметром указатель на массив символов, а Вы ему одиночный символ пихаете. Возвращает тоже указатель.
Вы прочитайте всю строку, сложите в массив чаров, а потом уж парсите.
Если Вы хотите парсить по мере чтения, то это не так делается - это автомат строить надо, как в компиляторах.
простите за тупость, я владею web языками но с си столкнулся первый раз, на php я бы эту задачку сделал за 3 минуты, тут же все так вязко и туго. Ну всеровно спасибо что помогаете. Я это очень ценю!
Все капец, терпение лопнуло, Пукан бомбит - бесит!
Люди добрые помогите не понимаю(разжуйте с коментариями плизз)!
Вот есть код:
if (client.connected()) {
while (client.available()) {
char Response[] = { client.read() };
Serial.print(Response);
}
}
в Response я получаю самый класический массив, где в каждой ячейке массива лежит один символ, а имено в массиве лежит текст:
POST /add.php HTTP/1.1
Host: 192.168.0.145
Content-type: application/x-www-form-urlencoded
Content-length:17
Accept:*/*
User-agent:Opera 10.00
Connection:Close
na=0&fio=KISELEV&dom=5
Пересмотрел массу уроков на ютюбе по работе со строками и массивами и нихрена не понимаю как быть в моем случаи:
Как мне извлеч na=0&fio=KISELEV&dom=5 и распарсить и получить только цыфры и присвоить их переменным???
Прошу отнестись с пониманием коснулся си первый раз и просто бомбит от сложности элементарных задач.
Поверте бьюсь уже третий день, и перессмотрел массу примеров, но в си реально все туго.
Вот есть код:
if (client.connected()) {
while (client.available()) {
char Response[] = { client.read() };
Serial.print(Response);
}
}
Это не код. Это аудиозапись в конюшне, когда сивая кобыла Марго приболела и начала бредить.
Объясните пожалуйста (самому себе, мне не надо), что по-Вашему означает конструкция
char Response[] = { client.read() };Потом, прочитайте уже хоть какую-нибудь книжку по языку на котором "пишете" и переделайте эту в строку во что-нибудь более осмысленное.
Так и есть. Это был последний раз, когда я смотрел на Ваш код вставленный с полным игнором правил форума. В следующий раз, будете так вставлять - ответа не ждите.
ясно, правила изучил, буду их учитывать)
Отстал
Ну, вот, теперь разберитесь со строкой, которую я Вам показал и всё будет здорово!
Посоветуйте книгу автора, кто на Ваш взгляд доходчевее всех описывает работы с масивами строками указателями и т.п.
Спасибо!
http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf
Друзья подскажите
Внезапно перестала работать функция fsockopen();
Если из браузера открыть скрипт в котором и есть отправка даных через сокет то через 30 сек. вылазиет ошибка:
Warning: fsockopen() [function.fsockopen]: unable to connect to 192.168.0.145:80 (Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. ) in Z:\home\h.test\www\add.php on line 6
следует отметить важный факт что, после вызова скрипта на ethernet шилде лампочки пару раз моргают и все.
так же в seral порте тишина:
опытным методом понял что, Вот это условие не выполняется.
while (client.available() > 0) { char c = client.read(); Serial.print(c); }А вот:
выдает - 1 т.е. я так понимаю конект ардуины и браузера проходит успешно.
Еще раз повторю все работало вчера, сегодня включаю и не работает.
Что пробовал делать:
1) Перезагружал комп, ардуино.
2) менял кабель ethernet shilda
3) менял блок питания у ардуины
4) менял скеч(создавал новый)
5) Единственное что делал это нечайно удалил папку downloads из папки документы/arduino/libraries/downloads
6) При компеляции скеча ошибок ни каких не появляется.
7) пробовал менять порт в команде тоже не помогает
Были у кого нить похожие проблемы?
И не такое бывало;) Ставте Wireshark на комп, сможете увидеть что реально пришло на комп и был ли ответ.
друзья посмотрел трафик wireshark идущий к ардуине - 192.168.0.241 от компа 192.168.0.202 и вижу отдни пакеты RST что говорит о том что ардуина скидывает соеденение.

Ниче не понимаю, помогите понять, почему?
Эти пакеты RST появляются при попытке отправить данные из php в ардуину методом fsockopen.
Друзья переломал все копья! Силы кончались, Неделя гугления завела в тупик.
Ни как не работает fsockopen();
Выручайте пожалуйста!!!
Вот скрипт который отправлет данные из php
01$socket = fsockopen("192.168.0.146", 80, $errno, $errstr, 10);0203if(!$socket)die("$errstr($errno)");04//собираем данные05//$data = "name=".urlencode("John")."&surname=".urlencode("Smith");06$data ="name=1";07//пишем в сокет метод, URI и протокол08fwrite($socket,"GET /add.php HTTP/1.1\r\n");09//а также имя хоста10stream_set_timeout($socket, 2);11fwrite($socket,"Host: 192.168.0.146\r\n");1213//теперь отправляем заголовки14//Content-type должен быть applicaion/x-www-form-urlencoded15fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");16//размер передаваемых данных передаем в заголовке Content-length17fwrite($socket,"Content-length:".strlen($data)."\r\n");18//типы принимаемых данных. */* означает, что принимаем все типы данных19fwrite($socket,"Accept:*/*\r\n");20//представимся оперой21fwrite($socket,"User-agent:Opera 10.00\r\n");22fwrite($socket,"\r\n");2324//теперь передаем данные25fwrite($socket,"$data\r\n");26fwrite($socket,"\r\n");2728//теперь читаем и выводим ответ29$answer ='';30while(!feof($socket)){31$answer.= fgets($socket, 4096);32}33echo $answer;3435//закрываем сокет36fclose($socket);Вот таким скечем слушая приход данных от php.
Ну скажите что я не так делаю??? что бы я не делал заканчивается ошибкой:
Warning: fsockopen() [function.fsockopen]: unable to connect to 192.168.0.146:80 (Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. )
даже если оставляю в php скрипте одну строку:
1$socket = fsockopen("192.168.0.146", 80, $errno, $errstr, 10);23Всеровно получаю туже ошибку.4Перегуглил за неделю все что только можно было, прошу выдвигать даже бредовые версии, все пойдет в работу. Руки уже опустились.