Skocz do zawartości

Wynik mnożenia ze znakami po przecinku


Pomocna odpowiedź

19 godzin temu, farmaceuta napisał:

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; 
 }

 

nie kumam za bardzo co masz na myśli

Na polski:

Czy mam do wyświetlenia inną wartość niż ta co ostatnio wyświetliłem?

Jeśli nie, nie rób nic

Jeśli tak, wyświetl i zapamiętaj.

 

(edytowany)
#include <LiquidCrystal_I2C.h>

int buttonPin = 4;  // PIN 4
int Display = 0;
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;
unsigned long currentTime, loopTime;

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

void setup()
{
lcd.begin(20, 4);
lcd.init();
lcd.backlight();
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH); 
pinMode(watermeterPin1, INPUT);
pinMode(watermeterPin2, INPUT);   
Serial.begin(9600); 
attachInterrupt(digitalPinToInterrupt(2), getFlow1, FALLING);
attachInterrupt(digitalPinToInterrupt(3), getFlow2, FALLING);

}

void loop()
{ 
  currentTime = millis();
if(currentTime >= (loopTime + 1000))
loopTime = currentTime;
if (digitalRead(buttonPin) == LOW){  
  delay(200);                        

  Display = Display + 1;
  if(Display > 3){
    
    Display = 1;
  }

  switch (Display) {
    case 1: {
     
    
     if(impulsychwilowe1!=0.0)
{literperhour1 = (impulsychwilowe1*10);
literperhour2 = (impulsychwilowe2*10);   
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.setCursor(0,1);
lcd.print("Spal.chwil.");
lcd.setCursor(13, 1);
lcd.print("0.0  ");
lcd.setCursor(17,1);
lcd.print("l/h");

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

to może inaczej. Gdzie jest błąd w kodzie?

Edytowano przez lukas616

To może inaczej: nikomu z nas się nie chce przepuszczać Twoich kodów przez jakies indenty czy inne autoformatery.

Sformatuj kod porządnie, bo na razie to wygląda jak materac w domu publicznym (z tych tańszych).

 

23 minuty temu, lukas616 napisał:
#include <LiquidCrystal_I2C.h>

int buttonPin = 4;  // PIN 4
int Display = 0;
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;
unsigned long currentTime, loopTime;

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

void setup()
{
lcd.begin(20, 4);
lcd.init();
lcd.backlight();
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH); 
pinMode(watermeterPin1, INPUT);
pinMode(watermeterPin2, INPUT);   
Serial.begin(9600); 
attachInterrupt(digitalPinToInterrupt(2), getFlow1, FALLING);
attachInterrupt(digitalPinToInterrupt(3), getFlow2, FALLING);

}

void loop()
{ 
  currentTime = millis();
if(currentTime >= (loopTime + 1000))
loopTime = currentTime;
if (digitalRead(buttonPin) == LOW){  
  delay(200);                        

  Display = Display + 1;
  if(Display > 3){
    
    Display = 1;
  }

  switch (Display) {
    case 1: {
     
    
     if(impulsychwilowe1!=0.0)
{literperhour1 = (impulsychwilowe1*10);
literperhour2 = (impulsychwilowe2*10);   
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.setCursor(0,1);
lcd.print("Spal.chwil.");
lcd.setCursor(13, 1);
lcd.print("0.0  ");
lcd.setCursor(17,1);
lcd.print("l/h");

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

to może inaczej. Gdzie jest błąd w kodzie?

A przypomnij na czym polega problem..

26 minut temu, farmaceuta napisał:

A przypomnij na czym polega problem..

Że liczba jest wyswietlana statyczna a nie zmienna i dopiero aktualizuje się po wciśnięciu przycisku

1 godzinę temu, lukas616 napisał:

Że liczba jest wyswietlana statyczna a nie zmienna i dopiero aktualizuje się po wciśnięciu przycisku

Bo obliczenia robisz w środku if'a i to jest błąd...obliczenia rób normalnie ciągle w case, a w tym if'ie do wyświetlania masz tylko wyświetlić zmienna...

13 godzin temu, farmaceuta napisał:

Bo obliczenia robisz w środku if'a i to jest błąd...obliczenia rób normalnie ciągle w case, a w tym if'ie do wyświetlania masz tylko wyświetlić zmienna...

No niestety ale to nie pomogło

Wyświetl sobie na porcie szeregowym zmienne, które wyświetlasz, potrzebujesz do działania programu jak "impulsychwilowe1", jakiś tekst w poszczególnych if, żebyś wiedział w jakim miejscu program się znajduje. Po tym stwierdzisz czy jakąś pętle program wykonuje raz a powinien ciągiem, lub nie oblicza jakiejś zmiennej. Bo teraz wygląda tak, że zmienna "impulsychwilowe1" przyjmuje wartość 0.0 w funkcji if i tak pozostaje.

26 minut temu, Yarokot napisał:

Wyświetl sobie na porcie szeregowym zmienne, które wyświetlasz, potrzebujesz do działania programu jak "impulsychwilowe1", jakiś tekst w poszczególnych if, żebyś wiedział w jakim miejscu program się znajduje. Po tym stwierdzisz czy jakąś pętle program wykonuje raz a powinien ciągiem, lub nie oblicza jakiejś zmiennej. Bo teraz wygląda tak, że zmienna "impulsychwilowe1" przyjmuje wartość 0.0 w funkcji if i tak pozostaje.

#include <LiquidCrystal_I2C.h>



LiquidCrystal_I2C lcd(0x27,20,4);
int watermeterPin1 = 2;
int watermeterPin2 = 3;
int PRZYCISK = 4; //  PIN 4
int ostatniStan = HIGH;


volatile int  impulsychwilowe1;
volatile int  impulsychwilowe2;
float literperhour1;
float literperhour2;
byte sensorInterrupt = 0;



 void getFlow1 ()
{ 
   impulsychwilowe1++;
} 
void getFlow2 ()
{ 
   impulsychwilowe2++;
} 

void setup()
{ pinMode(4, INPUT_PULLUP);
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);
lcd.clear();  

}
 
void loop(){
literperhour1 = (impulsychwilowe1*10);
literperhour2 = (impulsychwilowe2*10);   
float literperhour = (literperhour1 - literperhour2);            
int stan = digitalRead(PRZYCISK);  
if(stan == LOW)
{lcd.setCursor(0,1);
lcd.print("Spal.chwil.");  
lcd.setCursor(13,1);            
lcd.print(literperhour,1);  
lcd.setCursor(17,1);  
lcd.print("l/h");


}  
}  

Ja już całkiem zgłupiałem. Uprościłem kod jak tylko można i dalej po naciśnięciu przycisku nie jest wyświetlana zmienna tylko stała liczba.

9 minut temu, Yarokot napisał:

Teraz funkcja if wykonuje się tylko wtedy kiedy masz wciśnięty przycisk.

To jak mam zrobić aby po wciśnięciu przycisku wyświetlana była liczba która się zmienia w zależności od obrotów czujnika?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...