• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wyświetlacz do samochodu - termometr, zegar, prędkość - rzadko się odświeża
#1
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
 
Odpowiedź
  


Wiadomości w tym wątku
Wyświetlacz do samochodu - termometr, zegar, prędkość - rzadko się odświeża - przez Prosiak_wej - 16-03-2024, 12:23

Skocz do:


Przeglądający: 1 gości