Skocz do zawartości

Przeskakiwanie na ekranie funkcji przyciskiem


piotrek_brt

Pomocna odpowiedź

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

Dnia 8.12.2020 o 07:30, Gieneq napisał:

@piotrek_brt zapoznaj sie z maszyna stanu, zmiennymi/flagami/stanami i obsługą przycisku w trybie zatrzasku tak jak pisałem tu:

 

 

Myślę, że do tak prostej funkcjonalności wystarczy mu zwykła flaga.

Ale jak najbardziej popieram naukę i praktykowanie różnych wzorców projektowych!

Link do komentarza
Share on other sites

(edytowany)

wgralem taki szkic na  przeskakiwanie przyciskiem lecz przycisk mi nie dziala za to jak zblize palce kolo pinow na arduino kolo plytki ekran sie przelacza co jest nie tak 

// NJarpa
// LCD 16x2 Multiple screens example

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //To lcd (RS,E,D4,D5,D6,D7)

//Counter to change positions of pages

int page_counter=1 ;       //To move beetwen pages


//-------Pins-----//
int up = 8;               //Up button
int down = 10;           //Down button
//---------Storage debounce function-----//
boolean current_up = LOW;          
boolean last_up=LOW;            
boolean last_down = LOW;
boolean current_down = LOW;
        

void setup() {
  lcd.begin(16,2); 

}


   //---- De-bouncing function for all buttons----//
boolean debounce(boolean last, int pin)
{
boolean current = digitalRead(8);
if (last != current)
{
delay(5);
current = digitalRead(8);
}
return current;
}


void loop() {

current_up = debounce(last_up, up);         //Debounce for Up button
current_down = debounce(last_down, down);   //Debounce for Down button

//----Page counter function to move pages----//

//Page Up
    if (last_up== LOW && current_up == HIGH){  //When up button is pressed
      lcd.clear();                     //When page is changed, lcd clear to print new page  
      if(page_counter <3){              //Page counter never higher than 3(total of pages)
      page_counter= page_counter +1;   //Page up
      
      }
      else{
      page_counter= 3;  
      }
  }
  
    last_up = current_up;

//Page Down
    if (last_down== LOW && current_down == HIGH){ //When down button is pressed
      lcd.clear();                     //When page is changed, lcd clear to print new page    
      if(page_counter >1){              //Page counter never lower than 1 (total of pages)
      page_counter= page_counter -1;   //Page down
      
      }
      else{
      page_counter= 1;  
      }
  }
    
    last_down = current_down;

//------- Switch function to write and show what you want---// 
  switch (page_counter) {
   
    case 1:{     //Design of home page 1
      lcd.setCursor(5,0);
      lcd.print("This is");
      lcd.setCursor(3,1);
      lcd.print(" Home Page");
    }
    break;

    case 2: { //Design of page 2 
     lcd.setCursor(5,0);
     lcd.print("This is");
     lcd.setCursor(5,1);
     lcd.print("Page 2");
    }
    break;

    case 3: {   //Design of page 3 
     lcd.setCursor(1,0);
     lcd.print("You are now on");
     lcd.setCursor(4,1);
     lcd.print("Page 3");
    }
    break;
    
  }//switch end
  
}//loop end

 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

A tak przy okazji, to odczytujesz tylko przycisku up (8), bo w funkcji debounce zamiast korzystać z parametru pin, masz na stałe wpisane 8.

A taki kod:

   if(page_counter <3){              //Page counter never higher than 3(total of pages)
      page_counter= page_counter +1;   //Page up 
   } else{
      page_counter= 3; 
  }

Można znacznie uprościć:

const maxPage = 3;
pageCounter = min(maxPage, pageCounter - 1);
// I to samo w drugą stronę
pageCounter = max(1, pageCounter + 1);
// Ewentualnie jeśli stron jest dużo, może warto zapętlać, czyli po ostatniej dać pierwszą i vice versa, wtedy:
pageCounter = (pageCounter + direction) % maxPage + 1;
// Gdzie direction to 1 bądź -1 w zależności czy w górę czy w dół
// A +1 na końcu bo w switch/case używasz liczenia od 1 do maxPage zamiast w stylu C od 0 do maxPage-1

 

P.S. sorry za formatowanie kodu, obsługa tego edytora na komórce to istny koszmar.

Edytowano przez Marooned
Link do komentarza
Share on other sites

Tyle że ja to pisałem zanim pokazałeś schemat. Ponieważ masz już oporniki podciągające do masy, trzeba dać INPUT a nie INPUT_PULLUP.

Przede wszystkim sprawdź, co tak naprawdę dzieje się po wciśnięciu przycisku. Czyli program może wyglądać np. tak:

const int up = 8;
const int down = 10;

void setup()
{
	pinMode(up, INPUT);
	pinMode(down, INPUT);
	Serial.begin(9600);
}


void loop()
{
	Serial.print(digitalRead(down));
	Serial.println(digitalRead(up));
	delay(200);
}

Jeśli to uruchomisz, na monitorze serial powinieneś widzieć zmiany w czasie wciskania przycisków. Jeśli są zmiany - będziemy próbować dalej. Jeśli nie ma - coś masz źle podłączone.

Niestety - jak na złość nie mam ani jednego czteropinowego przycisku, więc nie sprawdzę czy na pewno są podłączone dobrą stroną...

Jeszcze jedno: czy na pewno ta płytka ma połączenie linii zasilania na całej długości? Bo moja na przykład nie ma.

 

 

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

(edytowany)

@ethanak @ethanak  wgralem inne menu z jednym przyciskiem i dziala teraz moje pytanie jak wgrac szkic do tego aby wyswietlal mi poziom paliwa ???

#include <Wire.h>
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
 
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:
    {
      firstScreen();
    }
      break;
   
    case 2:
      {
        secondScreen();
      }
      break;
   
    case 3:
      {
        thirdScreen();
      }
      break;
   
    case 4:
      {
        fourthScreen();
      }
      break;
   
    case 5:
      {
        fifthScreen();
      }
      break;
   
    case 6:
      {
        sixthScreen();
      }
      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 firstScreen()
  {
  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");
  }
void secondScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("  Second screen");
    lcd.setCursor(0,1);
    lcd.print("of my menu !!");
  }
void thirdScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("Hello, world!");
    lcd.setCursor(0,1);
    lcd.print("Third screen (3)");
  }
void fourthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("This is screen 4");
    lcd.setCursor(0,1);
    lcd.print("Just press btn");
  }
void fifthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("   Fifth screen");
    lcd.setCursor(0,1);
    lcd.print("i2C LCD screen");
  }
void sixthScreen()
  {
    lcd.clear();
    lcd.setCursor(0,0); // Column, line
    lcd.print("THE last screen");
    lcd.setCursor(0,1);
    lcd.print("  Sixth and last");
  }


 

 

 

i chcial bym dograc ten szkic 

 

#include <LiquidCrystal.h>
#include <LcdBarGraph.h>
byte lcdNumCols = 16; // -- number of columns in the LCD
byte sensorPin = A5; // -- value for this example
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // -- creating LCD instance
LcdBarGraph lbg(&lcd, lcdNumCols);  // -- creating
void setup(){
  
  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");
}
void loop()
{
  // -- draw bar graph from the analog value readed
  lbg.drawValue( analogRead(A5), 1010);
  // -- do some delay: frequent draw may cause broken visualization
  delay(2000);
}

 

Edytowano przez piotrek_brt
Link do komentarza
Share on other sites

Niestety - nie da się zrobić trzech rzeczy: nałożyć hełmu na lewą stronę, wejść na baczność po schodach i wgrać dwóch szkiców do jednego Arduino.

Musisz stworzyć trzeci szkic, który będzie robił jednocześnie to samo co te dwa. Ale to już temat na inny wątek.

A przy okazji: nad tym okienkiem co piszesz masz po kolei taką literkę "B", obok literka "I", a zaraz dalej taki śmieszny znaczek <> z napisem "wstaw kod". Zacznij tego używać, bo tak zamieszczonego kodu jak to zrobiłeś nikt nie będzie czytać...

  • Lubię! 1
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!

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