Arduino Nano + ESP8266(ESP-01S)

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Всем Доброго Дня!
Скажем так прошу немного помочь знающих людей. Заранее благодарю.
Вопрос то в принципе прост и вижу, что я где то в шаге от правильного ответа на свой вопрос, но не могу додумать суть. И так на ардуино нано залит скетч
 

// библиотека для работы программного Serial
#include <SoftwareSerial.h>
 
// создаём объект для работы с программным Serial
// и передаём ему пины TX и RX
SoftwareSerial mySerial(2, 3);
 
// serial-порт к которому подключён Wi-Fi модуль
#define WIFI_SERIAL mySerial
 
void setup()
{
  // открываем последовательный порт для мониторинга действий в программе
  // и передаём скорость 9600 бод
  Serial.begin(9600);
  while (!Serial) {
  // ждём, пока не откроется монитор последовательного порта
  // для того, чтобы отследить все события в программе
  }
  Serial.print("Serial init OK\r\n");
  // открываем Serial-соединение с Wi-Fi модулем на скорости 115200 бод
  WIFI_SERIAL.begin(115200);
}
 
void loop()
{
  // если приходят данные из Wi-Fi модуля - отправим их в порт компьютера
  if (WIFI_SERIAL.available()) {
    Serial.write(WIFI_SERIAL.read());
  }
  // если приходят данные из компьютера - отправим их в Wi-Fi модуль
  if (Serial.available()) {
    WIFI_SERIAL.write(Serial.read());
  }
}

И в нем все нормально.
Второй скетч заливаю в модуль ESP8266 (он же ESP-01S)
 

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>                          // библиотека для работы программного Serial




/////////////////// SETTINGS /////////////////////////////

//Подключаемся к домашнему роутеру
const char* ssid ="switch01";
const char* password = "f89mn2xK";

// MQTT

const char* mqtt_server = "m3.wqtt.ru";              //адрес сервера MQTT брокера
const int mqtt_port = 3064;                          //порт сервера MQTT брокера
const char* mqtt_user = "xxxxxxx";                  //имя пользователя
const char* mqtt_password = "xxxxxxxx";                  //пароль

// RELAY
const String relay_topic = "led_top/svet";
const int RELAY = 2;

/////////////////////////////////////////////////////////



WiFiClient espClient;
PubSubClient client(espClient);

bool relay_on = false;


void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void updateStatusChannel(void){
    if(relay_on){
      digitalWrite(RELAY, HIGH);
    }else{
      digitalWrite(RELAY, LOW);
    }
}

void callback(char* topic, byte* payload, unsigned int length) {
    
  String data_pay;
  for (int i = 0; i < length; i++) {
    data_pay += String((char)payload[i]);
  }

    Serial.println(data_pay);
    
  if( String(topic) == relay_topic ){
        if(data_pay == "OFF") relay_on = true;
        if(data_pay == "ON") relay_on = false;
    }

    updateStatusChannel();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId = "ESP8266-" + WiFi.macAddress();
    // Attempt to connect
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_password) ) {
      Serial.println("connected");
      
      // Подписываемся на все подтопики
      client.subscribe( (relay_topic + "/#").c_str() );

    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
    pinMode(RELAY, OUTPUT);
   digitalWrite(RELAY, LOW);
   // pinMode(3, OUTPUT);

  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

И в нем тоже все работает, модуль связывается с Wi-FI и MQTT сервером и управляет диодом на ESP с помощью Алисы. Но суть не в этом.
Вопрос: Когда я открываю монитор порта и ввожу команду AT, AT+GMR (команды модулю esp-01) он команду ловит но ничего в монитор порта не отвечает, что нужно допилить? Укажите на путь истинный.

b707
Offline
Зарегистрирован: 26.05.2017

MASHUKOV.ANTON пишет:

Вопрос: Когда я открываю монитор порта и ввожу команду AT, AT+GMR (команды модулю esp-01) он команду ловит но ничего в монитор порта не отвечает, что нужно допилить? Укажите на путь истинный.

Управление ЕСП через АТ команды и прошивка его своим кодом С++ - взаимоисключающие понятия.

Когда вы залили в ЕСП свою прошивку - вы затерли заводскую прошивку, работающую по АТ командам

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

b707 пишет:

[Управление ЕСП через АТ команды и прошивка его своим кодом С++ - взаимоисключающие понятия.

Когда вы залили в ЕСП свою прошивку - вы затерли заводскую прошивку, работающую по АТ командам

Уже хорошо, теперь понятно почему так происходит, тогда идем далее по дорожке, как сделать чтоб всё таки АТ работали и скетч выполнялся? Или же скетч писать на ардуино с AT командами для ESP модуля, а сам модуль не прошивать скетчем?

b707
Offline
Зарегистрирован: 26.05.2017

MASHUKOV.ANTON пишет:

Уже хорошо, теперь понятно почему так происходит, тогда идем далее по дорожке, как сделать чтоб всё таки АТ работали и скетч выполнялся?

очевидно, написать на С++ свой интерпретатор АТ-команд :) Непонятно только, зачем... что такое вам нужно в виде АТ-команд. что вы не можете сделать сами в своей прошивке?

Цитата:
Или же скетч писать на ардуино с AT командами для ESP модуля, а сам модуль не прошивать скетчем?

можно и так. Но тогда вам фактически всю логику сетевых взаимодействий придется кодировать на Нано и потом транслировать ее по Сериал в виде АТ-команд. Не сказал бы. что это проще...

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Окей, писать свой интерпретатор не вариант, писать командами да согласен! Долго и нуторно переписывать все что и так в принципе работает. Тогда вопрос, как в скетче esp-01s запросить его IP адрес и состояние сети (connect, disconnect) и вывести его в порт либо же на экран дисплея?

b707
Offline
Зарегистрирован: 26.05.2017

MASHUKOV.ANTON пишет:

Тогда вопрос, как в скетче esp-01s запросить его IP адрес и состояние сети (connect, disconnect) и вывести его в порт либо же на экран дисплея?

вы издеваетесь? в вашем коде в строчках 54-56 что написано?

Наверно вы этот код списали и ни строчки в нем не понимаете?

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

b707 пишет:
]

вы издеваетесь? в вашем коде в строчках 54-56 что написано? Наверно вы этот код списали и ни строчки в нем не понимаете?

)), чето я совсем уже съехал, просто сижу уже 7 день над этим делом, Теперь когда ты мне указал куда пялить всё встало на свои места. Оказалось всё просто, для того чтобы вывести данные на дисплей нужно всего то установить библиотеку Arduino LiquidCrystal, добавить в свой скетч строку для того чтобы вывести в дисплей ЖК

lcd.print("my text");

 Где найти команды (или переменные по которым можно запросить данные которые прописаны в библиотеках #include <ESP8266WiFi.h>   #include <PubSubClient.h> )? Могу погуглить но может у кого сразу ссылочки есть.

b707
Offline
Зарегистрирован: 26.05.2017

MASHUKOV.ANTON пишет:

Где найти команды (или переменные по которым можно запросить данные которые прописаны в библиотеках #include <ESP8266WiFi.h>   #include <PubSubClient.h> )?

не понял вопроса...

Если данные прописана в этих файлах - значит и переменные там же. Описания к библиотекам делаются редко. проще читать исходный код.

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

Ну например строка
 

Serial.println(WiFi.localIP());

в ней мы печатаем ip адрес  откуда мы его выкопали? 

MASHUKOV.ANTON
Offline
Зарегистрирован: 20.01.2021

еще такие моменты, например делаю кратковременное замыкание контактов (проще говоря ресет) контакт модуля esp-01s RTS на землю ардуино, в монитор пишет иногда всё ровно, а иногда такую хрень. Например:
 

//=====================ЗАМЫКАЮ 1й раз=====================

Connecting to switch01
..
WiFi connected
IP address: 
192.168.10..¦MCЎP.WV.СҐ№ќЃjEQQЃ.Ѕ№№•ЌСҐЅ№№rconnected
OFF
sl.lњs.Њc.гo...Њ.Ђlм.pЊ|Џѓџ.мp.“џЏ“њмЊ.p.Њ8уoџ.looњ.c.c.pЊЏcl`.slpуoаѓњ...ѓ‡l.ЊњЂ...c.oггoм.“..Џp.Њ|уoп.lЊЏ.l`...osl.lњs.Њc.гo...Њ.Ђlм.pЊ|Џѓџ.мp.“џЏ“њмЊ.p.Њ8уoџ.looњ.c.c.pмЏcl`.slpуoаѓњ...ѓЏЂl.ЊњЂ...oђ..oo..›.“

//=====================ЗАМЫКАЮ 2й раз=====================

Connectin.ўЅЃљЭҐСЌЎБЉj
..
WiFi connected
IP address: 
192.168.10.2¦MCЎP.WV.СҐ№ќЃjEQQЃ.Ѕ№№•ЌСҐЅ№№rconnected
OFF
sl.lњђs.Њc.гo...Њ.Ђlм.pЊ|Џѓџ.мp.“џЏ“њ.Њ.cЊ8уoџ.looњ.c.c.pЊЏcl`.slpуoаѓњ...ѓ‡Ђl.ЊњЂ...c.oггoм.“..Џp.Њ|уoз.lЊЏ.l`.ђ..oo.l`...osЏ“џs...c.l`..s“џп...c.lњ“

//=====================ЗАМЫКАЮ 3й раз=====================
Connecring to switch01
..
WiFi connected
IP address: 
192.168'10.235
Atzempting MQTZ connecconnected

В 3й раз вроде выдало все норм но в ip адресе и то после 168 выдало не "." а "`" получается если я буду выводить эти данные на LCD То у меня там будет то норм то бурда. Как это лечится?

b707
Offline
Зарегистрирован: 26.05.2017

MASHUKOV.ANTON пишет:

Ну например строка
 

Serial.println(WiFi.localIP());

в ней мы печатаем ip адрес  откуда мы его выкопали? 

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

строчка

WiFi.localIP()

означает метод localIP() обьекта WiFi

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

Только для начала ответьте себе на вопрос зачем?

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

MASHUKOV.ANTON пишет:

 Где найти команды (или переменные по которым можно запросить данные которые прописаны в библиотеках #include <ESP8266WiFi.h>   #include <PubSubClient.h> )? Могу погуглить но может у кого сразу ссылочки есть.

Вы не поверите! 

В файлах, которые называются "ESP8266WiFi.h" и "PubSubClient.h".