16-03-2024, 12:23
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:
Termometr:
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
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