arduino uno + ethernet shiel нужна помощь

domrustika
Offline
Зарегистрирован: 23.02.2015

привет всем. собственно все видно на видео. помогите кто может что исправить в коде нужно?

/*
 * 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
  }
}

http://youtu.be/FnnWvMbb5v8

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Даже не смотря видео скажите что будет при etap=1?

domrustika
Offline
Зарегистрирован: 23.02.2015

я не знаю мне код писал мой друг, но он не смог реализовать как надо.

поэтому прошу помощи здесь.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Если бы объяснили логику работы может кто-то и помог бы, а так мягко говорят другу надо выговор сделать за такой код. При etap=1 вообще ничего не делается. При получении on или off выполняется один и тот же код (абсолютно одинаковых 6ть строк) и при этом ничего не возвращается клиенту, в браузере ничего не будет обновляться.

Как оно должно работать?

domrustika
Offline
Зарегистрирован: 23.02.2015

логика работы должна быть простой -

заходим на страницу . жмем 1 раз мышкой на слове включено первой строки-------она меняется на слово выключено-------реле вЫключается и через секунду опять включается.

вот только и всего что нужно.

и так по кругу.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

И когда нажимаем на вЫключено тоже самое должно произойти? :)

domrustika
Offline
Зарегистрирован: 23.02.2015

да :) это реле нужно чисто для того что бы через интернет РЕСЕСТИТЬ модем. тоесть реле будет стоять в РАЗРЫВ провода питания роутера и перегружать его по нажатию на надпись.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Понятно, ну тогда для интереса комментируем 113, 114, 120, 121, 123-126 строки и смотрим что получится. Должно щелкаться, но надпись в браузере все равно не меняться.

domrustika
Offline
Зарегистрирован: 23.02.2015

сделал так. теперь при нажатии на надпись реле щелкает 3 раза и только потом устанавливается.(загорается его светодиод)

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

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну а в ком-порт что выдает? Какие заголовки приходят? Похоже друг с помощью etap пытался отсеить лишнее, да неудачно. В общем что в ком порт выдает?

domrustika
Offline
Зарегистрирован: 23.02.2015

приходит в программу terminal какая то ересь вроде такой

©NРЩБюљњЂа”ў и

может Вы можете свой вариант кода предложить для моего сценария?

был бы очень благодарен.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Я с ENC28J60 не работал, библиотеку EtherCard.h не знаю. Проще тот код что есть поправить чтобы работал. В 60 строке замените 115200 на 9600. Соответственно в терминале выставьте скорость 9600. Терминалов из Arduino IDE пользуетесь или сторонним? Надо просто понять что там приходит, раз три раза срабатывает значит strncmp три раза находит в буфере искомое.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Попробуйте ради интереса взять исходный скетч ничего не комментируя. 123 строку заменить на if (epat==3). А 126 строку заменить на } else etap++;

domrustika
Offline
Зарегистрирован: 23.02.2015

огромное Вам спасибо!!!))))) последний пост ваш все решил)) теперь работает все как надо)))

только еще 1 вопрос остался как на страницу после нажатия на надпись вывести хоть что нибудь да любое символ надпись да что угодно что бы я знал что реле сработало? а то как щас---- я жму на надпись включено -----реле выкл/включается а на странице ничего не поймешь нажалась она или нет может хоть надпись менять при срабатывании на выключено????

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Да у Вас там криво сделано в том плане что страница формируется после перещелкивания реле, а значит реле всегда включено и надпись не меняется. Надо переделывать ответ. Вечером время будет посмотрю как можно

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну если особо не заморачиваться, то можно попробовать следующим образом:
В 28 пишем bool relais1Status = true;
В 52 строке пишем relais1Status?PSTR("on"):PSTR("on"),
115 строку комментируем
116 строку меняем на
 digitalWrite(RELAIS_1, HIGH);
118 заменяем на relais1Status = !relais1Status;
119 строку меняем на 
digitalWrite(RELAIS_1, LOW);
Смотрим что получилось

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

pastry777
Offline
Зарегистрирован: 16.01.2014

ересь приходит если не совпадает скорость ком порта в мониторе и в скетче,установите соответствующую..