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

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

enjoynering

Well-known member
попробуйте так:

Код:
void send_Email(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=" + String(message.length()), 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 соединение
}
вызываем так:
Код:
  send_Email("HELLO");                          //сообщение
 

CodeNameHawk

Moderator
Команда форума
класс. вот это вопрос. давайте спроецируем ситуацию. вы пришли в салон за новым авто и опа нежднчик - дворники не работают. дилер вам в ответ - зачем вы решили пользоваться
щетками? вот вам костыль, зацепитесь и дрыгайте, всегда так делаю.
Так и я об этом
"Напомните почему вы решили НЕ ИСПОЛЬЗОВАТЬ SoftwareSerial ?"
 

CodeNameHawk

Moderator
Команда форума
класс. вот это вопрос. давайте спроецируем ситуацию. вы пришли в салон за новым авто и опа нежднчик - дворники не работают. дилер вам в ответ - зачем вы решили пользоваться
щетками? вот вам костыль, зацепитесь и дрыгайте, всегда так делаю.
Так и я об этом
"Напомните почему вы решили НЕ ИСПОЛЬЗОВАТЬ SoftwareSerial ?"
Если вам угодно, задняя передача не включается, давайте разворачивать машину на подставке.
 

enjoynering

Well-known member
Все вы поняли, но мне не жалко.

Потому что esp8266 arduino framework из коробки умеет два uart и SoftSerial - это костыль.

P.S. для arduino uno SoftSerial нормальное решение, там один аппаратный uart и он занят bootloader-ом.
 

enjoynering

Well-known member
Если прислушаться к рекомендации производителя...
Это вы разработчикам Arduino ESP8266 скажите. :)

P.S. Кстати SoftSerial использует теже пины - GPIO15 и GPIO13. Ещё один повод чтоб ее не использовать. Зачем второй велосипед, когда уже есть из коробки Serial.swap()?
 

CodeNameHawk

Moderator
Команда форума
Это вы разработчикам Arduino ESP8266 скажите.
Что вы им советуете сказать? Они нормально все сделали, когда надо запрограммировать есп используйте UART0.
Если UART0 нужен для общения с другим устройством, перебросьте вывод отладочной информации на UART1, что бы не переключаться обратно есть ОТА.

P.S. Кстати SoftSerial использует теже пины - GPIO15 и GPIO13. Ещё один повод чтоб ее не использовать. Зачем второй велосипед, когда уже есть из коробки Serial.swap()?
Тут все просто, у аппаратного UART1 только одна нога Тх на выход.
 

CodeNameHawk

Moderator
Команда форума
Это вы разработчикам Arduino ESP8266 скажите.
Что вы им советуете сказать? Они нормально все сделали, когда надо запрограммировать есп используйте UART0.
Если UART0 нужен для общения с другим устройством, перебросьте вывод отладочной информации на UART1, что бы не переключаться обратно есть ОТА.

P.S. Кстати SoftSerial использует теже пины - GPIO15 и GPIO13. Ещё один повод чтоб ее не использовать. Зачем второй велосипед, когда уже есть из коробки Serial.swap()?
Тут все просто, у аппаратного UART1 только одна нога Тх на выход.
 

Vypra

Member
Ха-ха! Получилось!
Код:
 Serial.swap();
  delay (500);
  Serial.println("AT+SMTPBODY=" + String(message.length()));
  //Serial.println("AT+SMTPBODY=5"); // или так
  delay (500);
  Serial.println(message + "\r\n" + (String)((char)26));
  delay (500); // без паузы не шлет
  Serial.swap();
  delay (500);
  sendATCommand("AT+SMTPSEND", true);
  delay (6000);
  sendATCommand("AT+SAPBR=0,1", true);
Обязательные условия:
1. Между SMTPBODY и сообщением нельзя переключать Serial.swap();, потому что присылает иероглифы. Т.е. нужно Serial.swap();-> SMTPBODY -> сообщение-> Serial.swap(); Поэтому здесь функция sendATCommand все портила.
2. Нужны паузы. Особенно между сообщением и AT+SMTPSEND. Иначе не шлет. И вообще между всеми командами нужны паузы. Наверное СИМ800 медленный. Не знаю. Это тоже было причиной.

Замечено, что сообщения от СИМ800 прилетают уже после переключения на стандартные пины. Смотрите:

OK
// здесь мы переключаемся на СИМ800 и вводим сообщение. Мы этого не видим.

AT+SMTPSEND // отправляем сообщение

DOWNLOAD // !!! но сообщение прилетает после переключения назад на стандартные пины

OK

OK

AT+SAPBR=0,1

Всем спасибо!!!
 

enjoynering

Well-known member
DOWNLOAD // !!! но сообщение прилетает после переключения назад на стандартные пины
Так и должно быть, вы немножко запутались. Вот правильная логика:

1. После старта esp8266 serial висит на пинах gpio01 и gpio03.
2. Переключаем на sim800 командой Serial.swap(), подключённый к gpio15 и gpio13
3. На всякий случай чистим буфер serial ( gpio15 и 13), командой Serial.flush();
4. Передаем сообщения sim800 с delay() после каждой передачи.
5. Принимаем сообщение от sim800 ВО ВРЕМЕННУЮ ПЕРЕМЕННУЮ
6. Переключаемся назад на com порт - gpio01 и gpio03 и чистим буфер (gpio01 и 03).
7. Посылаем данные из временной переменной в com порт.
8. Переключемся назад на sim800 и повторяем с п.3
 

Vypra

Member
Так и должно быть, вы немножко запутались. Вот правильная логика:

1. После старта esp8266 serial висит на пинах gpio01 и gpio03.
2. Переключаем на sim800 командой Serial.swap(), подключённый к gpio15 и gpio13
3. На всякий случай чистим буфер serial ( gpio15 и 13), командой Serial.flush();
4. Передаем сообщения sim800 с delay() после каждой передачи.
5. Принимаем сообщение от sim800 ВО ВРЕМЕННУЮ ПЕРЕМЕННУЮ
6. Переключаемся назад на com порт - gpio01 и gpio03 и чистим буфер (gpio01 и 03).
7. Посылаем данные из временной переменной в com порт.
8. Переключемся назад на sim800 и повторяем с п.3
Не. Посмотрите. В последнем случае, чтоб не переключаться Serial.swap() между SMTPBODY и сообщением, я использовал
Serial.println("AT+SMTPBODY=" + String(message.length())); вместо функции с временной переменной. И Serial.flush(); здесь не использовал. Т.е. SMTPBODY и ввод сообщения - это две команды, которые не посылались во внешнюю функцию. Все другие команды - да, посылались по описанному Вами алгоритму.
 

enjoynering

Well-known member
вот здесь вы переключаетесь на SIM800 (gpio15 и gpio13) и передаете размер письма и тело письма. пока все логично
Код:
Serial.swap();
  delay (500);
  Serial.println("AT+SMTPBODY=" + String(message.length()));
  //Serial.println("AT+SMTPBODY=5"); // или так
  delay (500);
  Serial.println(message + "\r\n" + (String)((char)26));
  delay (500); // без паузы не шлет
а дальше у меня взорвался мозг. вы переключаетесь на обычный COM порт (gpio01 и gpio03) и шлете в него команды SIM800 для завершения передачи письма
Код:
  Serial.swap();
  delay (500);
  sendATCommand("AT+SMTPSEND", true);
  delay (6000);
  sendATCommand("AT+SAPBR=0,1", true);
ВОПРОС - как SIM800 их получит если команды вы шлете на gpio01 и gpio03, а SIM800 подключен к gpio15 и gpio13?
 

CodeNameHawk

Moderator
Команда форума
4. Передаем сообщения sim800 с delay() после каждой передачи.
Если sim800 дает ответ на каждую команду(подозреваю, что такое должно быть в sim800), то вместо delay() надо дожидаться ответа от sim800, если нет ответа определенное время, надо отправить команду по новой или перегрузить sim800.

И Serial.flush(); здесь не использовал
Вам дали хороший совет, чистить буфер после каждого Serial.swap(), может избавить от неприятных неожиданностей.
 

enjoynering

Well-known member
Что вы им советуете сказать? Они нормально все сделали, когда надо запрограммировать есп используйте UART0.
Если UART0 нужен для общения с другим устройством, перебросьте вывод отладочной информации на UART1, что бы не переключаться обратно есть ОТА.

Тут все просто, у аппаратного UART1 только одна нога Тх на выход.
тут все просто уважаемый CodeNameHawk надо переставать давать людям плохие советы аля - чем вам SoftSerial не угодил?
 

CodeNameHawk

Moderator
Команда форума
тут все просто уважаемый CodeNameHawk надо переставать давать людям плохие советы аля - чем вам SoftSerial не угодил?
Если вам кажется, что это плохой совет, то хотя бы напишите, чем он плох.

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

enjoynering

Well-known member
Если вам кажется, что это плохой совет, то хотя бы напишите, чем он плох.

После того, как ТС разобрался почему у него не работало, будет все работать и через SoftSerial, если сделать без ошибок.
Плюсы от этого очевидные, программа надежней, легче читается и как следствие этого у вас не разнесет мозг.
Я уже объяснял. Потому что esp8266 arduino из коробки умеет все тоже самое что SoftSerial. Просто надо оторвать 5-ю точку и прочесть документацию на esp8266 arduino. А копипастить корявые примеры из сети конечно легче.
 

enjoynering

Well-known member
Автор, модератор CodeNameHawk прав:

чистить буфер после каждого Serial.swap(), может избавить от неприятных неожиданностей.
Вы ещё не поняли откуда у вас появлялись китайские иероглифы в письме? :) Это как раз куски отладочной информации esp8266 из буфера.
 

CodeNameHawk

Moderator
Команда форума
Я уже объяснял. Потому что esp8266 arduino из коробки умеет все тоже самое что SoftSerial.
Вышло не понимание, ТС и использовал библиотеку, что идет с иде, просто в версии 2,5,2 она у него перестала работать.
И он вместо, того, что бы разобраться почему не работает, начал пользоваться свапом, что мне впрочем не мешает.
  • // БИБЛИОТЕКИ
#include <SoftwareSerial.h> // GSM sim800L
 

Vypra

Member
вот здесь вы переключаетесь на SIM800 (gpio15 и gpio13) и передаете размер письма и тело письма. пока все логично
Код:
Serial.swap();
  delay (500);
  Serial.println("AT+SMTPBODY=" + String(message.length()));
  //Serial.println("AT+SMTPBODY=5"); // или так
  delay (500);
  Serial.println(message + "\r\n" + (String)((char)26));
  delay (500); // без паузы не шлет
а дальше у меня взорвался мозг. вы переключаетесь на обычный COM порт (gpio01 и gpio03) и шлете в него команды SIM800 для завершения передачи письма
Код:
  Serial.swap();
  delay (500);
  sendATCommand("AT+SMTPSEND", true);
  delay (6000);
  sendATCommand("AT+SAPBR=0,1", true);
ВОПРОС - как SIM800 их получит если команды вы шлете на gpio01 и gpio03, а SIM800 подключен к gpio15 и gpio13?

enjoynering, наверное на Вас подействовала усталость в столь поздний час и Вы не внимательно прочитали код. Давайте еще разок на свежую голову:

Код:
// ОСНОВНОЙ ЦИКЛ
// Мы на GPIO 1, 3
 Serial.swap(); // Переключаемся на GPIO 13, 15
  delay (500);
  Serial.println("AT+SMTPBODY=" + String(message.length())); // создаем тело сообщения
  delay (500);
  Serial.println(message + "\r\n" + (String)((char)26)); // вводим текст сообщения. Мы еще на GPIO 13, 15
  delay (500);
  Serial.swap();  // Переключаемся на GPIO 1, 3
  delay (500);
// Мы на GPIO 1, 3
  sendATCommand("AT+SMTPSEND", true); // Переходим в sendATCommand


// ВНЕШНЯЯ ФУНКЦИЯ
String sendATCommand(String cmd, bool waiting)
{
// Мы на GPIO 1, 3
  Serial.println(cmd);                                            // Пишем команду в монитор порта ПК для себя, чтоб видеть что будем посылать СИМ800. Но мы на GPIO 1, 3.
  delay (300);
  Serial.swap();                                                  // Переключаемся на GPIO 13, 15
  Serial.flush();
  delay (300);
  String _resp = "";                                             
  Serial.println(cmd);                                            // Даем команду SIM800. Мы пока на GPIO 13, 15
 
if (waiting)                                                   
  {
    _resp = waitResponse();                          // Если нужно ждать, идем  в  String waitResponse(). Мы пока на GPIO 13, 15.         
  }
  else
  {
    Serial.swap();    // Если не нужно ждать, мы переключимся на на GPIO 1, 3, и выйдем в основной цикл, чтоб начать все сначала.
    Serial.flush();
    delay (300);
  }
  return _resp;                                                  
}


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

String waitResponse()                                            
{
// Мы пока на GPIO 13, 15
  String _resp = "";                                             
  unsigned long _timeout = millis() + 4000;                     
  do
  { delay(0);

    if (millis() > _timeout )
    {
      Serial.swap();                                             // Если СИМ800 не отвечает (ошибка), мы переключаемся на на GPIO 1, 3, печатаем себе  Timeout... и уходим в основной цикл.
      Serial.flush();
      delay (300);
      Serial.println("Timeout...");                             
      break;
    }

    if (Serial.available())
    {
      _resp = Serial.readString();                               
      _response = _resp;
      Serial.swap();    // Если СИМ800 ответила, мы переключаемся на GPIO 1, 3, печатаем себе ответ СИМ800 и выйдем в основной цикл, чтоб начать все сначала.
      Serial.flush();
      delay (300);
      Serial.println(_resp);                                     
      break;
    }
  }
  while (1) ;                                                      
  return _resp;                                                     
}
Итак, все в рамках Ваших рекомендаций. Все работает.
 
Сверху Снизу