Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Железные вопросы по esp8266", создана пользователем Vypra, 31 янв 2019.

  1. Vypra

    Vypra Новичок

    Сообщения:
    129
    Симпатии:
    0
    Не могу подружить 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 тоже обкатана другими скетчами.

    Прошиваем:
    Код (Text):
    1. void setup()
    2.  
    3. { Serial.begin(9600);}
    4.  
    5. void loop()
    6. {}
    7.  
    Ручками в терминале Arduino IDE пишем АТ. Ни ответа, ни привета. По идее должно.


    Отключаем SIM800L и коротим на NODE MCU V3 TX-RX.
    Прошиваем:
    Код (Text):
    1. void setup()
    2.  
    3. {
    4. Serial.begin(9600);
    5. pinMode(1, INPUT);
    6. pinMode(3, INPUT);
    7. }
    8.  
    9. void loop() {}
    Ручками в терминале Arduino IDE пишем текст, текст выскакивает в терминале, понимаем что TX-RX рабочий.

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

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

    nikolz Гуру

    Сообщения:
    4.133
    Симпатии:
    431
    На nodemcu Есть встроенный адаптер USB-UART он тоже подключен туда же может создавать коллизии.
    Желательно отпаять TX пин CH и поставить туда тумблер
    Резисторы в 10 ком это уже перебор -возможно проблема от этого.
    Если SIM800L питается от 3.4 резисторы на RX TX нет надобности
     
  3. Vypra

    Vypra Новичок

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

    Вложения:

    • UART.jpg
      UART.jpg
      Размер файла:
      268,9 КБ
      Просмотров:
      14
  4. Vypra

    Vypra Новичок

    Сообщения:
    129
    Симпатии:
    0
    ПДФник на всяк случай. Страница 31.
     

    Вложения:

  5. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    по идеи 10кОм на землю, а между пинами 3кОм. Тогда делитель 3.3в на 2.7в получается.
    Но вы правы, делитель тут не к чему.
     
  6. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    что мешает попробовать? И уменьшите резисторы, если не хотите их убирать, как в даташите 5.6кОм-1кОм. А то и правда многовато.
     
  7. Vypra

    Vypra Новичок

    Сообщения:
    129
    Симпатии:
    0
    Собственно ничего, кроме того, что на форуме торчу на работе, а паяю дома ))).
    Вчера пришел домой, первым делом перепаял резюки как по даташиту. Напряжение 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? Как это сделать?
     
    Последнее редактирование: 7 фев 2019
  8. Vypra

    Vypra Новичок

    Сообщения:
    129
    Симпатии:
    0
    Это трэш какой-то. Вчера весь вечер игрался.
    Уже пробовал объявить 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 свободны.)
     
    Последнее редактирование: 8 фев 2019
  9. Сергей_Ф

    Сергей_Ф Moderator Команда форума

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

    Vypra Новичок

    Сообщения:
    129
    Симпатии:
    0
    Сергей, я знаю это. Но как ни странно, но назначение output (TX), input (RX) ничего не дали. А вот input-input дали возможность вводить руками команды, а SIM800 отвечал (по крайней мере до вчера). Про эту странность я и писал. Про input-input я нашел на stD. И это сработало.
     
  11. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    @Vypra всё правильно. Пока вы не назначите TX на input вы руками ничего ввести не сможете. Это же очевидно. Если порт будет в режиме output - он будет блокировать ваш ввод. Ну и наоборот.
     
  12. Vypra

    Vypra Новичок

    Сообщения:
    129
    Симпатии:
    0
    А модуль как получил команду? Т.е. TX сработал как на передачу, так и на прием?
     
  13. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    Команду модуль получает по RX. По TX ничего получить нельзя. Если вы про SIM800 - то у него, как вы сами показали в даташите, подписи инвертированные. Т.е. подписаны выводы КУДА их надо подключить у микроконтроллера.
     
  14. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.503
    Симпатии:
    174
    Если проблема, что не работает если посылаете из скетча, то возможно вы после АТ не посылаете символов "перевода строки" и "возврата каретки".
     
  15. Vypra

    Vypra Новичок

    Сообщения:
    129
    Симпатии:
    0
    Serial.println(); Автоматом добавлять должно. На Ардуино работает.
     
  16. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    Код (Text):
    1. size_t Print::println(void) {
    2.  
    3.     return print("\r\n");
    4. }
    Вроде всё есть.
    Давайте тогда весь код.
     
  17. Vypra

    Vypra Новичок

    Сообщения:
    129
    Симпатии:
    0
    Код (Text):
    1.  
    2. String _response = "";                               // Переменная для хранения ответа модуля
    3.  
    4. void setup()
    5. {
    6.   Serial.begin(9600); //Скорость сериал порта
    7.  
    8.   //********** CHANGE PIN FUNCTION  TO TX/RX **********
    9.   //GPIO 1 (TX) swap the pin to a TX.
    10.   pinMode(1, FUNCTION_0);
    11.   //GPIO 3 (RX) swap the pin to a RX.
    12.   pinMode(3, FUNCTION_0);
    13.   //***************************************************
    14.  
    15.   //sendATCommand("AT+CFUN=1,1", true);                // перезагрузка модуля при запуске
    16.   sendATCommand("AT", true);                         // Отправили AT для настройки скорости обмена данными
    17.  
    18.    send_Email("5", "HELLO");                          // 1 - количество символов в теле сообщения, 2 - сообщение
    19. }
    20.  
    21. void loop()
    22. {}
    23.  
    24. void send_Email(String num, String message)
    25. {
    26.   //Настройки интернет соединения
    27.   sendATCommand("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", true);                               // задаем команду выхода в интернет
    28.   delay (2000);  // без паузы не работает
    29.   sendATCommand("AT+SAPBR=3,1,\"APN\",\"internet\"", true);                               // настройки APN Vodafone
    30.   delay (2000);  // без паузы не работает
    31.   sendATCommand("AT+SAPBR=1,1", true);                                                    // To open a GPRS context. установить GPRS соединение
    32.   delay (2000);  // без паузы не работает
    33.  
    34.   //Настройки для отправки e-mail :
    35.   sendATCommand("AT+EMAILCID=1", true);                                                    // Установка CID параметра для email сессии.
    36.   sendATCommand("AT+EMAILTO=30", true);                                                    // Set EMAIL timeout Установка таймаута для SMTP и POP серверов.
    37.   sendATCommand("AT+EMAILSSL=1", true);                                                    // Set EMAIL begin encrypt transmission with encrypt port
    38.   sendATCommand("AT+SMTPSRV=\"SMTP.GMAIL.COM\"", true);                                    // Установка адреса и порта SMTP почтового сервера.
    39.   sendATCommand("AT+SMTPAUTH=1,\"**********@gmail.com\",\"*****Arduino\"", true);          // Аутентификация (e-mail адрес, и пароль от e-mail)
    40.   sendATCommand("AT+SMTPFROM=\"**********@gmail.com\",\"*****arduino\"", true);            //от кого письмо (почтовый адрес, имя отправителя)
    41.   sendATCommand("AT+SMTPSUB=\"Test\"", true);                                              //тема письма
    42.   sendATCommand("AT+SMTPRCPT=0,0,\"***********@gmail.com\",\"***********\"", true);        // кому письмо (почтовый адрес, имя получателя)
    43.   sendATCommand("AT+SMTPBODY=\"" + num + "\"", true);                                      // задаем сколько символов в письме
    44.   sendATCommand(message + "\r\n" + (String)((char)26), true);                              //После получение ответа от модуля DOWNLOAD.
    45.   //Для отправки в конце сообщения отправляем символ SUB ( (char)26 или Cntrl+Z)
    46.   sendATCommand("AT+SMTPSEND", true);                                                      // Отправка Email
    47.   sendATCommand("AT+SAPBR=0,1", true);                                                     //  разорвать GPRS соединение
    48. }
    49.  
    50.  
    51. String sendATCommand(String cmd, bool waiting)                    // Функция отправки комманд модулю
    52. {
    53.   String _resp = "";                                              // Переменная для хранения результата
    54.   Serial.println(cmd);                                            // Дублируем команду в монитор порта
    55.    if (waiting) {                                                 // Если необходимо дождаться ответа...
    56.     _resp = waitResponse();                                       // ... ждем, когда будет передан ответ
    57.     Serial.println(_resp);                                        // Дублируем ответ в монитор порта
    58.   }
    59.   return _resp;                                                   // Возвращаем результат. Пусто, если проблема
    60. }
    61.  
    62.  
    63. String waitResponse()                                             // Функция ожидания ответа и возврата полученного результата
    64. {
    65.   String _resp = "";                                              // Переменная для хранения результата
    66.   unsigned long _timeout = millis() + 10000;                      // Переменная для отслеживания таймаута (10 секунд)
    67.   do
    68.   { delay(0);
    69.  
    70.     if (millis() > _timeout )
    71.     {
    72.       delayMicroseconds (20);
    73.       Serial.println("Timeout...");
    74.       delayMicroseconds (20);
    75.       break;
    76.     }
    77.  
    78.     if (Serial.available())
    79.     { _resp = Serial.readString();
    80.       delayMicroseconds (20);
    81.       Serial.println(_resp);
    82.       delayMicroseconds (20);
    83.       break;
    84.     }
    85.   }
    86.   while (1) ;                                                     // Просто событие, которое не наступит
    87.  
    88.   return _resp;                                                   // ... возвращаем результат. Пусто, если проблема
    89. }
     
  18. Vypra

    Vypra Новичок

    Сообщения:
    129
    Симпатии:
    0
    Может через pinMode(PIN, FUNCTION_3); объявить все пины GPIO и посылать через SoftSerial? Возможно ли чтоб RX TX небыло?
     
  19. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    особо не вникал, но мне кажется что
    это не 5 символов.
    И зачем назначать gpio 1 и 3, если это аппаратный RX/TX по умолчанию?
    Не понял зачем delayMicroseconds (20) понатыкано и зачем ответ от модуля вы обратно ему отправляете?
     
  20. Vypra

    Vypra Новичок

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

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

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

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

Поделиться этой страницей