Управление релейным модулем esp-01s с помощью sms

Тема в разделе "ESP8266, ESP32", создана пользователем denis1667, 18 фев 2023.

  1. denis1667

    denis1667 Нуб

    Здравствуйте.Подключил sim900 к релейному модулю esp01s v1.0 по схеме:TX-GPIO0,RX-GPIO2 перерезал дорожку идущую к GPIO0 и кинул ее на GPIO3 так как изначально GPIO0 управляет реле.Проблема в том,что после подачи питания и посылки sms (sms доходит)реле не переключается.Но стоит кратковременно нажать кнопку RST то все прекрасно работает.Заливал этот же скетч в NodeMcu v3 такой проблемы нет.Может я не правильно,что то подключаю или надо поправить скетч?Если не сложно подскажите хоть в каком направлении искать.Схему и скетч прилагаю.
    [​IMG]
     

    Вложения:

    Последнее редактирование модератором: 18 фев 2023
  2. Airbus

    Airbus Радиохулиган Модератор

    Вопрос1 Почему использовали именно esp8266 для работы с GSM модулем?
    Вопрос2 для чего перерезал дорожку идущую к GPIO0 и кинул ее на GPIO3?
    Что пока вижу сразу
    1Неправильное подключение к GSM модулю должно быть. RX-TX а TX-RX. У Вас ТХ зачем то на GPIO0 Что у Вас там?
    2На esp8266-01 нет подтяжек выводов их надо делать ручками типо так. На Node mcu и Witty подтяжки есть на плате поэтому работает все сразу. Скетч не смотрел но могу глянуть если вставите правильно
    [​IMG]
     
    denis1667 нравится это.
  3. denis1667

    denis1667 Нуб

    1.Использовал esp8266 потому,что показалось проще.Дорожку перерезал так как подключил на GPIO0-TX sim900,а для управления реле использовал GPIO3.Пробовал подключать RX-TX а TX-RX не работает.

    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(0, 2); // установка контактов 2 и 3 для программного порта (для микроконтроллера ардуино убать букву D)
    #define RELE 3 // (для микроконтроллера ардуино убать букву D)
    bool rele = LOW;


    char* adminNumber[]={"+70000000000"};
    int8_t i;
    void setup()
    {
    Serial.begin(115200);
    gprsSerial.begin(115200);
    pinMode(RELE, OUTPUT);
    digitalWrite(RELE, LOW);

    // настройка приема сообщений
    gprsSerial.print("AT+CMGF=1\r"); // устанавливаем текстовый режим смс-сообщения
    delay(500); //
    gprsSerial.print("AT+IFC=1, 1\r"); // устанавливаем программный контроль потоком передачи данных
    delay(500);
    gprsSerial.print("AT+CPBS=\"SM\"\r"); // открываем доступ к данным телефонной книги SIM-карты
    delay(500);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); // включает оповещение о новых сообщениях, новые сообщения приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>",
    //на следующей строчке с первого символа идёт содержимое сообщения
    delay(700);
    }
    String currStr = ""; // если эта строка сообщение,

    boolean isStringMessage = false; //  то ставим флаг на разрешение оброботки SMS


    void loop()
    {
    if (!gprsSerial.available())// если не данных от модуля SIM800l, то дальше не идем.
    return;
    char currSymb = gprsSerial.read(); // записываем в переменую символы, которые получили от модуля.
     
    if ('\r' == currSymb) // если получили символ перевода коректи в начало строки, это означает что передача сообщения от модуля завершена.
    {
    if (isStringMessage) { // если текущая строка – сообщение, то…
    if (!currStr.compareTo("On")) { // если текст сообщения совпадает с "on",
    rele = HIGH;                        // то включаем низкоуровневое реле.
    digitalWrite(RELE, rele);
    }
    if (!currStr.compareTo("Off")) { // если текст сообщения совпадает с "off",
    rele = LOW;                        // то выключаем низкоуровневое реле.
    digitalWrite(RELE, rele);
    }
     
      isStringMessage = false;
      }
    else {
    if (currStr.startsWith("+CMT"))
    { // если текущая строка начинается с "+CMT", то следующая сообщение
     
       for (i = 0; i <= 1; i++)
       { // число 3 - это количество заданных тел.номеров.
         if (currStr.indexOf(adminNumber[i])) //сверяем номер с номером прешедним SMS
         {
          Serial.println(adminNumber[i]);
          isStringMessage = true;
          break;
         }
       }
      }
    }
    currStr = "";
    }
    else if ('\n' != currSymb) { //  игнорируем второй символ в последовательности переноса строки: \r\n , и
    currStr += String(currSymb); //дополняем текущую команду новым сиволом
    }
    }
     
  4. fps

    fps Нерд

    Не стоит так делать. На TX sim900 при включении может оказаться низкий уровень, и esp загрузится в режиме прошивки.

    На esp01s есть
     
    denis1667 нравится это.
  5. denis1667

    denis1667 Нуб

    Так все работает при нажатии кнопки RST на релейном модуле.А при старте не работает.Наверное как вы и сказали при старте переходит в режим прошивки.
     
  6. denis1667

    denis1667 Нуб

    Конечно может быть и легче было подключить sim900 к nodemsu,но все же хочется разобраться почему не работает с esp01s.Может можно как то программно сделать перезагрузку при старте esp?
     
  7. Bott

    Bott Гик

    Скетч вроде нормальный. Можно попробовать подтянуть GPIO0 к плюсу резистором 3—5 ком. Кстати у Вас соединены EN(4)и VCC(8)?
     
    denis1667 нравится это.
  8. denis1667

    denis1667 Нуб

    Скетч рабочий.Все же работает, только чего то не хватает для работы при запуске esp-01s ,а вот чего в этом то и вопрос.EN и VCC я не соединял.Мне кажется они уже соединены в esp-01s. ESP_01S.jpg
     
  9. denis1667

    denis1667 Нуб

    Мне кажется вся проблема в подключении TX sim900 кGPIO0 .Только по другому подключить не получается.
     
  10. Airbus

    Airbus Радиохулиган Модератор

    А так?Проверяйте.Мой Компилятор проглотил.
    Код (Text):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(0, 2); // установка контактов 2 и 3 для программного порта (для микроконтроллера ардуино убать букву D)
    #define RELE 3 // (для микроконтроллера ардуино убать букву D)

    char* adminNumber[]={"+70000000000"};
    int8_t i;
    void setup()
    {
    delay(5000);//ждемс
    gprsSerial.begin(9600);//Самый любимый бодрейт для GSM
    pinMode(RELE, OUTPUT);
    digitalWrite(RELE, LOW);

    // настройка приема сообщений
    gprsSerial.print("AT+CMGF=1\r"); // устанавливаем текстовый режим смс-сообщения
    delay(500); //
    gprsSerial.print("AT+IFC=1, 1\r"); // устанавливаем программный контроль потоком передачи данных
    delay(500);
    gprsSerial.print("AT+CPBS=\"SM\"\r"); // открываем доступ к данным телефонной книги SIM-карты
    delay(500);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); // включает оповещение о новых сообщениях, новые сообщения приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>",
    //на следующей строчке с первого символа идёт содержимое сообщения
    delay(700);
    }
    String currStr = ""; // если эта строка сообщение,

    boolean isStringMessage = false; //  то ставим флаг на разрешение обработки SMS


    void loop()
    {
    if (!gprsSerial.available())// если не данных от модуля SIM800l, то дальше не идем.
    return;
    char currSymb = gprsSerial.read(); // записываем в переменую символы, которые получили от модуля.
    if ('\r' == currSymb) // если получили символ перевода коректи в начало строки, это означает что передача сообщения от модуля завершена.
    {
    if (isStringMessage) { // если текущая строка – сообщение, то…
    if (!currStr.compareTo("On")) { // если текст сообщения совпадает с "on",
                                                      // то включаем низкоуровневое реле.
    digitalWrite(RELE, HIGH);
    }
    if (!currStr.compareTo("Off")) { // если текст сообщения совпадает с "off",
                                                      //  выключаем низкоуровневое реле.
    digitalWrite(RELE, LOW);
    }
      isStringMessage = false;
      }
    else {
    if (currStr.startsWith("+CMT"))
    { // если текущая строка начинается с "+CMT", то следующая сообщение
       for (i = 0; i <= 1; i++)
       { // число 3 - это количество заданных тел.номеров.
         if (currStr.indexOf(adminNumber[i])) //сверяем номер с номером прешедним SMS
         {
          Serial.println(adminNumber[i]);
          isStringMessage = true;
          break;
         }
       }
      }
    }
    currStr = "";
    }
    else if ('\n' != currSymb) { //  игнорируем второй символ в последовательности переноса строки: \r\n , и
    currStr += String(currSymb); //дополняем текущую команду новым сиволом
    }
    }
    В коде ничего Вас не смутило?Вы зачем то запускаете Serial-Железный USART.Он использует ноги 2 и 3. Потом запускаете программный Serial . Он использует ноги 2 и 0. Конфликта не наблюдаете?
     
    Последнее редактирование: 20 фев 2023
    denis1667 нравится это.
  11. denis1667

    denis1667 Нуб

    Конфликта не не было.Спасибо за правку скетча,все работает.Только правда также как и с исходным скетчем.После загрузки посылаю смс она доходит,но реле не перещелкивается.А если при подаче питания или после загрузки (это не важно) нажать на кнопку RST все начинает прекрасно работать.Мне кажется,что в начале не загружается esp01s (не дает sim900),а после перезагрузки кнопкой все работает.Как бы программно сделать перезагрузку после старта.Или скорей всего надо подключать через RX и TX.Пробовал,но не работает только часто щелкает реле.Надо еще попробовать с вашими исправлениями подключить по uart.
     
  12. Airbus

    Airbus Радиохулиган Модератор

    А попробуйте в setup в первой строчке поставить delay на 5 секунд. Возможно GSM модуль должен сначала загрузиться. Завтра попробую Ваш скетч на Ардуино. Там вроде не должно проблем возникнуть. Если все ровно будем дальше копать. Самому интересно стало. Правда esp8266-01 то еще авно я от них отказался в пользу witty. Да и еще можно подтянуть GPIO0 к VCC через резюк 3 килоома. На всяк случай-не повредит.Кстати в скетч уже внёс поправку
     
    Последнее редактирование: 20 фев 2023
    denis1667 нравится это.
  13. denis1667

    denis1667 Нуб

    Попробовал.Все тоже самое.Подтянул GPIO0 только через 4.7кОм тоже нечего.Если попробуете на Ардуино то скорей всего все будет работать замечательно.У меня же с nodemsu работает.Это только происходит с esp01s.И как я думаю из-за того,что подключаю sim900 к GPIO0 и GPIO2 esp01s и мешаю ее запуску.Кажется нужно как то сделать,что бы сначала запустилась esp ,а уж потом sim900.Или наоборот.И еще забыл сказать,Что после первой правки скетча произошли изменения.Реле после включения самопроизвольно стало отключатся через секунд 20.В исходном скетче такого нет.
     
  14. denis1667

    denis1667 Нуб

    Попробовал еще вот такой скетч от ардуинки.Только срабатывает на звонки.Все тоже самое,работает только после нажатия кнопки RST.
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(0, 2); //
    unsigned long timing; // Переменная для хранения точки отсчета

    void setup()

    { Serial.begin(115200);
    mySerial.begin(115200);
    pinMode(3, OUTPUT); // ЭТО РЕЛЕ
    digitalWrite(3, LOW); // ПОДТЯЖКА ПОРТА
    mySerial.println("ATE0"); //ОТКЛ ЭХО
    delay(5000);
    mySerial.println("AT+IPR=115200;");
    delay(300);
    mySerial.println("AT+CLIP=1"); // ВКЛ ОПРЕДЕЛИТЕЛЬ НОМЕРА
    delay(300);
    mySerial.println("AT+CLIP=1"); // ВКЛ ОПРЕДЕЛИТЕЛЬ НОМЕРА
    delay(300);
    }

    void loop()
    {
    { digitalWrite(13, HIGH);// ИНДИКАЦИЯ СВЯЗИ СИМ900 И МИКРОК.
    mySerial.println("AT"); // РЕГИСТАЦИЯ СЕТИ
    if (millis() - timing > 500){ // Вместо 10000 подставьте нужное вам значение паузы
    if ( mySerial.find("OK")) // ОТВЕТ ОК
    { Serial.println("SOEDINENIE OK");
    digitalWrite(13, LOW); }// МИГАЕМ ВСЕ ОК
    else{ Serial.println("SOEDINENIE NO");
    digitalWrite(13, HIGH); // ЕСЛИ НЕ НАШЛИ ГОРИМ
    }
    timing = millis();

    }

    /////////////ИЩЕМ ЗВОНОК/////////////
    if (mySerial.find("CLIP:")) // если нашли RING
    {
    Serial.println("RING!");
    delay(200);
    mySerial.println("AT+CLIP=1"); // ВКЛ ОПРЕДЕЛИТЕЛЬ НОМЕРА
    delay(500);
    while (1) // в цикле
    {
    if (mySerial.find("+79000000000")) { // ищим номер телефона, если нашли
    { digitalWrite(3, !digitalRead(3)); // инвертируем A1
    delay(200);
    Serial.println("INVERSIA RELE");
    ////////////////////////////////////////
    delay(200);
    if( digitalRead(3)==HIGH)//ЕСЛИ РЕЛЕ ВКЛ
    { mySerial.println("AT+CHUP;"); // сбрасываем вызов
    delay(200);
    Serial.println("VKL RELE");
    }
    else
    {
    Serial.println("OTKL RELE");
    delay(6000);
    mySerial.println("AT+CHUP;"); // сбрасываем вызов
    delay(500);

    }
    if (mySerial.find("CLIP:"))
    break;
    }

    }

    else { // иначе
    mySerial.println("AT"); // спрашиваем состояние модема
    delay(200);
    if (mySerial.find("OK"))
    break; // и если он в "готовности", выходим из цикла
    } // если звонок в процессе, возвращает +CPAS: 3
    } // и крутимся дальше

    mySerial.println("AT+CHUP;"); // сбрасываем вызов
    delay(200);

    }
    }
    }
     
  15. SergeiL

    SergeiL Оракул Модератор

    Проблема точно в GIP0
    Модем стартует с задержкой
    На GPIO0 низкий уровень, она вваливается в режим программирования. В реле управление реле повешено на GPIO3 поэтому не работает аппаратный serial. Не нужен он им был. Зато его можно притянуть к GND в реле, чтобы не щелкало реле. Потому что включение реле сделано по 1. Если бы они догадались сделать включение по 0, его можно было бы повесить на GPIO2.
    По хорошему нужно освобождать GPIO0, реле переносить на GPIO2, а UART на аппаратный GPIO1 и 3. Но реле может щелкать при включении. Только нужно посмотреть есть ли подтяжка управления реле на самом реле к GND иначе тоже стартовать не будет. Убрать ее нужно будет на GPIO2 тоже нужен высокий уровень при старте. Хотя если там конденсатор и резистор, может и так прокатит. Но не думаю RX - это вход.
     
    denis1667 нравится это.
  16. Airbus

    Airbus Радиохулиган Модератор

    Вот видос от нашего форумчанина—Пушного Зверя. Он там с этим реле колдует. Может это поможет?

     
    denis1667 нравится это.
  17. denis1667

    denis1667 Нуб

    Большое спасибо.Это уже хоть,что то ,Есть над чем подумать.А ни как нельзя программно сделать перезагрузку с задержкой esp?
     
  18. Airbus

    Airbus Радиохулиган Модератор

    Програмно-нет. Нету там Вачдога. Полагаю интерес чисто академический? Работал с разными GSM модулями и даже с телефонами Сименс в качестве онных. Но esp8266-01 в качестве управляющего контроллера-плохая идея. Ардуино или голый МК самое то. Или node mcu в крайнем случае. Кстати видел фичу-притянуть GPIO0 к плюсу резюками 5-7 ком
     
  19. denis1667

    denis1667 Нуб

    В общем я понял,что нужно завязывать с esp8266-01 и сделать на node mcu.
     
  20. Airbus

    Airbus Радиохулиган Модератор

    Лучше на Ардуине—там частота стабилизирована кварцем. Бодрейт не уплывает. Если не будет перепадов температуры—то все в порядке но а если планируются то лучше подстраховаться.Несколько лет назад проводил такой эксперимент—на балконе при +10 пулял в USART строку. Потом пальцем дотронулся до esp8266. Вместо букв пошли кракозяблы—бодрейт уплыл. Да и node mcu жалко под это дело использовать. Она умнее и мощнее Ардуины.
     
    denis1667 нравится это.