Skocz do zawartości

Menu wyświetlacza dla pomiaru temperatury


Pomocna odpowiedź

Widać że przełączniki zwierają do masy. Więc ich przyciśnięcie daje stan niski, a nie wysoki. To w sumie widać i bez zdjęcia - inaczej pullup-y nie miałyby sensu.

Natomiast inne pytanie nie daje mi spokoju: kiedy wreszcie program będzie miał cokolwiek wspólnego z tematem wątku, czyli obsługą menu.

To nie jest schemat -- schematy w Fritzingu rysujesz w drugim tabie. Ale przynajmniej tu już widać jakie połączenia są. Tak jak @elvis pisze, twoje przyciski ściągają do masy, więc jak są wciśnięte, to są LOW a jak nie, to są HIGH. Popraw IF-y w swoim programie odpowiednio, bo na razie, to program myśli, że oba przyciski są cały czas wciśnięte -- liczba się nie zmienia tylko dlatego, że jednocześnie zwiększa i zmniejsza ją o 1.

To teraz dodaj trzeci przycisk, taki jak te pozostałe, który będzie zmieniać globalną zmienną pomiędzy 0 i 1. W zależności od wartości tej zmiennej, zamiast "Liczba:" wyświetlaj "MIN" albo "MAX".

Narazie tak to zrobiłem

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define BACKLIGHT_PIN 3

#define UP 4
#define DOWN 5
#define ENTER 6
float liczba = 0;
byte zmienna = 0;
bool flaga = true;
//Adres wyswietlacza
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

long last_up = 0; 
long last_down = 0;

void setup() {

Serial.begin(9600);

 pinMode( UP, INPUT_PULLUP);
 pinMode(DOWN, INPUT_PULLUP);
 pinMode(ENTER, INPUT_PULLUP);

 lcd.begin(16, 2);
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 lcd.setCursor(0, 0); //ustawienie kursora
 lcd.print("Liczba: ");

}

void loop() {

 if(digitalRead(ENTER)==LOW){
 zmienna++;
 delay(200);
 }
 if(zmienna%2==1){
 lcd.setCursor(0,0);
 lcd.print("MIN");
 }

 else{
 lcd.setCursor(0,0);
 lcd.print("MAX");
 }
 if(flaga!=false){
 lcd.clear();

 lcd.setCursor(10, 0);
 lcd.print(liczba,1);

 flaga=false;
 }

 if((digitalRead(UP)==LOW) && (millis() - last_up > 200))
 {

   liczba+=0.1;
   last_up = millis();

   flaga = true;

 }
 if((digitalRead(DOWN)==LOW) && (millis() - last_down > 200))
 { 

   liczba-=0.1;
   last_down = millis();
   flaga = true;
 }



}

A dlaczego nie zrobiłeś tak jak powiedziałem? Po co dodałeś ten delay? Zrób tak, jak pozostałem przyciski, bo potem będą problemy z czytaniem sensora. Poza tym potrzebujesz wartości 0 lub 1, a twoja zmienna rośnie aż do przepełnienia -- to jest niedobrze, bo za chwilę będziemy chcieli jej używać do indeksowania tablicy.

Ja idę tymczasem spać, jutro możemy to ciągnąć dalej. Jak masz czas, to polecam poczytać o tablicach w C/C++, bo za chwilę się nam przydadzą.

Wiem że każdy problem można rozwiązywać na wiele sposobów. Obsługa menu bez blokowania może mieć nawet pewne plusy - ale wcale nie jest niezbędna w tym konkretnym przypadku. Z tego co widzę Bonkers jest bardzo początkującym programistą, więc proponowałbym poziom rozwiązania dostosować do poziomu zaawansowania.

Najprościej byłoby wrócić do pierwszej wersji programu, wykorzystać blokowania na delay-ach, a obsługę menu zrobić w nowej procedurze (wywoływanej po wciśnięciu przycisku np. MENU).

Wtedy nie będzie potrzebna tablica, a kod będzie prosty. Oczywiście nie będzie to idealne rozwiązanie, ale chyba nie chodzi o napisanie kodu o jakości produkcyjnej, tylko naukę.

Przepraszam, że się wtrąciłem, ale mam wrażenie że strasznie komplikujecie sobie życie, a chyba nie o to chodzi.

Dobrze Wam idzie, więc ja już nie przeszkadzam. Po prostu wydawało mi się, że obecny program jest nieco skomplikowany dla kogoś kto dopiero zaczyna, a w sumie niewiele zbliżył się do celu, czyli menu z wyborem opcji. Inna sprawa, że jestem ciekaw jak ostateczny program miałby działać, tym bardziej nie będę już przeszkadzać.

W menu wchodziło by się za pomocą przycisku (enter), dwoma przyciskami zmieniałoby się wartości temp., 4 przycisk służył by jako exit.

Wydaje mi się, że to opis działania menu, chociaż może czegoś nie zrozumiałem.

Ehh no nie wiem jak to zrobić, jeżeli dobrze zrozumiałem to mam to zrobić w tej samej formule co poprzednie przyciski czyli:

  if((digitalRead(ENTER)==LOW) && (millis() - last_enter > 200))
 {
 zmienna++;
 last_enter = millis();

 flaga = true;

 }

Jeżeli to ma przyjmować wartości 0 i 1 to wydaje mi się że zmienna ma być typu bool.

Ale nie jestem pewien.

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