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

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

=AK=

New member
Я считал, скетч ESP посылает одно сообщение каждую секунду, а он, треклятый, сыпет их как из ведра, так получается?
Он их посылат каждую секунду. Только секунда в ESP начинается и заканчивается совсем не то же самое время, когда начинается и заканчивается секунда в Ардуино, ведь часы у каждого свои. Поэтому за свою секунду Ардуино вполне может увидеть кусочек сообщения, посланного ESP в предыдущую секунду, плюс кусочек, посланный в следующую секунду. А за время, когда Ардуино ничего не принимает (у вас там delay есть), ESP может еще что-то передать.
 

CodeNameHawk

Moderator
Команда форума
Введите символы начала и конца строки, у меня это { и }
Посылайте {LedON} или {LedOFF}

Код:
const  int  buf_max = 200;            //rozmiar bufera dla dannych z Serial
char odczyt_buf[buf_max];             //przyjeta linia z serial
unsigned long start_time, now_time;   //zapisuje sie, kiedy zaczeli czekac na danne z Serial

void loop ( void )
{
  char odczyt;               //przyjety  char z serial
  int  i;
  boolean posylka_full;      //zrobi sie true , jak bedzie otrzymana pelna posylka

 if (Serial.available() > 0)
  { //если есть доступные данные
    // считываем байт
    odczyt = Serial.read();
    if (odczyt == '{') //szukamy poczatek linii
    {
      i = 0; //na poczatek buffera
      odczyt_buf[i] = odczyt;
      i = i + 1;
      posylka_full = false;
      start_time = millis();
      do
      {
        if (Serial.available() > 0)
        {
          odczyt = Serial.read();
          odczyt_buf[i] = odczyt;
          i = i + 1;
          if (i >= buf_max)
          {
            posylka_full = false;
            break;
          }
          if (odczyt == '}')
          {
            posylka_full = true;
            odczyt_buf[i + 1] = 0;
            break;
          }
        }
        now_time = millis();
        if ((now_time - start_time) > 5000)
        {
          posylka_full = false;
          break;
        }
      }
      while (1);
      if (posylka_full == true)
      { 
         //      Используется только во время отладки.

        //        Serial.println();
        //        Serial.println("Cala posylka");
        //        Serial.println(i);
        //for (int cykl = 0; cykl < i; cykl++)
        //{
         // Serial.print(odczyt_buf[cykl]);
        //}

         //Получили полную строку.

//--------------------------------------------------------------------------------------
//  вставьте сюда обработку вашей строки
// ваша строка будет {LedON} или {LedOFF}

  
//--------------------------------------------------------------------------------------
        }
      } else //posylka nie cala, tylko na czas otladki
      {
        //  Используется только во время отладки.
        //  Serial.println();
        //  Serial.println("Nie cala posylka");
      }
    }
  }
}
 

Sever44

Member
А вы сами подумайте, почему бы Ардуина должна принимать строки именно в том виде, в каком вам хотелось бы? Она принимает то, что ей передают, до тех пор, пока не сработает тайм-аут 1 сек. Вот что за 1 сек придет, то и будет в строке. А за 1 сек придет кусочек одной строки и кусочек другой. Вы же никак и ничем не определяете для приемника, где строка начинается, а где кончается. Вот и будет у приемника "компот". В случае println еще хуже, потому что к строке будут добавлены невидимые глазу символы возврата каретки и перевода строки, а их приемник вообще не ждет.
Извините за настойчивость, но как Вы увидели этот "компот"?
Я, в лучшем случае, видел сообщения от ESP в UART'e только в режиме моста Ардуины.
 

stalkerkz

New member
Спасибо, но пока не осилил.
Я залил скетч который скинул Вам ранее в свою нано и простой в ESP-01 все работает, не знаю почему у Вас не работает... может вы конвертер уровней не правильно собрали или неправильно запитали есп и нано?

 

Sever44

Member
Я залил скетч который скинул Вам ранее в свою нано и простой в ESP-01 все работает, не знаю почему у Вас не работает... может вы конвертер уровней не правильно собрали или неправильно запитали есп и нано?
Спасибо!
Завтра посмотрю, проверю, сегодня уже нет сил, с часа ночи вожусь.
 

=AK=

New member
Извините за настойчивость, но как Вы увидели этот "компот"?
Я, в лучшем случае, видел сообщения от ESP в UART'e только в режиме моста Ардуины.
Я вроде бы объяснил, довольно подробно, даже два раза... Вот, смотрите на диаграмму:

ESP передает строки LedON и LedOFF раз в секунду по своим часам. Шкала времени ESP показана сверху, вертикальная черточка - это конец одного 1-сек интервала и начало следующего:
Код:
|_____________________|_____________________|__________
LedON_________________LedOFF________________LedON______  
__|_____________________|_____________________|________
Ардуино принимает текст в течении 1 секунды по своим часам. Шкала времени Ардуино показана снизу, одна из возможных. В этой шкале Ардуино примет строки "dONLe", "dOFFLe", и т.д.
 
Последнее редактирование:

Sever44

Member
Всем привет!
Докладываю результаты моих мучений.
ДЕЛО БЫЛО НЕ В БОБИНЕ....
Изучая основы, я в нескольких местах видел утверждение, что ESP к Ардуине подключается без перекрестия, т. е. RX к RX, а TX к TX. Я удивился, но сделал, "как положено".
Теперь то я понял, что речь шла об использовании Ардуины для прошивки ESP.
Включил голову, сделал, как учили в школе, и все заработало.
Причем, я дважды упоминал на форуме о таком неправильном подключении, и никто меня муд............реца, не поправил!
Так что БОЛЬШЕ ВНИМАНИЯ РАЗНЫМ ВОПРОСАМ!
Всем спасибо!
 
Сверху Снизу