Skocz do zawartości

Wynik mnożenia ze znakami po przecinku


lukas616

Pomocna odpowiedź

@lukas616 czyli całe obliczenia w kodzie to:

literperhour = (pulse_frequency * 60 / 7.5);

Zmienna pulse_frequency to liczba całkowita. To - jeśli nie mam chwilowego zaćmienia umysłu - dla każdej wartości tej zmiennej wynik będzie całkowity. Co trzeba podstawić zamiast pulse_frequency wynik był z ułamkiem? Nie ma przecież takiej wartości.

Link do komentarza
Share on other sites

5 godzin temu, Treker napisał:

@lukas616 czyli całe obliczenia w kodzie to:

literperhour = (pulse_frequency * 60 / 7.5);

Zmienna pulse_frequency to liczba całkowita. To - jeśli nie mam chwilowego zaćmienia umysłu - dla każdej wartości tej zmiennej wynik będzie całkowity. Co trzeba podstawić zamiast pulse_frequency wynik był z ułamkiem? Nie ma przecież takiej wartości.

Czyli pulse_frequency wychodzi na to że to liczba impulsów jakie odczytało arduino. OK to ma sens bo liczba impulsów zawsze będzie liczbą całkowitą. Ściągnąłem ten kod z neta i praktycznie go nie rozumiałem ale teraz rozjaśniło mi to umysł. Jestem początkujący w te klocki i proszę o wyrozumiałość.

Link do komentarza
Share on other sites

Mam problem z wyświetlaczem. Mam przepływomierz i wynik jest podawany w l/h z jednym znakiem po przecinku i na wyświetlaczu gdy jest przepływ w jednościach to elegancko chodzi ale gdy przepływ jest np 20 l/h i potem spada do 0 to na wyświetlaczu jest podawane 0.00 czyli wychodzi że wyświetlacz się nie odświeża. Gdzie jest problem?

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@lukas616 to normalne, jeśli nie czyścisz lub nie nadpisujesz całego pola, w którym wyświetlana jest wartość. Pokaż jak odkładnie wygląda teraz kod, który wyświetla tę informację. 

Link do komentarza
Share on other sites

2 godziny temu, Treker napisał:

@lukas616 to normalne, jeśli nie czyścisz lub nie nadpisujesz całego pola, w którym wyświetlana jest wartość. Pokaż jak odkładnie wygląda teraz kod, który wyświetla tę informację. 

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);
int watermeterPin1 = 2;
int watermeterPin2 = 3;

volatile int  impulsychwilowe1;
volatile int  impulsychwilowe2;
volatile int  impulsycalkowite1;
volatile int  impulsycalkowite2;
volatile int  impulsycalkowite11;
volatile int  impulsycalkowite22;
float  liter1;
float  liter2;
float liter11;
float liter22;
float literperhour1;
float literperhour2;
byte sensorInterrupt = 0;
unsigned long currentTime, loopTime;

 void getFlow1 ()
{ 
   impulsychwilowe1++;
impulsycalkowite1++;
impulsycalkowite11++;
} 
void getFlow2 ()
{ 
   impulsychwilowe2++;
impulsycalkowite2++;   
impulsycalkowite22++;
} 

void setup()
{ 
  lcd.init();
  lcd.backlight();
   lcd.setCursor(6,1);
      lcd.print(" WITAJ! "); 
delay(1000);


 
   pinMode(watermeterPin1, INPUT);
 pinMode(watermeterPin2, INPUT);   
   Serial.begin(9600); 
   attachInterrupt(sensorInterrupt, getFlow1, FALLING);
   attachInterrupt(digitalPinToInterrupt(3), getFlow2, FALLING);
  currentTime = millis();
   loopTime = currentTime;   
   lcd.clear();                                
  } 

void loop ()    
{
  
 currentTime = millis();
   if(currentTime >= (loopTime + 1000))
   
{
  loopTime = currentTime;
  if(impulsychwilowe1!=0.0)
  {

      literperhour1 = (impulsychwilowe1/2);
      literperhour2 = (impulsychwilowe2/2);   
      float literperhour = (literperhour1 - literperhour2);   
       impulsychwilowe1=0.0;
impulsychwilowe2=0.0;          
    
          lcd.setCursor(0,1);
      lcd.print("Spal.chwil.");  
          lcd.setCursor(13,1);            
          lcd.print(literperhour,1);  
          lcd.setCursor(17,1);  
            lcd.print("l/h");
}
else{
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Spal.chwil.");
lcd.setCursor(13, 1);
lcd.print(impulsychwilowe1-impulsychwilowe2);
    lcd.setCursor(17,1);
    lcd.print("l/h");
 }
        }

      
{lcd.setCursor(0, 2);
     lcd.print("Spal.calk "); 
      liter1 = (impulsycalkowite1*10);
      liter2 = (impulsycalkowite2*10);   
      float liter = (liter1 - liter2);     
lcd.setCursor(13,2);
        lcd.print(liter/300, 1);        
      lcd.print(" l");
}
{lcd.setCursor(0, 3);
     lcd.print("Spal.rob. "); 
      liter11 = (impulsycalkowite11*8.23);
      liter22 = (impulsycalkowite22*10);   
      float liter_ha = (liter11 - liter22); 
      impulsycalkowite11=0;
      impulsycalkowite22=0;    
lcd.setCursor(11,3);
        lcd.print(liter_ha, 1);  
        lcd.setCursor(16, 3);     
      lcd.print("l/ha");
}

}

Doszedłem do tego że spada teraz do 0 tylko że gdy nie ma przepływu druga i trzecia linijka miga tak jakby się odświeżała i nie wiem czy to nie zniszczy wyświetlacza w dłuższej perspektywie czasowej.

Link do komentarza
Share on other sites

18 godzin temu, lukas616 napisał:

i trzecia linijka miga tak jakby się odświeżała i nie wiem czy to nie zniszczy wyświetlacza w dłuższej perspektywie czasowej.

Nie, wyświetlacz się nie uszkodzi. Jeśli takie rozwiązanie Ci wystarcza to możesz tak zostawić. Alternatywnie, zamiast czyszczenia całej linii możesz wyświetlać w danej lokalizacje spacje, jeśli liczba zajmuje mniej znaków niż poprzednio. 

Niezależnie od tego polecam jeszcze zadbać o formatowanie kodu. Wiem, że zaczynasz i robisz wiele testów, ale warto na chwilę się zatrzymać i poprawić wcięcia, lokalizację nawiasów itd. Praca z takim chaotycznym kodem jest dużo trudniejsza, za jakiś czas przez pomyłkę coś usuniesz/nadpiszesz i wszystko przestanie działać, a znalezienie brakującego nawiasu zajmie Ci wiele czasu.

  • Lubię! 1
Link do komentarza
Share on other sites

7 godzin temu, Treker napisał:

Nie, wyświetlacz się nie uszkodzi. Jeśli takie rozwiązanie Ci wystarcza to możesz tak zostawić. Alternatywnie, zamiast czyszczenia całej linii możesz wyświetlać w danej lokalizacje spacje, jeśli liczba zajmuje mniej znaków niż poprzednio. 

Niezależnie od tego polecam jeszcze zadbać o formatowanie kodu. Wiem, że zaczynasz i robisz wiele testów, ale warto na chwilę się zatrzymać i poprawić wcięcia, lokalizację nawiasów itd. Praca z takim chaotycznym kodem jest dużo trudniejsza, za jakiś czas przez pomyłkę coś usuniesz/nadpiszesz i wszystko przestanie działać, a znalezienie brakującego nawiasu zajmie Ci wiele czasu.

Dzięki wielkie za pomoc:)

Teraz mam nieco bardziej skomplikowany problem a mianowicie chcę utworzyć kilka ekranów na jednym lcd a mianowicie chce aby na jednym ekranie wyświetlane były parametry spalania i żeby przyciskiem przełączyć np na pomiar temperatury. Jakieś sugestie jak ugryźć temat?

Link do komentarza
Share on other sites

Zrób dwa czy tam więcej buforów z danymi do wyświetlenia, potem prostą maszynę stanów i wyświetlaj zawartość buforów zależnie od wybranej pozycji.

Czyli zamiast wyświetlać bezpośrednio robisz mniej więcej:

char ekran_temp[32];
char ekran_costam[32];

// formatowanie danych do odpowiednich tablic....

if(jakis_state == 1)lcd.... ekran_temp;
if(jakis_inny_stat)lcd.... ekran drugi;

WAŻNE: trochę się zapędziłem z tymi buforami 😉 nie chodzi o to że do każdej wyświetlanej pierdołki masz powołać osobny bufor, bo szybko skończy się ram,  a o to aby manipulować tymi dwoma dostępnymi buforami tj: kiedy z jednego wyświetlasz, formatujesz dane do tego co jest wolny i tak dalej.

Edytowano przez _LM_
Link do komentarza
Share on other sites

20 minut temu, _LM_ napisał:

Zrób dwa czy tam więcej buforów z danymi do wyświetlenia, potem prostą maszynę stanów i wyświetlaj zawartość buforów zależnie od wybranej pozycji.

Czyli zamiast wyświetlać bezpośrednio robisz mniej więcej:

char ekran_temp[32];
char ekran_costam[32];

// formatowanie danych do odpowiednich tablic....

if(jakis_state == 1)lcd.... ekran_temp;
if(jakis_inny_stat)lcd.... ekran drugi;

WAŻNE: trochę się zapędziłem z tymi buforami 😉 nie chodzi o to że do każdej wyświetlanej pierdołki masz powołać osobny bufor, bo szybko skończy się ram,  a o to aby manipulować tymi dwoma dostępnymi buforami tj: kiedy z jednego wyświetlasz, formatujesz dane do tego co jest wolny i tak dalej.

A jakbyś mógł po ludzku wytłumaczyc?:)

Link do komentarza
Share on other sites

Wykorzystujesz instrukcję case do wyświetlania różnych informacji. W zależności jak napiszesz program dane będziesz odczytywał ciągiem lub wtedy kiedy będzie aktywny dany case. Zmienną "stan" zmieniasz przyciskiem od wartości 1 do ilości ekranów jakie chcesz wyświetlać. Poza instrukcją case już nie wykorzystujesz instrukcji wyświetlających dane na wyświetlaczu.
 

switch(stan) { 
    case 1:
      //Instrukcje wyświetlające dane na temat spalania na wyświetlaczu
 
    break;
    
    case 2:
      //Instrukcje wyświetlające dane na temat temperatury na wyświetlaczu
 
    break;
}

 

  • Lubię! 2
Link do komentarza
Share on other sites

22 godziny temu, Yarokot napisał:

Wykorzystujesz instrukcję case do wyświetlania różnych informacji. W zależności jak napiszesz program dane będziesz odczytywał ciągiem lub wtedy kiedy będzie aktywny dany case. Zmienną "stan" zmieniasz przyciskiem od wartości 1 do ilości ekranów jakie chcesz wyświetlać. Poza instrukcją case już nie wykorzystujesz instrukcji wyświetlających dane na wyświetlaczu.
 

switch(stan) { 
    case 1:
      //Instrukcje wyświetlające dane na temat spalania na wyświetlaczu
 
    break;
    
    case 2:
      //Instrukcje wyświetlające dane na temat temperatury na wyświetlaczu
 
    break;
}

 

No pokombinowałem trochę tylko jest problem z wyświetlaniem zmiennych na bieżąco czyli wyświetlana jest statyczna liczba a po wciśnięciu przycisku liczba się aktualizuje tylko ja chcę aby dane były wyświetlane na bieżąco.

Link do komentarza
Share on other sites

19 minut temu, lukas616 napisał:

No pokombinowałem trochę tylko jest problem z wyświetlaniem zmiennych na bieżąco czyli wyświetlana jest statyczna liczba a po wciśnięciu przycisku liczba się aktualizuje tylko ja chcę aby dane były wyświetlane na bieżąco.

Wchodzisz w case który Cię interesje i latasz w nim w kółko...a jak wartość wyświetlana się zmieni to wtedy aktualizujesz... 

zmienna = odczyt;

switch (x) { 
    case 0:
    if (zmienna != kopia) { 
    //  wyswietl 
      kopia = zmienna; 
      }
    break; 
 }

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.