Nano+w5500+mqtt, проблема с подключением к сети

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

Модератор: immortal

yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Nano+w5500+mqtt, проблема с подключением к сети

Сообщение yden » Ср мар 28, 2018 9:47 am

Здравствуйте.
Подскажите пожалуйста, где в коде ошибка. Суть: ардуино нано + w5500 + mqtt. Нужно отправлять\читать топики на этом железе. Там что-то с интернет частью.

Код:

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

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

// =======================================================================
// Конфигурация устройства MQTT:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xA2 };
IPAddress ip(192, 168, 1, 73);
EthernetClient client;

const char *mqtt_server = "192.168.1.70"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "****"; // Логи от сервер
const char *mqtt_pass = "****"; // Пароль от сервера
// =======================================================================

const byte outPin1 = 5; // ночник холл
const byte outPin2 = 3; // холл
const byte outPin3 = 2; // кладовка
const byte outPin4 = 4; // санузел
const byte outPin5 = 6; // диммер холл
const byte outPin6 = 7; // диммер кладовка
const byte outPin7 = 8; // ночник санузел 1 ступень

//кнопки
const byte inButton1 = 15; //вход кнопка1
const byte inButton2 = 16; //вход кнопка2

//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer1 = Bounce(inButton1, 150);
Bounce bouncer2 = Bounce(inButton2, 150);

boolean flag_button1 = false; //флаг кнопка 1
boolean flag_button2 = false; //флаг кнопка 2

//подсчет времени MQTT
long previousMillis_mqtt = 0;  // храним время последнего подключения
long interval_mqtt = 10000;     //интервал 3 сек

//--------------------------------------------------------------------------------------
// Функция получения данных от сервера MQTT
void callback(const MQTT::Publish& pub)
{
  if  (pub.topic() == "ihouse/svet/holl/in")
  {
    if (String(pub.payload_string()) == "1") flag_button1 = true;
    if (String(pub.payload_string()) == "0") flag_button1 = false;

    digitalWrite(outPin2, flag_button1);
    digitalWrite(outPin5, flag_button1);
  }

  if  (pub.topic() == "ihouse/svet/san/in")
  {
    if (String(pub.payload_string()) == "1") flag_button2 = true;
    if (String(pub.payload_string()) == "0") flag_button2 = false;

    digitalWrite(outPin4, flag_button2);
    digitalWrite(outPin7, flag_button2);
  }
  
}

EthernetClient ethClient;
PubSubClient client(ethClient, mqtt_server, mqtt_port);

void setup()
{
  pinMode(inButton1, INPUT);
  pinMode(inButton2, INPUT);

  pinMode(outPin1, OUTPUT);
  digitalWrite(outPin1, LOW);

  pinMode(outPin2, OUTPUT);
  digitalWrite(outPin2, LOW);

  pinMode(outPin3, OUTPUT);
  digitalWrite(outPin3, LOW);

  pinMode(outPin4, OUTPUT);
  digitalWrite(outPin4, LOW);

  pinMode(outPin5, OUTPUT);
  digitalWrite(outPin5, LOW);

  pinMode(outPin6, OUTPUT);
  digitalWrite(outPin6, LOW);

  pinMode(outPin7, OUTPUT);
  digitalWrite(outPin7, LOW);

  Serial.begin(115200);
  Ethernet.begin(mac, ip);
}

////функция светодиод улица
//void function_led_outdoor (uint16_t time_0, uint16_t time_1)
//{
//  static bool state = 0;       // состояние светодиода
//  static uint32_t future = 0;  // время будущего перескока на другое состояние
//  if (millis() < future) return; // если время не пришло(нужное значение millis() ) то выйти из функции
//  state = !state;              // время смены пришло поменяйте состояние
//  future += state ? time_0 : time_1 ;
//  // определите новое время для перескока если state = 1 то future=future+time_0
//  //                                      если state = 0 то future=future+time_1
//  digitalWrite(led_outdoor, state);
//}

//--------------------------------------------------------------------------------------
// Функция отправки в топик
void MQTT_Send()
{
  unsigned long currentMillis_mqtt = millis();

  if (currentMillis_mqtt - previousMillis_mqtt >= interval_mqtt)
  {
    previousMillis_mqtt = currentMillis_mqtt;
    client.publish("ihouse/work/svet_veranda", String(random(100)));
  }
  delay(10);
}

void loop()
{
  //--------------------------------------------------------------------------------------
  //проверка состояния кнопки1 - холл
  if ( bouncer1.update() )
  {
    //если считано значение 1
    if ( bouncer1.read() == HIGH)
    {
      flag_button1 = !flag_button1;

      digitalWrite(outPin2, flag_button1);
      digitalWrite(outPin5, flag_button1);
      client.publish("ihouse/svet/holl/out", String(flag_button1));      
    }
  }

  //--------------------------------------------------------------------------------------
  //проверка состояния кнопки2 - санузел
    if ( bouncer2.update() )
  {
    //если считано значение 1
    if ( bouncer2.read() == HIGH)
    {
      flag_button2 = !flag_button2;

      digitalWrite(outPin4, flag_button2);
      digitalWrite(outPin7, flag_button2);
      client.publish("ihouse/svet/san/out", String(flag_button2));      
    }
  }

  //--------------------------------------------------------------------------------------
  //мигание светодиодом улица
//  if (currentMillis_diod_interval - previousMillis_diod_interval >= 100000)
//  {
//    previousMillis_diod_interval = currentMillis_diod_interval;
//    interval_diod = random(10000);
//  }
//  function_led_outdoor(250, interval_diod);

  //--------------------------------------------------------------------------------------
  // подключаемся к MQTT серверу
  if (Ethernet.status() == WL_CONNECTED)
  {
  if (!client.connected()) {
    Serial.println("Connecting to MQTT server");
    if (client.connect(MQTT::Connect("nano_svet_veranda")
                       .set_auth(mqtt_user, mqtt_pass)))
    {
      Serial.println("Connected to MQTT server");
      client.set_callback(callback);
      client.subscribe("ihouse/svet/holl/in"); // подписывааемся по топик
      client.subscribe("ihouse/svet/san/in"); // подписывааемся по топик
    }
    else
    {
      Serial.println("Could not connect to MQTT server");
    }
  }

  if (client.connected())
  {
    client.loop();
    MQTT_Send();
  }
}
 
Ругается:
svet_veranda_mqtt:82: error: conflicting declaration 'PubSubClient client'

благодарю
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Nano+w5500+mqtt, проблема с подключением к сети

Сообщение nick7zmail » Ср мар 28, 2018 10:15 am

Вы 2 раза инициализируете сетевого клиента

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

EthernetClient client; //тут
EthernetClient ethClient; //и тут 
Вот и ругается...1 из них удалите, и mqtt вешайте на оставшийся.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Nano+w5500+mqtt, проблема с подключением к сети

Сообщение serghei » Ср мар 28, 2018 10:20 am

А разве с W5500 не Ethernet2.h надо библиотеку использовать ?
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Nano+w5500+mqtt, проблема с подключением к сети

Сообщение nick7zmail » Ср мар 28, 2018 10:31 am

serghei писал(а):А разве с W5500 не Ethernet2.h надо библиотеку использовать ?
Кстати да.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Nano+w5500+mqtt, проблема с подключением к сети

Сообщение serghei » Ср мар 28, 2018 10:35 am

Я запускал на Меге - классно работает. Но похоже Алекс её перепилил. Первую то точно.А на Nano влезет ? Кстати есть уже готовый шилд под неё.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Nano+w5500+mqtt, проблема с подключением к сети

Сообщение nick7zmail » Ср мар 28, 2018 11:24 am

serghei писал(а):Я запускал на Меге - классно работает. Но похоже Алекс её перепилил. Первую то точно.А на Nano влезет ? Кстати есть уже готовый шилд под неё.
Алекс точно переписывал Ethernet библиотеки. Но при чем тут он))) речь вроде не про АМС, а про стандартный скетч...и человек явно написал ошибку при компиляции, я ответил из-за чего она))
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Nano+w5500+mqtt, проблема с подключением к сети

Сообщение serghei » Ср мар 28, 2018 11:35 am

Про ошибку в скетче понятно. А Алекс исправил ошибку в библиотеке и она будет работать с любым кодом , а не только AMS. Статья.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: Nano+w5500+mqtt, проблема с подключением к сети

Сообщение yden » Ср мар 28, 2018 6:35 pm

Ребята, все равно ничего не пойму. Связка ардуино нано + шилд w5100. В интернет не выходит.

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

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

// =======================================================================
// Конфигурация устройства MQTT:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x76 };
IPAddress ip(192, 168, 1, 76);
//EthernetClient client;

const char *mqtt_server = "192.168.1.70"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "****"; // Логи от сервер
const char *mqtt_pass = "*****"; // Пароль от сервера
// =======================================================================

const byte outPin1 = 5; // ночник холл
const byte outPin2 = 3; // холл
//const byte outPin3 = 2; // кладовка
const byte outPin4 = 4; // санузел
const byte outPin5 = 6; // диммер холл
//const byte outPin6 = 7; // диммер кладовка
const byte outPin7 = 8; // ночник санузел 1 ступень

//кнопки
const byte inButton1 = 15; //вход кнопка1
const byte inButton2 = 16; //вход кнопка2

//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer1 = Bounce(inButton1, 150);
Bounce bouncer2 = Bounce(inButton2, 150);

boolean flag_button1 = false; //флаг кнопка 1
boolean flag_button2 = false; //флаг кнопка 2

//подсчет времени
//подсчет времени MQTT
long previousMillis_mqtt = 0;  // храним время последнего подключения
long interval_mqtt = 10000;     //интервал 3 сек

//--------------------------------------------------------------------------------------
// Функция получения данных от сервера MQTT
void callback(const MQTT::Publish& pub)
{
  if  (pub.topic() == "ihouse/svet/holl/in")
  {
    if (String(pub.payload_string()) == "1") flag_button1 = true;
    if (String(pub.payload_string()) == "0") flag_button1 = false;

    digitalWrite(outPin2, flag_button1);
    digitalWrite(outPin5, flag_button1);
  }

  if  (pub.topic() == "ihouse/svet/san/in")
  {
    if (String(pub.payload_string()) == "1") flag_button2 = true;
    if (String(pub.payload_string()) == "0") flag_button2 = false;

    digitalWrite(outPin4, flag_button2);
    digitalWrite(outPin7, flag_button2);
  }
  
}

EthernetClient ethClient;
PubSubClient client(ethClient, mqtt_server, mqtt_port);

void setup()
{
  pinMode(inButton1, INPUT);
  pinMode(inButton2, INPUT);

  pinMode(outPin1, OUTPUT);
  digitalWrite(outPin1, LOW);

  pinMode(outPin2, OUTPUT);
  digitalWrite(outPin2, LOW);

//  pinMode(outPin3, OUTPUT);
//  digitalWrite(outPin3, LOW);

  pinMode(outPin4, OUTPUT);
  digitalWrite(outPin4, LOW);

  pinMode(outPin5, OUTPUT);
  digitalWrite(outPin5, LOW);

//  pinMode(outPin6, OUTPUT);
//  digitalWrite(outPin6, LOW);

  pinMode(outPin7, OUTPUT);
  digitalWrite(outPin7, LOW);

  Serial.begin(115200);
  Ethernet.begin(mac, ip);
}

//--------------------------------------------------------------------------------------
// Функция отправки в топик
void MQTT_Send()
{
  unsigned long currentMillis_mqtt = millis();

  if (currentMillis_mqtt - previousMillis_mqtt >= interval_mqtt)
  {
    previousMillis_mqtt = currentMillis_mqtt;
    client.publish("ihouse/work/svet_veranda", String(random(100)));
  }
  delay(10);
}

void loop()
{
  //--------------------------------------------------------------------------------------
  //проверка состояния кнопки1 - холл
  if ( bouncer1.update() )
  {
    //если считано значение 1
    if ( bouncer1.read() == HIGH)
    {
      flag_button1 = !flag_button1;

      digitalWrite(outPin2, flag_button1);
      digitalWrite(outPin5, flag_button1);
      client.publish("ihouse/svet/holl/out", String(flag_button1));      
    }
  }

  //--------------------------------------------------------------------------------------
  //проверка состояния кнопки2 - санузел
    if ( bouncer2.update() )
  {
    //если считано значение 1
    if ( bouncer2.read() == HIGH)
    {
      flag_button2 = !flag_button2;

      digitalWrite(outPin4, flag_button2);
      digitalWrite(outPin7, flag_button2);
      client.publish("ihouse/svet/san/out", String(flag_button2));      
    }
  }

  //--------------------------------------------------------------------------------------
  // подключаемся к MQTT серверу
  if (ethClient.connected())
  {
  if (!client.connected()) 
  {
    Serial.println("Connecting to MQTT server");
    if (client.connect(MQTT::Connect("nano_svet_veranda")
                       .set_auth(mqtt_user, mqtt_pass)))
    {
      Serial.println("Connected to MQTT server");
      client.set_callback(callback);
      client.subscribe("ihouse/svet/holl/in"); // подписывааемся по топик
      client.subscribe("ihouse/svet/san/in"); // подписывааемся по топик
    }
    else
    {
      Serial.println("Could not connect to MQTT server");
    }
  }

  if (client.connected())
  {
    client.loop();
    MQTT_Send();
  }
}
}
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Nano+w5500+mqtt, проблема с подключением к сети

Сообщение serghei » Ср мар 28, 2018 7:24 pm

В интернет в смысле в мир ? А в локалке пингуется ? Может Gateway и DNS добавить?

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

Ethernet.begin(mac, ip);
У меня без этого время не синхронизируется.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
yden
Сообщения: 141
Зарегистрирован: Пн авг 22, 2016 10:03 am
Благодарил (а): 28 раз
Поблагодарили: 5 раз

Re: Nano+w5500+mqtt, проблема с подключением к сети

Сообщение yden » Ср мар 28, 2018 7:58 pm

serghei писал(а):В интернет в смысле в мир ? А в локалке пингуется ? Может Gateway и DNS добавить?

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

Ethernet.begin(mac, ip); 
У меня без этого время не синхронизируется.
Пинг проходит по локалке. Нет коннекта с mqtt брокером.
Ответить