Arduino Mega Server

Модератор: Alex

olmoro
Сообщения: 40
Зарегистрирован: Пт окт 13, 2017 9:37 pm
Откуда: Выборг
Благодарил (а): 8 раз
Поблагодарили: 12 раз

Re: Arduino Mega Server

Сообщение olmoro » Ср апр 01, 2020 4:33 pm

На конструкцию if(!Ethernet) или (!server) компилятор ругается
а скажите пожалуйста, что Вы хотели сказать с помощью этой конструкции?
В примерах в том же arduino ide для esp есть конструкции такие...и они вполне работают
К сожалению человек не разобрался(((
Скорее всего нарушено правило объявлять, в частности переменную, ранее чем её использовать. Особенно трудно соблюдать это правило, если в проекте на Arduino IDE несколько файлов .ino
eGorka
Сообщения: 179
Зарегистрирован: Чт ноя 24, 2016 10:47 am
Благодарил (а): 1 раз
Поблагодарили: 23 раза

Re: Arduino Mega Server

Сообщение eGorka » Ср апр 01, 2020 8:48 pm

Smeech писал(а):
Ср апр 01, 2020 12:06 pm
Спасибо, ребята, за советы и примерное указание пути, куда двигаться. Потихонечку будем продвигаться.
Пока есть практический вопрос. При сбое питания (выключили-включили свет) ардуина стартует быстрее, чем роутер, и
пытается подцепиться к сети раньше, чем эта сеть появляется. Пытается однократно, и больше попыток не предпринимает. Как отследить программно наличие/отсутствие сети, чтобы проинициализировать модуль ethernet заново? На конструкцию if(!Ethernet) или (!server) компилятор ругается, хотя вроде где-то встречал аналогичную проверку типа while(!Serial) в каких-то скетчах примеров.
Костыль
СпойлерПоказать

Код: Выделить всё

#include "SPI.h"
#include "Ethernet.h"

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(10, 0, 0, 10); // Ваш IP
bool router_connect = 0;

void setup() {
  Ethernet.init(10);
  Serial.begin(115200);
  Serial.println("Ethernet example");
  Ethernet_Init();
}

void loop() {
  if(!router_connect){
    Ethernet_Init();
  }
}

void Ethernet_Init(){
  if(Ethernet.begin(mac)){
    Serial.println("Router connected.");
    Ethernet.setLocalIP(ip);
    router_connect = 1;
  }else{
    Serial.println("Router not connected.");
    router_connect = 0;
  }
}
За это сообщение автора eGorka поблагодарил:
Coolblaster (Вт июн 09, 2020 2:23 pm)
Рейтинг: 1.23%
alexsis_76
Сообщения: 767
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 3 раза
Поблагодарили: 44 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Чт апр 02, 2020 1:24 pm

Добрый вечер друзья!!!
Касаемо
if(!Ethernet) или (!server)
так как конструкции вырваны из контекста, понять их смысл затруднительно..., но мы попробуем)))
Данные синтаксические конструкции обычно используют для проверки значений переменных и возвращаемых функциями значений, возвращаемые значения обычно имеют True или False ну или 1 или 0. if(!Ethernet) означает "Если Ethernet не равно True", то есть оно равно False, но в данном случае Ethernet это скорей всего экземпляр класса EthernetClass и он не может быть не True не False.
(!server) скорей всего то же самое
EthernetServer server(80);
.r
Код
#include "SPI.h"
#include "Ethernet.h"

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(10, 0, 0, 10); // Ваш IP
bool router_connect = 0;

void setup() {
Ethernet.init(10);
Serial.begin(115200);
Serial.println("Ethernet example");
Ethernet_Init();
}

void loop() {
if(!router_connect){
Ethernet_Init();
}
}

void Ethernet_Init(){
if(Ethernet.begin(mac)){
Serial.println("Router connected.");
Ethernet.setLocalIP(ip);
router_connect = 1;
}else{
Serial.println("Router not connected.");
router_connect = 0;
}
}
в принципе правильный но я бы несколько модифицировал его
Ethernet.begin(mac)
производит инициализацию W5100 и если чипа не обнаружено возвращает 0, в связи с этим в
}else{
Serial.println("Router not connected.");
router_connect = 0;
}
довольно сложно понять почему произошло событие Router not connected., то ли с роутером беда, то ли W5100 не прошла инициализацию.
Еще бы я добавил следующую строку
while (Ethernet.linkStatus() == LinkOFF) {
delay(1000)
Serial.println("Ethernet cable is not connected.");
}
- тут как говорится без комментариев))
Ethernet_Init() сделал бы с returnom и убрал глобальную переменную
bool router_connect
if(!router_connect){
Ethernet_Init();
}
вот это трансформировал бы в
wile(!router_connect){
delay(1)
Ethernet_Init();
}
так как без инициализации сетевого контроллера дальнейшее исполнение кода бессмысленно и перенес бы это в Setup
Ну вот в принципе и все))), можете задавать вопросы))))
eGorka
Сообщения: 179
Зарегистрирован: Чт ноя 24, 2016 10:47 am
Благодарил (а): 1 раз
Поблагодарили: 23 раза

Re: Arduino Mega Server

Сообщение eGorka » Чт апр 02, 2020 6:08 pm

alexsis_76 писал(а):
Чт апр 02, 2020 1:24 pm
Еще бы я добавил следующую строку
while (Ethernet.linkStatus() == LinkOFF) {
delay(1000)
Serial.println("Ethernet cable is not connected.");
}
Ethernet.linkStatus
"This feature is only available when using the W5200 and W5500 Ethernet controller chips."
Эта функция доступна только при использовании микросхем контроллера W5200 и W5500.
ссылка
так как без инициализации сетевого контроллера дальнейшее исполнение кода бессмысленно и перенес бы это в Setup
Всё зависит от того, что за код у Smeech-а, просто веб-морда или сетевой обмен с чем-то.
Smeech
Сообщения: 12
Зарегистрирован: Сб мар 21, 2020 9:28 am
Благодарил (а): 6 раз
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Smeech » Чт апр 02, 2020 9:47 pm

У меня AMS 0.17 на бутерброде мега+шилд на w5100. Что-то потихоньку прикручиваю свое, т.е. есть уже код, который работает и без сетевого соединения. Факт, что модуль Ethernet в AMS не стартует после сбоя питания, заметил давно, и вот случайно наткнулся где-то на код

Код: Выделить всё

Serial.begin(9600);
while (!Serial){;;} //ожидание инициализации
из чего сделал вывод, что объект некоего класса появляется в памяти после инициализации методом begin. И если он есть, то логически он единица. Иначе - ноль, или ложь. (в js вроде так, но боюсь напутать..). Конструкцией if (Ethernet) я хотел проверить результат применения метода Ethernet.begin(mac,ip). Не вышло :) Благодарю за предложения, попробую, думаю разберусь.
В идеале было бы и при старте системы дожидаться появления сети (загрузки роутера после появления питания), ну и по ходу работы периодически справляться о наличии соединения. Хотя, второе может и избыточно. Интуитивно кажется, что если выдернуть сетевой шнур "на горячую", а потом воткнуть заново, то все продолжит работать. Надо попробовать будет.
eGorka
Сообщения: 179
Зарегистрирован: Чт ноя 24, 2016 10:47 am
Благодарил (а): 1 раз
Поблагодарили: 23 раза

Re: Arduino Mega Server

Сообщение eGorka » Пт апр 03, 2020 8:11 am

Попробовал запустить АМС(2560 + W5100), лядь...
Мало того, что библиотека Ethernet в архиве ams_017.zip стара как говно мамонта, так она ещё и модифицирована.
Аватара пользователя
nick7zmail
Сообщения: 7304
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 1913 раз

Re: Arduino Mega Server

Сообщение nick7zmail » Пт апр 03, 2020 8:27 am

eGorka писал(а):
Пт апр 03, 2020 8:11 am
Попробовал запустить АМС(2560 + W5100), лядь...
Мало того, что библиотека Ethernet в архиве ams_017.zip стара как говно мамонта, так она ещё и модифицирована.
Да...она изначально была модифицирована Alex-ом, т.к. стандартных функций там то ли не хватало, то ли работали они неправильно.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
eGorka
Сообщения: 179
Зарегистрирован: Чт ноя 24, 2016 10:47 am
Благодарил (а): 1 раз
Поблагодарили: 23 раза

Re: Arduino Mega Server

Сообщение eGorka » Пт апр 03, 2020 9:13 am

Теперь на NTP зависает

Код: Выделить всё

09:06:21.236 -> Module NTP...
09:06:21.236 ->  Local port: 123
09:06:21.236 -> ============
09:06:21.236 -> Module Time...
09:06:21.236 ->  NTP sync...
09:06:21.236 ->  Transmit NTP request (88.147.254.235:123)
А теперь не зависает )

Код: Выделить всё

10:23:58.223 -> Module NTP...
10:23:58.223 ->  Local port: 123
10:23:58.223 -> ============
10:23:58.223 -> Module Time...
10:23:58.223 ->  NTP sync...
10:23:58.223 ->  Transmit NTP request (88.147.254.235:123) Receive NTP response
10:23:58.316 -> ============
10:23:58.503 -> 2020-04-03 10:23:58 Module Server... started
Было:

Код: Выделить всё

  eepromInit();

  ethernetInit();
  sdCardInit();
  
  #ifdef SD_INFO_FEATURE
    sdInfoInit();
  #endif
  #ifdef SD_FILES_FEATURE
    sdFilesInit();
  #endif
  #ifdef NTP_FEATURE
    ntpInit();
  #endif
  timeInit();
Стало:

Код: Выделить всё

  eepromInit();

  sdCardInit();
  
  #ifdef SD_INFO_FEATURE
    sdInfoInit();
  #endif
  #ifdef SD_FILES_FEATURE
    sdFilesInit();
  #endif
  ethernetInit();
  #ifdef NTP_FEATURE
    ntpInit();
  #endif
  timeInit();
Порядок инициализации модулей это нечто.
За это сообщение автора eGorka поблагодарил:
Coolblaster (Вт июн 09, 2020 2:27 pm)
Рейтинг: 1.23%
alexsis_76
Сообщения: 767
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 3 раза
Поблагодарили: 44 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Пт апр 03, 2020 1:25 pm

Привет друзья!!!!
Ох eGorka... чую на второй круг собрался))))
eGorka
Сообщения: 179
Зарегистрирован: Чт ноя 24, 2016 10:47 am
Благодарил (а): 1 раз
Поблагодарили: 23 раза

Re: Arduino Mega Server

Сообщение eGorka » Пт апр 03, 2020 3:53 pm

alexsis_76 писал(а):
Пт апр 03, 2020 1:25 pm
Ох eGorka... чую на второй круг собрался))))
Да вроде уже передумал, посмотрел код в АМС, а там полярная лисица, как раз чтоб у начинающих всё желание пропало.
Ответить