Нужна помощь. Ethernet shield w5100

Прошу вашего совета. Имеется ардуино уно и интернетный шилд w5100 с али экспресса.
Залил на него скетч управления реле через интернет используя Openhab и MQTT
но столкнулся с проблеммой что не всегда ардуино подключается к модему. бывает с первого раза все ок, стоит переподключить питание и уже не подключается. Заметил странную особенность что в момент подключения в модему на шилде горит желтый светодиод возле 13 ноги, когда подключения нет к модему он не горит. (если я правильно понимаю то этот светодиод и подключен к 13 ноге, но тогда не понимаю почему он загорается ведь в коде такой команды нет) Наткнулся на статью про резисторы у меня так же стоят резисторы 511 а не 510. Но не понимаю почему нет какой то стабильности или работаю или нет.
Подскажите в чем может быть проблемма…

и Arduino Ethernet W5100 – как устранить брак конструкции – reedpaper.com


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


// -------------------------------------- BEGIN - Пины Arduino ----------------------------------------------
#define LED_pin 5                         //Пин 5 для светодиодов
#define Relay1_pin 6                     //Пин 6 для реле 1
#define Relay2_pin 7                      //Пин 7 для реле 2  
// -------------------------------------- END - Пины Arduino ------------------------------------------------


// -------------------------------------- BEGIN - Глобальные переменные -------------------------------------
int Led = 0;                              //Переменная для хранения состояния светодиода 
boolean Relay1 = HIGH;                    //Переменная для хранения состояния Реле 1 
boolean Relay2 = HIGH;                    //Переменная для хранения состояния Реле 2
// -------------------------------------- END - Глобальные переменные ---------------------------------------


// -------------------------------------- BEGIN - Установка параметров сети ---------------------------------
void callback(char* topic, byte* payload, unsigned int length);
// Установить MAC адресс для этой Arduino (должен быть уникальным в вашей сети)
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
// Утановить IP адресс для этой Arduino (должен быть уникальным в вашей сети)
IPAddress ip(192, 168, 0, 118);

// Уставновить IP адресс MQTT брокера
byte server[] = { 192, 168, 0, 112 };

// Уставновить Логин и Пароль для подключения к MQTT брокеру
const char* mqtt_username = "openhabian";
const char* mqtt_password = "openhabian";

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);
// --------------------------------------- END - Установка параметров сети ----------------------------------


// --------------------------------------- BEGIN - Подключение и подписка на MQTT broker ----------------------------------
boolean reconnect() {
 //Serial.println("reconnect...");
 if (client.connect("Arduino_test", mqtt_username, mqtt_password)) {       
   client.subscribe("/room31/led"); Serial.println("Connected to: /room31/led");
   client.subscribe("/room31/relay1"); Serial.println("Connected to: /room31/relay1");
   client.subscribe("/room31/relay2"); Serial.println("Connected to: /room31/relay2");
   //Serial.println("MQTT connected");    
 }
 return client.connected();
}
// --------------------------------------- END - Подключение и подписка на MQTT broker ----------------------------------

// --------------------------------------- BEGIN - void setup() -------------------------------------------
void setup()
{
 digitalWrite(Relay1_pin, HIGH); // Решение проблемы с LOW статусом пинов при загрузке ардуино
 digitalWrite(Relay2_pin, HIGH); // Решение проблемы с LOW статусом пинов при загрузке ардуино
 pinMode(LED_pin, OUTPUT);
 pinMode(Relay1_pin, OUTPUT);
 pinMode(Relay2_pin, OUTPUT);                

// Serial.begin(9600); // Open serial communications

 // Start with a hard-coded address:
 Ethernet.begin(mac, ip);

// Serial.print("My ip address: ");
// Serial.println(Ethernet.localIP());

 reconnect(); // Подключение к брокеру, подписка на прописанные выше темы

}
// --------------------------------------- END - void setup() ---------------------------------------------


// --------------------------------------- BEGIN - void loop() --------------------------------------------
void loop() {

client.loop();
}
// --------------------------------------- END - void loop() ----------------------------------------------


// --------------------------------------- BEGIN - void callback ------------------------------------------
// Чтение данных из MQTT брокера
void callback(char* topic, byte* payload, unsigned int length) {
 // проверка новых сообщений в подписках у брокера
   payload[length] = '\0';
  // Serial.print("Topic: ");
  // Serial.print(String(topic));
  // Serial.println(" - ");

 if (String(topic) == "/room31/led") {
   String value = String((char*)payload);
   Led = value.substring(0, value.indexOf(';')).toInt();
   Led = map(Led, 0, 100, 0, 255);   
   analogWrite(LED_pin, Led);
  // Serial.print("Znachenie prisvoenoe peremennoy Led: ");
  // Serial.println(Led);
 }
 
 if (String(topic) == "/room31/relay1") {
   String value = String((char*)payload);
   Relay1 = value.substring(0, value.indexOf(';')).toInt();
 //  Serial.print("Znachenie prisvoenoe peremennoy Relay1: ");
 //  Serial.println(Relay1);   
   digitalWrite(Relay1_pin, Relay1);
 }

 if (String(topic) == "/room31/relay2") {
   String value = String((char*)payload);
   Relay2 = value.substring(0, value.indexOf(';')).toInt();
 //  Serial.print("Znachenie prisvoenoe peremennoy Relay2: ");
 //  Serial.println(Relay2);   
   digitalWrite(Relay2_pin, Relay2);
 }
 
}
// ---------------------------------------- END - void callback -------------------------------------------

Проблема в том, что вы не можете найти систематику сбоев и описать их понятно (а для этого нужен опыт).

Например - какое питание и кому вы переподключаете? Есть ли обмен с сетевым чипом, когда “уже не подключается”? Какой USB разъем на Arduino?

Ардуино питается от ноутбука по проводу usb-usb type B. Реле не подключено вообще пока ищу проблемму с подключением.
Переподключаю я имелл ввиду если загрузил скетч в ардуино отсоединил ее и подключил через блок питания 12 в 1а к разьему подключения внешнего питания

юзал такой шилд, даже с неправильными резисторами, все работало, коммутатор CISCO, изредка зависал, недавно запускал шилд W5500 (рекомендую), так вот роутер ему не давал адреса пока я не поменял MAC (я поставил что то там от балды) на тот что в примере. на вот так byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };

У меня в такой конфигурации USB снизу замыкал Ethernet-разъем корпусом.

Если после “неконнекта” ресет жмакнуть - коннектится?

Я отпаял с платы разьем и повесил его на проводах. Да reset на самом шильде помогает в большинстве случаев, но не всегда

Я не столь радикален, просто картонку прокладываю между разъёмами.

Была “проблема” в старых библиотеках - не успевал W5100 инициализироваться до начала работы МК. Спасал delay в сетапе - чтобы придержать начало работы на некоторое время.

1 лайк

Попробую как вариант вечером. А в свежих библиотеках это уже было решено?

Вроде бы да. Но я давно уже 5100 не вытаскивал из мешка.

The W5100 bug(s) – and how to fix it (them) – Arduino, ESP8266, ESP32 & Raspberry Pi stuff → Bug 3 – The Funduino Reset Bug

PS. А вообще - с резисторами 511 нужен очень короткий проводок и везение. Иначе так системности и не будет.

Да, действительно delay помог. Только появилось новое) как решить вопрос с считыванием состояния кнопки, а то после перезагрузки все реле находятся в выключенном состоянии хоть ранее было отправлена команда на включение

Ничего не понял. Какой кнопки?

Реле находятся в том состоянии, в котором установите. Ни они сами, ни МК ничего не будет специально запоминать и какая команда там была отправлена - пофигу. После ресета всё начинается с чистого листа.

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

Извиняюсь, опечатался) Суть такова: Установлен Openhab на raspberry и подключен к интернету через провод к модему.
Arduino Uno вместе с ethernet shield w5100 и 16 канальным реле так же подключена по проводу к этому же модему.
Если на сайте управления поставить переключатель реле в положение вкл, то ардуино отреагирует и включит один канал реле, но если не меняя положение перезагрузить ардуино то она не считывает значение установленное на raspberry.