Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

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

Модератор: immortal

olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение olehs » Пн окт 21, 2019 9:23 am

Arduino 1.8.10
ESP32 отсюда https://github.com/espressif/arduino-es ... manager.md
Библиотек не нужно, они уже входят в ESP32 (кроме PubSubClient).
Для wroom в настройках скорее всего выбирать ESP32 Dev Module
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Пн окт 21, 2019 11:57 am

Я так и делаю, выбираю только ESP32 Dev Module, потому что с другими платами у меня скетч не проходит проверку. Если выбрана не та плата, то при проверке скетча мне об этом сообщают.

Такие настройки платы и так после загрузки скетча
СпойлерПоказать
esp32-2.jpg
esp32-2.jpg (186.4 КБ) 5118 просмотров
При установке библиотеки PubSubClient, в описании я не вижу, чтобы эта библиотека подходила для ESP32
СпойлерПоказать
esp32.JPG
esp32.JPG (32.74 КБ) 5118 просмотров

Какая версия ESP32 для платы у вас стоит?
Какая версия PubSubClient у вас?
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение olehs » Пн окт 21, 2019 1:04 pm

вот так
СпойлерПоказать
Annotation 2019-10-21 130259.png
Annotation 2019-10-21 130259.png (74.09 КБ) 5106 просмотров
Annotation 2019-10-21 130321.png
Annotation 2019-10-21 130321.png (29.01 КБ) 5106 просмотров
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Пн окт 21, 2019 8:05 pm

Что-то никак ваш скетч не хочет устанавливаться. У вас на скриншоте выбрана скорость 921600

Если я выберу скорость загрузки 921600, то появляется вот такое сообщение
СпойлерПоказать
ошибка 1.JPG
ошибка 1.JPG (58.67 КБ) 5081 просмотр
Если я выберу скорость загрузки 115200, то появляется вот такое сообщение и почему-то он сообщает про такой режим работы с памятью DIO. Бывает, что одни модули работают в DIO, другие в QIO.
СпойлерПоказать
тип памяти DIO.JPG
тип памяти DIO.JPG (30.04 КБ) 5081 просмотр
Саму ошибку я устранил с помощью flash tool, стер все данные с памяти
СпойлерПоказать
ПО для стирания.JPG
ПО для стирания.JPG (67.12 КБ) 5081 просмотр

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

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

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
*********/

// Load Wi-Fi library
#include <WiFi.h>

// Replace with your network credentials
const char* ssid     = "указываем имя вашей сети";
const char* password = "указываем пароль вашей сети";

// Set web server port number to 80
WiFiServer server(80);

// Decode HTTP GET value
String redString = "0";
String greenString = "0";
String blueString = "0";
int pos1 = 0;
int pos2 = 0;
int pos3 = 0;
int pos4 = 0;

// Variable to store the HTTP req  uest
String header;

// Red, green, and blue pins for PWM control
const int redPin = 13;     // 13 corresponds to GPIO13
const int greenPin = 12;   // 12 corresponds to GPIO12
const int bluePin = 14;    // 14 corresponds to GPIO14

// Setting PWM frequency, channels and bit resolution
const int freq = 5000;
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
// Bit resolution 2^8 = 256
const int resolution = 8;

// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0; 
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;

void setup() {
  Serial.begin(115200);
  // configure LED PWM functionalitites
  ledcSetup(redChannel, freq, resolution);
  ledcSetup(greenChannel, freq, resolution);
  ledcSetup(blueChannel, freq, resolution);
  
  // attach the channel to the GPIO to be controlled
  ledcAttachPin(redPin, redChannel);
  ledcAttachPin(greenPin, greenChannel);
  ledcAttachPin(bluePin, blueChannel);
  
  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop(){
  WiFiClient client = server.available();   // Listen for incoming clients

  if (client) {                             // If a new client connects,
    currentTime = millis();
    previousTime = currentTime;
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected() && currentTime - previousTime <= timeoutTime) {            // loop while the client's connected
      currentTime = millis();
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
                   
            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            client.println("<link rel=\"stylesheet\" href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css\">");
            client.println("<script src=\"https://cdnjs.cloudflare.com/ajax/libs/jscolor/2.0.4/jscolor.min.js\"></script>");
            client.println("</head><body><div class=\"container\"><div class=\"row\"><h1>ESP Color Picker</h1></div>");
            client.println("<a class=\"btn btn-primary btn-lg\" href=\"#\" id=\"change_color\" role=\"button\">Change Color</a> ");
            client.println("<input class=\"jscolor {onFineChange:'update(this)'}\" id=\"rgb\"></div>");
            client.println("<script>function update(picker) {document.getElementById('rgb').innerHTML = Math.round(picker.rgb[0]) + ', ' +  Math.round(picker.rgb[1]) + ', ' + Math.round(picker.rgb[2]);");
            client.println("document.getElementById(\"change_color\").href=\"?r\" + Math.round(picker.rgb[0]) + \"g\" +  Math.round(picker.rgb[1]) + \"b\" + Math.round(picker.rgb[2]) + \"&\";}</script></body></html>");
            // The HTTP response ends with another blank line
            client.println();

            // Request sample: /?r201g32b255&
            // Red = 201 | Green = 32 | Blue = 255
            if(header.indexOf("GET /?r") >= 0) {
              pos1 = header.indexOf('r');
              pos2 = header.indexOf('g');
              pos3 = header.indexOf('b');
              pos4 = header.indexOf('&');
              redString = header.substring(pos1+1, pos2);
              greenString = header.substring(pos2+1, pos3);
              blueString = header.substring(pos3+1, pos4);
              /*Serial.println(redString.toInt());
              Serial.println(greenString.toInt());
              Serial.println(blueString.toInt());*/
              ledcWrite(redChannel, redString.toInt());
              ledcWrite(greenChannel, greenString.toInt());
              ledcWrite(blueChannel, blueString.toInt());
            }
            // Break out of the while loop
            break;
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
}


Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Пн окт 21, 2019 8:32 pm

Вопрос решился, нужно было выбрать Flash Mode DIO, теперь другая проблема
СпойлерПоказать
нет подключения.JPG
нет подключения.JPG (41.83 КБ) 5078 просмотров
В настройках я указал все так, указал свой IP адрес, не 192.168.1.8, а другой, а на скриншоте я его стер, добавил две строки для авторизации, но почему-то он указывает другой IP адрес, а не тот, что я указал?
СпойлерПоказать
настройка скетча.JPG
настройка скетча.JPG (31.9 КБ) 5078 просмотров
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение olehs » Пн окт 21, 2019 9:53 pm

Все верно, там должно быть DIO, я неправильный скриншот сделал (менял плату на другую и не все вернул назад).
По умолчанию плата получает адрес от роутера по DHCP, его можно не указывать (если хотите, конечно, то это нужно сделать в функции setupWiFi()).

В разделе MQTT Settings указывать нужно адрес сервера, где крутится MQTT-брокер, а не какой-то другой. Ну либо вообще ничего не указывать, если вам не нужен MQTT
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Пн окт 21, 2019 10:03 pm

Вот оно что, а я тут голову сломал, не мог понять, почему не работает на QIO :D . У меня имеется сервер MQTT и на нем настроена авторизация. Я правильно понимаю, чтобы шлюз подключился к серверу MQTT, нужно добавить эти строки?

static const char* mqtt_server = "0.0.0.0"; //Адрес сервера
static const uint16_t mqtt_port = 1883; //Порт сервера
static const char* mqtt_user = ""; //Логин от сервера
static const char* mqtt_pass = ""; //Пароль от сервера
static const char* mqtt_client = "R4SClient";
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Пн окт 21, 2019 10:19 pm

Я указал IP адрес сервера MQTT, а он почему-то тянет IP адрес, который ему выдает DHCP. Строка static const char* mqtt_server = "0.0.0.0"; указывает конкретный ip адрес сервера или эта строка не работает?
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Пн окт 21, 2019 11:11 pm

Можете привести пример, как мне настроить скетч таким образом, чтобы шлюз мог подключиться к серверу MQTT с авторизацией?

Так нужно прописывать в функции setupWiFi()?

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

// присваиваем статический IP адрес
  WiFi.mode(WIFI_STA); // режим клиента
  WiFi.config(IPAddress(192, 168, 1, 20), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));

нашел еще такой вариант

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

// Удаляем предыдущие конфигурации WIFI сети
  WiFi.disconnect(); // обрываем WIFI соединения
  WiFi.softAPdisconnect(); // отключаем отчку доступа(если она была
  WiFi.mode(WIFI_OFF); // отключаем WIFI
  delay(500);
  // присваиваем статический IP адрес
  WiFi.mode(WIFI_STA); // режим клиента
  WiFi.config(IPAddress(192, 168, 1, 20), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Вт окт 22, 2019 12:27 am

с горе пополам получилось, но чайник не находит и не хочет с ним сопрягаться. Через gatttol соединение проходит успешно, а вот с esp32 как-то не получается. Просто в gatttool я использую gatttool -t random -b 00:00:00:00:00:00 -I, может здесь также?

И почему-то ip по прежнему он показывает 192.168.1.8, когда я подключаюсь к нем через web по 192.168.1.20?
СпойлерПоказать
пошла загрузка.JPG
пошла загрузка.JPG (38.02 КБ) 5051 просмотр
Сообщение через браузер {"monitoring":5}
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Ответить