GPS не отображается
Итак, сейчас я пытаюсь реализовать проект, в котором, если мой датчик активен, он будет отображать мое местоположение. Но, похоже, когда датчик активен, он отображает на моем ЖК-дисплее только местоположение с координатами широты: 0,00 и долготы: 0,00. помогите мне решить эту проблему.
#include <LiquidCrystal.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(9,10);
char msg;
int knockPin = 7; // Используем контакт 7 как вход
int knockVal = HIGH; // Здесь мы записываем наши измерения удара
boolean bAlarm = false;
int knockValue = digitalRead(6);
unsigned long lastKnockTime; // Записываем время, когда мы измерили удар
int knockAlarmTime = 500; // Количество миллисекунд, в течение которых сигнализация детонации будет оставаться высокой
static const int RXPin = 13, TXPin = 8;
static const int GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup ()
{
mySerial.begin(19200); // Установка скорости передачи данных GSM-модуля
delay(20000);
ss.begin(GPSBaud);
Serial.begin(115200);
Serial.println("GSM SIM900A BEGIN");
pinMode (knockPin, INPUT) ; // вход от KY-031
pinMode (6, OUTPUT);
lcd.begin(16, 2);
String latitude = String(gps.location.lat(),6);
String longitude = String(gps.location.lng(),6);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("VeCAS System");
lcd.setCursor(3,1);
lcd.print(">>Begin>>");
delay (5000);
}
void loop ()
{
knockVal = digitalRead (knockPin) ; // прочитать значение KY-031
if (knockVal == LOW) // Если мы видим стук
{
lastKnockTime = millis(); // записываем время удара
// Следующее не нужно прокручивать экран вывода
if (!bAlarm)
{
Serial.println("KNOCK, KNOCK");
bAlarm = true;
digitalWrite (6, HIGH);
Serial.println(knockVal);
delay(100);
while (ss.available() > 0)
gps.encode(ss.read());
if (gps.location.isUpdated())
lcd.clear();
lcd.setCursor(4,0);
lcd.print("KNOCK!");
lcd.setCursor(3,1);
lcd.print("Detected");
delay (5000);
lcd.clear();
Serial.print("Latitude= ");
Serial.print(gps.location.lat(), 6);
Serial.print(" Longitude= ");
Serial.println(gps.location.lng(), 6);
lcd.setCursor(0,0);
lcd.print("LAT:");
lcd.setCursor(5,0);
lcd.print(gps.location.lat());
lcd.setCursor(0,1);
lcd.print("LON:");
lcd.setCursor(5,1);
lcd.print(gps.location.lng());
delay(1000);
lcd.clear();
}
}
else
{
if( (millis()-lastKnockTime) > knockAlarmTime && bAlarm)
{
Serial.println("no knocks");
bAlarm = false;
digitalWrite (6, LOW);
delay(100);
}
}
}
void gpsTrack()
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("KNOCK!");
lcd.setCursor(3,1);
lcd.print("Detected");
delay (5000);
lcd.clear();
Serial.print("Latitude= ");
Serial.print(gps.location.lat(), 6);
Serial.print(" Longitude= ");
Serial.println(gps.location.lng(), 6);
lcd.setCursor(0,0);
lcd.print("LAT:");
lcd.setCursor(5,0);
lcd.print(gps.location.lat());
lcd.setCursor(0,1);
lcd.print("LON:");
lcd.setCursor(5,1);
lcd.print(gps.location.lng());
delay(1000);
lcd.clear();
}
@eric, 👍1
2 ответа
Лучший ответ:
Если вы подключите GPS к Serial (контакты 0 и 1), а GSM к AltSoftSerial (контакты 8 и 9), это может сработать. Вам придется отключить контакт 0, чтобы загрузить новые скетчи через USB. Я предполагаю, что у вас UNO или Nano, потому что вы не сказали, какой Arduino вы используете.
Как сказал Маженко, это никогда не будет работать с двумя портами SoftwareSerial. SoftwareSerial очень неэффективен, потому что он отключает прерывания на длительные периоды времени. Это может помешать другим частям вашего скетча или другим библиотекам. И он не может отправлять и получать данные одновременно. Этот ответ содержит полную информацию.
Возможно, вам также захочется взглянуть на мою библиотеку NeoGPS. Она меньше, быстрее, надежнее и точнее всех других библиотек GPS. Даже если вы ее не используете, вам стоит прочитать страницу о выборе последовательного порта. Также есть много советов на странице устранения неполадок.
NeoGPS, AltSoftSerial и NeoSWSerial доступны в диспетчере библиотек IDE в меню Скетч -> Включить библиотеку -> Управление библиотеками.
Кстати, вы не можете использовать delay таким образом. Вы должны постоянно считывать и декодировать символы GPS. Скетч потеряет много-много символов GPS, не давая ему когда-либо получить полную информацию GPS. Вам нужно сделать что-то вроде этого:
#include <LiquidCrystal.h>
#include <NMEAGPS.h>
#include <AltSoftSerial.h>
AltSoftSerial gsmPort; // принимаем контакт 8 на GSM TX, передаем контакт 9 на GSM RX
char msg;
int knockPin = 7; // Используем контакт 7 как вход
int knockVal = HIGH; // Здесь мы записываем наши измерения удара
boolean bAlarm = false;
int knockValue = digitalRead(6);
unsigned long lastKnockTime; // Записываем время, когда мы измерили удар
int knockAlarmTime = 500; // Количество миллисекунд, в течение которых сигнализация детонации будет оставаться высокой
static const int GPSBaud = 9600;
NMEAGPS gps;
gps_fix fix;
#define gpsPort Serial // RX-контакт 0 к GPS TX, TX-контакт 1 к GPS RX
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup ()
{
gsmPort.begin(19200); // Установка скорости передачи данных GSM-модуля
gpsPort.begin(GPSBaud);
//Serial.begin(115200); // gpsPort *является* последовательным
// Последовательный монитор должен быть установлен на 9600 (нижний правый
// углу окна последовательного монитора)
Serial.println("GSM SIM900A BEGIN");
pinMode (knockPin, INPUT) ; // вход от KY-031
pinMode (6, OUTPUT);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("VeCAS System");
lcd.setCursor(3,1);
lcd.print(">>Begin>>");
delay( 1000 );
}
void loop ()
{
// Проверяйте наличие символов GPS (всегда!)
if (gps.available( gpsPort )) {
fix = gps.read(); // сохраняем последние поля GPS в одной структуре
gpsTrack(); // показать последние поля GPS
}
// Проверка на наличие стуков
knockVal = digitalRead (knockPin) ; // прочитать значение KY-031
if (knockVal == LOW) // Если мы видим стук
{
lastKnockTime = millis(); // записываем время удара
// Следующее не нужно прокручивать экран вывода
if (!bAlarm)
{
bAlarm = true;
digitalWrite (6, HIGH);
Serial.println("KNOCK, KNOCK");
Serial.println(knockVal);
lcd.clear();
lcd.setCursor(4,0);
lcd.print("KNOCK!");
lcd.setCursor(3,1);
lcd.print("Detected");
}
}
else
{
if( (millis()-lastKnockTime) > knockAlarmTime && bAlarm)
{
Serial.println("no knocks");
bAlarm = false;
digitalWrite (6, LOW);
}
}
}
void gpsTrack()
{
Serial.print("Latitude= ");
if (fix.valid.location)
Serial.print( fix.latitude(), 6);
Serial.print(" Longitude= ");
if (fix.valid.location)
Serial.println( fix.longitude(), 6);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("LAT:");
lcd.setCursor(5,0);
if (fix.valid.location)
lcd.print( fix.latitude() );
lcd.setCursor(0,1);
lcd.print("LON:");
lcd.setCursor(5,1);
if (fix.valid.location)
lcd.print( fix.longitude() );
}
Обратите внимание, что он также проверяет флаг достоверности местоположения перед использованием значений широты/долготы. Ваш GPS может не знать местоположение, возможно, из-за плохого приема спутников.
У вас есть два порта SoftwareSerial. Вы не можете надежно использовать два из них одновременно. Только один может быть настроен на прием данных, и это первый из них, который вы определяете. Вы можете переключаться между ними с помощью функции listen(), но это не рекомендуется. Если вы никогда не хотите получать данные на одном из них, то это (почти) нормально, но при отправке на любой из них ничего не может быть получено нигде (даже на аппаратном последовательном порту).
Добавление в setup() после ss.begin(GPSBaud):
ss.listen();
Возможно, это сработает на какое-то время, но как только вы начнете делать что-то еще с mySerial, у вас могут возникнуть проблемы.
Если в вашей конструкции требуется более одного последовательного порта, то вам действительно следует рассмотреть возможность использования более мощной платы с большим количеством аппаратных портов UART.
да, я пытаюсь поместить ss.listen(); после ss.begin(GPSBaud), но это приводит к ошибке., @eric
- GPS-модуль uBlox Neo 6M не отвечает
- Как отправить данные из Arduino Uno с SIM900 GPRS в Firebase
- Ошибка инициализации GPS DFRobot [Arduino Uno, SIM808]
- GPRS SIM900 и GPS NEO-6M не работают вместе
- TinyGPS не дает долготу, широту и другие данные
- GPS не определяется на модуле SIM808!
- Serial.parseFloat() считывает 0, несмотря на то, что я ввел другое значение
- последовательная передача данных на GPS-экране duinopeak
Спасибо за ваш ответ. Я использую доску Uno. Поэтому я пытаюсь использовать ваш код, но он не работает, так как это доска Uno., @eric
Да, ваш последовательный монитор должен работать на частоте 9600, а не 115200 (я отредактировал эту строку выше). Тогда он будет работать на UNO, *ЕСЛИ* вы подключите GPS к контактам 0 и 1, как описано. Он ничего не отправляет и не принимает в GSM, так что это не имеет значения. См. ссылку «Выбор последовательного порта»., @slash-dev
Я получаю это сообщение об ошибке. Ошибка компиляции для платы Arduino/Genuino Uno. Почему? Ха-ха., @eric
хаха, извини, я забыл скачать библиотеку., @eric