Спидометр на arduino uno и дисплее tft 2.4 LCD shield

sheendor
sheendor аватар
Offline
Зарегистрирован: 19.02.2020

Приветствую, . Загвоздка вот в чём, есть рабочий скетч спидометра на экран 128х64, всё работает всё хорошо, спутники ищет быстро отклик вроде удовлетворительный. есть экран 2.4 tft шилд на котором и нужно сделать спидометр. вроде всё собрал кроме одного момента обращение к дисплею с данных gps(в скетче закоментировано). освободил 2 пина А4(ресет припаял на ресет в uno) А5.чего должно хватить.

Рабочий скетч на экран 128х64

#include "U8glib.h"

//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);                                            // I2C / TWI 1.3
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);   // SCK=A5, SDA=A4       // I2C / TWI 0.96
//U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9, 8);  // SCK=13, SDA=11, CS=10, DC=9, Reset=8   // SPI / TWI 0.96

#define u8g_logo_sat_width 20
#define u8g_logo_sat_height 20
//Satelliten Logo
const unsigned char u8g_logo_sat[] = {

 0x00, 0x01, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x06, 0x00, 0x60, 0x30, 0x00,
  0x60, 0x78, 0x00, 0xc0, 0xfc, 0x00, 0x00, 0xfe, 0x01, 0x00, 0xff, 0x01,
  0x80, 0xff, 0x00, 0xc0, 0x7f, 0x06, 0xc0, 0x3f, 0x06, 0x80, 0x1f, 0x0c,
  0x80, 0x4f, 0x06, 0x19, 0xc6, 0x03, 0x1b, 0x80, 0x01, 0x73, 0x00, 0x00,
  0x66, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x70, 0x00, 0x00
};

// Serielle Anschluß
#include <SoftwareSerial.h>
static const int RXPin = 12, TXPin = 13;     // GPS RX -> Arduino D3 //GPS TX -> Arduino D2
static const uint32_t GPSS = 9600;
SoftwareSerial ss(RXPin, TXPin);

//GPS Library
#include <TinyGPS++.h>
TinyGPSPlus gps;

//Program variables
double Lat;
double Long;

int num_sat, gps_speed;
String heading;

void(*resetFunc)(void) = 0; // Автоматический сброс bei Fehler

void setup() {
ss.begin(GPSS);
}

    
void loop() {

  Get_GPS(); //Получить данные GPS

  //Display info in the OLED
  u8g.firstPage();
  do {
    print_speed();
  } while ( u8g.nextPage() );
}

void print_speed() {

  //u8g.setFont(u8g_font_fur42n);
  u8g.setFont(u8g_font_helvR24r);
  u8g.setPrintPos(2, 50);

  u8g.print(gps_speed , DEC);
  u8g.setFont(u8g_font_9x18);     


  u8g.setPrintPos(70, 50);
  u8g.print("km/h");

    u8g.setFont(u8g_font_6x10);  
  u8g.setPrintPos(10, 10);
  u8g.print("sputnic");

  
  u8g.setFont(u8g_font_6x10);             //колличество спутников
  u8g.setPrintPos(70, 10);               // Позиция Количество Satelliten 
  u8g.print( num_sat, 5);

  u8g.setPrintPos(0, 63);                //широта долгота
  u8g.print("Lat:");

  u8g.setPrintPos(26, 63);
  u8g.print( Lat, 3);

  u8g.setPrintPos(66, 63);
  u8g.print("Long:");

  u8g.setPrintPos(97, 63);
  u8g.print( Long,3);
  
  u8g.setFont(u8g_font_unifont);

  u8g.drawXBM(107, 0, u8g_logo_sat_width, u8g_logo_sat_height, u8g_logo_sat);   // Положение Значка СБ
}

// Datenzufur zu dem GPS
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

void Get_GPS()
{
  num_sat = gps.satellites.value();

  if (gps.location.isValid() == 1) {

    Lat = gps.location.lat();
    Long = gps.location.lng();

    gps_speed = gps.speed.kmph();

    heading = gps.cardinal(gps.course.value());
}

smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
   // Serial.println(F("No GPS detected: Please check you wiring."));
  resetFunc();
  delay(1000);
  }
}

Скетч на экран 2.8 tft


#include <Adafruit_GFX.h> // Libreria de graficos
#include <Adafruit_TFTLCD.h> // Libreria de LCD 
#include <TinyGPS++.h>   //memanggil library GPS Ublox Neo
//#include "U8glib.h"

// Pines de conexion del LCD
#define LCD_CS A3 // Chip Select - Pin analogico 3
#define LCD_CD A2 // Command/Data - Pin Analogico 2
#define LCD_WR A1 // LCD Write - Pin Analogico 1
#define LCD_RD A0 // LCD Read - Pin Analogico 0
#define LCD_RESET A4 // LCD Reset - Pin Analogico 4

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); // Инстанции-дель-ЖК

//Define Warna agar memudahkan saat melakukan coding
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
/*
void setup() {

//rtc.begin();        // Memulai RTC
 tft.begin(0x9341); // Нициализация адреса контроллера 
 // Адреса контролеров: 0x9325, 0x9328,0x7575, 0x9341, 0x8357,
 // 0x0154,0x9488
 tft.fillScreen(BLACK); // Очистка в черный цвет экран

return; }
*/
// Serielle Anschluß
#include <SoftwareSerial.h>
static const int RXPin = 1, TXPin = 0;     // GPS RX -> Arduino D1 //GPS TX -> Arduino D0
static const uint32_t GPSS = 9600;
SoftwareSerial ss(RXPin, TXPin);

//GPS Library
#include <TinyGPS++.h>
TinyGPSPlus gps;

//Program variables
double Lat;
double Long;

int num_sat, gps_speed;
String heading;

void(*resetFunc)(void) = 0; // Автоматический сброс bei Fehler

void setup() {


//rtc.begin();        // Memulai RTC
 tft.begin(0x9341); // Нициализация адреса контроллера 
 // Адреса контролеров: 0x9325, 0x9328,0x7575, 0x9341, 0x8357,
 // 0x0154,0x9488
 tft.fillScreen(BLACK); // Очистка в черный цвет экран

//return; 
ss.begin(GPSS);
}

void loop() {

//с экрана 128*64 /* */

/*{

  Get_GPS(); //Получить данные GPS


 /* //Дисплей информация на дисплее
  u8g.firstPage();
  do {
    print_speed();
  } while ( u8g.nextPage() );*/


void print_speed() {

  //u8g.setFont(u8g_font_fur42n);
 // tft.setRotation(0);
 // tft.setCursor(2, 50);
  tft.setRotation(3);
  tft.setCursor(50, 50);  
  tft.setTextSize(5);
  tft.setTextColor(CYAN);
  tft.print(gps_speed , DEC);
   

  tft.setRotation(3);
 // tft.setCursor(9, 18);  
  tft.setTextSize(5);
  tft.setTextColor(CYAN);
  tft.setCursor(120, 50);
  tft.println("km/h");
/*
    u8g.setFont(u8g_font_6x10);  
  u8g.setPrintPos(10, 10);*/

   tft.setRotation(3);
   tft.setCursor(10, 10);  
   tft.setTextSize(5);
   tft.setTextColor(CYAN);
   tft.print("sputnic");

  /*
  u8g.setFont(u8g_font_6x10);             //колличество спутников
  u8g.setPrintPos(70, 10);               // Позиция Количество Satelliten */

    tft.setRotation(3);
    tft.setCursor(70, 10);  
    tft.setTextSize(5);
    tft.setTextColor(CYAN);
    tft.print( num_sat, 5);

 /* u8g.setPrintPos(0, 63);                //широта долгота*/

    tft.setRotation(3);
    tft.setCursor(0, 63);  
    tft.setTextSize(5);
    tft.setTextColor(CYAN);
    tft.print("Lat:");

  /*u8g.setPrintPos(26, 63);*/

    tft.setRotation(3);
    tft.setCursor(26, 63);  
    tft.setTextSize(5);
    tft.setTextColor(CYAN);
    tft.print( Lat, 3);

  /*u8g.setPrintPos(66, 63);*/

    tft.setRotation(3);
    tft.setCursor(66, 63);  
    tft.setTextSize(5);
    tft.setTextColor(CYAN);
    tft.print("Long:");

 /* u8g.setPrintPos(97, 63);*/

    tft.setRotation(3);
    tft.setCursor(97, 63);  
    tft.setTextSize(5);
    tft.setTextColor(CYAN);
    tft.print( Long,3);
}

// Данные для GPS
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

void Get_GPS() 
{

  num_sat = gps.satellites.value();

  if (gps.location.isValid() == 1) {

    Lat = gps.location.lat();
    Long = gps.location.lng();

    gps_speed = gps.speed.kmph();

    heading = gps.cardinal(gps.course.value());

}
smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
   // Serial.println(F("No GPS detected: Please check you wiring."));
  resetFunc();
  delay(1000);
  }
}

}

 

b707
Offline
Зарегистрирован: 26.05.2017

в чем вопрос то?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

в чем вопрос то?

Это он похвастаца. 

sheendor
sheendor аватар
Offline
Зарегистрирован: 19.02.2020

не могу вывести на экран tft 2.4 код написанный для экрана 128х64, не совсем понимаю как в той или иной библиотеке для экранов обозначаются действия.

067 void loop() {
068  
069 //с экрана 128*64 /* */
070  
071 /*{
072  
073   Get_GPS(); //Получить данные GPS
074  
075  
076  /* //Дисплей информация на дисплее
077   u8g.firstPage();
078   do {
079     print_speed();
080   } while ( u8g.nextPage() );*/

тут затык, библиотека для  u8g и для tft, грубо говоря не могу перенести код жпс с рабочего скетча от экрана 128х64 на экран 2.4tft

b707
Offline
Зарегистрирован: 26.05.2017

sheendor пишет:

не могу вывести на экран tft 2.4 код написанный для экрана 128х64

вы полагаете, кто-то станет это делать за вас?

Откройте обе библиотеки - для экрана 128х64 и для tft 2.4 - и сравнивая функции вывода и посматривая в примеры, переделайте вывод с одной либы на другую

Только для начала разберитесь с подключением, оно для этих экранов разное. Меня смутили ваши слова в первом посте о том, что "пинов А4 и А5 должно хватить"

sheendor
sheendor аватар
Offline
Зарегистрирован: 19.02.2020

Извиняюсь за краткость, торопился. пин 4 и 5 для gps  модуля, 4 пин сброса на экране отвел на ресет в ардуинке тем самым освободив его.

я не прошу сделать за меня, просто направить куда копать

пост бы поправил только нет вкладки изменить(

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну так тебе в #4 сказали, куда копать: 

b707 пишет:

Откройте обе библиотеки - для экрана 128х64 и для tft 2.4 - и сравнивая функции вывода и посматривая в примеры, переделайте вывод с одной либы на другую

sheendor
sheendor аватар
Offline
Зарегистрирован: 19.02.2020

DetSimen пишет:

Ну так тебе в #4 сказали, куда копать: 

b707 пишет:

Откройте обе библиотеки - для экрана 128х64 и для tft 2.4 - и сравнивая функции вывода и посматривая в примеры, переделайте вывод с одной либы на другую

 

а вы я смотрю набиваете бесполезные посты

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sheendor пишет:

а вы я смотрю набиваете бесполезные посты

Таки да. Мы тут по этому специализируемся, ибо больше ни на что не способны, увы :-(((.

А зачем, кстати, ресет экрана на ресет контроллера завели?

b707 пишет:

вы полагаете, кто-то станет это делать за вас?

Даже странно слышать. А для чего тогда ещё форум?

sheendor
sheendor аватар
Offline
Зарегистрирован: 19.02.2020

ЕвгенийП пишет:

sheendor пишет:

а вы я смотрю набиваете бесполезные посты

Таки да. Мы тут по этому специализируемся, ибо больше ни на что не способны, увы :-(((.

А зачем, кстати, ресет экрана на ресет контроллера завели?

b707 пишет:

вы полагаете, кто-то станет это делать за вас?

Даже странно слышать. А для чего тогда ещё форум?

освободить второй пин по датчик gps neo 6mv2

sheendor
sheendor аватар
Offline
Зарегистрирован: 19.02.2020

делал всё на примере скетча в котором не было коментариев (там и было выведен пин 4 на ресет) и по большей части всё методом тыка так как языка не знаю.

не понятна разница между библиотеками Adafruit_GFX и tft, на каждую находил скетчи которые работали на моём экране, но код вывода на экран разный

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sheendor пишет:

не понятна разница между библиотеками Adafruit_GFX и tft, на каждую находил скетчи которые работали на моём экране, но код вывода на экран разный

А ресурсы? Память, например?

b707
Offline
Зарегистрирован: 26.05.2017

sheendor пишет:

не понятна разница между библиотеками Adafruit_GFX и tft, на каждую находил скетчи которые работали на моём экране, но код вывода на экран разный

вот у вас есть пиджак и свитер - каждый вам по размеру, а вид и материал разный.

Библиотек на один и тот же модуль может быть не одна и не две...

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Подскажу Вам ход, удивляющей своей простотой. Вы подключаете только экран и берете примеры из библиотеки (какая понравится, хотя мне лично Adafruit нравится больше), разбираете их, пишете свою программу типа "Хэлло, Вася", потом размечаете экран и в простой программке выдаете текст, который потом будете получать динамически, на нужное ему место экрана. Получилось? Вставляйте функции вывода в свою программу и наслаждайтесь!