• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Ардуино Нано + ESP-12

Sever44

Member
Получив эти данные, Ардуино выводит их на цифровые выходы и запускает АЦП. Получив результаты из АЦП, Ардуино посылает их в ESP.
Это разные данные. Полученные от ESP "цифровые" данные (не могу найти другого подходящего слова, может Вы предложите?) управляют чем-то. Что-то Другое оцифровывается и посылается в ESP.
 
Последнее редактирование:

stalkerkz

New member
Если я не ошибаюсь, достаточно RX с выхода Ардуины подать на вход RX ESP через резистивный делитель 1 кОм/2 кОм, а TX ESP (3,3 В) TX Ардуины и так поймет.
где то на другой ветке форума я прочитал, что через резистивный делитель данные отправляются не стабильно, у кого то даже не работало, видимо это связано с тем, какое напряжения для питания подается на нано, кто то отписался что лучшее решение получилось через резистор и диод зенера, выкладывали даже схему погуглите, там несколько человек ее применили и все довольны.
 

stalkerkz

New member
Вопрос с обменом информацией между ESP и сервером CloudMQTT решен, причем для двух вариантов библиотек PubSubClient.
Осталось организовать обмен между Ардуино и ESP.
Думаю так:
При отправке данных на сервер ESP одновременно по Serial Port посылает данные в Ардуино, она (или он?) их читает, управляет исполнительными устройствами в соответствии с полученными данными и в ответ посылает числовые данные (оцифрованные аналоговые сигналы), а ESPполученные данные пересылает на сервер.

Можно и так сделать как вы предлагаете, только я не вижу смысла в отправке данные с ESP на ардуино... это усложнит код, я бы сделал проще, ардуино отрабатывает и собирает все данные с аналоговых входов, у нано ведь их всего 8, вряд ли вы их все используете, да даже если и все... затем эти данные собираете с помощью библиотеки arduiniJson в массив и отправляете его в заданный интервал времени (раз в секунду или как вам угодно) по сериал порту на esp сериал, в документации написано что они, родные сериал, работают без нагрузки на микропроцессор, если это для вас важно. Затем есп как только сообщение пришло, будет парсить их и вы сразу будете вытаскивать из него все данные аналоговых входов нано, а дальше делайте с ними все что душа пожелает. Получается, что у вас нано будет в роди такого навороченного расширителя портов по сериал!

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

Sever44

Member
Можно и так сделать как вы предлагаете, только я не вижу смысла в отправке данные с ESP на ардуино..
То есть Вы предлагаете управлять исполнительными устройствами с выходов ESP, а на Ардуино возложить только функцию обработки аналоговых сигналов?
 

Sever44

Member
Но пока пытаюсь передать данные из ESP в Ардуину.
ESP мигает, а Ардуина должна это видеть, но не видит...
Может, посмотрите что не так?

void setup() {
Serial.begin(115200);
pinMode(2, OUTPUT);
}
void loop() {
digitalWrite(2, HIGH);
Serial.print("LedON");
delay(1000);
digitalWrite(2, LOW);
Serial.print("LedOFF");
delay(1000);
}

void setup() {
Serial.begin(115200);
pinMode(13, OUTPUT);
}
void loop() {
while (Serial.available()) {
String fromESP = Serial.readString();
char LedON[] = "LedON";
char LedOFF[] = "LedOFF";
if (fromESP == LedON) {
digitalWrite(13, HIGH);
}
if (fromESP == LedOFF) {
digitalWrite(13, LOW);
delay(20);
}
}
}
 

KomX

Member
А какой в них смысл, если их гораздо проще организовать в ESP? Не надо плодить лишних сущностей. "Усложнять - просто, упрощать - сложно" (с)
Кесарю - кесарево, а Цезарю - цезарево.
Ни одна ESP-ка не позволит реализовать весь спектр задач решаемых на AVR аппаратными средствами.
Если я правильно понял, под двухпроводной связью подразумевается RX, TX связи.
А что такое однопроводная связь?
Уважаемый @=AK= уже расширил Ваши представления о 2-wire и 1-wire от Dallas/Maxim. Огромное ему за это спасибо.
 

Sever44

Member
Просто если вы захотите чтобы с есп по сериал в нано шли запросы и нано их отрабатывала.. вы не сможете использовать сериал есп для отладки или придется писать умный блок кода, чтобы ардуино отличал запрос к ней от другого спама который есп будет в сериал порт отправлять... оно вам надо?
А спам откуда возьмется?
 

stalkerkz

New member
То есть Вы предлагаете управлять исполнительными устройствами с выходов ESP, а на Ардуино возложить только функцию обработки аналоговых сигналов?
а ну вы не описали подробно, что у вас там на нано еще что то исполняется... речь ведь шла про аналоговые входы. Тогда нужно писать блок чтобы ардуино не только отправляла, но и принимала данные по сериал. по той же схеме но в два конца.
 

=AK=

New member
Но пока пытаюсь передать данные из ESP в Ардуину.
ESP мигает, а Ардуина должна это видеть, но не видит...
Может, посмотрите что не так?
У вас нет управления потоком данных. ESP отправит строку "LedON", а как Ардуино узнает, что строка закончилась и пора ее обрабатывать? Никак. Поэтому Ардуино принимает, пока не будет тайм-аут. А за это время придет начало другой строки, "LedOFF". Вот и увидит Ардуино в принятой строке невесть что, а вовсе не то, что вам хотелось бы.
 

Sever44

Member
ESP отправит строку "LedON", а как Ардуино узнает, что строка закончилась и пора ее обрабатывать?
Использовал println для передачи.
Теперь в СОМ порту Ардуины (в режиме моста):
LedON
LedOFF
LedON
LedOFF
LedON
LedOFF
Но Ардуина все равно молчит, собака...
Что же ей нужно?
 

stalkerkz

New member
То есть надо передавать PRINTLN?
я в блокноте написал не проверял если вылезут ошибки допилите... с есп нужно обязательно передавать через println, забыл в коде прописать inputString глобальная переменная тип строка. stringComplete тоже гл. Тип булиан.

Код:
String ESP_req; //глобальная переменнаz

в void вставляем следующее

  while (Serial.available()) {
      // получаем байт:
      char inChar = (char)Serial.read();
      // собираем в строку inputString:
      inputString += inChar;
      // проверяем если полученный символ флаг конца строки:
      if (inChar == '\n') {
        stringComplete = true;
      }
    }
    if (stringComplete) {
      espParse(inputString);
      // clear the string:
      inputString = "";
      stringComplete = false;
    }

void espParse(ESP_req) {
    if (ESP_req.index0f("LedON") > -1) {
        digitalWrite(13, HIGH);
    }
    if (ESP_req.index0f("LedOFF") > -1) {
        digitalWrite(13, LOW);
    }
}
 
Последнее редактирование:

Sever44

Member
я в блокноте написал не проверял если вылезут ошибки допилите... с есп нужно обязательно передавать через println
Что мог, добавил:
String inputString;
String stringComplete;
String espParse;

С этим не знаю, что делать.

In function 'void loop()':

Ard_iz_ESP_HELP:22: error: no match for call to '(String) (String&)'

espParse(inputString);

^

Ard_iz_ESP_HELP:25: error: ambiguous overload for 'operator=' (operand types are 'String' and 'bool')

stringComplete = false;

^

C:\Users\Rivex\Documents\Arduino\Ard_iz_ESP_HELP\Ard_iz_ESP_HELP.ino:25:22: note: candidates are:

In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:231:0,

from sketch\Ard_iz_ESP_HELP.ino.cpp:1:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:86:11: note: String& String::eek:perator=(const String&)

String & operator = (const String &rhs);

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:87:11: note: String& String::eek:perator=(const char*)

String & operator = (const char *cstr);

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:88:11: note: String& String::eek:perator=(const __FlashStringHelper*)

String & operator = (const __FlashStringHelper *str);

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:90:11: note: String& String::eek:perator=(String&&)

String & operator = (String &&rval);

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:91:11: note: String& String::eek:perator=(StringSumHelper&&)

String & operator = (StringSumHelper &&rval);

^

Ard_iz_ESP_HELP:28: error: variable or field 'espParse' declared void

void espParse(ESP_req) {

^

Ard_iz_ESP_HELP:38: error: expected '}' at end of input

}

^

exit status 1
no match for call to '(String) (String&)'
 

=AK=

New member
Использовал println для передачи.
Теперь в СОМ порту Ардуины (в режиме моста):
LedON
LedOFF
LedON
LedOFF
LedON
LedOFF
Но Ардуина все равно молчит, собака...
Что же ей нужно?
Ей нужно, чтобы в принятой строке было точно "LedON" или "LedOFF". А у вас там и раньше было бог весть что, что-то вроде "LedONL","edOFFLe", и т.п. А теперь стало еще хуже, "LedON\r\nLe", "dOFF\r\nLe" и т.п.

Кроме того, в выражении

if (fromESP == LedOFF)

вы сравниваете String c массивом char, а это вообще-то разные типы данных.
 

stalkerkz

New member
Что мог, добавил:
String inputString;
String stringComplete;
String espParse;

С этим не знаю, что делать.

In function 'void loop()':

Ard_iz_ESP_HELP:22: error: no match for call to '(String) (String&)'

espParse(inputString);

^

Ard_iz_ESP_HELP:25: error: ambiguous overload for 'operator=' (operand types are 'String' and 'bool')

stringComplete = false;

^

C:\Users\Rivex\Documents\Arduino\Ard_iz_ESP_HELP\Ard_iz_ESP_HELP.ino:25:22: note: candidates are:

In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:231:0,

from sketch\Ard_iz_ESP_HELP.ino.cpp:1:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:86:11: note: String& String::eek:perator=(const String&)

String & operator = (const String &rhs);

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:87:11: note: String& String::eek:perator=(const char*)

String & operator = (const char *cstr);

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:88:11: note: String& String::eek:perator=(const __FlashStringHelper*)

String & operator = (const __FlashStringHelper *str);

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:90:11: note: String& String::eek:perator=(String&&)

String & operator = (String &&rval);

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/WString.h:91:11: note: String& String::eek:perator=(StringSumHelper&&)

String & operator = (StringSumHelper &&rval);

^

Ard_iz_ESP_HELP:28: error: variable or field 'espParse' declared void

void espParse(ESP_req) {

^

Ard_iz_ESP_HELP:38: error: expected '}' at end of input

}

^

exit status 1
no match for call to '(String) (String&)'


Вот так попробуйте...

Код:
boolean stringComplete = false;
String inputString = "";

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(115000);
}

void loop() {
    while (Serial.available()) {
      // получаем байт:
      char inChar = (char)Serial.read();
      // собираем в строку inputString:
      inputString += inChar;
      // проверяем если полученный символ флаг конца строки:
      if (inChar == '\n') {
        stringComplete = true;
      }
    }
    if (stringComplete) {
      espParse(inputString);
      // clear the string:
      inputString = "";
      stringComplete = false;
    }
}

void espParse(String ESP_req) {
    if (ESP_req.indexOf("LedON") > -1) {
        digitalWrite(13, HIGH);
    }
    if (ESP_req.indexOf("LedOFF") > -1) {
        digitalWrite(13, LOW);
    }
}
 

Sever44

Member
Ей нужно, чтобы в принятой строке было точно "LedON" или "LedOFF". А у вас там и раньше было бог весть что, что-то вроде "LedONL","edOFFLe", и т.п. А теперь стало еще хуже, "LedON\r\nLe", "dOFF\r\nLe" и т.п.
А где Вы увидели этот "компот"?

Кроме того, в выражении

if (fromESP == LedOFF)

вы сравниваете String c массивом char, а это вообще-то разные типы данных.
Использовал println в скетче ESP, сравнивал строковые выражения, все равно молчит, как партизан на допросе.

Кажется, я нашел причину молчания.
void setup() {
Serial.begin(115200);
pinMode(13, OUTPUT);
}
void loop() {
delay(1000);
Serial.print('W'); // выводится в порт
while (Serial.available()) {
Serial.print('H'); // НЕ выводится в порт
}
}
Похоже, какая-то проблема с портом. Хотя это странно, сообщения от ESP (правда, в режиме моста) выводятся, сообщение вне условия WHILE выводится, в охваченное условием -НЕТ.
Буду разбираться.
Ведь так быть не должно?
 
Последнее редактирование:

=AK=

New member
А где Вы увидели этот "компот"?
А вы сами подумайте, почему бы Ардуина должна принимать строки именно в том виде, в каком вам хотелось бы? Она принимает то, что ей передают, до тех пор, пока не сработает тайм-аут 1 сек. Вот что за 1 сек придет, то и будет в строке. А за 1 сек придет кусочек одной строки и кусочек другой. Вы же никак и ничем не определяете для приемника, где строка начинается, а где кончается. Вот и будет у приемника "компот". В случае println еще хуже, потому что к строке будут добавлены невидимые глазу символы возврата каретки и перевода строки, а их приемник вообще не ждет.
 

Sever44

Member
А вы сами подумайте, почему бы Ардуина должна принимать строки именно в том виде, в каком вам хотелось бы? Она принимает то, что ей передают, до тех пор, пока не сработает тайм-аут 1 сек.
Значит, я действительно чего-то не понимал.
Приношу свои извинения.
Я считал, скетч ESP посылает одно сообщение каждую секунду, а он, треклятый, сыпет их как из ведра, так получается?
Тогда вопрос, как сделать одно сообщение в секунду?
 
Последнее редактирование:
Сверху Снизу