GSM не может прочитать SMS, если Arduino не был сброшен в первый раз после включения питания

Я использую GSM-модуль с Arduino вместе с Node MCU. У меня есть источник питания 9 В, 2 А в разъеме постоянного тока Arduino и GSM Shield. Node MCU питается от 3,3 В Arduino. Я могу нормально получать сообщения в GSM, когда USB-порт Arduino (включая блок питания, о котором я упоминал ранее) подключен к ноутбуку и контролируется с помощью последовательного монитора. Однако, если я отключу USB-порт, GSM больше не сможет получать сообщения, но когда я нажму кнопку сброса Arduino, он снова начнет получать сообщения. Почему это работает только тогда, когда я сначала сбрасываю Arduino после включения питания?

#include <SoftwareSerial.h>
#include <Wire.h>

SoftwareSerial gsmSerial(2, 3);

char incomingByte;
String inputString;

// Конфигурации выводов.

const int outlet1Pin = 4;
const int outlet2Pin = 5;
const int outlet3Pin = 6;

const int ping1Pin = 7;
const int ping2Pin = 8;
const int ping3Pin = 9;
const int ping4Pin = 10;
const int ping5Pin = 11;
const int ping6Pin = 12;
const int signalPin = 13;

const int pingWaitTime = 3000;

void setup()
{
  Serial.begin(9600);
  gsmSerial.begin(9600);

  pinMode(outlet1Pin, INPUT);
  pinMode(outlet2Pin, INPUT);
  pinMode(outlet3Pin, INPUT);

  pinMode(ping1Pin, OUTPUT);
  pinMode(ping2Pin, OUTPUT);
  pinMode(ping3Pin, OUTPUT);
  pinMode(ping4Pin, OUTPUT);
  pinMode(ping5Pin, OUTPUT);
  pinMode(ping6Pin, OUTPUT);
  pinMode(signalPin, OUTPUT);

  initGSM();
  //Последовательный.flush();
  //gsmSerial.flush();
  //sendSMS("Тестовая отправка.");


}

void loop()
{
  if (gsmSerial.available())
  {
    digitalWrite(signalPin, HIGH);

    delay(500);

    //Serial.println("Серийный номер доступен.");

    while (gsmSerial.available())
    {
      incomingByte = gsmSerial.read();
      inputString += incomingByte;
    }

    inputString.toUpperCase();



    checkCommandAction(inputString);


    if (inputString.indexOf("OK") == -1)
    {
      gsmSerial.println("AT+CMGDA=\"DEL ALL\"");
      delay(1000);
    }

    inputString = "";
    gsmSerial.flush();

  }
  digitalWrite(signalPin, LOW);

}

void sendSMS(String text)
{
  Serial.println("Sending Text...");

  gsmSerial.println("AT+CMGF=1");
  delay(1000);

  gsmSerial.print("AT+CMGS=\"+numberhere\"\r");

  delay(1000);

  gsmSerial.print(text);
  delay(1000);

  gsmSerial.print((char)26);
  delay(1000);

  gsmSerial.println();
  Serial.println("Message sent!");
  delay(1000);
}

void initGSM()
{
  gsmSerial.println("ATE0");
  while (!gsmSerial.available())
  {
    gsmSerial.println("AT");
    delay(500);
    Serial.println("Connecting...");
  }

  Serial.println("Connected!");

  gsmSerial.println("AT+CMGF=1");
  delay(500);
  gsmSerial.println("AT+CNMI=1,2,0,0,0");
  delay(500);
  gsmSerial.println("AT+CMGL=\"REC UNREAD\"");
  delay(500);
  gsmSerial.println("AT+CMGDA=\"DEL ALL\"");
  delay(500);

  Serial.println("All messages deleted!");

  Serial.println("Sending Text...");

  gsmSerial.println("AT+CMGF=1");
  delay(500);

  gsmSerial.print("AT+CMGS=\"+639776811077\"\r");

  delay(500);

  gsmSerial.print("Device Initialized!");
  delay(500);

  gsmSerial.print((char)26);
  delay(500);

  gsmSerial.println();

  Serial.println("Message sent!");
  delay(500);
}

void checkCommandAction(String command)
{

  //Serial.println("Проверить команду.");

  if (command.indexOf("O1ON") > -1)
  {

    digitalWrite(ping1Pin, !LOW);
    delay(pingWaitTime);
    digitalWrite(ping1Pin, !HIGH);
    Serial.println("O1ON Enter");
    sendSMS("Outlet 1 Turned ON by text.");

  }
  else if (command.indexOf("O1OFF") > -1)
  {
    digitalWrite(ping4Pin, !LOW);
    delay(pingWaitTime);
    digitalWrite(ping4Pin, !HIGH);
    Serial.println("O1OFF");
    sendSMS("Outlet 1 Turned OFF by text.");
  }
  else if (command.indexOf("O2ON") > -1)
  {
    digitalWrite(ping2Pin, !LOW);
    delay(pingWaitTime);
    digitalWrite(ping2Pin, !HIGH);
    Serial.println("O2ON");
    sendSMS("Outlet 2 Turned ON by text.");
  }
  else if (command.indexOf("O2OFF") > -1)
  {
    digitalWrite(ping5Pin, !LOW);
    delay(pingWaitTime);
    digitalWrite(ping5Pin, !HIGH);
    Serial.println("O2OFF");
    sendSMS("Outlet 2 Turned OFF by text.");
  }
  else if (command.indexOf("O3ON") > -1)
  {
    digitalWrite(ping3Pin, !LOW);
    delay(pingWaitTime);
    digitalWrite(ping3Pin, !HIGH);
    Serial.println("O3ON");
    sendSMS("Outlet 3 Turned ON by text.");

  }
  else if (command.indexOf("O3OFF") > -1)
  {
    digitalWrite(ping6Pin, !LOW);
    delay(pingWaitTime);
    digitalWrite(ping6Pin, !HIGH);
    Serial.println("O1OFF");
    sendSMS("Outlet 3 Turned OFF by text.");
  }
  else if (command.indexOf("CHECKSTATE") > -1)
  {
    int state1 = !digitalRead(outlet1Pin);
    int state2 = !digitalRead(outlet2Pin);
    int state3 = !digitalRead(outlet3Pin);

    String toSend = "";
    toSend += "Outlet 1: ";
    toSend += String((state1) ? ("ON") : ("OFF"));
    toSend += "Outlet 2: ";
    toSend += String((state2) ? ("ON") : ("OFF"));
    toSend += "Outlet 3: ";
    toSend += String((state3) ? ("ON") : ("OFF"));

    sendSMS(toSend);
  }
}

void turnPingsOn()
{
  // Контакты, к которым подключены пинги,
  // настраивается как INPUT_PULL up, поэтому нам нужно высокое
  // это по умолчанию.

  digitalWrite(ping1Pin, HIGH);
  digitalWrite(ping2Pin, HIGH);
  digitalWrite(ping3Pin, HIGH);
  digitalWrite(ping4Pin, HIGH);
  digitalWrite(ping5Pin, HIGH);
  digitalWrite(ping6Pin, HIGH);
}

, 👍0


1 ответ


1

Теоретически не следует полагаться на источник питания 3,3 В Arduino для питания платы NodeMCU, его мощности недостаточно, особенно при передаче данных по WIFI .

Вы извлекаете USB-накопитель, когда система находится в рабочем состоянии? Если так, то вы, вероятно, задеваете разные части, которые не любят задевания, и поэтому они ломаются.

Если вы извлекаете USB и ПОТОМ включаете систему, что происходит, когда вы выключаете систему и включаете ее снова через 10 секунд? Я предполагаю, что она не будет получать сообщения. Так что есть разница между подачей питания и сбросом платы, что подразумевает, что вы очень ограничены в своем блоке питания.

Если вы используете модуль SIM800 (?), им нужно 2 Ампера для передачи, поэтому если вы подаете только 2 А, то может не хватить мощности для холодного запуска, но при сбросе она есть. Так что если вы можете попробовать больше мощности, это может помочь.

Другая мысль может заключаться в том, что у вас нет надлежащего заземления (настенные бородавки обычно не заземляются), поэтому ваше USB-подключение действует как заземление. Если это так, то оно должно работать, когда ваш ПК выключен.

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

,