Skocz do zawartości

Menu dla modułu 4-digits 7-segmentowy


szczepulek

Pomocna odpowiedź

W osobnym temacie samo menu do wykorzystania z wyświetlaczami 7 segmentowymi, pozwala się przełączać pomiędzy kolejnymi "stronami" w pętli np.: 1 - 2 - 3 - 4 - 1 - 2 - 3 -...

Button podpięty pod PIN w przykładzie 4 (INPUT_PULLUP) i zwierający z masą GND.
 

#include <TM1637Display.h>

/* Napisał: Szczepulek

 * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit
 
 *  kod oryginalny dla cieklokrystalicznych https://github.com/FritzenLab/LCD-Screen-Menu-System/tree/master/LCD-Screen-Menu
 *  Clovis Fritzen in 05/06/2017
*/

#define CLK1 5 //wyswietlacz nr1 8segm.4-cz
#define DIO1 6 //wyswietlacz nr1 8segm.4-cz


int WhichScreen =1;   // Nr strony przechowywany w zmiennej //This variable stores the current Screen number
boolean hasChanged = true;
const int buttonPin = 4;    // PIN dla przycisku // the number of the pushbutton pin
int buttonState;             // status przycisku obecny - odczyt // the current reading from the input pin
int lastButtonState = LOW;   // poprzedni stan na przycisku
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637

uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 };  //Dla LEDDispl4digit

//wyswietlenie segmentow dla AL
const uint8_t disp_alarm[] = {
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,           // A
  SEG_D | SEG_E | SEG_F   // L
};

//wyswietlenie segmentow dla L
const uint8_t disp_linia[] = {
  SEG_D | SEG_E | SEG_F ,// L
   0  // O
};  


void setup()
{

  pinMode(buttonPin, INPUT_PULLUP);
  display_1.setBrightness(0x0a); //LED7Seg jasnosc
   Serial.begin(9600);
   WhichScreen = 0;  //aby przy starcie zaczynało na pierwszej opcji menu
}
void loop()
{

  if (hasChanged == true) {
    
  switch(WhichScreen) {
    case 1:
    {
      firstScreen();
    }
      break;
    
    case 2:
      {
        secondScreen();
      }
      break;
    
    case 3:
      {
        thirdScreen();
      }
      break;
    
   /* Dla wiekszej ilosci wyswietlania pozycji menu
    *  
    case 4:
      {
        fourthScreen();
      }
      break;
    
    case 5:
      {
        fifthScreen();
      }
      break;
    
    case 6:
      {
        sixthScreen();
      }
      break;
      */
 
    case 0:  //konczacy zapis menu
      {
        
      }
      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 > 3){  // UWAGA! jesli masz wiecej stron niz 3, musiasz zmienic warunek wpisujac wartosc rowna ilosci stron
    WhichScreen = 1;
  }
}

void firstScreen()
  {
    display_1.clear();
   Serial.println("glowny ekran");  // test w serial
   display_1.showNumberDec(99, false, 2, 2);
  }
 
void secondScreen()
  {
  display_1.clear();  //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu
 int alarmHigh = 30;
 display_1.setSegments(disp_alarm, 2, 0);
 display_1.showNumberDec(alarmHigh, false, 2, 2);
  Serial.print("alarm:");  // test w serial
  Serial.println(alarmHigh);
  }
 
void thirdScreen()
  {
   display_1.clear();
  int liniaNr = 7;
  display_1.showNumberDecEx(liniaNr,0, true);
  display_1.setSegments(disp_linia, 2, 0);
 
   Serial.print("linia nr:");  // test w serial
   Serial.println(liniaNr);
  }
/*

dla większej ilosci przejsc miedzy wyswietlanymi informacjami/stronami !!!
 
 void fourthScreen()
  {
    //tresc 4 strony
  }
void fifthScreen()
  {
    //tresc 5 strony
  }
void sixthScreen()
  {
    //tresc 6 strony
  }
  */

 

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

okej, nie jest to rozwiązanie satysfakcjonujące, jeśli ma byś statyczne wyświetlanie ok.

W momencie gdy dodam np.

  int value = analogRead(2);
  Serial.print(F("Wejscie analogowe 2 ma wartosc: "));
  Serial.println(value)

w pętli loop. to będzie sobie wyświetlać serial w monitorze wartości, lecz wyswietlając w case1 (1 strona) te zmienna value, nie zmienia się, nie odświeża jej nawet po przeskoczeniu przez wszystkie strony. No to się pocieszyłem 🙂

Link do komentarza
Share on other sites

Poprawiony kod...

po dodaniu klawisza przełączającego zmienną pokazMenu na true/false, oraz warunku if..else uwzględniającego tą zmienną i powodującą wykonanie kodu dla programu właściwego .. np wyświetlanie wartości na wejściu analogowym (przy pokazMenu=0) lub kodu dla menu (pokazMenu=1).

Domyślnie po starcie wartość zmiennej jest zapisana jako 0.

#include <TM1637Display.h>

/* Napisał: Szczepulek

 * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit
 
 *  kod oryginalny dla cieklokrystalicznych https://github.com/FritzenLab/LCD-Screen-Menu-System/tree/master/LCD-Screen-Menu
 *  Clovis Fritzen in 05/06/2017
*/

#define CLK1 5 //wyswietlacz nr1 8segm.4-cz
#define DIO1 6 //wyswietlacz nr1 8segm.4-cz


int WhichScreen =1;   // Nr strony przechowywany w zmiennej //This variable stores the current Screen number
boolean hasChanged = true;

boolean pokazMenu = 0; // zmienna do przelaczania miedzy menu a reszta programu

const int buttonPin = 4;    // PIN dla przycisku // the number of the pushbutton pin
const int buttonMenu = 5; // wywolanie menu z przycisku do GND

int buttonState;             // status przycisku obecny - odczyt // the current reading from the input pin
int lastButtonState = LOW;   // poprzedni stan na przycisku
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637

uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 };  //Dla LEDDispl4digit

//wyswietlenie segmentow dla AL
const uint8_t disp_alarm[] = {
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,           // A
  SEG_D | SEG_E | SEG_F   // L
};

//wyswietlenie segmentow dla L
const uint8_t disp_linia[] = {
  SEG_D | SEG_E | SEG_F ,// L
   0  // O
};  


void setup()
{

  pinMode(buttonPin, INPUT_PULLUP);
  
  pinMode(buttonMenu, INPUT_PULLUP);
  
  display_1.setBrightness(0x0a); //LED7Seg jasnosc
   Serial.begin(9600);
   WhichScreen = 0;  //aby przy starcie zaczynało na pierwszej opcji menu
}
void loop()
{
int value = analogRead(2);  // pomiar na analogowym wejsciu losowej

  
if (digitalRead(33) == LOW) // sprawdza czy na pinie 33 stan LOW niski, jesli tak to ..
{
  delay(250);
  pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1
}
  
 /* pierwsza czesc programu , czyli robi co tam chcecie, pomiary, wyswietlanie w czasie rzeczywistym itp */
 
 
if (pokazMenu == 0) // jesli (domyslnie na starcie) mamy 0 to wykonaj program, wlasciwy..czy tez ten ktory ma sie glownie wykonywac
{  
  display_1.showNumberDec(value); //info domslna strona  a raczej wyswietlacz, z w tym przypadku do testow wartoscia napiecia na analogowym pinie 
  
  hasChanged = true; // ustawiam na true, aby po wlaczeniu na menu pojawila sie na wyswietlaczu strona ustawien, bez tego zostaje zamrozony wynik ostatniego pomiaru z wejscia analogowego
  
}
  
  /* no a tutaj juz sam kod do menu */
  else {
  
  if (hasChanged == true) {  //wykonanie menu wszystko w dol
    
  switch(WhichScreen) {
    case 1:
    {
      firstScreen();
    }
      break;
    
    case 2:
      {
        secondScreen();
      }
      break;
    
    case 3:
      {
        thirdScreen();
      }
      break;
    
   /* Dla wiekszej ilosci wyswietlania pozycji menu
    *  
    case 4:
      {
        fourthScreen();
      }
      break;
    
    case 5:
      {
        fifthScreen();
      }
      break;
    
    case 6:
      {
        sixthScreen();
      }
      break;
      */
 
    case 0:  //konczacy zapis menu
      {
        
      }
      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 > 3){  // UWAGA! jesli masz wiecej stron niz 3, musiasz zmienic warunek wpisujac wartosc rowna ilosci stron
    WhichScreen = 1;
  }
 }
}
  
  
void firstScreen()
  {
    display_1.clear();
   Serial.println("glowny ekran");  // test w serial
   display_1.showNumberDec(99, false, 2, 2);
  }
 
void secondScreen()
  {
  display_1.clear();  //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu
 int alarmHigh = 30;
 display_1.setSegments(disp_alarm, 2, 0);
 display_1.showNumberDec(alarmHigh, false, 2, 2);
  Serial.print("alarm:");  // test w serial
  Serial.println(alarmHigh);
  }
 
void thirdScreen()
  {
   display_1.clear();
  int liniaNr = 7;
  display_1.showNumberDecEx(liniaNr,0, true);
  display_1.setSegments(disp_linia, 2, 0);
 
   Serial.print("linia nr:");  // test w serial
   Serial.println(liniaNr);
  }
/*

//dla większej ilosci przejsc miedzy wyswietlanymi informacjami/stronami !!!
 
 void fourthScreen()
  {
    //tresc 4 strony
  }
void fifthScreen()
  {
    //tresc 5 strony
  }
void sixthScreen()
  {
    //tresc 6 strony
  }
  */

 

Link do komentarza
Share on other sites

(edytowany)

Dodana kolejna  funkcjonalność, dla zmiany parametrów dla danej zakładki / CASE i wyświetlenie parametrów zmiennej po zmianie.

Aby uzyskać te udogodnienia należy zaraz po

Cytat

else {

dodać następujący kod,

  /* deklarujemy z którego PINu ma być sygnał niski/LOW/0 oraz poprzez '&&' (warunek AND/ i) dodajemy WhichScreen, liczba 2 w tym wypadku mowi ze aby funkcja zadzialala MUSI byc atywna strona 2, dzieki temu dodane dzialania , funkcje, itp beda realizowane wylacznie dla tego okna, zapobiegajac przypadkowej edycji wartosci u mnie 'alarmHigh'. W innym wypadku bedac na stronie 3 niechcacy mozna by zmienic  parametry alarmu */
	if (digitalRead(31) == LOW && WhichScreen == 2) //pierwszy warunek dla wejscia PIN 31 = 0 i strony wyswietlanej 2
          if (WhichScreen == 2) //drugi warunek wstawiony tylko dla pewnosci, bez niego podczas przeskakiwania miedzy funkcjami pomiaru i menu petla byla wykonywana
          {
          
          alarmHigh[1]++; //tutaj akurat podnosze o 1 wartosc alarmu, i zapisywane jest do tablicy
          hasChanged = true; // odswierza dana strone na ktorej sa wprowadzane zmiany poprawiajac wyswietlanie zmiennych 
          }
         }  

Oczywiście dla wygody można użyć jednej tablicy do wszystkich stron, aby nie rozrastał się kod.. i tak oto pod zmienną   s  można przypisać numer strony wyświetlanej, oraz miejsce w tabeli..

 

No dobra,  poniżej całkowity kod, z utworzoną tablicą dla parametrów każdej strony   tabStrMenu[noleży_wpisać_ilosc_stron],

Wykasowane nie potrzebne części kodu z testów.

#include <TM1637Display.h>

/* ! ! ! ! ! ! ! ! ! !  ! !!  !! ! ! ! !  !
 * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit
 * 
 *  ! ! ! !  ! !! ! !  ! !  ! ! !!  ! 
 * 
 * This code create a MENU structure on a 16x2 LCD screen.
 * Six (6) different screens are implemented, and you can travel
 * thru them by pressing a button on Arduino PIN 4. Each press
 * of the button advances one (1) screen. 
 * 
 * Made by Clovis Fritzen in 05/06/2017
 * http://www.FritzenMaker.com
 * http://www.FritzenLab.com.br
*/

#define CLK1 5 //wyswietlacz nr1 8segm.4-cz 
#define DIO1 6 //wyswietlacz nr1 8segm.4-cz


int WhichScreen =1;   // This variable stores the current Screen number
boolean hasChanged = true;
boolean pokazMenu = 0;
const int buttonPin = 37;    // the number of the pushbutton pin
const int buttonMenu = 33; // wywolanie menu
const int buttonOk = 32; // zatwierdz/zapisz key OK
const int buttonUp = 31; // edycja key UP
const int buttonDn = 30; // edycja key DOWN
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 = 75;    // the debounce time; increase if the output flickers


/* tabStrMenu  - przechowywanie poszczegolnych ustawien dla kolejnych stron, 0 - niewykozystane, 1 - dla 1 strony czyli ALARM, 2 - przechowywany numer LINII;
 mozna tez przypisac do stron przez 's-1' w linii funkci menu  */
int tabStrMenu[3];  // dane ze stron/menu LED  // ilosc deklarowana = ilosc stron + 1;
int value; //testowe

TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637

uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 };  //Dla LEDDispl4digit

//wyswietlenie segmentow dla AL
const uint8_t disp_alarm[] = {
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G ,           // A
  SEG_D | SEG_E | SEG_F   // L
};

//wyswietlenie segmentow dla L
const uint8_t disp_linia[] = {
  SEG_D | SEG_E | SEG_F ,// L
   0  // O
};  

/*
int test[2];  // tylko gdy potrzebuesz wartosci do Case
*/


void setup()
{
 // lcd.init();       // initialize the lcd 0x20 lub 0x38??
//  lcd.backlight();  // z LCD
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(buttonMenu, INPUT_PULLUP);
  pinMode(buttonUp, INPUT_PULLUP);
  pinMode(buttonDn, INPUT_PULLUP);
  display_1.setBrightness(0x0b); //LED7Seg jasnosc
   Serial.begin(9600);
  tabStrMenu[1]=33;  //do testow domyslna wartosc dla alarmu, domyslnie pobierane z EEPROM
  tabStrMenu[2]=8; //domyslnie z eeprom - pobranie numeru linii
  WhichScreen =0;  // aby menu startowalo od 1 str.
}


void loop()
{
  
    int value = analogRead(2);  // pomiar na analogowym wejsciu losowej
  Serial.print(F("Wejscie analogowe 2 ma wartosc: ")); // to na nic tu nie potrzebne
  Serial.println(value);
 
    /*
    test[1] = value; //zapis do tablicy potrzebny aby w CASE mozna bylo odczytac wartosc, po wrzuceniu do warunku na poczatku funkcji loop nie porzebne.
   */


if (digitalRead(33) == LOW) // sprawdza czy na pinie 33 stan LOW niski, jesli tak to ..
{
  pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1
  delay(250);
}


// jesli (domyslnie na starcie) mamy 0 to wykonaj program, wlasciwy..czy tez ten ktory ma sie glownie wykonywac
  
if (pokazMenu == 0) {    //GLOWNY PROGRAM
  
  display_1.showNumberDec(value); //info domslna strona  a raczej wyswietlacz, z w tym przypadku do testow wartoscia napiecia na analogowym pinie 
  
  hasChanged = true; // ustawiam na true, aby po wlaczeniu na menu pojawila sie na wyswietlaczu strona ustawien, bez tego zostaje zamrozony wynik ostatniego pomiaru z wejscia analogowego
  
}

else // jesli zmienna pokazMenu ma wartosc inna niz zero.. w tym wypadku tylko moze byc to 1 wykonaj.. wyswietlenie menu

{

int s = WhichScreen;  // UWAGA! nalezy zadeklarowac tablice o liczbie elementow nie mniejszej niz ilosc stron.

   if (digitalRead(31) == LOW && WhichScreen == s) // zmiana parametrow UP/dodaj
       {
          Serial.print("strona nr :");
          Serial.println(WhichScreen);
          if (WhichScreen == s)
          {
          
          tabStrMenu[s]++;
          hasChanged = true;
          delay (25);
          }
        }  
    if (digitalRead(30) == LOW && WhichScreen == s) // zmiana parametrow DOWN/odejmij
       {
          if (WhichScreen == s)
          {
          
          tabStrMenu[s]--;
          hasChanged = true;
          delay(25);
          }
        }  

        
 if (hasChanged == true) 
 {   

   
  
  switch(WhichScreen) {
    case 1:
    {
      firstScreen();
    }
      break;
    
    case 2:
      {
        secondScreen(); 
      }
      break;
      
    /* Dla wiekszej ilosci wyswietlania pozycji menu
    *     
    case 3:
      {
        thirdScreen();
      }
      break;
    

    case 4:
      {
        fourthScreen();
      }
      break;
    
    case 5:
      {
        fifthScreen();
      }
      break;
    
    case 6:
      {
        sixthScreen();
      }
      break; 
      */
  
    case 0:  //konczacy zapis menu
      {
        
      }
      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 > 2){  //ilosc wszystkich stron
    WhichScreen = 1;
  }
}

}

void firstScreen()  // pierwsza strona opcji
  {

  display_1.clear();  //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu

  display_1.setSegments(disp_alarm, 2, 0);
  display_1.showNumberDec(tabStrMenu[1], false, 2, 2);  //wyswietla graniczna temp. alarmu

  Serial.print("Alarm od:");  // test w serial
  Serial.println(tabStrMenu[1]);


  }
  
void secondScreen() // druga str opcji itd itp
  {
   display_1.clear(); 
   
  display_1.showNumberDecEx(tabStrMenu[2],0, true); // wartosc przechowywana dla Nr Linii
  display_1.setSegments(disp_linia, 2, 0);
  
   Serial.print("linia nr:");  // test w serial
   Serial.println(tabStrMenu[2]);
  }
/*

dla większej ilosci przejsc miedzy wyswietlanymi informacjami, ponizej rozpiska dla wyswietlacza LCD !!!
  
 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");
  }
  */

Myślę że tyle wystarczy w temacie MENU dla 4-Digits Display LED 🐵

 

Edytowano przez szczepulek
  • 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

(edytowany)

a jednak, coś jeszcze :D..

dotychczasowy program wymagał przycisku by wejść w menu, wyjść z menu. przycisku by przeskakiwać pomiędzy stronami menu, przycisku do podnoszenia w górę zmiennych, i zmniejszających zmienne. w sumie 4, no nie ukrywam że 5 też dojdzie do zatwierdzania / zapisywania ustawień do eeprom.

Tak czy inaczej można się pozbyć jednego do przeskakiwania po stronach i użyć do tego wyzwalającego menu. W chwili wciśnięcia zamiast zmieniać stan zapamiętany dla  zmiennej pokazMenu, ustawiamy na 1. W wyniku czego ładuje się strona 1,  nasłuchujemy zamiast buttonPin, nadal buttonMenu. po przyciśnięciu go zamiast wrócić do głównej cześci programu z manu, przeskakujemy na następną stronę drugą, trzecią itd.. w zależności ile ich ustawiono jeżeli jak ja używacie 2 stron, dodajemy jeszcze trzecią, i w linii  

case 3:  //przykładowa ostatnia strona
{
     pokazMenu = 0;  //powracamy do głównej części programu
}
break;

jak w przykładzie, wpisanie pokazMenu =0; ustawia warunek  spełniający wymagania dla głównej części funkcji działającej domyślnie.

by to działało należy zmienić jeszcze te części kodu:

if (digitalRead(33) == LOW) // sprawdza czy na pinie 33 stan LOW niski, jesli tak to ..
{
  pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1
  delay(250);
}

na:
 

if (digitalRead(33) == LOW)  //pin buttonMenu

{
 // pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1
 
 pokazMenu = 1; //obsluga 1 przyciskiem, i ostatnia strona powrot do glownego programu
  delay(250);
}

i nasłuchujemy ten sam button dla zmiany stron


 

 int reading = digitalRead(buttonMenu); // obsluga jednym klawiszem do menu
 
  if (reading != lastButtonState) {

Wstawiony film to prezentacja działania z osobnymi klawiszami do wejscia/wyjscia menu i osobnego do zmiany stron.

 

vid-20191028-menuLED7seg.zip

Edytowano przez szczepulek
Link do komentarza
Share on other sites

(edytowany)

menu na LED 7 seg display.jpg

 

Uaktualnienie informacji, zastosowałem menu do swojego projektu pomiaru temperatur, w miedzyczsie dokonałem kilku jeszcze zmian.

Dodano/zmieniono:

  • alarmowanie o nie zapisaniu zmiennej w ustawieniach przez blink na PIN 13 (miganie przy użyciu millis(), nie jest to takie trudne jak na początku się wydawało) DZIEKI @RFM za motywację 🙂  próbowałem miganie na wyświetlaczach ale przez sposób ich sterowania efekt był mizerny.
  • dodano regułkę podczas przebywania na jednej ze stron Menu i braku aktywności któregokolwiek z klawiszy przez określony czas (u mnie 15 sek, maks. 65 sek z zmienna typu WORD) samoczynnie powraca do funkcji podstawowej, czyli wyświetlania u mnie temperatur czujników.
  • Cytat

    pracuję w tej chwili nad warunkiem, który sprawdza przy opuszczaniu menu czy zapisano nowe nastawy, jeśli nie. powrót do wartości z eepromu, obecnie po wyjściu z menu nadal działa blink, a nie pamiętając poprzednich nastaw (lub chcący je poznać) trzeba po kolei sprawdzać wartości ,aż zniknie miganie.

    ukończyłem, 2 minuty..

    if(millis() - autoExitMenu > autoExitCzas) //warunek wyprowadza z menu, jesli brak aktywnosci podana ilosc czasu (ms)
            {
              if (eepromOdczyt[s] != tabStrMenu[s]) //  jeśli wartość w pamięci, i w tablicy przechowujacej obecne nastawy są różne to...
              tabStrMenu[s] = eepromOdczyt[s]; // zapisz do tablicy odczyt z eeprom,
            pokazMenu = 0; // przejdz do glownej funkcji
            autoExitMenu = millis(); // kasowanie odliczania braku aktywnosci, a raczej zapisanie obecnego czasu dzialania do obliczania.
            }
    
    /*
    czas zapisu do EEPROM w arduino to chyba 3ms, nie wiem ile zamuje odczyt, na wszelki wypadek na poczatku petli glownej przypisalem do tablicy eepromOdczyt[] wartosci odczytane z EEPROM.read();
    kilka razy odnosze sie w swoim kodzie do tych wartosci, wiec jesli to ma znaczenie to przyoszczedze kilka ms, jesli nie, to i tak nic sie nie stalo  ;-P */

     

  • animacje przy zapisaniu do eeprom i zatwierdzeniu.

Gdy skończę wcześniejszy projekt umieszczę kod ze zmianami..

Edytowano przez szczepulek
kilka poprawek
  • 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.