Arduino Polska Forum

Pełna wersja: Wyświetlacz do samochodu - termometr, zegar, prędkość - rzadko się odświeża
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
Hej,

W moim Clio III Ph1 jest oryginalny wyświetlacz i nieoryginalne radio. Na wyświetlaczu znajduje się godzina i temperatura. Początkowo chciałem wykorzystać literki, którymi zarządzało fabryczne radio, ale trafiłem na sufit w postaci wyświetlacza sterowanego przez CAN i braku bibliotek do tego. Uznałem, że usunę wyświetlacz fabryczny i wstawię generyczny HD44780 w jakimś ładnym wykonaniu. Mam już za sobą pozytywne próby wyświetlania prędkości z modułu U-Blox NEO 6M na czterocyfrowym wyświetlaczu LED naprzemiennie z godziną (gdy prędkość jest poniżej 5km/h). Przyszedł czas na HD44780 i jako~tako mam to ogarnięte, ale:

1. Godzina i prędkość odświeżają się bardzo rzadko, nawet co dwie minuty. Termometr jest responsywny, real-time, bym powiedział.

2. Gdy usunę fragment kodu odpowiedzialny za obsługę DS18B20, to dane z GPS (raczej) się odświeżają na bieżąco - sprawdzę to za godzinę, gdy będę jechał do pracy.

3. Gdy nie ma danych z GPS, to wyświetlam krzyżyk i jest wskazywana godzina 1:00 (ok, niech tak będzie), gdy dane z GPS zaczną spływać, to godzina się aktualizuje, a zamiast krzyżyka pojawia się symbol satelity. Jednak, gdy danych z GPS znowu nie będzie, to prędkość oraz symbol satelity pozostaje, a godzina zostaje zamrożona.

Zamieszczam kod główny (z zaznaczeniem, gdzie miałem kod termometru) oraz kod termometru.

Główny:
Kod:
#include <Arduino.h>
#include <LiquidCrystal.h>
#include <OneWire.h>

#include <SoftwareSerial.h>
#include <TinyGPSPlus.h>
#include <DallasTemperature.h>

#define SW 18
#define LED 9
#define ONE_WIRE_BUS 6


OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);



SoftwareSerial Serial1(7, 8);
TinyGPSPlus gps;


int val = 0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte stopien[8] ={
                      B01100,
                      B10010,
                      B10010,
                      B01100,
                      B00000,
                      B00000,
                      B00000,
                      B00000
                     };
byte iks[8] ={
                      B10001,
                      B01010,
                      B00100,
                      B01010,
                      B10001,
                      B00000,
                      B00000,
                      B00000
                     };
byte satelita[8] ={
                      B11111,
                      B00100,
                      B01110,
                      B01010,
                      B01110,
                      B00100,
                      B11111,
                      B00000
                     };





void setup() {

  lcd.createChar(1, stopien);
  lcd.createChar(2, iks);
  lcd.createChar(3, satelita);

  lcd.begin(16, 2);

  lcd.setCursor(0, 0);
  lcd.print("  Dzien  Dobry  ");

  lcd.setCursor(0, 1);
  lcd.print("                ");
  delay(4000);

  lcd.clear();

  delay(200);

  pinMode(SW,INPUT_PULLUP);
  pinMode(LED, OUTPUT);


  while(!Serial);
  Serial.begin(9600);
  Serial1.begin(9600);

  sensors.setResolution(9);


}

void loop()
{
     while (Serial1.available() > 0)
    (gps.encode(Serial1.read()));

    lcd.setCursor(4, 1);
    lcd.write(byte(1));
    lcd.setCursor(5, 1);
    lcd.write("C");

    if(gps.speed.isValid())            // Zaświecenie diody, gdy lokalizacja GPS jest ustalona
    {
    digitalWrite(LED,HIGH);            // Dioda na pinie 9
    lcd.setCursor(15,0);               // Narysuj symbol satelity
    lcd.write(byte(3));
    }
    else
    {
    lcd.setCursor(15,0);
    lcd.write(byte(2));                // Narysuj iks
    }


    // if(gps.speed.isValid())         // Wyświetlanie napisu SPEED, gdy GPS jest dostępny
    // {
    // }
    // else
    // {
    // lcd.setCursor(0, 0);           
    // lcd.print("      ----   ");
    // }



    int speed = gps.speed.kmph();
    if(speed >1 && speed<10)
    {
    lcd.setCursor(6, 0);
    lcd.print(speed);
    lcd.setCursor(5, 0);
    lcd.print(" ");
    lcd.setCursor(7, 0);
    lcd.print("km/h");
    }
    else
    {
      if(speed >=10)
      {
         lcd.setCursor(5, 0);
         lcd.print(speed);
         lcd.setCursor(4, 0);
         lcd.print(" ");
         lcd.setCursor(7, 0);
         lcd.print("km/h");
      }
      else
      {
      if(speed >=100)
      {
         lcd.setCursor(4, 0);
         lcd.print(speed);
         lcd.setCursor(7, 0);
         lcd.print("km/h"); 
      }
    else
    {
    lcd.setCursor(6, 0);              // Wyświetlanie napisu 0km/h, gdy prędkość jest dostępna, ale mniejsza od 1km/h
    lcd.print("0");
    lcd.setCursor(7, 0);
    lcd.print("km/h"); 
    }
   }
  }

    

      int hours = gps.time.hour();
        hours = hours+1;
        val = digitalRead(SW); // odczyt stanu z pinu 7 - niski=zimowy, open=letni
        if(digitalRead(SW))
        hours = hours+1;
        else
        hours = hours+0;
        if(hours>23)
        hours=hours-24;     
      int minutes = gps.time.minute();  
    
           if(hours<10){
        lcd.setCursor(10, 1);
        lcd.print(" ");
        lcd.setCursor(11, 1);
        lcd.print(hours);
      }
      else{
        lcd.setCursor(10, 1);
        lcd.print(hours);
      }
    lcd.setCursor(12, 1);
    lcd.print(":");
      if(minutes<10){
        lcd.setCursor(13, 1);
        lcd.print("0");
        lcd.setCursor(14, 1);
        lcd.print(minutes);
      }
      else{
        lcd.setCursor(13, 1);
        lcd.print(minutes);
      }
    
// tu wyciąłem  termometr



   



    delay (200);

}




 

Termometr:
Kod:
  sensors.requestTemperatures();
  float temperature = sensors.getTempCByIndex(0);


if(temperature <= -10)
    {
    lcd.setCursor(1, 1);
    lcd.print(temperature,0);
    }
      else
      {
      if(temperature <0 && temperature >=-9)
      {
      lcd.setCursor(1, 1);
      lcd.print(" ");
      lcd.setCursor(2, 1);
      lcd.print(temperature,0);
      }
        else
        {
        if(temperature ==0)
        {
        lcd.setCursor(1, 1);
        lcd.print("   0");
        // lcd.setCursor(2, 1);
        // lcd.print(temperature,0);
        }
          else
          {
          if(temperature >0 && temperature <=9)
          {
          lcd.setCursor(1, 1);
          lcd.print("  ");
          lcd.setCursor(3, 1);
          lcd.print(temperature,0);
          }
            else
            {
            if(temperature >=10)
            {
            lcd.setCursor(2, 1);
            lcd.print(temperature,0);
            }
            }
          }
        }
      }

Pewnie popełniłem masę szkolnych błędów, więc poproszę Was o pomoc w ich usunięciu i usprawnieniu działania wyświetlacza Smile
Edit:
Po usunięciu kodu termometru zegar pracuje (w miarę) normalnie, natomiast prędkościomierz niekoniecznie. Jak raz złapał 14km/h, to tak wyświetlał niezależnie od tego, czy jechałem 120km/h, czy stałem.
Rozumiem, że can odpuściłeś sobie całkowicie, a prędkość i czas bierzesz z GPS. Docelowo nie jest Ci potrzebny USB, więc użyj sprzętowego, a na czas testów komunikacji z GPS po UART użyj płytki MICROUSB/LEONARDO lub MEGA, albo innej z wolnym UART. Sprzętowy zapewnia pewniejsze działanie.
Naucz się używać millis, wchodzisz w funkcje odczytu znaku z UART po czym drukujesz ekran i robisz przerwę na 200ms, jak już bardzo bardzo Ci zależy na tym, by coś drukować co 200ms (choć to nie ma za bardzo sensu, bo GPS nie będzie w takim tempie aktualizował danych i wysyłał kolejnej paczki, bardziej co 1s) to ustaw to drukowanie z użyciem millis, a w każdym loop niech się odbywa tylko to while.
Poza tym w przykładzie basic masz przykładowe linie z GPS:
"$GPRMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A*7C\r\n"
Każda paczka danych jest wysłana jako linia tekstu zakończona znakiem \n, można tak jak w przykładzie SerialEvent, albo wg przykładów na tym forum po tym samym hasłem do wyszukania, zczytać całą linię, i jak jest nowa kompletna dopiero wtedy ją wrzuć do parsowania jak w przykładzie basic:
while (*gpsStream)
if (gps.encode(*gpsStream++))
displayInfo();
(16-03-2024, 16:17)Prosiak_wej napisał(a): [ -> ]Edit:
Po usunięciu kodu termometru zegar pracuje (w miarę) normalnie, natomiast prędkościomierz niekoniecznie. Jak raz złapał 14km/h, to tak wyświetlał niezależnie od tego, czy jechałem 120km/h, czy stałem.

Problem prawdopodobnie wynika z tego delay(200). Czekasz 1/5 sekundy a tym czasie cały czas idą dane z GPS, z przędkością ponad 1000 znaków /s . Pomiędzy poszczególnymi sekwencjami są różne przerwy, ale zwykle jest przerwa, a potem kilka sekwencji idzie "ciurkiem". W tą 1/5 sekundy może przyjść ze 200 znaków co pewnie jest więcej niż bufor seriala. Atmegi mają dość śladowe ilości RAM, więc i bufory są pewnie malutkie, nawet jedna pełna sekwencja się tam nie zmieści. A że mają sumy kontrolne - to jak się nie odczyta całej to wszystko "przepada". Z OneWire jest jeszcze gorzej - te procedury podobno blokują nawet przerwania, a trwają trochę długo, wystarczy, że w tym czasie przepadnie kilka znaków z seriala i sekwencja NMEA idzie do śmieci. A jeszcze czytasz GPS serialem softwarowym.
PS. 
W dokumentacji jest napisane że bufor seriala ma 64 znaki - to za mało nawet na jedną serkwencje $GPRMC, tą która zacytował #kaczakat.
Biblioteka TinyGPSPlus analizujer dwie sekwencje GPGGA i GPRMC. Czas idzie w obu, prędkość tylko w tej drugiej, wiec w momencie gdy część sekwencji jest tracona mniejsza jest szansa na prędkość.

Zauważyłem ciekawostkę w kodzie - zapalasz LED ale go nigdzie nie gasisz.
Dioda to tylko dodatek, pozostałość po użyciu wyświetlacza LED. Ale rzeczywiście - gdy zagbraknie sygnału GPS lub odłączę moduł, to wszystko się zamraża, symbol satelity nie zmienia się na iks, czas i prędkość staje w miejscu. Obecnie mam zdefiniowane dwa piny pod 1Wire, aby wskazywać temperaturę z dwóch czujników (celowo nie chcę ich adresować, tylko na płytce mieć osobne gniazdko na czujnik zewnętrznej i wewnętrznej temperatury).

Delay z końca już wyciąłem, a wskazywanie prędkości przeniosłem na osobny void, co aktualizuje prędkość mniej więcej co sekundę, dwie. Już lepiej, ale jeszcze nie to. No i przy dwóch czujnikach temperatury na prędkość znowu trzeba czekać...

Spróbuję na początek GPS przenieść na sprzętowy serial, zobaczę co to da. Zamieszczę także kod, na którym aktualny wyświetlacz pracuje (prędkość, godzina i jedna temperatura) oraz kod, nad którym pracuję (prędkość, godzina, dwie temperatury). Zmiana dlatego, że użyję wyświetlacz VFD 2x20.
Kod, nad którym pracuję (dwie temperatury):

Kod:
#include <Arduino.h>
#include <LiquidCrystal.h>

#include <SoftwareSerial.h>
#include <TinyGPSPlus.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define SW 18

const int oneWireBus_1 = 9;
const int oneWireBus_2 = 10;

OneWire oneWire1(oneWireBus_1); //Podłączenie do 9
OneWire oneWire2(oneWireBus_2); //Podłączenie do 10

DallasTemperature sensors1(&oneWire1); //Przekazania informacji do biblioteki
DallasTemperature sensors2(&oneWire2); //Przekazania informacji do biblioteki

SoftwareSerial Serial1(7, 8);
TinyGPSPlus gps;


int val;
int t1;
int t2;
int speed;



LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte zet[8] ={
                      B00100,
                      B00000,
                      B11111,
                      B00010,
                      B00100,
                      B01000,
                      B11111,
                      B00000
                     };
byte stopien[8] ={
                      B00110,
                      B01001,
                      B01001,
                      B00110,
                      B00000,
                      B00000,
                      B00000,
                      B00000
                     };
byte iks[8] ={
                      B00000,
                      B10001,
                      B01010,
                      B00100,
                      B01010,
                      B10001,
                      B00000,
                      B00000
                     };
byte satelita[8] ={
                      B11111,
                      B00100,
                      B01110,
                      B01010,
                      B01110,
                      B00100,
                      B11111,
                      B00000
                     };


void setup() {

  lcd.createChar(0, zet);
  lcd.createChar(1, stopien);
  lcd.createChar(2, iks);
  lcd.createChar(3, satelita);

  lcd.begin(20, 2);

  lcd.setCursor(0, 0);
  lcd.print("      WELCOME      ");


  delay(1000);

  lcd.clear();

  pinMode(SW,INPUT_PULLUP);

  sensors1.begin(); //Inicjalizacja czujnikow
  sensors2.begin(); //Inicjalizacja czujnikow

  while(!Serial);
  Serial.begin(9600);
  Serial1.begin(9600);
 
    lcd.setCursor(6, 0);
    lcd.print("km/h");

    lcd.setCursor(16, 0);
    lcd.write(byte(1));
    lcd.setCursor(17, 0);
    lcd.write("C");
    lcd.setCursor(19, 0);
    lcd.write(byte(29));

    lcd.setCursor(16, 1);
    lcd.write(byte(1));
    lcd.setCursor(17, 1);
    lcd.write("C");
    lcd.setCursor(19, 7);
    lcd.write(byte(30));



}

void loop()
{


   
    val = digitalRead(SW); // odczyt stanu z pinu 7 - niski=zimowy, open=letni

    if(gps.speed.isValid())            // Zaświecenie diody, gdy lokalizacja GPS jest ustalona
    {
    lcd.setCursor(0,1);               // Narysuj symbol satelity
    lcd.write(byte(3));
    }
    else
    {
    lcd.setCursor(0,1);
    lcd.write(byte(2));                // Narysuj iks
    }

    while (Serial1.available() > 0)
    if (gps.encode(Serial1.read()))
    speed = gps.speed.kmph();
    {
    speedo(); 
    uhr();
    }
    tempzero();
    temp();

}

void speedo()
{
    // int speed = gps.speed.kmph();
    // lcd.setCursor (4, 0);
    // lcd.print(speed);
        if(speed >0 && speed<1)           // - UWAGA! Zmienić górną wartość na 5 !!
        {
        lcd.setCursor(2, 0);              // Wyświetlanie napisu 0km/h, gdy prędkość jest dostępna, ale mniejsza od 5km/h
        lcd.print("  0");
        }
        else{
          if(speed >0 && speed<10)
          {
          lcd.setCursor(4, 0);
          lcd.print(speed);
          lcd.setCursor(2, 0);
          lcd.print("  ");
          }
          else
          {
            if(speed >=10 && speed <100)
            {
              lcd.setCursor(3, 0);
              lcd.print(speed);
              lcd.setCursor(2, 0);
              lcd.print(" ");
     
            }
            else
            {
            if(speed >=100)
            {
              lcd.setCursor(2, 0);
              lcd.print(speed);
            }
          }
        }
      }
     // else
     // {
     // lcd.setCursor(4, 0);              // Wyświetlanie napisu 0km/h, gdy prędkość jest dostępna, ale mniejsza od 5km/h
     // lcd.print("  0");
     // }
}

void uhr()
{
      int hours = gps.time.hour();
        hours = hours+1;
        val = digitalRead(SW); // odczyt stanu z pinu 7 - niski=zimowy, open=letni
        if(digitalRead(SW))
        hours = hours+1;
        else
        hours = hours+0;
        if(hours>23)
        hours=hours-24;     
      int minutes = gps.time.minute();  
    
           if(hours<10){
        lcd.setCursor(5, 1);
        lcd.print(" ");
        lcd.setCursor(6, 1);
        lcd.print(hours);
      }
      else{
        lcd.setCursor(5, 1);
        lcd.print(hours);
      }
    lcd.setCursor(7, 1);
    lcd.print(":");
      if(minutes<10){
        lcd.setCursor(8, 1);
        lcd.print("0");
        lcd.setCursor(9, 1);
        lcd.print(minutes);
      }
      else{
        lcd.setCursor(8, 1);
        lcd.print(minutes);
      }
}

void tempzero()
{

}

void temp()
{
  sensors1.requestTemperatures(); //Pobranie temperatury czujnika

  sensors2.requestTemperatures(); //Pobranie temperatury czujnika

  int temp1 = (sensors1.getTempCByIndex(0));
  int temp2 = (sensors2.getTempCByIndex(0));

   if(temp1 <=-100)
    {
    lcd.setCursor(12, 0);
    lcd.print(temp1);
    }
    else
    {
      if(temp1 <= -10 && temp1 >99)
      {
      lcd.setCursor(12, 0);
      lcd.print(" ");
      lcd.setCursor(13, 0);
      lcd.print(temp1);
      }
      else
      {
        if(temp1 <0 && temp1 >=-9)
        {
        lcd.setCursor(12, 0);
        lcd.print("  ");
        lcd.setCursor(14, 0);
        lcd.print(temp1);
        }
        else
        {
          if(temp1 ==0)
          {
          lcd.setCursor(12, 0);
          lcd.print("   0");
          // lcd.setCursor(2, 1);
          // lcd.print(temperature,0);
          }
          else
          {
            if(temp1 >0 && temp1 <=9)
            {
            lcd.setCursor(12, 0);
            lcd.print("   ");
            lcd.setCursor(15, 0);
            lcd.print(temp1);
            }
            else
            {
              if(temp1 >=10 && temp1 <100)
              {
              lcd.setCursor(12, 0);
              lcd.print("  ");
              lcd.setCursor(14, 0);
              lcd.print(temp1);
              }
              else
              {
                if(temp1 >=100)
                {
                lcd.setCursor(12, 0);
                lcd.print(" ");
                lcd.setCursor(13, 0);
                lcd.print(temp1);
                }
              }
            }
          }
        }
      }
  }

     if(temp2 <=-100)
    {
    lcd.setCursor(12, 1);
    lcd.print(temp2);
    }
    else
    {
      if(temp2 <= -10 && temp2 >99)
      {
      lcd.setCursor(12, 1);
      lcd.print(" ");
      lcd.setCursor(13, 1);
      lcd.print(temp2);
      }
      else
      {
        if(temp2 <0 && temp2 >=-9)
        {
        lcd.setCursor(12, 1);
        lcd.print("  ");
        lcd.setCursor(14, 1);
        lcd.print(temp2);
        }
        else
        {
          if(temp2 ==0)
          {
          lcd.setCursor(12, 1);
          lcd.print("   1");
          // lcd.setCursor(2, 1);
          // lcd.print(temperature,0);
          }
          else
          {
            if(temp2 >0 && temp2 <=9)
            {
            lcd.setCursor(12, 1);
            lcd.print("   ");
            lcd.setCursor(15, 1);
            lcd.print(temp2);
            }
            else
            {
              if(temp2 >=10 && temp2 <100)
              {
              lcd.setCursor(12, 1);
              lcd.print("  ");
              lcd.setCursor(14, 1);
              lcd.print(temp2);
              }
              else
              {
                if(temp2 >=100)
                {
                lcd.setCursor(12, 1);
                lcd.print(" ");
                lcd.setCursor(13, 1);
                lcd.print(temp2);
                }
              }
            }
          }
        }
      }
    }
}




 
A to kod, który pracuje już w samochodzie:

Kod:
#include <Arduino.h>
#include <LiquidCrystal.h>
#include <OneWire.h>

#include <SoftwareSerial.h>
#include <TinyGPSPlus.h>
#include <DallasTemperature.h>

#define SW 18
#define LED 9
#define ONE_WIRE_BUS 6


OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);



SoftwareSerial Serial1(7, 8);
TinyGPSPlus gps;


int val = 0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte zet[8] ={
                      B00100,
                      B00000,
                      B11111,
                      B00010,
                      B00100,
                      B01000,
                      B11111,
                      B00000
                     };
byte stopien[8] ={
                      B01100,
                      B10010,
                      B10010,
                      B01100,
                      B00000,
                      B00000,
                      B00000,
                      B00000
                     };
byte iks[8] ={
                      B10001,
                      B01010,
                      B00100,
                      B01010,
                      B10001,
                      B00000,
                      B00000,
                      B00000
                     };
byte satelita[8] ={
                      B11111,
                      B00100,
                      B01110,
                      B01010,
                      B01110,
                      B00100,
                      B11111,
                      B00000
                     };





void setup() {

  lcd.createChar(0, zet);
  lcd.createChar(1, stopien);
  lcd.createChar(2, iks);
  lcd.createChar(3, satelita);

  lcd.begin(16, 2);

  lcd.setCursor(0, 0);
  lcd.print("  WELCOME      ");


  delay(4000);

  lcd.clear();

  delay(200);

  pinMode(SW,INPUT_PULLUP);
  pinMode(LED, OUTPUT);


  while(!Serial);
  Serial.begin(9600);
  Serial1.begin(9600);

  sensors.setResolution(9);
 
    lcd.setCursor(4, 1);
    lcd.write(byte(1));
    lcd.setCursor(5, 1);
    lcd.write("C");
    lcd.setCursor(8, 0);
    lcd.print("km/h");


}

void loop()
{
   

    while (Serial1.available() > 0)
    if (gps.encode(Serial1.read())){
    setDisplay(); 
    }

}

void setDisplay()

{
    if(gps.speed.isValid())            // Zaświecenie diody, gdy lokalizacja GPS jest ustalona
    {
    digitalWrite(LED,HIGH);            // Dioda na pinie 9
    lcd.setCursor(15,0);               // Narysuj symbol satelity
    lcd.write(byte(3));
    }
    else
    {
    lcd.setCursor(15,0);
    lcd.write(byte(2));                // Narysuj iks
    }




    int speed = gps.speed.kmph();
    // lcd.setCursor (4, 0);
    // lcd.print(speed);
        if(speed >0 && speed<5)
        {
        lcd.setCursor(4, 0);              // Wyświetlanie napisu 0km/h, gdy prędkość jest dostępna, ale mniejsza od 5km/h
        lcd.print("  0");
        }
        else{
          if(speed >0 && speed<10)
          {
          lcd.setCursor(6, 0);
          lcd.print(speed);
          lcd.setCursor(4, 0);
          lcd.print("  ");
          }
          else
          {
            if(speed >=10 && speed <100)
            {
              lcd.setCursor(5, 0);
              lcd.print(speed);
              lcd.setCursor(4, 0);
              lcd.print(" ");
     
            }
            else
            {
            if(speed >=100)
            {
              lcd.setCursor(4, 0);
              lcd.print(speed);
            }
          }
        }
      }



     

      int hours = gps.time.hour();
        hours = hours+1;
        val = digitalRead(SW); // odczyt stanu z pinu 7 - niski=zimowy, open=letni
        if(digitalRead(SW))
        hours = hours+1;
        else
        hours = hours+0;
        if(hours>23)
        hours=hours-24;     
      int minutes = gps.time.minute();   
     
           if(hours<10){
        lcd.setCursor(10, 1);
        lcd.print(" ");
        lcd.setCursor(11, 1);
        lcd.print(hours);
      }
      else{
        lcd.setCursor(10, 1);
        lcd.print(hours);
      }
    lcd.setCursor(12, 1);
    lcd.print(":");
      if(minutes<10){
        lcd.setCursor(13, 1);
        lcd.print("0");
        lcd.setCursor(14, 1);
        lcd.print(minutes);
      }
      else{
        lcd.setCursor(13, 1);
        lcd.print(minutes);
      }
     




  sensors.requestTemperatures();
  float temperature = sensors.getTempCByIndex(0);

if(temperature <= -10)
    {
    lcd.setCursor(1, 1);
    lcd.print(temperature,0);
    }
      else
      {
      if(temperature <0 && temperature >=-9)
      {
      lcd.setCursor(1, 1);
      lcd.print(" ");
      lcd.setCursor(2, 1);
      lcd.print(temperature,0);
      }
        else
        {
        if(temperature ==0)
        {
        lcd.setCursor(1, 1);
        lcd.print("  0");
        // lcd.setCursor(2, 1);
        // lcd.print(temperature,0);
        }
          else
          {
          if(temperature >0 && temperature <=9)
          {
          lcd.setCursor(1, 1);
          lcd.print("  ");
          lcd.setCursor(3, 1);
          lcd.print(temperature,0);
          }
            else
            {
            if(temperature >=10)
            {
            lcd.setCursor(1, 1);
            lcd.print(" ");
            lcd.setCursor(2, 1);
            lcd.print(temperature,0);
            }
            }
          }
        }
      }



   



    delay (200);

}




 
Docelowo to chciałbym, aby prędkość oraz czas były odświeżane na równi z tym, co moduł GPS podaje, czyli co sekundę. Natomiast odczyt z termometrów mógłby być realizowany co 10 sekund. Czytałem dziś o funkcji millis, ale chciałbym się jej nauczyć w praktyce na osobnej platformie testowej, czekam aż przyjdą kolejne płytki Nano, żeby zrobić taki "brudnopis" Smile
A tu nie trzeba nawet millsa, wystarczy odrobinę wyobraźni.

Ale skoro masz :
while (Serial1.available() > 0)
if (gps.encode(Serial1.read())){
setDisplay();

To ręce opadają..
Tobie ręce opadają, a ja nie wiem dlaczego. W programowanie nigdy się nie bawiłem, zacząłem robić pojedyncze przykłady na jakichś wirtualnych kursach, później sklejałem klocki do siebie. Gdybyś był tak miły i powiedział, czemu to co zacytowałeś jest złe oraz zaproponował inne rozwiązanie, które pomoże mi dojść do końca, to byłbym po stokroć wdzięczny.
Stron: 1 2 3