Arduino Mega + Ethernit shield w5500, зависает SPI

Sergei123
Offline
Зарегистрирован: 22.11.2021

Доброго времени суток! 

Допустим в сети есть 2 роутера: Роутер 1 и Роутер 2. Порт WAN роутера 2 подключен в порт LAN роутера 1. Так вот при такой организации сети если ардуину подключить в Lan порт роутера 1, то всё работает нормально, а если подключить в Lan порт роутера 2, то ethenet у ардуины работает примерно 4-5 минуты и перестаёт работать, ардуина полностью не виснет, просто отваливается ethenet и ардуина перестаёт принимать как входящие так и совершать исходящие http запросы до тех пор пока её не перезагрузишь кнопочкой или программно  void(* resetFunc) (void) = 0; вот такой строчкой кода. На данный момент выхожу из положения тем что раз в 4 минуты вызывается такая строчка кода: void(* resetFunc) (void) = 0; и ардуина постоянно находится на связи. Может быть кто-то сталкивался с такой проблемой и знает как её решить? Замена шилда не помогает, все шилды 5500 будут иметь такой глюк, другие шилды не пробовал пока.

Sergei123
Offline
Зарегистрирован: 22.11.2021

Роутеры пробовал разные, проблема одна и та же.

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

Наврядли это проблема Wiznet.

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

Читайте логи роутеров.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, понятно, что тут можно только гадать на кофейной гуще...

Помнится, на w5100 китайцы распаивали резисторы 51 Ом вместо 510 Ом (маркировка SMD резистора на 51 Ом как раз "510"). Может, и здесь что-то похожее.

Sergei123
Offline
Зарегистрирован: 22.11.2021

Такой же эффект зависания кстати происходит если связь с ардуиной будет через wi-fi мост, пробовал 2 модели мостов, ubuntu и mikrotik, то же самое, 5 мин работает и уходит в зависание.

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

Натравите пример WebClient на гугл. В этом случае пакет пройдёт десятки роутеров и мостов.

Sergei123
Offline
Зарегистрирован: 22.11.2021

дело не в том по какому пути идёт пакет, дело в том какая схема подключения ардуины ну как бы в рамках моей локальной сети

например если воткнуть ардуину напрямую в комп через провод (ethernet) то всё будет нормально работать, а если провод заменить на wi-fi мост то ардуина зависнет, при этом не имеет значения. ардуина будет соединена с вайфай мостом напрямую или же через свич

если например воткнуть комп и ардуину в коммутатор (или даже несколько коммутаторов последовательно соединить) то тоже всё будет нормально работать

если например взять один роутер и воткнуть ардуину в его лан порт, и комп тоже будет подключен к роутеру проводом или по вайфай, то всё будет нормально

если взять ещё один роутер и соединить с первым роутером лан портами, то тоже всё будет нормально и не важно к какому роутеру будет подключена ардуина

но если 2-й роутер будет подключен к 1-му wan портом, а ардуина будет подключена ко 2-му роутеру, то она зависает

и это я опробовал примерно на 30-ти платах и ардуино и w5500, эффект одинаковый... обидно блин

короче заказал чип w5100, посмотрю как он будет работать в проблемных режимах

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Судя по вышеописанному (а именно проблеме с WAN-портом), подразумеваю, что не верно настроен Firewall (или вообще не настроен). А так же там всякие PortForward имеется и так далее. 

awladimer
Offline
Зарегистрирован: 13.02.2017

Всем привет почти аналогичная проблема зависают 2 шт ардуино + чип w5100 передают в mqtt  в majordomo.

может что-то в коде посмотрите пожалуйста.

#include <SPI.h>                 // Библиотека SPI шины ПИНЫ ДАТА A4 A5
#include <Ethernet.h>            // Ethernet библиотека
#include <PubSubClient.h>        // Библиотека MQTT
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include "Adafruit_Si7021.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

OneWire  oneWire(A3);  // пин 3  (a 4.7K resistor is necessary)
DallasTemperature ds(&oneWire);
Adafruit_BMP280 bmp; // I2C шина
Adafruit_Si7021 Si7021 = Adafruit_Si7021();
DeviceAddress sensor1 ={0x28, 0xC3, 0xA5, 0x79, 0xA2, 0x0, 0x03, 0x59};//Спальня Насти
DeviceAddress sensor2 ={0x28, 0xA8, 0xD0, 0x79, 0xA2, 0x0, 0x03, 0xDD};//СпальнЯ Сережи
DeviceAddress sensor3 ={0x28, 0x87, 0xA1, 0x28, 0x01, 0x0, 0x0, 0x48}; //Мой Кабинет
DeviceAddress sensor4 ={0x28, 0xD9, 0xC1, 0x79, 0xA2, 0x0, 0x03, 0xC3};//гардеробная
DeviceAddress sensor5 ={0x28, 0x2B, 0xCE, 0xC2, 0x2, 0x0, 0x0, 0xA1};//Гостинная
DeviceAddress sensor6 ={0x28, 0xFF, 0xB8, 0x79, 0x97, 0x7, 0x3, 0xDC};//Кухня
DeviceAddress sensor7 ={0x28, 0xD, 0xBA, 0xC2, 0x2, 0x0, 0x0, 0xD7};//Спальня
DeviceAddress sensor8 ={0x28, 0xE, 0x36, 0xBE, 0x0, 0x0, 0x0, 0x91};//Зал
DeviceAddress sensor9 ={0x28, 0x2B, 0xCE, 0xC2, 0x2, 0x0, 0x0, 0xA1};//клодовая
DeviceAddress sensor10 ={0x28, 0x93, 0xC5, 0x79, 0xA2, 0x0, 0x3, 0x66};//Парная
DeviceAddress sensor11 ={0x28, 0x93, 0xC5, 0x79, 0xA2, 0x0, 0x3, 0x66};//Баня
DeviceAddress sensor12 ={0x28, 0xE, 0x36, 0xBE, 0x0, 0x0, 0x0, 0x91};
DeviceAddress sensor13 ={0x28, 0x2B, 0xCE, 0xC2, 0x2, 0x0, 0x0, 0xA1};
DeviceAddress sensor14 ={0x28, 0xFF, 0xB8, 0x79, 0x97, 0x7, 0x3, 0xDC};
DeviceAddress sensor15 ={0x28, 0xFF, 0xB8, 0x79, 0x97, 0x7, 0x3, 0xDC};
DeviceAddress sensor16 ={0x28, 0xFF, 0xB8, 0x79, 0x97, 0x7, 0x3, 0xDC};

// Задаём mac и ip адреса в Локальной сети
byte mac[]    = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED  };
IPAddress ip(192, 168, 1, 213);      //ip Адрес Ethernet Shild'a Arduino
IPAddress server(192, 168, 1, 200);  //ip Адрес для MQTT Брокера

// Шапка Функции Callback (обратный вызов)
void callback(char* topic, byte* payload, unsigned int length);

EthernetClient ethClient;                                 //Инициализируем Ethernet клиент
PubSubClient client(server, 1883, callback, ethClient);   //Инициализируем MQTT клиент

// Функция Callback
void callback(char* topic, byte* payload, unsigned int length)
{
  // Выделяем необходимое кол-во памяти для копии payload
  byte* p = (byte*)malloc(length);
  // Копирование payload в новый буфер
  memcpy(p, payload, length);
  client.publish("", p, length);
  // Освобождаем память
  free(p);
}

void setup(void) {
//  delay(50);
//  Serial.begin(9600);
  Ethernet.begin(mac, ip);        // Инициализируем mac, ip
  Wire.begin();
  ds.begin();
 Si7021.begin(); 
  bmp.begin();
   bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}

void loop(void) {
 ds.requestTemperatures();
    float t1 = ds.getTempC(sensor1);
    float t2 = ds.getTempC(sensor2);
    float t3 = ds.getTempC(sensor3);
    float t4 = ds.getTempC(sensor4);
    float t5 = ds.getTempC(sensor5);
    float t6 = ds.getTempC(sensor6);
    float t7 = ds.getTempC(sensor7);
    float t8 = ds.getTempC(sensor8);
    float t9 = ds.getTempC(sensor9);
    float t10 = ds.getTempC(sensor10);
    float t11 = ds.getTempC(sensor11);
    float t12 = ds.getTempC(sensor12);
    float t13 = ds.getTempC(sensor13);
    float t14 = ds.getTempC(sensor14);
    float t15 = ds.getTempC(sensor15);
    float t16 = ds.getTempC(sensor16);
         // Считываем и выводим показания температуры
    float bmpt = bmp.readTemperature();
        // Считываем и выводим показания высоты
    float bmpa = bmp.readAltitude(1013.25);
        // Считываем и выводим показания атмосверного давления
    float bmpp = bmp.readPressure();
      bmpp = bmpp * 0.00750062; // Преобразуем Паскали в мм.рт.ст.
    float Si7021H = Si7021.readHumidity();//si7021 получение влажности Перевод в float
    float Si7021t = Si7021.readTemperature();//si7021 получение температуры Перевод в float

    static char char_bmpt[10];      // Переменная для перевода из float в char
                dtostrf(bmpt, 3, 0, char_bmpt);    // Перевод из float в char
    static char char_bmpp[10];      // Переменная для перевода из float в char
                dtostrf(bmpp, 3, 0, char_bmpp);    // Перевод из float в char
    static char char_bmpa[10];      // Переменная для перевода из float в char
                dtostrf(bmpa, 3, 0, char_bmpa);    // Перевод из float в char
    static char char_Si7021t[10];      // Переменная для перевода из float в char
                dtostrf(Si7021t, 3, 2, char_Si7021t);    // Перевод из float в char
    static char char_Si7021H[10];      // Переменная для перевода из float в char
                dtostrf(Si7021H, 3, 0, char_Si7021H);    // Перевод из float в char*/

    static char char_temp1[10];      // Переменная для перевода из float в char
    dtostrf(t1, 3, 2, char_temp1);    // Перевод из float в char
    static char char_temp2[10];      // Переменная для перевода из float в char
    dtostrf(t2, 3, 2, char_temp2);    // Перевод из float в char
    static char char_temp3[10];      // Переменная для перевода из float в char
    dtostrf(t3, 3, 2, char_temp3);    // Перевод из float в char
    static char char_temp4[10];      // Переменная для перевода из float в char
    dtostrf(t4, 3, 2, char_temp4);    // Перевод из float в char
    static char char_temp5[10];      // Переменная для перевода из float в char
    dtostrf(t5, 3, 2, char_temp5);    // Перевод из float в char
    static char char_temp6[10];      // Переменная для перевода из float в char
    dtostrf(t6, 3, 2, char_temp6);    // Перевод из float в char
    static char char_temp7[10];      // Переменная для перевода из float в char
    dtostrf(t7, 3, 2, char_temp7);    // Перевод из float в char
    static char char_temp8[10];      // Переменная для перевода из float в char
    dtostrf(t8, 3, 2, char_temp8);    // Перевод из float в char
    static char char_temp9[10];      // Переменная для перевода из float в char
    dtostrf(t9, 3, 2, char_temp9);    // Перевод из float в char
    static char char_temp10[10];      // Переменная для перевода из float в char
    dtostrf(t10, 3, 2, char_temp10);    // Перевод из float в char
    static char char_temp11[10];      // Переменная для перевода из float в char
    dtostrf(t11, 3, 2, char_temp11);    // Перевод из float в char
    static char char_temp12[10];      // Переменная для перевода из float в char
    dtostrf(t12, 3, 2, char_temp12);    // Перевод из float в char
    static char char_temp13[10];      // Переменная для перевода из float в char
    dtostrf(t13, 3, 2, char_temp13);    // Перевод из float в char
    static char char_temp14[10];      // Переменная для перевода из float в char
    dtostrf(t14, 3, 2, char_temp14);    // Перевод из float в char
    static char char_temp15[10];      // Переменная для перевода из float в char
    dtostrf(t15, 3, 2, char_temp15);    // Перевод из float в char*/
    static char char_temp16[10];      // Переменная для перевода из float в char
    dtostrf(t16, 3, 2, char_temp16);    // Перевод из float в char*/

  if (client.connect("TempClient"))  {
    //Отправка данных по MQTT в Брокер 
    client.publish("tNastya", char_temp1); //отправляем в Брокер значения
    client.publish("tSerg", char_temp2);//отправляем в Брокер значения
    client.publish("tKabinet", char_temp3); //отправляем в Брокер значения
    client.publish("tGorderob", char_temp4); //отправляем в Брокер значения
    client.publish("tZal", char_temp5); //отправляем в Брокер значения
    client.publish("tGostinaya", char_temp6);//отправляем в Брокер значения
    client.publish("tSpalnya", char_temp7); //отправляем в Брокер значения
    client.publish("tKuhnya", char_temp8); //отправляем в Брокер значения*/
    client.publish("tTualet", char_temp9); //отправляем в Брокер значения*/
    client.publish("tPar", char_temp10); //отправляем в Брокер значения*/
    client.publish("tBanaj", char_temp11); //отправляем в Брокер значения*/
    client.publish("tRazdevalka", char_temp12); //отправляем в Брокер значения*/
    client.publish("tKachegarka", char_temp13); //отправляем в Брокер значения*/
    client.publish("tKotel", char_temp14); //отправляем в Брокер значения*/
    client.publish("tPodachaPol", char_temp15); //отправляем в Брокер значения*/
    client.publish("tObratkaPol", char_temp16); //отправляем в Брокер значения*/
    client.publish("bmptemp", char_bmpt); //отправляем в Брокер значения температуры с улицы
    client.publish("Si7021temp", char_Si7021t); //отправляем в Брокер значения температуры с улицы
    client.publish("davlenie", char_bmpp); //отправляем в Брокер значения давление
    client.publish("more", char_bmpa); //отправляем в Брокер значения над уровнем моря
    client.publish("Humidity", char_Si7021H); //отправляем в Брокер значения давление
//  Serial.print("Temperature: ");
//  Serial.print(bmptempvozd);
//  Serial.print(char_bmpdavlenie);
//  Serial.print(char_bmpmore);
//  Serial.print(char_bmptempvozd7021);
//  Serial.print(char_bmptempvozd70210);
//  Serial.print(char_bmpHumidity);
    delay(1000);              // Отправка данных в Брокер раз в 5 секунд
    client.disconnect();      // Отключиться
  }  
  }

 

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

На коннекте зависает, поди.

awladimer
Offline
Зарегистрирован: 13.02.2017

sadman41 пишет:
На коннекте зависает, поди.

разъясните пожалуйста для особо одаренных ,пинг проходит а данные перестает получать

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

То кого и куда пинг проходит..

Зависание на connect() - это гипотеза. Не может рессолв FDQN сделать или просто удаленный хост отмораживается - может показать только экспериментальное исследование. 

awladimer
Offline
Зарегистрирован: 13.02.2017

до шилда 5100

awladimer
Offline
Зарегистрирован: 13.02.2017

по его  ip

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

Ну, хорошо, что проходит. Значит не висит. Но не знаю, как это поможет решить проблему. Копайте в области коннекта.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Sergei123 пишет:

дело не в том по какому пути идёт пакет, дело в том какая схема подключения ардуины ну как бы в рамках моей локальной сети

например если воткнуть ардуину напрямую в комп через провод (ethernet) то всё будет нормально работать, а если провод заменить на wi-fi мост то ардуина зависнет, при этом не имеет значения. ардуина будет соединена с вайфай мостом напрямую или же через свич

если например воткнуть комп и ардуину в коммутатор (или даже несколько коммутаторов последовательно соединить) то тоже всё будет нормально работать

если например взять один роутер и воткнуть ардуину в его лан порт, и комп тоже будет подключен к роутеру проводом или по вайфай, то всё будет нормально

если взять ещё один роутер и соединить с первым роутером лан портами, то тоже всё будет нормально и не важно к какому роутеру будет подключена ардуина

но если 2-й роутер будет подключен к 1-му wan портом, а ардуина будет подключена ко 2-му роутеру, то она зависает

и это я опробовал примерно на 30-ти платах и ардуино и w5500, эффект одинаковый... обидно блин

короче заказал чип w5100, посмотрю как он будет работать в проблемных режимах

на втором роутере тоже пакеты натятся, правильно?

Sergei123
Offline
Зарегистрирован: 22.11.2021

тут не важно, настроена переадресация портов на одном либо на обои роутерах либо вообще не настроена ни на одном из роутеров, если физически подключить ардуину так как я описал, то происходит зависон, а любое другое сетевое оборудование подключаешь всё работает без проблем, а с ардуиной вот так... 

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

Ничего не зависает просто так. У меня эти визнеты работали на девайсе с аптаймом в год. И через локалку и через впн.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

падает на маршрутизации

SAB
Offline
Зарегистрирован: 27.12.2016

Может  тупо колизии идут, которые маршрутизаторы долго разруливают, и это приводит к видимому зависанию. Ну там IP в сети одинаковые есть. У самих то роутеров маска подсети разная?

Sergei123
Offline
Зарегистрирован: 22.11.2021

Проблема решилась элементарно. Обновлением библиотеки Ethernet до последней версии - 2.0.1. Заодно и ещё несколько глюков ушло.

Тема закрыта