• 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
Czar "0" z przodu...
#11
(12-02-2023, 01:37)Jarewa0606 napisał(a): int czas_pozostaly_proc = (klepsydra_sek/sekundy_ustaw)*100;
      co jest de facto:
int czas_pozostaly_proc  = (100/3600)*100;


Pewnie  klepsydra_sek i sekundy_ustaw to zmienne całkowite, wiec masz źle  i nawet ustawienie

float czas_pozostaly_proc = (klepsydra_sek/sekundy_ustaw)*100;

Nic nie zmieni bo przy obliczeniu nie wie że wynik jest float.  I będzie liczył liczby całkowite gdzie:

100/3600 = 0  a 0*100 = 0. 

Musisz mu to wskazać zrub rzutowanie

float czas_pozostaly_proc = (float(klepsydra_sek/sekundy_ustaw)*100);

Napisałem: czas_pozostaly_proc = (float(klepsydra_sek/sekundy_ustaw)*100);, 
wcześniej kombinowałem z zapisem: (float)(klepsydra_sek/sekundy_ustaw)*100); (jest prawidłowy? kompilator nawet nie pisnął)...

niestety nadal jest 0 u mnie. Sad

Co ciekawe: float ddd = 100/3600; też daje 0... u mnie... coś trzeba ustawić?


Na razie pominąłem te procenty, moze trzeba każdą zmienną osobno zrobić float? Sprawdzę i potwierdzę.
 
Odpowiedź
#12
Mam prośbę, co źle robię, chcę, aby były 3 znaki specjalne i coś nie wychodzi:

Mam zdefiniowane globalnie:
byte celsjusz[] = {B00100, B01010, B10001, B01010, B00100, B00000, B00000, B00000};
byte statek[] = {B00100, B00110, B00111, B00100, B11111, B01110, B00000, B00000};
byte clock[] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0};

dalej: w loop
lcd.createChar(0, clock);
lcd.createChar(1, celsjusz);
lcd.createChar(2, statek);
lcd.home();

jednak gdy wywołam:
lcd.setCursor(0,0);
lcd.write(byte(0));

lub lcd.write(0); lub i inne bajty: lcd.write(1); lcd.write(2); , nawet 10 - to zawsze mi pojawia się stateczek...

WHY?
 
Odpowiedź
#13
Kod:
Co ciekawe: float ddd = 100/3600; też daje 0... u mnie... coś trzeba ustawić?
float ddd = 1/36.0 wywal zera i dodaj coś po przecinku, jak w działaniach biorą liczby int to działanie jest promowane do typu int, co obcina wszystko po kropce. Jak masz w równaniu dzielenie i mnożenie to najpierw rób mnożenie, wywalaj zera bo po co mnożyć x 100 jak potem dzielisz przez 3600, można podzielić przez 36 i otrzymać ten sam wynik.
Zrób sobie cała bufor na całą linię do wysłania na ekran by można było używać sprintf do sformatowania całej linii, to działa efektywniej niż dukanie po literce.
Stateczku może nie ma ale znak stopnia C na pewno jest w pamięci LCD, możesz to sprawdzić drukując po kolei wszystkie znaki char z LCD, to po prostu liczby od 0-255, czy tam od 0x0 do 0xFF.
Np. mój LCD ma coś takiego:
   
Więc wystarczy w odpowiednie pole tablicy char wpisać wartość 0xDF by na LCD zobaczyć taki  oC.
Jak sobie zrobisz customowy znak to raczej trzeba go sobie tam ręcznie dodawać i pamiętać by zlokalizować go w odpowiednie miejsce.
Na koniec Twoje znaki pokazują się na LCD normalnie, pewnie masz jakiś czeski błąd w swoim programie, którego nie pokazujesz w całości.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#14
Cytat:float ddd = 100/3600
żeby to cudo liczyło Ci się z przecinkami musisz co najmniej mianownik zrzutować na float, czyli:

Kod:
float ddd = 100/(float)3600;
u mnie działa Smile

Kod:
lcd.createChar(0, clock);
lcd.createChar(1, celsjusz);
lcd.createChar(2, statek);
lcd.home();
Próbowałeś to przenieść do setup()? W bibiliotece LiquidCrystal nie widać innej implementacji createChar() w inny sposób niż jej używasz...
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości