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

Нужна помощь RTC by Makuna

Vypra

Member
Накидайте в программу отладочных Serial.println и узнаете в каком месте затык.
Для начала - Зашел в Setup - вышел.
И так в каждую функцию, в той что подвисает, дополнительно после "важных" операторов.
Уважаемый CodeNameHawk, Вы наверное не поняли сути проблемы, которую я выше описал. Скетч рабочий. Отладки не требует.
enjoynering прав. Я изменил скетч и обращаюсь к SIM800 переключением Serial.swap(); на пины SIM800 и обратно на пины монитора порта.

Код:
String _response    = "";                                     // Переменная для хранения ответа модуля
long lastUpdate = millis();                                   // Время последнего обновления
long updatePeriod   = 60000;                                  // Проверять каждую минуту
bool hasmsg = false;                                          // Флаг наличия сообщений к удалению

void setup()
{
  Serial.begin(9600);
  pinMode(15, OUTPUT);
  pinMode(13, INPUT);

  //sendATCommand("AT&F", true);                       // Сброс до заводских
  sendATCommand("AT+CFUN=1,1", true);                // перезагрузка модуля при запуске
  delay (2000);
  delay (2000);
  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);  // без паузы не работает
  delay (2000);
  sendATCommand("AT+SAPBR=3,1,\"APN\",\"internet\"", true);                               // настройки APN Vodafone
  delay (2000); // без паузы не работает
  delay (2000);
  sendATCommand("AT+SAPBR=1,1", true);                                                    // To open a GPRS context. установить GPRS соединение
  delay (2000); // без паузы не работает
  delay (2000);

  //Настройки для отправки e-mail :
  sendATCommand("AT+EMAILCID=1", true);                                                    // Установка CID параметра для email сессии.
  delay (2000);
  sendATCommand("AT+EMAILTO=30", true);                                                    // Set EMAIL timeout Установка таймаута для SMTP и POP серверов.
  delay (2000);
  sendATCommand("AT+EMAILSSL=1", true);                                                    // Set EMAIL begin encrypt transmission with encrypt port
  delay (2000);
  sendATCommand("AT+SMTPSRV=\"SMTP.GMAIL.COM\"", true);                                    // Установка адреса и порта SMTP почтового сервера.
  delay (2000);
  sendATCommand("AT+SMTPAUTH=1,\"*******@gmail.com\",\"****\"", true);               // Аутентификация (e-mail адрес, и пароль от e-mail)
  delay (2000);
  sendATCommand("AT+SMTPFROM=\"*****@gmail.com\",\"*****\"", true);                  //от кого письмо (почтовый адрес, имя отправителя)
  delay (2000);
  sendATCommand("AT+SMTPSUB=\"Test\"", true);                                              //тема письма
  delay (2000);
  sendATCommand("AT+SMTPRCPT=0,0,\"******@gmail.com\",\"******\"", true);  // кому письмо (почтовый адрес, имя получателя)
  delay (2000);
  sendATCommand("AT+SMTPBODY=\"" + num + "\"", true);                                      // задаем сколько символов в письме
  delay (2000);

  sendATCommand(message + "\r\n" + (String)((char)26), true);                              //После получение ответа от модуля DOWNLOAD. вводим текст письма длиной n символов.
  //Для отправки в конце сообщения отправляем символ SUB ( (char)26 или Cntrl+Z)
  delay (2000);
  delay (2000);
 
  sendATCommand("AT+SMTPSEND", true);                                                      // Отправка Email

  delay (2000); // без паузы не работает
  delay (2000);
  delay (2000);

  sendATCommand("AT+SAPBR=0,1", true);                                                    //  разорвать GPRS соединение
}

// Ответы:
//  1 – письмо успешно отправлено
//  Некоторые ошибки:
//  61 – ошибка соединения
//  63 – ошибка подключения SMTP TCP
//  64 – время сессии истекло
//  65 - отклонено сервером (в Gmail нужно разрешить доступ к аккаунту небезопасным приложениям)
//  67 – ошибка аутентификации


//***************************************************************************************************************

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


//***************************************************************************************************************

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

    if (millis() > _timeout )
    {
      Serial.swap();                                             // Переключаемся на монитор порта ПК
      delay (300);
      Serial.println("Timeout...");                              // печатаем Timeout... в монитор порта ПК
      break;
    }

    if (Serial.available())
    {
      _resp = Serial.readString();                                // читаем ответ SIM 800
      _response = _resp;
      Serial.swap();                                              // Переключаемся на монитор порта ПК
      delay (300);
      Serial.println(_resp);                                      // печатаем ответ SIM 800 в монитор порта ПК
      break;
    }
  }
  while (1) ;                                                        // Просто событие, которое не наступит
  return _resp;                                                      // ... возвращаем результат. Пусто, если проблема
}
Все работает, но приходит письмо с китайскими иероглифами вместо HELLO. Проблема в строчке sendATCommand(message + "\r\n" + (String)((char)26), true);

Хотя в мониторе порта вижу
Код:
AT+SMTPBODY="5"

DOWNLOAD

HELLO

OK

AT+SMTPSEND

OK
Что может быть?
 

Vypra

Member
Например не поставили подтягивающего резистора.
Наверное не вариант. GPIO 15, 13 подключены к SIM800 через делитель для понижения напряжения. Т.е от ESP к SIM800 через резистор 1К и между резюком 1К-SIM800 и землей стоит 5,6 К. Тем более команды SIM800 получает, и ответ SIM800 в монитор порта я правильно считываю и дублирую.
 

Vypra

Member
Кстати, замечено, что без
pinMode(15, OUTPUT);
pinMode(13, INPUT);
не работает.
Но если Serial.swap(); переключает с GPIO 1, 3 и делает из GPIO 15, 13 стандартный RX TX, то почему нужно объявлять OUTPUT/INPUT на GPIO 15, 13???
 

enjoynering

Well-known member
вот так подтягивали, см. картинку?

Код:
Кстати, замечено, что без
pinMode(15, OUTPUT);
pinMode(13, INPUT);
не работает.
Но если Serial.swap(); переключает с GPIO 1, 3 и делает из GPIO 15, 13 стандартный RX TX, то почему нужно объявлять OUTPUT/INPUT на GPIO 15, 13???
может потому что вы забыли удалить inclide<"SoftSerial.h">; ?
 

Вложения

enjoynering

Well-known member
пробуйте чистить буферы Serial.flush(); сразу после вызова Serial.swap(); - может там мусор остается от предыдущего обмена.
 

enjoynering

Well-known member
вот что еще нарыл на sim800
Restrictions of autobauding operation:
The DTE serial port must be set at 8 data bits, no parity and 1 stop bit. The URC such as "RDY", "+CFUN: 1" and "+CPIN: READY” will not be reported
поэтому в вашем правильнее вызывать Serial.begin() так:

Код:
Serial.begin(9600, SERIAL_8N1); //9600kbps, 8-bit data, no parity, 1-bit stop
 

Vypra

Member
может потому что вы забыли удалить inclide<"SoftSerial.h">; ?
))) неее. выше выложил скетч "как есть". Без SoftSerial.

вот так подтягивали, см. картинку?
Именно так. С даташита взято. Перепроверил.

пробуйте чистить буферы Serial.flush(); сразу после вызова Serial.swap();
Сделано.

поэтому в вашем правильнее вызывать Serial.begin() так:
Сделано.

Все равно письма шлет с китайщиной.
Не сработало ничто.

Письмо приходит с иконкой замка, зашифрованное Google Стандартное автоматическое TLS шифрование. Не может на стадии отправки неверно шифровать? Хотя в старой прошивке все слало правильно. Но как вариант? Иероглифы приходят всегда одинаковые. Так что это не мусор.
 

Vypra

Member
Все проблемы начинаются с AT+SMTPBODY. После этой команды в мониторе порта на ПК должно появиться слово DOWNLOAD. После чего можно ввести сообщение руками или послать текст функцией. Для завершения ввода текста нужно послать символ SUB ( (char)26 или Cntrl+Z). Далее AT+SMTPSEND отправляет сообщение. Алгоритм понятен.

Делаем не через функцию sendATCommand, как раньше, а вот так:

Код:
Serial.swap(); // Переводим сериалпорт на пины СИМ800 
  delay (300);
  Serial.println("AT+SMTPBODY=\"" + num + "\"");  
  Serial.swap(); 
  delay (300);

  Serial.swap();  // Переводим сериалпорт на пины СИМ800 
  delay (300);
  Serial.println(message + "\r\n" + (String)((char)26));
  Serial.swap();  //  Переводим сериалпорт на стандартные пины 
  delay (300);

  sendATCommand("AT+SMTPSEND", true);
И что же мы видим в мониторе порта на ПК:
Код:
P⸮i⸮QA    =e⸮"5"
HELLO
AT+SMTPSEND

OK
Т.е. AT+SMTPBODY = 5 монитор порта видит крякозяблами
Далее DOWNLOAD мы не видим и не должны, поскольку в этот момент переключены на пины СИМ800.
Но слово HELLO какого-то черта мы видим, хотя находимся на пинах СИМ800!
Ну далее AT+SMTPSEND мы видим, потому что в функции sendATCommand мы дублируем команду в монитор порта ПК.
Так что я подумал, а если когда мы посылаем все через sendATCommand, СИМ800 не успевает дочитать текст сообщения HELLO, а мы переключаемся? При этом если поставить delay после Serial.println(message + "\r\n" + (String)((char)26));, программа остановится и СИМ800 все равно не дочитает.
Так же подмечено, что если не ставить после команд delay, СИМ800 не успевает обрабатывать команды. Например мы посылаем текст, тут же команду отправки письма и тут же отключения интернета, то диод на модуле перестает мигать (выход с интернета) значительно позже, чем ушла последняя команда.
 

CodeNameHawk

Moderator
Команда форума
Напомните почему вы решили не использовать SoftwareSerial ?
На 9600 он по идеи должен работать.

Код:
  _resp = Serial.readString();                                // читаем ответ SIM 800
Вы уверены, что SIM 800 отвечает строкой, а не набором символов?

Недавно по новой установил версию 2,5,2 и скетч который ранее не собирался на этой версии плат, начал собираться и нормально работать. Возможно они что то починили.
 

Vypra

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

CodeNameHawk

Moderator
Команда форума
Послушайте, я выложил код. Там код простой до немогу. В чем я там могу быть не уверен? Тем более что все работало прекрасно до смены версии платы.
"Странно, прошлый раз мы так вытащили одного из колодца"
Как найти причину, а не думать, что ее не должно быть, я уже вам писал.
Самая простая проверка, простой скетч, что принимает один символ с Serial и посылает на его на Serial1.
Но тут нужны два переходника усб-сом для подключения к компу.
Удачи.
 

Vypra

Member
"Странно, прошлый раз мы так вытащили одного из колодца"
Как найти причину, а не думать, что ее не должно быть, я уже вам писал.
Самая простая проверка, простой скетч, что принимает один символ с Serial и посылает на его на Serial1.
Но тут нужны два переходника усб-сом для подключения к компу.
Удачи.
CodeNameHawk, Вы все правильно говорите. Ошибки поблочно я ищу. Пробую разные варианты. Место, где начинаются приколы, я уже нашел. Теперь ищу причину сему.
 

enjoynering

Well-known member
Напомните почему вы решили не использовать SoftwareSerial ?
класс. вот это вопрос. давайте спроецируем ситуацию. вы пришли в салон за новым авто и опа нежднчик - дворники не работают. дилер вам в ответ - зачем вы решили пользоваться
щетками? вот вам костыль, зацепитесь и дрыгайте, всегда так делаю.

напоминает ситуацию с драйвером i2c - все знали о проблеме но упорно не хотели в этом признаваться.
вся боль от использования библиотеки и драйвера I2C шины для Arduino ESP8266 тут, тут, тут и здесь.
 

Vypra

Member
Парни, проблема только с вводом текста.
2 команды - AT+SMTPBODY (задает размер сообщения) и ввод самого текста сообщения. Если выбросить эти 2 команды - сообщение без проблем приходит, но пустое.
 
Сверху Снизу