Некоторый код работает только при подключении последовательного порта USB

Я использую Arduino Uno в качестве своего микроконтроллера, но у меня странное поведение. Мне нужно запустить несколько функций одновременно. Один для получения значения GPS и температуры, затем отправляет каждое значение на номер телефона пользователя при получении запроса модулем SIM800L GSM, а другой для отображения этих значений на ЖК-дисплее I2C. Все работает нормально, когда мой USB-порт подключен к моему компьютеру. Но когда я попытался отключить USB и использовать внешний источник питания от Li-Po батареи, я не могу получить ответ от модуля SIM800L всякий раз, когда я отправляю сообщение с запросом.

Когда я попытался создать отдельную программу (просто получил сообщение с запросом, а затем отправил ответ с помощью SIM800L), она работает нормально, даже несмотря на использование внешнего источника питания (Li-Po аккумулятор) без подключения USB-порта. Еще одно странное поведение заключается в том, что когда я использовал оба аккумулятора Li-Po и подключил USB-порт, а затем отсоединил USB-порт, он снова работает нормально. Но когда я отсоединил аккумулятор, а затем снова подключил его без подключения USB-порта, SIM800L не смог отправить ответ. Что случилось ?

Это мой полный код:



#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include "DHT.h"

//sms
char ReceivedSms;
short DHT_OK=-1, GPS_OK=-1;
String DataSms;
int _timeout;
String _buffer;
String number = "+62811XXXXXX";

//dht
#define DHTPIN 5
#define DHTTYPE DHT11

LiquidCrystal_I2C lcd(0x27,20,4);
SoftwareSerial sim800l(2,3);
DHT dht(DHTPIN, DHTTYPE);


// Объект TinyGPS++
TinyGPSPlus gps;


void setup()
{
  Serial.begin(9600);
  sim800l.begin(9600);
  dht.begin();
  lcd.init();                      // инициализировать ЖК-дисплей
  // Выведите сообщение на ЖК-дисплей.
  lcd.backlight();
  _buffer.reserve(50);
  ReceiveMode();
}

void loop()
{
   displayInfo();
 
}

void displayInfo()
{
  String RSMS;

  while(sim800l.available() > 0) {
      ReceivedSms = sim800l.read();
      RSMS.concat(ReceivedSms);
      GPS_OK = RSMS.indexOf("All");
   }
   
  if (gps.location.isValid())
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Latitude  : ");
    lcd.println(gps.location.lat(), 6);
    lcd.setCursor(0,1);
    lcd.print("Longitude : ");
    lcd.println(gps.location.lng(), 6);
    delay(5000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Suhu       : ");
    lcd.println(dht.readTemperature());
    lcd.setCursor(0,1);
    lcd.print("Kelembaban : ");
    lcd.println(dht.readHumidity());
    delay(2000);
   
    if(GPS_OK!=-1)
        {
        String link = "http://www.google.com/maps/place /" + Строка(gps.location.lat(),6) + "," + Строка(gps.location.lng(),6);
        DataSms = "ALL\nSuhu = "+String(dht.readTemperature(),1)+" C"+" \nKelembaban ="+String(dht.readHumidity(),1)+" %"+" \nMaps = "+link;
        SendMessage();
        ReceiveMode();
        GPS_OK = -1;
        }
  }
  else
  {
 
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("GPS not found");
    delay(2000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Suhu      :");
    lcd.println(dht.readTemperature());
    lcd.setCursor(0,1);
    lcd.print("Kelembaban:");
    lcd.println(dht.readHumidity());
    delay(2000);
   
    if(GPS_OK!=-1)
       {
        DataSms = "ALL\nSuhu = "+String(dht.readTemperature(),1)+" C"+" \nKelembaban ="+String(dht.readHumidity(),1)+" %"+" \nMaps = Lokasi Tidak Ditemukan";
        SendMessage();       
        ReceiveMode();
        GPS_OK = -1;
       }
  }

}

String _readSerial() {
  _timeout = 0;
  while  (!sim800l.available() && _timeout < 12000  )
  {
    delay(13);
    _timeout++;
  }
  if (sim800l.available()) {
    return sim800l.readString();
  }
}

void ReceiveMode() {
  sim800l.println("AT");
  delay(100);
  sim800l.println("AT+CMGF=1");
  delay(100);
  sim800l.println("AT+CNMI=2,2,0,0,0");
  delay(100);
}

void SendMessage()
{
  //Serial.println ("Отправка сообщения");
  sim800l.println("AT+CMGF=1");    //Переводит GSM-модуль в текстовый режим
  delay(1000);
  //Serial.println ("Установить номер SMS");
  sim800l.println("AT+CMGS=\"" + number + "\"\r"); //Номер мобильного телефона для отправки сообщения
  delay(1000);
  String SMS = "Hello from 800L...";
  sim800l.println(DataSms);
  delay(100);
  sim800l.println((char)26);// ASCII-код CTRL+Z
  delay(1000);
  _buffer = _readSerial();
}

Просто для вашей информации я использую Li-Po аккумулятор 7,4 В 2200 мАч

, 👍1

Обсуждение

Я подозреваю, что у вас возникают проблемы с питанием, когда вы не подключены к USB. Используя вольтметр, пожалуйста, измерьте напряжение питания Uno, если он не подключен к USB. Также проверьте напряжение питания SIM800 при отключении., @jwh20

Вы никогда не вызываете "gps.encode (...)` - и в любом случае, где * подключен * ваш GPS? Я не вижу для этого программного обеспечения (которое, кстати, может прослушиваться только на ОДНОМ интерфейсе одновременно)., @Majenko

Это звучит так, но я только предполагаю, что у вас проблема с заземлением. Убедитесь, что все основания соединены вместе. Я предполагаю, что вы подключаете липо-аккумулятор к Vin, а не к контакту 5V. Напряжение батареи сильно колеблется для стабильной работы. Обязательно следуйте рекомендациям jwh20, и вы должны быть работоспособны., @Gil

@Majenko Я использую цифровой вывод 0 и 1 для своего GPS .. это работает нормально, хотя мне сначала нужно отключить вывод GPS VCC во время загрузки моей программы, @Proxcentaur

@Gil Я подключаю Li-Po аккумулятор к моему понижающему 5 В, затем я подключаю выход этого понижающего к 5 В контакту Arduino, можно ли напрямую подключить Li-Po аккумулятор 7,4 В к 5 В контакту Arduino?, @Proxcentaur

Здесь я прилагаю свою простую схему подключения, показывающую, как мне включить мой Arduino и другую часть: https://github.com/Proxcentaur/track-gps-sim/blob/main/wiring.PNG, @Proxcentaur

@Majenko Я пробовал использовать 2 последовательных программного обеспечения в Arduino Uno, но это не работает. Затем я решил использовать цифровые контакты 0 и 1, @Proxcentaur

@jwh20 Я измерил это, напряжение питания Uno, когда оно не подключено к USB и просто подключено к батарее, составляет 8,04 В, @Proxcentaur

Контакты 0 и 1 конфликтуют с последовательным интерфейсом usb. Вы не можете просто использовать и то, и другое., @Majenko


1 ответ


1

Я решил свою проблему, нажав на вывод кнопки сброса Arduino после того, как все мои компоненты получили источник питания. Почему-то я не могу объяснить, почему это работает после выполнения этой простой вещи

,

Приятно слышать! Это всегда помогает накормить их хорошими электронами:-), @Gil