Ардуино + ENC28J60

Votmax
Offline
Зарегистрирован: 18.06.2016

Всем доброго дня!

Не серчайте, если не в ту ветку форума залез. Вопрос у меня уже заезженный и замыленный, но решить его я не могу.

Суть вопроса: Есть у меня Ардуино Уно и Нано и микросхема ENC28J60. Использую стандартную библиотеку ethernet.h и взятую на стороне EtherCard.h. В качестве скетча беру стандартные примеры из этих библиотек для реализации Web-сервера.  Задаю IP-адрес в рамках своей подсети. Пины использую в соответствии с описанием библиотек. Для Нано пришлось стабилизировать напряжение, так как пип 3.3В проседал до 2В. В общем с моей точки зрения все сделано корректно. Лампочки на ENC28J60 вроде бы все горят правильно (красная на плате и желтая+зеленая при подключении сетевого кабеля)  Но ПК не видит мой Web-сервер при работе как через Уно так и через Нано. Команда ping пишет либо "Превышен интервал ожидания" либо "Сервер (или адрес, не помню) не доступен". Пакетов получено 0, отправлено 4. За все время тестирования только один раз был получен один пакет из четырех (наверное случайно).

Предположения: Предположений три. Первое - кривые руки. Второе - неисправная плата  ENC28J60 (хотя судя по лампачкам она что то делает и работает). Третье - Не может это быть связано с сетью? IP распределяются маршрутизатором динамически, а тут статический адрес. Я подключаю свое устройство не к ПК, а непосредстенно к маршрутизатору. Может что то нужно прописать в маршрутизаторе?

 

Votmax
Offline
Зарегистрирован: 18.06.2016

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

axill
Offline
Зарегистрирован: 05.09.2011

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

Ip адрес который вы в скетче назначаете должен быть из подсети настроенной на роутере при этом он не должен конфликтовать с другими устройствами. Обычно это решается прописыванием фиксированного IP на конкретный MAC адресс в настройках роутера. MAC адрес тоже должен быть уникальный в подсети

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Votmax пишет:

Для Нано пришлось стабилизировать напряжение, так как пип 3.3В проседал до 2В. 

Вы что, питаете модуль от ардуиновских 3.3В? Вы смотрели какой ток нужен модулю и какой может обеспечить ардуино? Пересадите модуль на нормальное питание, тогда поговорим.

Если не поможет, выкладывайте и схему подключения, и скетч.

Votmax
Offline
Зарегистрирован: 18.06.2016

Использую стандартный скетч:

/*
  Web Server

 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 modified 02 Sept 2015
 by Arturo Guadalupi

 */

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}
IP соответствует моей сети. 

 

Питание от USB через преобразователь Lm2596. Вот ссылка: http://ru.aliexpress.com/item/LM2596S-ADJ-DC-DC-adjustable-step-down-module-IN3-OUT1-5-35-40-v/32561997940.html?btsid=c9e4ad96-ab0a-4cb5-a3d9-362716494421&s=p&ws_ab_test=searchweb201556_0%2Csearchweb201602_3_10039_10048_10037_10017_10046_10045_10032_10040%2Csearchweb201603_1&spm=2114.03020208.3.11.TlFi4H

 

Думаю, что это идея, попробовать прописать фиксированный IP на конкретный MAC адрес в настройках роутера.

 

 

 

Votmax
Offline
Зарегистрирован: 18.06.2016

И да, команда Ethernet.localIP() выдает результат 0.0.0.0

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Votmax пишет:

И да, команда Ethernet.localIP() выдает результат 0.0.0.0

Ардуина к роутеру цепляется? Пробуйте сначала по DHCP получить IP-адрес:

if(!Ethernet.begin(mac)) // try using DHCP
{
 Ethernet.begin(mac,ip); // try using static ip
}

 

Votmax
Offline
Зарегистрирован: 18.06.2016

DIYMan пишет:

Votmax пишет:

И да, команда Ethernet.localIP() выдает результат 0.0.0.0

Ардуина к роутеру цепляется? Пробуйте сначала по DHCP получить IP-адрес:

if(!Ethernet.begin(mac)) // try using DHCP
{
 Ethernet.begin(mac,ip); // try using static ip
}

 

 

Спасибо, попробую!

JasKo
Offline
Зарегистрирован: 21.11.2015

По моему ошибка кроется вот здесь


#include <Ethernet.h>

Эта библиотека если не ошибаюсь для W5100

а для ENC28J60 вот эта https://github.com/jcw/ethercard

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

О, точняк, чего-то я протупил жёстко, в названии темы ведь указано ENC28J60. Повёлся на сам код :)

Votmax
Offline
Зарегистрирован: 18.06.2016

JasKo пишет:

По моему ошибка кроется вот здесь


#include <Ethernet.h>

Эта библиотека если не ошибаюсь для W5100

а для ENC28J60 вот эта https://github.com/jcw/ethercard

 

 

Ура! Это чудо, заработало!!!

Причем я этот пример тестил и пин 10 менял на пин 8, но не работало. Как я думаю, возможно, причина в питании. Я питал схему от USB ПК, но когда подключал модуль к роутеру, брал USB переходник от самсунга, а на нем выходное напряжение, оказывается 4.75В. Еще раз всем большое спасибо! Ура!

 

 

JasKo
Offline
Зарегистрирован: 21.11.2015

Votmax пишет:

Ура! Это чудо, заработало!!!

Причем я этот пример тестил и пин 10 менял на пин 8, но не работало. Как я думаю, возможно, причина в питании. Я питал схему от USB ПК, но когда подключал модуль к роутеру, брал USB переходник от самсунга, а на нем выходное напряжение, оказывается 4.75В. Еще раз всем большое спасибо! Ура!

 

 

Так в чем причина? в питании? и чудо что библа к 5100 заработала с 28j60?

Votmax
Offline
Зарегистрирован: 18.06.2016

JasKo пишет:

Votmax пишет:

Ура! Это чудо, заработало!!!

Причем я этот пример тестил и пин 10 менял на пин 8, но не работало. Как я думаю, возможно, причина в питании. Я питал схему от USB ПК, но когда подключал модуль к роутеру, брал USB переходник от самсунга, а на нем выходное напряжение, оказывается 4.75В. Еще раз всем большое спасибо! Ура!

 

 

Так в чем причина? в питании? и чудо что библа к 5100 заработала с 28j60?

Не, заработало то точняк с Ethercard, просто я перебирал несколько библиотек, а о том, что Ethernet.h для 5100 и не подозревал )). Похоже здесь был дабл косяк. Неверное напряжение + неверная библиотека. ))

Votmax
Offline
Зарегистрирован: 18.06.2016

А дабл косяк по определению сложнее одинарного косяка и хуже решается))

Grek1130
Grek1130 аватар
Offline
Зарегистрирован: 19.11.2016

UIPEthernet.h это работает, но памяти жрет много.

axill
Offline
Зарегистрирован: 05.09.2011

Grek1130 пишет:

UIPEthernet.h это работает, но памяти жрет много.

Ethercard насколько я понял жрет еще больше

по крайней мере автор uipethernet утверждает, что его библиотека использует 8к встроенных в enc28j60, а ethercard нет

опять же в ethercard нет dhcp и что еще хуже она не совместипа с ethernet.h, а значит чужие библиотеки расчитанные на ethernet.h сходу не заработают

Только что делал девайс с enc28j60 с mqtt, начал было с ethercard но потом переключился на uip

kipishio
Offline
Зарегистрирован: 02.07.2015

Votmax пишет:

Всем доброго дня!

Не серчайте, если не в ту ветку форума залез. Вопрос у меня уже заезженный и замыленный, но решить его я не могу.

Суть вопроса: Есть у меня Ардуино Уно и Нано и микросхема ENC28J60. Использую стандартную библиотеку ethernet.h и взятую на стороне EtherCard.h. В качестве скетча беру стандартные примеры из этих библиотек для реализации Web-сервера.  Задаю IP-адрес в рамках своей подсети. Пины использую в соответствии с описанием библиотек. Для Нано пришлось стабилизировать напряжение, так как пип 3.3В проседал до 2В. В общем с моей точки зрения все сделано корректно. Лампочки на ENC28J60 вроде бы все горят правильно (красная на плате и желтая+зеленая при подключении сетевого кабеля)  Но ПК не видит мой Web-сервер при работе как через Уно так и через Нано. Команда ping пишет либо "Превышен интервал ожидания" либо "Сервер (или адрес, не помню) не доступен". Пакетов получено 0, отправлено 4. За все время тестирования только один раз был получен один пакет из четырех (наверное случайно).

Предположения: Предположений три. Первое - кривые руки. Второе - неисправная плата  ENC28J60 (хотя судя по лампачкам она что то делает и работает). Третье - Не может это быть связано с сетью? IP распределяются маршрутизатором динамически, а тут статический адрес. Я подключаю свое устройство не к ПК, а непосредстенно к маршрутизатору. Может что то нужно прописать в маршрутизаторе?

 

 

Аналогичная проблемы была пока не взял от ардуинки не 3 вольта а 5, как только провод перекинул на 5 вольтвсе заработало

sansei4
Offline
Зарегистрирован: 09.01.2015

axill пишет:

Только что делал девайс с enc28j60 с mqtt, начал было с ethercard но потом переключился на uip

 

axill, а можете поделиться, на каком процессоре и как именно Вы связали enc28j60 с mqtt? Код было бы идеально :)

У меня сейчас работает связь по mqtt на меге2560 через w5100 и Ethernet.h (сервер на распберри). Надо перейти на мини про.

Пробовал и ethercard и uip, но пока что получилось только сервер запустить....

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

uipethernet.h такая библеотека дает возможность 28j60 работать как с W5100. Единственное я заметил что при автообновлении страници виснет после нескольких обновлений, если отключить то работает

sansei4
Offline
Зарегистрирован: 09.01.2015

C UIPEthernet.h и правда заработало. Одно но... В локальной сети все отлично, а на удаленный сервер команды не проходят. При этом с компьютера из той же сети все доходит.

Есть мысли, в чем может быть дело? Может таймауты какие-то?

sadman41
Offline
Зарегистрирован: 19.10.2016

sansei4 пишет:

C UIPEthernet.h и правда заработало. Одно но... В локальной сети все отлично, а на удаленный сервер команды не проходят. При этом с компьютера из той же сети все доходит.

Покажите свой Ethernet.begin

sansei4
Offline
Зарегистрирован: 09.01.2015

Ethernet.begin(mac).

Вот весь код:

#include <UIPEthernet.h>
#include "PubSubClient.h"

#define CLIENT_ID       "Hal"

uint8_t mac[6] = {
  0xD0, 0x92, 0x1A, 0x0D, 0xF7, 0x90};

IPAddress mqttServer(223,322,223,322);
uint16_t  mqttPort = 1883;

//IPAddress mqttServer(192,168,1,111);
//uint16_t  mqttPort = 1883;

EthernetClient ethClient;
PubSubClient mqttClient;

void setup() {
  // setup ethernet communication using DHCP
  if (Ethernet.begin(mac) == 0) {
    for (;;);
  }
  // setup mqtt client
  mqttClient.setClient(ethClient);
  mqttClient.setServer(mqttServer, mqttPort);
}

void loop() {
  sendData("1");
  mqttClient.loop();
  delay (2000);
  sendData("12");
  mqttClient.loop();
  delay (2000);
  sendData("123");
  mqttClient.loop();
  delay (2000);
}

void sendData(char* val) {
  if (mqttClient.connect(CLIENT_ID)) {
    mqttClient.publish("/W/WWL", val);
  }
}



 

sadman41
Offline
Зарегистрирован: 19.10.2016

Должно работать, если DHCP раздает правильный default gateway.

Но я бы не использовал с UIPEthernet данный функционал (DHCP), а брал бы статический адрес, отключив заодно UDP полностью.

Кстати, попробуйте запустить со статическим адресом, в таком формате:  Ethernet.begin(mac, ip, dns, gateway, subnet). У меня месяцами работает в режиме сервера и проблем с доступом из других подсететей я не наблюдаю.

DESArt
Offline
Зарегистрирован: 26.02.2017

 

я подключал так

 


#include <UIPEthernet.h>

EthernetServer server = EthernetServer(1000);
EthernetClient client;

void setup()
{
   pinMode(5, OUTPUT);
  Serial.begin(9600);

  uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
  IPAddress myIP(192,168,1,140);

  Ethernet.begin(mac,myIP);

  server.begin();
}

void loop()
{
  size_t size;
  String sbuf;

  if (client = server.available())
    {
      while((size = client.available()) > 0)
        {
          uint8_t* msg = (uint8_t*)malloc(size);
          size = client.read(msg,size);
          Serial.write(msg, size);
 
          sbuf = String((char *)msg);
          sbuf = sbuf.substring(0, size);
          Serial.println("buffer >>" + sbuf);
          
           if (sbuf == "LED ON") {
            digitalWrite(5, HIGH);
           }
           if (sbuf == "LED OFF") {
            digitalWrite(5, LOW);
           }
          free(msg);
        }
      client.println("DATA from Server!");
      client.stop();      
    }
}

 

DESArt
Offline
Зарегистрирован: 26.02.2017

Проверял все самописными программами 

Сервер и клиент на Delphi

sadman41
Offline
Зарегистрирован: 19.10.2016

Не могу не отметить, что вариант DESArt будет работать только в том случае, если оба хоста (и клиент и сервер) в одной ip-подсети или роутер имеет адрес 192.168.1.1.

 

DESArt
Offline
Зарегистрирован: 26.02.2017

да так и есть

DESArt
Offline
Зарегистрирован: 26.02.2017

Про клиента:

 

#include "UIPEthernet.h";

EthernetClient client;

void setup() 
{
  Serial.begin(9600);
  
  uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
  Ethernet.begin(mac); //Configure IP address via DHCP

  Connect();

}

void Connect()
{
  if (client.connect(IPAddress(192,168,1,62),1000))
  {
    Serial.println("Succefull connection!");
    client.println("I Connection");
  }
  else
  {
    Serial.println("Error connection...");
  }  
}

long int _time = 0;
bool _conn;

void loop() {
   size_t size;
   String sbuf;

     while((size = client.available()) > 0)
            {
              uint8_t* msg = (uint8_t*)malloc(size);
              size = client.read(msg, size);
 
              sbuf = String((char *)msg);
              sbuf = sbuf.substring(0, size);
              Serial.println("recv >> " + sbuf);
              client.println(millis());

              delay(2000);
              free(msg);
            }

     if (!client.connected())
     {
      Serial.println("Disconnected");
      Connect();
     }

}

Мне нужно определить если сервер отключил клиента, или произошел какой то сбой

     if (!client.connected())
     {
      Serial.println("Disconnected");
      Connect();
     }

не срабатывает почему то

sansei4
Offline
Зарегистрирован: 09.01.2015

sadman41, чего-то я запутался... Какие значения адресов нужно вводить?

Есть роутер с белым IP 223.322.223.322, который преренаправляет с порта 1883 на сервер с MQTT 192.168.123.112:1883.

Правильно ли я настраиваю UIP?

uint8_t myIP[4]   = {192,168,1,99}; // локальный IP ENC28j60
uint8_t myMASK[4] = {255,255,255,0};
uint8_t myDNS[4]  = {192,168,1,1}; // локальный роутер 
uint8_t myGW[4]   = {192,168,1,1}; // локальный роутер 

EthernetClient ethClient;
PubSubClient mqttClient;

Ethernet.begin(mac,myIP,myDNS,myGW,myMASK);

IPAddress mqttServer(223,322,223,322); // удаленный роутер 
uint16_t  mqttPort = 1883;

mqttClient.setClient(ethClient);
mqttClient.setServer(mqttServer, mqttPort);

Повторюсь, если меняю

IPAddress mqttServer(223,322,223,322);  // удаленный роутер

 на 

// адрес тестового локального сервера MQTT, копии удаленного
IPAddress mqttServer(192,168,1,111); 

то все работает.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

sansei4 пишет:

Есть роутер с белым IP 223.322.223.322, который преренаправляет с порта 1883 на сервер с MQTT 192.168.123.112:1883.

В теории всё правильно. Вот вам способ узнать:
Serial.println(Ethernet.localIP()); 
Serial.println(Ethernet.subnetMask()); 
Serial.println(Ethernet.gatewayIP()); 
GatewayIP() должен показать адрес вашего роутера.
Но вопрос в другом - вы уверены, что проброс порта работает и ваш удаленный MQTT доступен извне?
Сразу оговорюсь, что у меня никаких MQTT нет и всякие особенности реализации взаимодействия с ним мне неизвестны. Моё устройство на Arduino само принимает коннекты, по большей части из других подсетей, через всякие там VPN-ы и пр. Так что я не думаю, что UIPEthernet настолько плох, что имеет проблемы с роутингом и таймаутами в рамках стандарта TCP/IP.
 
К слову, советую брать не master-ветку, а fix_errata12 (https://github.com/ntruchsess/arduino_uip/tree/fix_errata12) - она устойчива к интенсивному траффику, в том числе и тупому флуду.
 

 

Votmax
Offline
Зарегистрирован: 18.06.2016

Всем привет!

В общем, пол года назад я начинал эту тему )). Проблема подключения Ардуино + ENC28J60 решилась использованием корректного напряжения и правильной библиотеки с нужной распиновкой (8 пин, а не 10…). Стандартный пример rbbb_server библиотеки EtherCard.h запустился на ура. Я обрадовался и отложил работу над устройством на некоторое время.

Сейчас вернулся к работе над своим мини сервером и обнаружил следующую проблему: стандартный rbbb_server работает, но как только я начинаю дописывать выводимую html страницу проект начинает как то нестабильно работать. То есть то запускается, то вообще нет, при этом устройство даже не пингуется.

Я понял, что проблема в строчке

byte Ethernet::buffer[950];

Код HTML страницы в примере rbbb_server составляет с пробелами и ковычками 198 символов, то есть до 500 байт. Мой код занимаем 910 символов. Буфер я выставил на 1000 байт. Если выставить на 1200, среда разработки предупреждает, что начинаются проблемы с памятью и программа может работать некорректно.

В общем, при буфере 1000  байт устройство работает как повезёт. Если залить код и сайт откроется, то он и дальше будет открываться, а если с первого раза не открылся, то и дальше не будет открываться. Какая то ерунда... Не подскажите, в чем может быть дело?

 

P.S.  Мне сильно понравилась библиотека  UIPEthernet.h, но её примеры моя ENC28J60 вообще не отрабатывает, устройство даже не пингуется.

 

P.S.  P.S.   Возвращаясь к питанию, в интернете видел статью, где автор утверждает, что с ардуино нано 3.3В для питания ENC28J60 брать нельзя, а с ардуино уно можно и его будет достаточно. Корректно ли данное утверждение?

 

P.S.  P.S.   P.S.  Я вот все таки немного грешу на питание, дело в том, что я питаю    ENC28J60 не с пина 3.3В, а с пина 5В, но через конвертор напряжения. На выходе имею стабильно 3.3В. Можно ли так делать или лучше 5В брать не с ардуино, а непосредственно с источника питания?

P.S.  P.S.   P.S.  P.S. И еще, у меня на модуле ENC28J60 горят при включении зеленая и желтая лампочки. Это ж правильно?

 

 

Заранее всем спасибо за ответы!

sadman41
Offline
Зарегистрирован: 19.10.2016

Votmax пишет:

P.S.  Мне сильно понравилась библиотека  ENC28J60  UIPEthernet.h, но её примеры моя ENC28J60 вообще не отрабатывает, устройство даже не пингуется.

Насчет конкретно ваших примеров я не в курсе, но знаю, что UIPEthernet организует внутренние буферы по ~100б на сокет. И при достижении определенного лимита свободной памяти (та цифра, что показывает компилятор) действительно перестает работать даже ping.  Конкретно в моем проекте эта граница в районе 260байт. Чуть выше - пинг есть, ниже - молчок. Причем сама ардуина вполне себе работает, не висит.

Вообще - если не сильно хотите вникать во всю эту кухню, лучше сразу взять W5100 mini - чуть дороже, но не будет всех тех проблем, с которыми вы будете маяться месяцами, используя ENC. И памяти у вас свободной больше останется и progmem space.

Votmax пишет:

P.S.  P.S.   Возвращаясь к питанию, в интернете видел статью, где автор утверждает, что с ардуино нано 3.3В для питания ENC28J60 брать нельзя, а с ардуино уно можно и его будет достаточно. Корректно ли данное утверждение?

И да и нет.

Суть тут вот в чем: чип ENC28J60 требует, по-моему, 250ma в режиме максимальной производительности. Т.е. источник питания, к которому вы подключаете сетевой модуль, должен его обеспечивать. Как правило Nano имеет штатный стабилизатор на 5V/800ma, а 3,3V - это побочный эффект, производимый чипом usb-интерфейса. Т.е. лучше считать, что 3,3V на Nano нет. 

Однако я знаю одну модификацию Nano, имеющую на борту дополнительный стабилизатор на 3.3V/500ma - это Arduino Nano board от RobotDyn. Вот с ней ENC28J60 будет работать спокойно.

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

Так же стоит знать, что встречаются модули на базе ENC28J60 с набортным стабилизатором. Такой модуль можно тупо присоединить к пину +5V платы Arduino (если, конечно, вы не превышаете суммарную нагрузку). Подобные модули так же доступны у RobotDyn и у других производителей. Отличить их можно по дополнительному трехногому таракану на плате (xx1117, как правило).

Votmax пишет:
P.S.  P.S.   P.S.  Я вот все таки немного грешу на питание, дело в том, что я питаю    ENC28J60 не с пина 3.3В, а с пина 5В, но через конвертор напряжения. На выходе имею стабильно 3.3В. Можно ли так делать или лучше 5В брать не с ардуино, а непосредственно с источника питания?

Можно и так и сяк. Пока на пин +5V не навешано потребителей, требующих больше чем 800ma - всё должно работать. Но всё же лучше оставить ардуину в покое, если вы имеете возможность не пускать через ее стабилизатор любые дополнительные нагрузки. В теории это должно уменьшить нестабильность работы АЦП микроконтроллера (analogRead() будет поточнее работать).

 

Votmax пишет:

P.S.  P.S.   P.S.  P.S. И еще, у меня на модуле ENC28J60 горят при включении зеленая и желтая лампочки. Это ж правильно?

Одна из них Link, вторая Activity. Если линк горит при отсутствии воткнутого провода, то, конечно, это ненормально.

Votmax
Offline
Зарегистрирован: 18.06.2016

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

И еще, правильно ли я понимаю, что W5100 это шилд специльно для ардуино? То есть можно расчитывать на большую стабильность? А какой объем страницы типовой для него?

У меня в планах сделать страницу по наполняемости аналогичную главной странице http://arduino.ru/. То есть как бы не пусто, но и не густо. А картинки, понятное дело, будут загружаться с интернета. Как думаете хватит возхможности для этого у W5100? 

Заранее спасибо!

sansei4
Offline
Зарегистрирован: 09.01.2015

Интересное видео про ENC, W5100 и вообще -  https://youtu.be/LwDDEIx63cA

sadman41
Offline
Зарегистрирован: 19.10.2016

Votmax пишет:
И еще, правильно ли я понимаю, что W5100 это шилд специльно для ардуино? То есть можно расчитывать на большую стабильность?

Если под фразой "специльно для ардуино" понимать "не работает ни с чем, кроме как платы Arduino", то нет. Работает и с STM и прочими чипами, которые быстро шевелят ногами, изображая SPI-шину.

"Большая стабильность" в общеупотребительном значении обычно означает "напихаю столько HTML-а, что по швам рваться начнет, но не лопнет". Так вот, напихать в W5100 (и в любой сетевой чип) вы ничего не сможете. Он будет отправлять то, что ему будет совать МК. Если МК сует быстрее, чем работает сеть (удаленный абонент, например, подключен через GPRS), то данные будут складыватся во внутренний буфер и отправляться по мере возможности.

Так же сетевой чип будет принимать, складывая в свой буфер, всё, что лезет из сети и адресовано его MAC-адресу. Будет МК забирать данные или не будет - это дело второе. Чип начнет слать отказы в соединении всем, как только заполнится его внутренний буфер.

Теперь, что касается более узкого понимания "стабильность". Я считаю, что W5100 более стабилен в работе за счет того, что у него больше буфера (просто реже ошибка переполнения буфера будет возникать. Вплоть до того, что вы ее можете никогда за свою жизнь не получить) и аппаратный TCP/IP, который писали не любители, а оплачиваемые специалисты. Т.е., в принципе, более качественный и вылизанный код работает с сетью. С ENC28J60 тоже можно добиться определенной стабильности, вопрос только в том сколько времени из своей жизни вы готовы вычеркнуть только для того, чтобы эта гадина перестала вешаться без видимых простому пользователю Arduino IDE причин раз в день или две недели.

Votmax пишет:
А какой объем страницы типовой для него?

У меня в планах сделать страницу по наполняемости аналогичную главной странице http://arduino.ru/. То есть как бы не пусто, но и не густо. А картинки, понятное дело, будут загружаться с интернета. Как думаете хватит возхможности для этого у W5100?

Полагаю, что насчет взаимосвязи объёма страницы и применяемого сетевого модуля вы поняли - ее нет. Объемы вы будете хранить в микроконтроллере или на SD-карте, которую будет читать микроконтроллер. А вот сколько в МК останется места под ваш HTML - как раз зависит от сетевого чипа и библиотек, через которые вы с ним будете работать. Оценить это можно просто: открываете пример Webserver для библиотеки Ethernet и такой же пример для библиотеки UIPEthernet. Компилируете первый, записываете занятый объём Progmem и RAM, компилируете второй, записываете те же параметры. Вычитаете первое из второго и получаете значения ресурсов, сэкономленных при переходе с ENC на Wiznet. Их вы можете истратить на более полезное мигание светодиодом или пару сотен HTML-тэгов.

Насчет планов страницы, подобной arduino.ru - думаю, что вы собрались слишком широко шагать. Во-первых за простой страничкой кроется как минимум LAMP на сервере с гигабитной картой и процессором Xeon. А он, процессор, даже по чистому весу раз в 10 тяжелее вашей ардуины. Во-вторых вы точно так же можете прикинуть на что вам хватит вашей Uno - просто сохраните страничку на жесткий диск, удалите все картинки и посмотрите объём папки с остатками. Теперь посмотрите на объём progmem space вашего МК. Остается что-нибудь на pinMode()/digitalWrite()?

К слову, если вы собрались делать что-то на Uno, то более удобен будет Ethernet shield (тот же самый W5100, но в другом формате). W5100 mino более интересен для мелких вещей в сочетании с Nano или Mini Pro.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

sansei4 пишет:

Интересное видео про ENC, W5100 и вообще -  https://youtu.be/LwDDEIx63cA

Да, видео неплохое, но оно про W5500. W5100 победнее немного по ресурсам. А у W5500 свои закидоны есть, кроме того, что он тупо дороже ;)

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

 

Votmax
Offline
Зарегистрирован: 18.06.2016

Еще раз спасибо за дельные советы! Наверное в последний раз задам свои глупые вопросы).

 

sadman41 пишет:

Во-вторых вы точно так же можете прикинуть на что вам хватит вашей Uno - просто сохраните страничку на жесткий диск, удалите все картинки и посмотрите объём папки с остатками. Теперь посмотрите на объём progmem space вашего МК. Остается что-нибудь на pinMode()/digitalWrite()?

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Votmax пишет:

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

Можете выводить и построчно и побайтово. Браузер же перед анализом их все равно соберет в кучу. Тут вас скорее  всего будет поджидать еще и проблема обработки многопоточных запросов. HTML видели? Там ссылки на css и пр. Всё это будет запрашиваться не последовательно, а одновременно. Но так, как МК однопоточный (и библиотечки тоже сделаны таковыми), то отдавать сможете только один "файл". Будете медленно отдавать - остальные коннекты отлетят по таймауту и часть данных не прогрузится. Страница покривеет в лучшем случае. Т.е. всё передавать одной страницей что ли с погруженным css/js... Опять же - SD-карта и сетевой чип будут делить SPI-шину. Т.е. вы или читаете или передаете (или наворачиваете программную эмуляцию второй SPI-шины). Следовательно - сколько-то байт нужно будет сначала слить с карты в память, переключиться на сетевой модуль и выплюнуть. Затем повторить. Вобщем, тут много проблем придется решать. Но я построением веб-серверов на МК не увлекаюсь, поэтому советов давать не буду. Хотя нет, один могу дать - Raspberry Pi или что-то из этого семейства гораздо выгоднее использовать для устройства вебсервера, если вам непременно хочется засунуть его в мыльницу. 

 

Votmax
Offline
Зарегистрирован: 18.06.2016

Sadman41, спасибо за консультацию! Как попробую, обязательно отпишусь, что и как у меня получилось!

Votmax
Offline
Зарегистрирован: 18.06.2016

Всем привет!!!

Заказал я W5100 себе с Китая, но пока она идет, решил поработать с ENC28J60 и пришел наконец к некоторому рабочему состоянию))).

Вот код:


#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,100,203 };

byte Ethernet::buffer[1300];
BufferFiller bfill;
int datas;


void setup () {
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println(F("Failed to access Ethernet controller"));
  ether.staticSetup(myip);
}

static word homePage() {
  long t = millis() / 1000;
  word h = t / 3600;
  byte m = (t / 60) % 60;
  byte s = t % 60;
  bfill = ether.tcpOffset();
  bfill.emit_p(PSTR(
"<html><head><meta charset='UTF-8'>"
"<title>Система...</title>"
"<style type='text/css'>"
" A {color: black; "
"text-decoration:underline;"
"font-size: 34px;}"
"A:visited {color: black;"
"font-size: 34px;}"
"A:hover {color: red; "
"font-size: 34px;}"
"</style></head><body>"
"<img src='' width='100%'/>"
"<br/><br/><br/><br/>"
"<center>"
"<a href='monitor.html'>Показать данные мониторинга</a>"
"<br/><br/>"
"<a href='data.html'>Установка даты и времени</a>"
"<br/><br/>"
"<a href='about.html'>О системе</a>"
"</center></body></html> "
  ));
  return bfill.position();
}

void loop () {
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);

  datas='555';
  
  if (pos)  // check if valid tcp data is received
  {char *data = (char *) Ethernet::buffer + pos;
// проверяем на наличие в заголовках нужных нам строк


if (strstr(data, "monitor.html")){
    bfill = ether.tcpOffset();
bfill.emit_p(PSTR("<html><head><meta charset='UTF-8'>"
"<title>Система....</title>"

"</head><body>"
"<img src='' width='100%'/>"
"<a href='index.html'>Назад</a>"
"</html> "));
ether.httpServerReply(bfill.position());
goto label;
}

if (strstr(data, "about.html")){
    bfill = ether.tcpOffset();
bfill.emit_p(PSTR( "<html><head><meta charset='UTF-8'>"
"<title>Система......</title>"
"<style type='text/css'>"
" A {color: black;"
"text-decoration:underline;"
"font-size: 34px;}"
"A:visited {color: black;"
"font-size: 34px;}"
"A:hover {color: red;"
"font-size: 34px;}"
"</style></head><body>"
"<img src='' width='100%'/>"
"<br/><br/><br/><br/>"
"Система предназначена для......."
"<center><a href='index.html'>Назад</a></center>"
"</body></html>" 
     ));
ether.httpServerReply(bfill.position());
goto label;
}


if (strstr(data, "data.html")){
    bfill = ether.tcpOffset();
bfill.emit_p(PSTR( "<html><head><meta charset='UTF-8'>"
"<title>Система.......</title>"
"<style type='text/css'>"
" A {color: black;"
"text-decoration:underline;"
"font-size: 34px;}"
"A:visited {color: black;"
"font-size: 34px;}"
"A:hover {color: red;"
"font-size: 34px;}"
"</style></head><body>"
"<img src='' width='100%'/>"
"<br/><br/><br/><br/>"
"<center>"
"<form name='forma' action='settime.html'>"
"Дата:<input name='data' value='23-03-2017'/>"
"Время:<input name='time' value='00-00'/>"
"Код администратора:<input name='pass' value=''/>"
"<br/><br/><input type='submit' name='b' value='Отправить'/>"
"</form>"
"<br/><a href='index.html'>Назад</a>"
"</center></body></html>" 
     ));
ether.httpServerReply(bfill.position());
goto label;
}

if (strstr(data, "settime.html")){

//Что то делаем и формируем страницу

bfill = ether.tcpOffset();
bfill.emit_p(PSTR( "<html><head><meta charset='UTF-8'>"
"<title>Система.......</title>"
"</style></head><body></body></html>" ));


ether.httpServerReply(bfill.position());
goto label;
}


   
    ether.httpServerReply(homePage()); // send web page data
 label:
 datas='555';
  }
}

Я установил, что оптимальный размер буфера 1300 байт. Как я понимаю, размер страницы соответственно болжен быть как минимум не больше размера буфера. Поэтому все картинки подгружаем с интернета. Еще с типового примера rbbb_server нужно убрать обновление страницы раз в секунду или сделать его продолжительнее по времени, например раз в 30 секунд и т.д.

Еще показаолсь, что работоспособность зависит от версии компилятора, я использовал 1.8.1. Не знаю, может быть и нет, но на версии 1.6 работало как то косячнее (ИМХО).

В общем то, что написано, работает пока на ура! Открываются все ссылочки)) и даже передается запрос по нажатию кнопки для страницы settime.html. Правда запрос пока не отрабатывал. Но, это уже "it's easy".

Свой код постарался урезать, оставив в нем только необходимую рабочую структуру. Кому нужно, пользуйтесь, пожалуйста)).

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Если можно несколько bfill.emit_p() подряд вызывать, а потом инициировать отсылку httpServerReply(), то в первом приближении можно сэкономить progmem space за счет последовательного вызова: header-emit, функции с css-emit, и, в конце, body+footer-emit. Ну, и index.html у вас не отдается, а ссылки на него формируются.

Votmax
Offline
Зарегистрирован: 18.06.2016

sadman41 пишет:

Если можно несколько bfill.emit_p() подряд вызывать, а потом инициировать отсылку httpServerReply()

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

А index.html да в запросе участвует, но так как контроллер ничего не находит, он передает управление на homePage().

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

glazkow
Offline
Зарегистрирован: 15.04.2017

орый день. Вопрос следующего характера.

При прошивке выдает следующее.  

ВНИМАНИЕ: Категория '' в библиотеке UIPEthernet не является действительной. Установка на 'Uncategorized'
Скетч использует 25376 байт (82%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1345 байт (65%) динамической памяти, оставляя 703 байт для локальных переменных. Максимум: 2048 байт.
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
 
Соответственно пинга нету и страница не открывается. Шилд подключен от USB отдельно от ардуинки. Лампочка актив на шилде горит, лампочка линк пару сек мигает. Дальше тишина.

Имеем Arduino IDE 1.8.2, Arduino pro mini, ethernet shild ENC28J60. Зашиваю с помощью USBASP. 

Сам скетч собственно

#include <SPI.h>
#include <UIPEthernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAB, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

// я использовал порт 19989:
EthernetServer server(19989);

String httpHandler="";

int relayPin5=5;
int relayPin4=4;
int relayPin3=3;
int relayPin2=2;


void setup() {
  // устанавливаем скорость передачи данных для последовательного порта и ждем, когда он будет готов
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  pinMode(relayPin5, OUTPUT);
  pinMode(relayPin4, OUTPUT);
  pinMode(relayPin3, OUTPUT);
  pinMode(relayPin2, OUTPUT);

  digitalWrite(relayPin5, HIGH);
  digitalWrite(relayPin4, HIGH);
  digitalWrite(relayPin3, HIGH);
  digitalWrite(relayPin2, HIGH);
  
  // устанавливаем соединение с Ethernet шилдом и запускаем его в режиме сервера:
  Ethernet.begin(mac, ip, 10);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // прослушиваем подключенных клиентов
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        //читаем данные клиента
        char c = client.read();
        httpHandler +=c;
        //Serial.write(c);
        // когда дошли до конца строки (символ '\n'), это означает что http запрос завершился 
        //и можно отправлять клиенту ответ
        if (c == '\n' && currentLineIsBlank) {
          // отправляем клиенту ответ
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(F("Connection: close"));  // соединение будет закрыто после завершения ответа          
          client.println(F("<!DOCTYPE HTML>"));
          client.println(F("<html>"));
          client.println("<meta http-equiv='refresh' content='5; URL=/'>");  // refresh the page automatically every 5 sec
          
          //немного стилей для наглядного отображения надписей и кнопок клиенту
          //это стили bootstrap'а )))
          client.println(F("<style> "));
          client.println(F(".btn {"));
          client.println(F("    display: inline-block;"));
          client.println(F("    padding: 6px 12px;"));
          client.println(F("    margin-bottom: 0;"));
          client.println(F("    font-size: 14px;"));
          client.println(F("    font-weight: normal;"));
          client.println(F("    line-height: 1.42857143;"));
          client.println(F("    text-align: center;"));
          client.println(F("    white-space: nowrap;"));
          client.println(F("    vertical-align: middle;"));
          client.println(F("    cursor: pointer;"));
          client.println(F("    -webkit-user-select: none;"));
          client.println(F("    -moz-user-select: none;"));
          client.println(F("    -ms-user-select: none;"));
          client.println(F("    user-select: none;"));
          client.println(F("    background-image: none;"));
          client.println(F("    border: 1px solid transparent;"));
          client.println(F("    border-radius: 4px;"));
          client.println(F("}"));
          client.println(F("    .btn:focus,"));
          client.println(F("    .btn:active:focus,"));
          client.println(F("    .btn.active:focus {"));
          client.println(F("        outline: thin dotted;"));
          client.println(F("        outline: 5px auto -webkit-focus-ring-color;"));
          client.println(F("        outline-offset: -2px;"));
          client.println(F("    }"));
          client.println(F("    .btn:hover,"));
          client.println(F("    .btn:focus {"));
          client.println(F("        color: #333;"));
          client.println(F("        text-decoration: none;"));
          client.println(F("    }"));
          client.println(F("    .btn:active,"));
          client.println(F("    .btn.active {"));
          client.println(F("        background-image: none;"));
          client.println(F("        outline: 0;"));
          client.println(F("        -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);"));
          client.println(F("        box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);"));
          client.println(F("    }"));
          client.println(F(".btn-success {"));
          client.println(F("    color: #fff;"));
          client.println(F("    background-color: #5cb85c;"));
          client.println(F("    border-color: #4cae4c;"));
          client.println(F("}"));
          client.println(F("    .btn-success:hover,"));
          client.println(F("    .btn-success:focus,"));
          client.println(F("    .btn-success:active,"));
          client.println(F("    .btn-success.active,"));
          client.println(F("    .open > .dropdown-toggle.btn-success {"));
          client.println(F("        color: #fff;"));
          client.println(F("        background-color: #449d44;"));
          client.println(F("        border-color: #398439;"));
          client.println(F("    }"));
          client.println(F("    .btn-success:active,"));
          client.println(F("    .btn-success.active,"));
          client.println(F("    .open > .dropdown-toggle.btn-success {"));
          client.println(F("        background-image: none;"));
          client.println(F("    }"));
          client.println(F(" .btn-success .badge {"));
          client.println(F("        color: #5cb85c;"));
          client.println(F("        background-color: #fff;"));
          client.println(F("    }"));
          client.println(F(".btn-danger {"));
          client.println(F("    color: #fff;"));
          client.println(F("    background-color: #d9534f;"));
          client.println(F("    border-color: #d43f3a;"));
          client.println(F("}"));
          client.println(F("    .btn-danger:hover,"));
          client.println(F("    .btn-danger:focus,"));
          client.println(F("    .btn-danger:active,"));
          client.println(F("    .btn-danger.active,"));
          client.println(F("    .open > .dropdown-toggle.btn-danger {"));
          client.println(F("        color: #fff;"));
          client.println(F("        background-color: #c9302c;"));
          client.println(F("        border-color: #ac2925;"));
          client.println(F("    }"));
          client.println(F("    .btn-danger:active,"));
          client.println(F("    .btn-danger.active,"));
          client.println(F("    .open > .dropdown-toggle.btn-danger {"));
          client.println(F("        background-image: none;"));
          client.println(F("    }"));
          client.println(F("  .btn-danger .badge {"));
          client.println(F("        color: #d9534f;"));
          client.println(F("        background-color: #fff;"));
          client.println(F("    }"));
          client.println(F(".alert {"));
          client.println(F("    padding: 5px;"));
          client.println(F("    margin-bottom: 10px;"));
          client.println(F("    border: 1px solid transparent;"));
          client.println(F("    border-radius: 4px;"));
          client.println(F("}"));
          client.println(F(".alert-success {"));
          client.println(F("    color: #3c763d;"));
          client.println(F("    background-color: #dff0d8;"));
          client.println(F("    border-color: #d6e9c6;"));
          client.println(F("}"));
          client.println(F(".alert-danger {"));
          client.println(F("    color: #a94442;"));
          client.println(F("    background-color: #f2dede;"));
          client.println(F("    border-color: #ebccd1;"));
          client.println(F("}"));
          client.println(F("a {"));
          client.println(F("    color: #428bca;"));
          client.println(F("    text-decoration: none;"));
          client.println(F("}"));
          client.println(F("</style>"));
          
          //здесь я условился, что клиент будет посылать запрос на включение/отключение реле в виде GET запроса '?relay{№ вывода (pin)}={состояние 1-вкл., 0-откл.}' 
          //исходя из этого парсим http запрос клиента, чтоб определить какое действие он хочет совершить, и с каким реле
          String pinNumber=httpHandler.substring(11,12);//номер вывода для реле
          String statusRelay=httpHandler.substring(13,14);//состояние 1-вкл., 0-откл.
                               
          if(pinNumber=="2"){//если номер вывода в Get запросе равен 2
            if(statusRelay=="1"){//клиент хочет включить реле statusRelay=1, если выключить, то statusRelay=0
              digitalWrite(relayPin2, LOW);
            }else{
              digitalWrite(relayPin2, HIGH);
            }
          }
          
          if(pinNumber=="3"){//аналогично предыдущему
            if(statusRelay=="1"){
              digitalWrite(relayPin3, LOW);              
            }else{
              digitalWrite(relayPin3, HIGH);              
            }
          } 
          
          if(pinNumber=="4"){//аналогично предыдущему
            if(statusRelay=="1"){
              digitalWrite(relayPin4, LOW);              
            }else{
              digitalWrite(relayPin4, HIGH);              
            }
          } 
                        
          if(pinNumber=="5"){//аналогично предыдущему
            if(statusRelay=="1"){
              digitalWrite(relayPin5, LOW);              
            }else{
              digitalWrite(relayPin5, HIGH);              
            }
          }         
                 
          //считываем состояния других выводов для отображения клиенту
          int pin2Status=digitalRead(relayPin2);
          int pin3Status=digitalRead(relayPin3);
          int pin4Status=digitalRead(relayPin4);
          int pin5Status=digitalRead(relayPin5);
          
          //вывод информации о состоянии и кнопок включения (при отключенном состоянии) либо отключения (при включенном состоянии)
          client.print(F("<span class='alert'>Relay2:</span> "));
          client.println(pin2Status == 0 ? F("<span class='alert-success alert'>VKL</span>&nbsp;") : F("<span class='alert-danger alert'>OTKL</span>&nbsp;"));            
          if(pin2Status == 1)
            client.println(F("<a href='?relay2=1' class='btn btn-success'>Vkl relay 2</a>"));
          else 
            client.println(F("<a href='?relay2=0' class='btn btn-danger'>Otkl relay 2</a>"));
            
          client.print(F("<br><br><span class='alert'>Relay3:</span> "));
          client.println(pin3Status == 0 ? F("<span class='alert-success alert'>VKL</span>&nbsp;") : F("<span class='alert-danger alert'>OTKL</span>&nbsp;"));
          if(pin3Status == 1)
            client.println(F("<a href='?relay3=1' class='btn btn-success'>Vkl relay 3</a>"));
          else 
            client.println(F("<a href='?relay3=0' class='btn btn-danger'>Otkl relay 3</a>"));
          
          client.print(F("<br><br><span class='alert'>Relay4:</span> "));
          client.println(pin4Status == 0 ? F("<span class='alert-success alert'>VKL</span>&nbsp;") : F("<span class='alert-danger alert'>OTKL</span>&nbsp;"));
          if(pin4Status == 1)
            client.println(F("<a href='?relay4=1' class='btn btn-success'>Vkl relay 4</a>"));
          else 
            client.println(F("<a href='?relay4=0' class='btn btn-danger'>Otkl relay 4</a>"));
          
          client.print(F("<br><br><span class='alert'>Relay5:</span> "));
          client.println(pin5Status == 0 ? F("<span class='alert-success alert'>VKL</span>&nbsp;") : F("<span class='alert-danger alert'>OTKL</span>&nbsp;"));
           if(pin5Status == 1)
            client.println(F("<a href='?relay5=1' class='btn btn-success'>Vkl relay 5</a>"));
          else 
            client.println(F("<a href='?relay5=0' class='btn btn-danger'>Otkl relay 5</a>"));
          
          //рисуем кнопку "обновить"
          client.println(F("<br><br><br><a href='/'>Obnovit'</a>"));
          
          httpHandler="";
          client.println(F("</html>"));
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(10);
    // разрываем соединение с клиентом
    client.stop();
    Serial.println("client disconnected");
  }
}

Заранее спасибо за помощь!

Votmax
Offline
Зарегистрирован: 18.06.2016

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

glazkow
Offline
Зарегистрирован: 15.04.2017

Попробую буфер увеличить, но тут интересно почему выводит такое

 

ВНИМАНИЕ: Категория '' в библиотеке UIPEthernet не является действительной. Установка на 'Uncategorized'
Скетч использует 25376 байт (82%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1345 байт (65%) динамической памяти, оставляя 703 байт для локальных переменных. Максимум: 2048 байт.
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Invalid version found: 1.04
Votmax
Offline
Зарегистрирован: 18.06.2016

Я, конечно, не занимался своим устройством уже месяц как, но вот строчки мне кажутся знакомыми:

не является действительной. Установка на 'Uncategorized'Invalid version found

 

У меня 1.8.1. Я еще помню, что они появились, когда я перешел с версии 1.6. Но так как проект у меня работает, я на них не обращал внимание)).

Так что к вопросу присоединяюсь).

И кстати:


client.println(F("


Obnovit'"));

Почему не "Обновить"? У меня с кодировкой все корректно отображается.

glazkow
Offline
Зарегистрирован: 15.04.2017

да просто было лень раскладку переключать ) да  и не особо люблю русский в коде )

glazkow
Offline
Зарегистрирован: 15.04.2017

С этим (Invalid version found: 1.04) разобрался. в библиотеке UIPEthernet, в library.properties 9-я строчка вроде, надо поправить на 1.0.4 Пропущена точка

glazkow
Offline
Зарегистрирован: 15.04.2017

Скетч зашивается, но пинга блин почемуу-то нет(( Уже и не знаю в чем дело. Пробовал на прямую от USB подключать шилд и Pro mini. Пинга нету. Правда шилд греется сильно.

sadman41
Offline
Зарегистрирован: 19.10.2016

ENC28J60 действительно греется как печка, 60C возле чипа для нее, наверное, норма.

Автор давно не занимается библиотекой, поэтому все нововведения в Arduino IDE (указание в файле library.properties категории, к которой относится библиотека и версии в правильном формате) не учтены в текущей UIPEthernet. Если вы включите более подробный уровень отладки - увидите еще больше предупреждений. Однако я не могу сказать, что это как-то мешает работе. Со своей стороны могу посоветовать вам использовать стабильный бранч https://github.com/ntruchsess/arduino_uip/tree/fix_errata12 и откомпилировать стандартный пример типа ChatServer. С ним все пинги должны идти правильно. Есть, конечно, одна ловушка - когда меняете IP-адрес отдельно от MAC. Тогда, конечно, случаются проблемы с ARP, которые рассасываются как только ваш роутер зафлушит свой кэш. Однако это не проблема UIPEthernet или чипа ENC. 

ICMP действительно давится, если остается мало реальной памяти в скетче. операции с типами String могут ее пожрать в runtime. Так что сначала проверяйте на стандартном примере, потом уже копайтесь в своем.

Ну и, конечно, есть вариант с неправильным соединением. Если localIP() показал что-то невообразимое - то это проблема с модулем/чипом/соединением. К тому же непонятно, что у вас за сетевой модуль. Их несколько видов. Если вы питаете модуль без набортного стабилизатора от 5V, то у вас, безусловно не только будут проблемы, но и может даже пойти дым из него.

При нормальном отношении модуль будет работать с UIPEthernet. У меня уже отработал > 100 дней.

glazkow
Offline
Зарегистрирован: 15.04.2017

Спасио попробую сегодня с фиксом что скинули. Шилд без стаба набортного, попробую сегодня его питать от лабораторного блока. Дело в том что он пинговался от скетча из примеров. После того как залил свой пинг пропал. И теперь если заливаю из примера, то тоже пинга нету. Думаю что косяк с питаловом. Одним словом буду дальше пробовать. Шилд вот такой

http://s1.micp.ru/Yv7rq.png

http://s3.micp.ru/N11p3.png