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.

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.

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

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



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

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.

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

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.

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.

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

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.