arduino uno + ethernet shiel нужна помощь
- Войдите на сайт для отправки комментариев
Пнд, 23/02/2015 - 23:21
привет всем. собственно все видно на видео. помогите кто может что исправить в коде нужно?
/* * arduWebRelays.ino * * Created: 07/09/2013 15:55:00 * Author: Guillaume Carriere - guillaume.carriere@gmail.com * VCC - 3.3V GND - GND SCK - Pin 13 SO - Pin 12 SI - Pin 11 CS - Pin 8 # Selectable with the ether.begin() function */ #include <EtherCard.h> static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x32 }; static byte myip[] = { 192,168,2,50 }; int etap = 0; #define BUFFER_SIZE 500 byte Ethernet::buffer[BUFFER_SIZE]; BufferFiller bfill; #define CS_PIN 10 #define RELAIS_1 5 #define RELAIS_2 6 bool relais1Status = false; bool relais2Status = false; const char http_OK[] PROGMEM = "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n\r\n"; const char http_Found[] PROGMEM = "HTTP/1.0 302 Found\r\n" "Location: /\r\n\r\n"; const char http_Unauthorized[] PROGMEM = "HTTP/1.0 401 Unauthorized\r\n" "Content-Type: text/html\r\n\r\n" "<h1>401 Unauthorized</h1>"; void homePage() { bfill.emit_p(PSTR("$F" "<title>Интернет-розетка</title>" "Розетка 1: <a href=\"?relais1=$F\">$F</a><br />" "Розетка 2: <a href=\"?relais2=$F\">$F</a>"), http_OK, relais1Status?PSTR("off"):PSTR("on"), relais1Status?PSTR("<font color=\"green\"><b>Выключено</b></font>"):PSTR("<font color=\"red\">Включено</font>"), relais2Status?PSTR("off"):PSTR("on"), relais2Status?PSTR("<font color=\"green\"><b>Выключено</b></font>"):PSTR("<font color=\"red\">Включено</font>")); } void setup() { Serial.begin(115200); pinMode(RELAIS_1, OUTPUT); pinMode(RELAIS_2, OUTPUT); if (ether.begin(BUFFER_SIZE, mymac, CS_PIN) == 0) Serial.println("Cannot initialise ethernet."); else Serial.println("Ethernet initialised."); ether.staticSetup(myip); // Serial.println("Setting up DHCP"); // if (!ether.dhcpSetup()) // Serial.println( "DHCP failed"); ether.printIp("My IP: ", ether.myip); ether.printIp("Netmask: ", ether.netmask); ether.printIp("GW IP: ", ether.gwip); ether.printIp("DNS IP: ", ether.dnsip); } void loop() { // digitalWrite(RELAIS_1, relais1Status); // digitalWrite(RELAIS_2, relais2Status); delay(1); // necessary for my system word len = ether.packetReceive(); // check for ethernet packet word pos = ether.packetLoop(len); // check for tcp packet if (pos) { bfill = ether.tcpOffset(); char *data = (char *) Ethernet::buffer + pos; if (strncmp("GET /", data, 5) != 0) { // Unsupported HTTP request // 304 or 501 response would be more appropriate bfill.emit_p(http_Unauthorized); } else { Serial.print("----"); Serial.print(data); Serial.println("----"); data += 5; if (data[0] == ' ') { // Return home page homePage(); } else if (strncmp("?relais1=on ", data, 12) == 0) { if (etap == 0) { relais1Status = true; digitalWrite(RELAIS_1, relais1Status); delay(1500); relais1Status = false; digitalWrite(RELAIS_1, relais1Status); etap ++; } bfill.emit_p(http_Found); if (etap > 2) { etap = 0; } } else if (strncmp("?relais1=off ", data, 13) == 0) { if (etap == 0) { relais1Status = true; digitalWrite(RELAIS_1, relais1Status); delay(1500); relais1Status = false; digitalWrite(RELAIS_1, relais1Status); etap ++; } bfill.emit_p(http_Found); } else { // Page not found bfill.emit_p(http_Unauthorized); } } ether.httpServerReply(bfill.position()); // send http response } }
Даже не смотря видео скажите что будет при etap=1?
я не знаю мне код писал мой друг, но он не смог реализовать как надо.
поэтому прошу помощи здесь.
Если бы объяснили логику работы может кто-то и помог бы, а так мягко говорят другу надо выговор сделать за такой код. При etap=1 вообще ничего не делается. При получении on или off выполняется один и тот же код (абсолютно одинаковых 6ть строк) и при этом ничего не возвращается клиенту, в браузере ничего не будет обновляться.
Как оно должно работать?
логика работы должна быть простой -
заходим на страницу . жмем 1 раз мышкой на слове включено первой строки-------она меняется на слово выключено-------реле вЫключается и через секунду опять включается.
вот только и всего что нужно.
и так по кругу.
И когда нажимаем на вЫключено тоже самое должно произойти? :)
да :) это реле нужно чисто для того что бы через интернет РЕСЕСТИТЬ модем. тоесть реле будет стоять в РАЗРЫВ провода питания роутера и перегружать его по нажатию на надпись.
Понятно, ну тогда для интереса комментируем 113, 114, 120, 121, 123-126 строки и смотрим что получится. Должно щелкаться, но надпись в браузере все равно не меняться.
сделал так. теперь при нажатии на надпись реле щелкает 3 раза и только потом устанавливается.(загорается его светодиод)
почему так? все так как мне надо только надо убрать тройное срабатывание реле.
Ну а в ком-порт что выдает? Какие заголовки приходят? Похоже друг с помощью etap пытался отсеить лишнее, да неудачно. В общем что в ком порт выдает?
приходит в программу terminal какая то ересь вроде такой
©NРЩБюљњЂа”ў и
может Вы можете свой вариант кода предложить для моего сценария?
был бы очень благодарен.
Я с ENC28J60 не работал, библиотеку EtherCard.h не знаю. Проще тот код что есть поправить чтобы работал. В 60 строке замените 115200 на 9600. Соответственно в терминале выставьте скорость 9600. Терминалов из Arduino IDE пользуетесь или сторонним? Надо просто понять что там приходит, раз три раза срабатывает значит strncmp три раза находит в буфере искомое.
Попробуйте ради интереса взять исходный скетч ничего не комментируя. 123 строку заменить на if (epat==3). А 126 строку заменить на } else etap++;
огромное Вам спасибо!!!))))) последний пост ваш все решил)) теперь работает все как надо)))
только еще 1 вопрос остался как на страницу после нажатия на надпись вывести хоть что нибудь да любое символ надпись да что угодно что бы я знал что реле сработало? а то как щас---- я жму на надпись включено -----реле выкл/включается а на странице ничего не поймешь нажалась она или нет может хоть надпись менять при срабатывании на выключено????
Да у Вас там криво сделано в том плане что страница формируется после перещелкивания реле, а значит реле всегда включено и надпись не меняется. Надо переделывать ответ. Вечером время будет посмотрю как можно
Ну если особо не заморачиваться, то можно попробовать следующим образом:
В 28 пишем bool relais1Status = true;
В 52 строке пишем relais1Status?PSTR("on"):PSTR("on"),
115 строку комментируем
116 строку меняем на digitalWrite(RELAIS_1, HIGH);
118 заменяем на relais1Status = !relais1Status;
119 строку меняем на digitalWrite(RELAIS_1, LOW);
Смотрим что получилось
Ну и соответственно все те изменения что были раньше сделаны, с которыми всё худо бедно заработало.
ересь приходит если не совпадает скорость ком порта в мониторе и в скетче,установите соответствующую..