• Система автоматизации с открытым исходным кодом на базе 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 посылает одно сообщение каждую секунду, а он, треклятый, сыпет их как из ведра, так получается?
Тогда вопрос, как сделать одно сообщение в секунду?
 
Последнее редактирование:
Сверху Снизу