• Система автоматизации с открытым исходным кодом на базе 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 команды - сообщение без проблем приходит, но пустое.
 
Сверху Снизу