Некоторый код работает только при подключении последовательного порта 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 мАч
@Proxcentaur, 👍1
Обсуждение1 ответ
Я решил свою проблему, нажав на вывод кнопки сброса Arduino после того, как все мои компоненты получили источник питания. Почему-то я не могу объяснить, почему это работает после выполнения этой простой вещи
Приятно слышать! Это всегда помогает накормить их хорошими электронами:-), @Gil
- AT-команда не отвечает на последовательный монитор
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- SIM800L не регистрируется в сети
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Как читать и записывать на устройство rs232 с/на Arduino
- Программное обеспечениеSerial с ESP8266
- Проблема с Software Serial: нет ответа
Я подозреваю, что у вас возникают проблемы с питанием, когда вы не подключены к 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