Skocz do zawartości

Przeskakiwanie na ekranie funkcji przyciskiem


Pomocna odpowiedź

@ethanak @ethanak Sory  juz sie poprawilem wlasnie zastanawialem sie jak dodac kod a teraz juz wiem dzieki . Własnie o to mi chodzi aby byl jeden szkic tylko jak dopisac wlasnie aby chodzila mi ten wskaznik a jak przelacze aby mi pokazal tenperature tylko wlasnie mi chodzi jak wstawic ten wskaznik aby jak bede krecil potenciometrem aby wskaznik sie podnosil jak dopisac czujnik do wyswietlanego wlasnie wskaznika 

 

(edytowany)

Rozumiem, że nie chcesz gotowego kodu a sam go napiszesz.

Oczywiście - nie da się na jednym rdzeniu robić dwóch rzeczy na raz. Ale można to zrobić szybciutko po kolei - a jeśli dobrze to przemyślisz to będziesz miał swój efekt.

Załóżmy, że na początku funkcji loop siedzi Twój kod menu. Kod wykonuje się szybko, nie blokuje praktycznie procesora (pomijając jakieś delaje w debouncingu, które nie są do niczego potrzebne), a gdzieś w jakiejś zmiennej (masz już taką, możesz skorzystać z WhichScreen) siedzi numerek wyświetlanego ekranu.

Teraz trzeba tylko dopisać część wyświetlającą właściwe rzeczy. W telegraficznym skrócie wyglądałoby to tak:

void loop()
{
	    
	//wybieramy ekran tak jak poprzednio

    switch (WhichScreen) {
      case 1:
        obsluga_paliwomierza();
        break;
      case 2:
        obsluga_szybkosciomierza();
        break;
     // i tak dalej

Musisz tylko pamiętać, że masz pozbyć się każdego jednego delaya. Dla debouncingu będzie to proste: zamiast kombinować zastosuj po prostu bibliotekę Bounce2 (w przykładach jest pokazana obsługa kilku klawiszy). A w procedurach obsługi... cóż, musisz doczytać jak pozbyć się delay i zastosować millis (na przykład tutaj).

Wystarczy?

Ogólnie te kursy po coś są, warto do nich sięgnąć.

Edytowano przez ethanak

Wygrałem taki kod ale gdy wejdę w LcdBarGraph czyli paliwomierz to pokaże  mi wartość ale gdy grece czujnikiem nie zmienia się wartość dopiero jak przelecę menu i wrócę znów to paliwomierza to zmieni się wartość chodzi o to ze nie zmienia się wartość tak jak by na żywo jak kręcę  

#include <Wire.h>
#include <LiquidCrystal.h>
#include <LcdBarGraph.h>

  byte lcdNumCols = 16; // -- number of columns in the LCD
byte sensorPin = A5;  
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
LcdBarGraph lbg(&lcd, lcdNumCols);
 
int WhichScreen =1;   // This variable stores the current Screen number
boolean hasChanged = true;
const int buttonPin = 8;    // the number of the pushbutton pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers
 
void setup()
{
  lcd.begin(16, 2);
  pinMode(buttonPin, INPUT);
   
}
void loop()
{
 
  if (hasChanged == true) {
   
  switch(WhichScreen) {
    case 1:
    {
      LcdBarGraph();

   
    }  
      break;
   
    case 2:
      {
        secondScreen();
      }
      break;
   
    case 3:
      {
        thirdScreen();
      }
      break;
   
    case 4:
      {
        fourthScreen();
      }
      break;
   
    case 5:
      {
        fifthScreen();
      }
      break;
   
    case 6:
      {
        temperatura();
      }
      break;
    case 0:
      {
       
      }
      break;
    }
}
 
    //-------------------------------
    // BEGIN of the switch debouncing code
    int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
 
if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:
 
    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;
 
      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        hasChanged = true;
        WhichScreen++;
       
       
      }
    } else {
      hasChanged = false;
    }
  }
  lastButtonState = reading;
  // END of the switch Debouncing code
  // --------------------------------------
  if (WhichScreen > 6){
    WhichScreen = 1;
  }
}
 
void LcdBarGraph()
  {
  
   
  lcd.begin(2, lcdNumCols);
  lcd.clear();
  delay(100);
  lcd.setCursor(5,1);
  lcd.print("Paliwo");
  lcd.setCursor(0,1);
  lcd.print("E");
  lcd.setCursor(15,1);
  lcd.print("F");


 {lbg.drawValue( analogRead(A5), 1010);
    delay(1000);}
  }
void secondScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("  Drugi ekran");
    lcd.setCursor(0,1);
    lcd.print("mojego menu !!");
  }
void thirdScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("Witaj świecie!");
    lcd.setCursor(0,1);
    lcd.print("Trzeci ekran (3)");
  }
void fourthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("To jest ekran 4");
    lcd.setCursor(0,1);
    lcd.print("Just press btn");
  }
void fifthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("   Piąty ekran");
    lcd.setCursor(0,1);
    lcd.print("i2C LCD screen");
  }
void temperatura()
  {
    lcd.clear();
    lcd.begin(16, 2);
    lcd.print("Temperatura: ");

 
  }

jak przypisać dany pin do wyświetlanej wartość ??????

No to popatrz sobie na swój program.

if (hasChanged == true) {

Co to oznacza? Czyżby nie to, że "jak zmieniam menu to wyświetlaj" (a w podtekście: "jak nie zmieniam to nie wyświetlaj")?

7 minut temu, piotrek_brt napisał:

jak przypisać dany pin do wyświetlanej wartość ??????

Możesz to jakoś na polski przetłumaczyć? A najlepiej napisz co chcesz osiągnąć, bo chyba coś strasznie naokoło kombinujesz.

 

  • Lubię! 1

chodzi mi ze pod pin A5 mam podłączony czujnik paliwa i chce aby z niego czytało mi wartość paliwomierza a jak  przeskoczę na czujnik temperatury czyli pin a4 aby te piny się nie nakładały 

No to to chcesz tu przypisywać...

Masz dwie możliwości.

Pierwsza: oddzielne funkcje paliwomierza i termometru. Trywialne, bo:
 

void paliwomierz()
{
	int paliwo = analogRead(a5);
	// wyświetl paliwo, np:
	lcd.print(paliwo) ;// no, może nie tak prosto ale podobnie
}

void termometr()
{
	int temp = analogRead(a4);
	// wyświetl temperaturę
}

Ale rozumiem, że chcesz skorzystać se swojego bargrafu. Ja bym i tak zrobił oddzielne funkcje, coś w stylu:

void paliwomierz()
{
   lbg.drawValue(analogRead(a5), MAX_FUEL);
}

void termometr()
{
  lbg.drawValue(analogRead(a4), MAX_TEMP);
}

I w zależności od tego na którym menu jesteś wywołujesz którąś z tych funkcji zamiast swoich "screenFirst" i podobnych ładnie nazwanych. A stałe MAX_FUEL i MAX_TEMP musisz sobie zdefiniować.

Oczywiście to straszliwe uproszczenie, warto by było napisać co właściwie wyświetlasz i wyświetlać wyniki co jakiś czas (kłania się millis(), zapomnij o delay()), ale to już sobie dopiszesz.

 

  • Lubię! 2

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...