• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь NODE MCU V3 + SIM800L через UART

Vypra

Member
Не могу подружить NODE MCU V3 и SIM800L через UART на пинах GPIO1 (TX), GPIO3 (RX).

Подключение с SIM800L перекрестное TX-RX, RX-TX через делитель напряжения 10К-3К, чтоб при питании 3,3В на RX и TX было 2,5В как того требует даташит SIM800L.

Питание внешнее через мощные DC DC Step down конвертеры c 12В аккумулятора на 4В для SIM800L и 5В для NODE MCU V3 через VIN и другие датчики. Стабилизация напряжения дополнительными конденсаторами. Земля общая для всех. Короче, по питанию чтоб вопросов не возникало.

NODE MCU V3 и SIM800L рабочие. SIM800L через SoftSerial работает на Ардуине, NODE MCU V3 тоже обкатана другими скетчами.

Прошиваем:
Код:
void setup()

{ Serial.begin(9600);}

void loop()
{}
Ручками в терминале Arduino IDE пишем АТ. Ни ответа, ни привета. По идее должно.


Отключаем SIM800L и коротим на NODE MCU V3 TX-RX.
Прошиваем:
Код:
void setup()

{
Serial.begin(9600);
pinMode(1, INPUT);
pinMode(3, INPUT);
}

void loop() {}
Ручками в терминале Arduino IDE пишем текст, текст выскакивает в терминале, понимаем что TX-RX рабочий.

Менял скорость передачи данных – глухо. Даже кракозяблов нет. Не общаются они.

Что не так? Как подружить? SoftSerial не вариант, мне другие GPIO нужны под датчики. Только через TX-RX.
Может скетч какой нужен чтоб попробовать вводить АТ команды для SIM800L через терминал? Рабочий проверенный скетч для отправки СМС на Ардуине тоже не заработал.
 

nikolz

Well-known member
Не могу подружить NODE MCU V3 и SIM800L через UART на пинах GPIO1 (TX), GPIO3 (RX).

Подключение с SIM800L перекрестное TX-RX, RX-TX через делитель напряжения 10К-3К, чтоб при питании 3,3В на RX и TX было 2,5В как того требует даташит SIM800L.

Питание внешнее через мощные DC DC Step down конвертеры c 12В аккумулятора на 4В для SIM800L и 5В для NODE MCU V3 через VIN и другие датчики. Стабилизация напряжения дополнительными конденсаторами. Земля общая для всех. Короче, по питанию чтоб вопросов не возникало.

NODE MCU V3 и SIM800L рабочие. SIM800L через SoftSerial работает на Ардуине, NODE MCU V3 тоже обкатана другими скетчами.

Прошиваем:
Код:
void setup()

{ Serial.begin(9600);}

void loop()
{}
Ручками в терминале Arduino IDE пишем АТ. Ни ответа, ни привета. По идее должно.


Отключаем SIM800L и коротим на NODE MCU V3 TX-RX.
Прошиваем:
Код:
void setup()

{
Serial.begin(9600);
pinMode(1, INPUT);
pinMode(3, INPUT);
}

void loop() {}
Ручками в терминале Arduino IDE пишем текст, текст выскакивает в терминале, понимаем что TX-RX рабочий.

Менял скорость передачи данных – глухо. Даже кракозяблов нет. Не общаются они.

Что не так? Как подружить? SoftSerial не вариант, мне другие GPIO нужны под датчики. Только через TX-RX.
Может скетч какой нужен чтоб попробовать вводить АТ команды для SIM800L через терминал? Рабочий проверенный скетч для отправки СМС на Ардуине тоже не заработал.
На nodemcu Есть встроенный адаптер USB-UART он тоже подключен туда же может создавать коллизии.
Желательно отпаять TX пин CH и поставить туда тумблер
Резисторы в 10 ком это уже перебор -возможно проблема от этого.
Если SIM800L питается от 3.4 резисторы на RX TX нет надобности
 

Vypra

Member
Нашел случайно даташит SIM800 по подключению. Так я смотрю, что ардуину нужно перекресно подключать, а MCU напрямую TX-TX RX-RX?
 

Вложения

Vypra

Member
что мешает попробовать?
Собственно ничего, кроме того, что на форуме торчу на работе, а паяю дома ))).
Вчера пришел домой, первым делом перепаял резюки как по даташиту. Напряжение 2,87В. получилось, считаю этого много, так как комфортое для него 2,5В. Но если даташит пишет что можно, значит можно. Возможно с 10К тоже работало бы, потому что через старый делитель работают другие датчики. Но не важно.
Главное, что на MCU действительно подключение прямое ))))
Завелось. Чтоб руками вводить команды в монитор порта, нужно объявлять:
  1. pinMode(1, INPUT);
  2. pinMode(3, INPUT);
Без этого не работает, хотя не вкурю почему. Пишем ручками АТ - ответ ОК.

Но рано обрадовался. Если вводить через Serial.println () - команда выводится, ответа нет. И pinMode () не нужно объявлять. Только скорость порта. Если объявить pinMode () - то и команда не выводится.
Читал что на Lua для начала работы через UART нужно писать uart.on. Но в Lua я не силен. Может через Arduino IDE тоже нужно как-то запустить UART? Как это сделать?
 
Последнее редактирование:

Vypra

Member
Это трэш какой-то. Вчера весь вечер игрался.
Уже пробовал объявить pinMode(1, FUNCTION_3); pinMode(3, FUNCTION_3); В порт команду посылает, ответа нет. После некоторых попыток переназначения FUNCTION_3 - FUNCTION_0 и обратно начало прошиваться при подсоединенных проводах от SIM800 на RX, TX Nodemcu. До этого чтоб загрузить скетч нужно было отсоединять провода. Что-то наверное сгорело. Если закоротить RX, TX на Nodemcu, руками команды вводятся. Наверное в SIM800 выгорело. Проверю SIM800 на ардуине, вчера небыло времени уже ночью.

А, еще напряжение: Если не соединенные два модуля между собой - SIM800 на RX - 0,3В, TX - 2,8В, а вот на Nodemcu RX - 3,2 В, TX - 3,2 В . Это здоровая ситуация? Осцилом не замерял, это тестером.

И если у меня на TXD1 GPIO 2 датчик температуры висит - это как-то может влиять на работу TXD0 GPIO 1, RXD0 GPIO 3 ? (TXD2 GPIO 15 и RXD2 GPIO 13 свободны.)
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@Vypra вы сначала общение между модулями наладьте, потом датчики подключайте. Как вы собираетесь выводить через Serial.print() если вы порт объявили как input? Выводят в output (TX), из input (RX) читают. Ну и учитывайте что на SIM800 они подписаны наоборот.
 

Vypra

Member
@Vypra вы сначала общение между модулями наладьте, потом датчики подключайте. Как вы собираетесь выводить через Serial.print() если вы порт объявили как input? Выводят в output (TX), из input (RX) читают. Ну и учитывайте что на SIM800 они подписаны наоборот.
Сергей, я знаю это. Но как ни странно, но назначение output (TX), input (RX) ничего не дали. А вот input-input дали возможность вводить руками команды, а SIM800 отвечал (по крайней мере до вчера). Про эту странность я и писал. Про input-input я нашел на stD. И это сработало.
 

Сергей_Ф

Moderator
Команда форума
@Vypra всё правильно. Пока вы не назначите TX на input вы руками ничего ввести не сможете. Это же очевидно. Если порт будет в режиме output - он будет блокировать ваш ввод. Ну и наоборот.
 

Vypra

Member
@Vypra всё правильно. Пока вы не назначите TX на input вы руками ничего ввести не сможете. Это же очевидно. Если порт будет в режиме output - он будет блокировать ваш ввод. Ну и наоборот.
А модуль как получил команду? Т.е. TX сработал как на передачу, так и на прием?
 

Сергей_Ф

Moderator
Команда форума
А модуль как получил команду?
Команду модуль получает по RX. По TX ничего получить нельзя. Если вы про SIM800 - то у него, как вы сами показали в даташите, подписи инвертированные. Т.е. подписаны выводы КУДА их надо подключить у микроконтроллера.
 

CodeNameHawk

Moderator
Команда форума
Без этого не работает, хотя не вкурю почему. Пишем ручками АТ - ответ ОК.
Если проблема, что не работает если посылаете из скетча, то возможно вы после АТ не посылаете символов "перевода строки" и "возврата каретки".
 

Vypra

Member
Давайте тогда весь код.
Код:
String _response = "";                               // Переменная для хранения ответа модуля

void setup()
{
  Serial.begin(9600); //Скорость сериал порта

  //********** CHANGE PIN FUNCTION  TO TX/RX **********
  //GPIO 1 (TX) swap the pin to a TX.
  pinMode(1, FUNCTION_0);
  //GPIO 3 (RX) swap the pin to a RX.
  pinMode(3, FUNCTION_0);
  //***************************************************

  //sendATCommand("AT+CFUN=1,1", true);                // перезагрузка модуля при запуске
  sendATCommand("AT", true);                         // Отправили AT для настройки скорости обмена данными

   send_Email("5", "HELLO");                          // 1 - количество символов в теле сообщения, 2 - сообщение
}

void loop()
{}

void send_Email(String num, String message)
{
  //Настройки интернет соединения
  sendATCommand("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", true);                               // задаем команду выхода в интернет
  delay (2000);  // без паузы не работает
  sendATCommand("AT+SAPBR=3,1,\"APN\",\"internet\"", true);                               // настройки APN Vodafone
  delay (2000);  // без паузы не работает
  sendATCommand("AT+SAPBR=1,1", true);                                                    // To open a GPRS context. установить GPRS соединение
  delay (2000);  // без паузы не работает

  //Настройки для отправки e-mail :
  sendATCommand("AT+EMAILCID=1", true);                                                    // Установка CID параметра для email сессии.
  sendATCommand("AT+EMAILTO=30", true);                                                    // Set EMAIL timeout Установка таймаута для SMTP и POP серверов.
  sendATCommand("AT+EMAILSSL=1", true);                                                    // Set EMAIL begin encrypt transmission with encrypt port
  sendATCommand("AT+SMTPSRV=\"SMTP.GMAIL.COM\"", true);                                    // Установка адреса и порта SMTP почтового сервера.
  sendATCommand("AT+SMTPAUTH=1,\"**********@gmail.com\",\"*****Arduino\"", true);          // Аутентификация (e-mail адрес, и пароль от e-mail)
  sendATCommand("AT+SMTPFROM=\"**********@gmail.com\",\"*****arduino\"", true);            //от кого письмо (почтовый адрес, имя отправителя)
  sendATCommand("AT+SMTPSUB=\"Test\"", true);                                              //тема письма
  sendATCommand("AT+SMTPRCPT=0,0,\"***********@gmail.com\",\"***********\"", true);        // кому письмо (почтовый адрес, имя получателя)
  sendATCommand("AT+SMTPBODY=\"" + num + "\"", true);                                      // задаем сколько символов в письме
  sendATCommand(message + "\r\n" + (String)((char)26), true);                              //После получение ответа от модуля DOWNLOAD.
  //Для отправки в конце сообщения отправляем символ SUB ( (char)26 или Cntrl+Z)
  sendATCommand("AT+SMTPSEND", true);                                                      // Отправка Email
  sendATCommand("AT+SAPBR=0,1", true);                                                     //  разорвать GPRS соединение
}


String sendATCommand(String cmd, bool waiting)                    // Функция отправки комманд модулю
{
  String _resp = "";                                              // Переменная для хранения результата
  Serial.println(cmd);                                            // Дублируем команду в монитор порта
   if (waiting) {                                                 // Если необходимо дождаться ответа...
    _resp = waitResponse();                                       // ... ждем, когда будет передан ответ
    Serial.println(_resp);                                        // Дублируем ответ в монитор порта
  }
  return _resp;                                                   // Возвращаем результат. Пусто, если проблема
}


String waitResponse()                                             // Функция ожидания ответа и возврата полученного результата
{
  String _resp = "";                                              // Переменная для хранения результата
  unsigned long _timeout = millis() + 10000;                      // Переменная для отслеживания таймаута (10 секунд)
  do
  { delay(0);

    if (millis() > _timeout )
    {
      delayMicroseconds (20);
      Serial.println("Timeout...");
      delayMicroseconds (20);
      break;
    }

    if (Serial.available())
    { _resp = Serial.readString();
      delayMicroseconds (20);
      Serial.println(_resp);
      delayMicroseconds (20);
      break;
    }
  }
  while (1) ;                                                     // Просто событие, которое не наступит
 
  return _resp;                                                   // ... возвращаем результат. Пусто, если проблема
}
 

Vypra

Member
Может через pinMode(PIN, FUNCTION_3); объявить все пины GPIO и посылать через SoftSerial? Возможно ли чтоб RX TX небыло?
 

Сергей_Ф

Moderator
Команда форума
особо не вникал, но мне кажется что
message + "\r\n" + (String)((char)26)
это не 5 символов.
И зачем назначать gpio 1 и 3, если это аппаратный RX/TX по умолчанию?
Не понял зачем delayMicroseconds (20) понатыкано и зачем ответ от модуля вы обратно ему отправляете?
 

Vypra

Member
особо не вникал, но мне кажется что это не 5 символов.
5 символов HELLO, остальное "\r\n" + (String)((char)26) чтоб завершить ввод в терминале и началась отправка. Модуль ждет эти символы. Можно хоть руками в терминале сообщение напечатать, отправка не начнется без завершения строки. Испытано на Ардуино.

[QUOTE ] И зачем назначать gpio 1 и 3, если это аппаратный RX/TX по умолчанию? [/QUOTE]
Это уже на всякий случай вчера. До этого небыло ничего. Просто скорость выставлял.

[QUOTE ] Не понял зачем delayMicroseconds (20) понатыкано [/QUOTE]
delayMicroseconds - резало иногда ответ. Попробовал так. Но проблема не в этом явно.

[QUOTE ] и зачем ответ от модуля вы обратно ему отправляете? [/QUOTE]
Ответ просто ОК или ERROR в терминал. Эхо модуля отключено. Ответ нужен мне. Модуль на ответ ОК не ответит.
 
Сверху Снизу