Skocz do zawartości
Bonkers

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.

Udostępnij ten post


Link to post
Share on other sites

@elvis: no wystarczy teraz dodać jeszcze jeden przycisk, do przełączania która liczba i w zasadzie gotowe

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

No dzięki, nareszcie działa poprawnie 😃

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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



}

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

Chyba niedokładnie przeczytałeś co kolega chciał osiągnąć i zasugerowałeś się słowem "menu".

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
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!

Gość
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...