#1 2020-01-25 16:58:29

ultimat88
Участник
Из Украина, Одесса
Зарегистрирован: 2020-01-25
Сообщений: 4

Нужна помощь.

Доброго времени суток. Крик души вынуждает меня создать тут тему. Была куплена arduino Mega и 3.2 tft lcd, GPS модуль VK2828U7G5LF. Я новенький в ардуино. До этого делал на nano проект с авто поливом( отображал данные с DHT11 на экран. И в случае падения влажности включался полив). Постоянно заниматься нет возможности, но хочется  wink . Немного отступил от темы. Эпопея началась почти неделю назад. Подключил все и начал танцы с бубном. Нашел код, залил, подключил - ничего. После разбора нашел что нужно поменять пины TX/RX местами.gps-pins.png
Поменял. опять ничего. Начал крутить код и в итоге получил вывод на порт 57600.gps-to-57600.png

#include <TinyGPS.h>
#include <UTFT.h>//библиотека для работы с дисплеем
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера управляющих пинов
UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
// объявления встроенного шрифта
extern uint8_t BigFont[];
//long   lat,lon; // create variable for latitude and longitude object
bool newdata = false;
float lat,lon;
TinyGPS gps; // create gps object
int gpsSpeedKm = 0;
char gpsSpeed[3];
int num_sat, gps_speed;
static const int RXPin = 19, TXPin = 18;
static const uint32_t GPSBaud = 9600;

String heading;

void setup(){
Serial.begin(57600); // connect serial
Serial.println("The GPS Received Signal:");
Serial1.begin(9600); // connect gps sensor
// инициализируем дисплей с вертикальной ориентацией
  myGLCD.InitLCD();
  // очищаем экран
  myGLCD.clrScr();
  myGLCD.setFont(BigFont);
  // устанавливаем красный цвет «чернил» для печати и рисования
  myGLCD.setColor(VGA_RED);

}
 
void loop(){
    while(Serial1.available()){ // check for gps data
    if(gps.encode(Serial1.read()))// encode gps data
    { 
    gps.f_get_position(&lat,&lon); // get latitude and longitude

    Serial.print("Position: ");
    
    //Latitude
    Serial.print("Latitude: ");
    Serial.print(lat,6);
    
    Serial.print(",");
    
    //Longitude
    Serial.print("Longitude: ");
    Serial.println(lon,6); 
    delay (10000);
    
   }
  }
} 

Прошу прощение за наличие мусора в коде вывода. После вывода данных GPS на порт решил вывести их на экран ( изначально была задумка сделать GPS спидометр для машины с возможность добавлять различные данные на экран. Типа остаток в бензобаке ( мой датчик не работает и на машину 78 года не так уж и просто найти его) и т.д. ). Но с чего-то нужно было начать. Было решено, что в целях обучения и примера будут выведены GPS данные на экран (широта, долгота). И тут меня ждала каменная стена, в которую моя не опытная голова уже бьется неделю безрезультатно. Люди в интернете выводят данные без проблем. Все просто и понятно. Мой же бубен так и не дал результатов чтобы я не пробовал( обычный текст вывести без проблем). Я не пишу потому-что проще узнать у кого-то чем напрягать свою голову. Я пишу потому-что неделю отпуска с утра до вечера сижу за кодом и не могу добиться результата.
Последний код, к которому я вернулся :

#include <UTFT.h>//библиотека для работы с дисплеем
#include <SoftwareSerial.h> 
#include <TinyGPS.h> 
float lat = 28.5458,lon = 77.1703; // создать переменную для объекта широты и долготы  
SoftwareSerial gpsSerial(19, 18);//rx,tx 
UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
extern uint8_t BigFont[];// объявления встроенного шрифта
TinyGPS gps; // создать gps объект

void setup(){ 
Serial.begin(9600); // соединяем serial  
gpsSerial.begin(9600); // подключаем gps датчик
myGLCD.InitLCD();
myGLCD.clrScr(); // очищаем экран
} 
void loop(){ 
  while(gpsSerial.available()){ // проверка gps данных
  if(gps.encode(gpsSerial.read()))// шифровать gps данные 
  {  
  gps.f_get_position(&lat,&lon); // получить широту и долготу
  // отобразить позицию 
  myGLCD.setFont(BigFont);
  myGLCD.setColor(VGA_RED); // устанавливаем красный цвет «чернил» для печати и рисования
  myGLCD.print("GPS Signal", LEFT, 0); 
  myGLCD.setFont(BigFont);
  myGLCD.setColor(VGA_RED); // устанавливаем красный цвет «чернил» для печати и рисования  
  myGLCD.print("LAT:", LEFT, 50); 
  myGLCD.setFont(BigFont);
  myGLCD.setColor(VGA_RED); // устанавливаем красный цвет «чернил» для печати и рисования
  myGLCD.print(lat, LEFT, 100);  
  myGLCD.setFont(BigFont);
  myGLCD.setColor(VGA_RED); // устанавливаем красный цвет «чернил» для печати и рисования
  myGLCD.print(",LON:", LEFT, 150); 
  myGLCD.setFont(BigFont);
  myGLCD.setColor(VGA_RED); // устанавливаем красный цвет «чернил» для печати и рисования 
  myGLCD.print(lon, LEFT, 200); 
 } 
} 
String latitude = String(lat,6); 
  String longitude = String(lon,6); 
Serial.println(latitude+";"+longitude); 
delay(1000); 
}

Выбивает ошибку:
C:\Users\wtf\Documents\Arduino\test_drygoi\test_drygoi.ino: In function 'void loop()':

C:\Users\wtf\Documents\Arduino\test_drygoi\test_drygoi.ino:24:37: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

   myGLCD.print("GPS Signal", LEFT, 0);

                                     ^

C:\Users\wtf\Documents\Arduino\test_drygoi\test_drygoi.ino:27:32: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

   myGLCD.print("LAT:", LEFT, 50);

                                ^

test_drygoi:30:30: error: no matching function for call to 'UTFT::print(float&, int, int)'

   myGLCD.print(lat, LEFT, 100); 

                              ^

In file included from C:\Users\wtf\Documents\Arduino\test_drygoi\test_drygoi.ino:1:0:

C:\Users\wtf\Documents\Arduino\libraries\UTFT/UTFT.h:215:8: note: candidate: void UTFT::print(char*, int, int, int)

   void print(char *st, int x, int y, int deg=0);

        ^

C:\Users\wtf\Documents\Arduino\libraries\UTFT/UTFT.h:215:8: note:   no known conversion for argument 1 from 'float' to 'char*'

C:\Users\wtf\Documents\Arduino\libraries\UTFT/UTFT.h:216:8: note: candidate: void UTFT::print(String, int, int, int)

   void print(String st, int x, int y, int deg=0);

        ^

C:\Users\wtf\Documents\Arduino\libraries\UTFT/UTFT.h:216:8: note:   no known conversion for argument 1 from 'float' to 'String'

C:\Users\wtf\Documents\Arduino\test_drygoi\test_drygoi.ino:33:34: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

   myGLCD.print(",LON:", LEFT, 150);

                                  ^

test_drygoi:36:30: error: no matching function for call to 'UTFT::print(float&, int, int)'

   myGLCD.print(lon, LEFT, 200);

                              ^

In file included from C:\Users\wtf\Documents\Arduino\test_drygoi\test_drygoi.ino:1:0:

C:\Users\wtf\Documents\Arduino\libraries\UTFT/UTFT.h:215:8: note: candidate: void UTFT::print(char*, int, int, int)

   void print(char *st, int x, int y, int deg=0);

        ^

C:\Users\wtf\Documents\Arduino\libraries\UTFT/UTFT.h:215:8: note:   no known conversion for argument 1 from 'float' to 'char*'

C:\Users\wtf\Documents\Arduino\libraries\UTFT/UTFT.h:216:8: note: candidate: void UTFT::print(String, int, int, int)

   void print(String st, int x, int y, int deg=0);

        ^

C:\Users\wtf\Documents\Arduino\libraries\UTFT/UTFT.h:216:8: note:   no known conversion for argument 1 from 'float' to 'String'

exit status 1
no matching function for call to 'UTFT::print(float&, int, int)'

Как-то так.

#2 2020-01-25 17:58:06

г0сть
Гость

Re: Нужна помощь.

Почитайте про работу с библиотекой для экрана. Например, здесь https://habr.com/ru/post/196600/
Обратите внимание на вывод значений на экран командами print и printNumF.

#3 2020-01-25 18:00:24

Watchdog
Гость

Re: Нужна помощь.

Попробуйте определить константу LEFT smile или переустановить библиотеку, через менеджер. А так же, включите вывод всех сообщений компилятора, в настойках IDE. Станет понятнее.

#4 2020-01-25 18:17:21

ultimat88
Участник
Из Украина, Одесса
Зарегистрирован: 2020-01-25
Сообщений: 4

Re: Нужна помощь.

Как я понимаю, то моя проблема, в основном, заключается именно в неправильном выводе информации на экран?  Т.е. в неправильном написании кода для этого действия.

#5 2020-01-25 18:22:27

г0сть
Гость

Re: Нужна помощь.

Ну для начала да, разберитесь с типами переменных и выводом их на экран. А там может и еще что-то вылезет, а может и нет smile

#6 2020-01-25 18:24:15

г0сть
Гость

Re: Нужна помощь.

посмотрите в примерах к библиотеке как выводятся на экран текст и переменные - целочисленные и с плавающей точкой

#7 2020-01-25 18:27:10

ultimat88
Участник
Из Украина, Одесса
Зарегистрирован: 2020-01-25
Сообщений: 4

Re: Нужна помощь.

Спасибо за участие. Теперь хоть есть направление для мозгового штурма.  smile

#8 2020-01-26 02:08:10

ultimat88
Участник
Из Украина, Одесса
Зарегистрирован: 2020-01-25
Сообщений: 4

Re: Нужна помощь.

Здравствуйте еще раз smile . Вроде лед тронулся. Конечного результата еще не добился, но все же. Проблема с отображением, как по мне , решилась. Только теперь у меня сложилось впечатление что я не правильно прописал общение с GPS. Работает он так как на комп передает данные. Код проходит до if (!loc_valid) и просто мигают надписи "Waiting". Отображения позиции так и не дождался...

#include <UTFT.h>//библиотека для работы с дисплеем
#include <SoftwareSerial.h> 
#include <TinyGPS++.h>  
static const int RXPin = 18, TXPin = 19;
static const uint32_t GPSBaud = 9600;
SoftwareSerial Serial_GPS(RXPin, TXPin);;//rx,tx 
UTFT myGLCD(CTE32HR,38,39,40,41);
extern uint8_t SmallFont[];// объявления встроенного шрифта
TinyGPSPlus gps; // создать gps объект

void setup(){   
Serial_GPS.begin(GPSBaud); // подключаем gps датчик
myGLCD.InitLCD();
myGLCD.setFont(SmallFont);
myGLCD.setColor(VGA_RED); // устанавливаем красный цвет 
myGLCD.print("GPS Signal", 10, 10);
}
void loop(){ 
  GPSDelay(1000);
  unsigned long start;
  double lat_val, lng_val;
  bool loc_valid;
  lat_val = gps.location.lat();
  loc_valid = gps.location.isValid();
  lng_val = gps.location.lng();
  if (!loc_valid)
  { 
   
  myGLCD.print("LAT:", LEFT, 50);
  myGLCD.print("LON:", LEFT, 150);
  myGLCD.print("Waiting", LEFT, 100);    
  myGLCD.print("Waiting", LEFT, 200); 
  delay(2000);
  myGLCD.clrScr();
  }
  else
  {
    myGLCD.clrScr();
    myGLCD.print("GPS Signal", 10, 10); 
    myGLCD.print("LAT:", LEFT, 50);
    myGLCD.print("LON:", LEFT, 150);
    myGLCD.printNumI(lat_val,3, LEFT, 100);    
    myGLCD.printNumI(lng_val,3, LEFT, 200);
    delay(2000);
 } 
} 
 static void GPSDelay(unsigned long ms)
 {
  unsigned long start = millis();
  do
  {
    while (Serial_GPS.available());
    gps.encode(Serial_GPS.read());
  } while (millis() - start < ms);
  }

#9 2020-01-26 10:17:18

Watchdog
Гость

Re: Нужна помощь.

IsValid, видимо, означает готовность данных к чтению, а вы читаете их когда попало. Там, в библиотеке, должны быть примеры. Не работать может по разным причинам и по причине ошибок в монтаже также.

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела