Skocz do zawartości

Arduino Nano - interakcja z uzytkownikiem


kotek12321

Pomocna odpowiedź

Cześć!

Mam prośbę o podpowiedzenie mi rozwiązania mojego problemu. 

W Arduino działam krótki czas, mimo przeglądnięcia sporej ilości materiału nie mogę wymyślić rozwiązania dla interakcji Arduino z użytkownikiem.

Mam układ oparty na Arduino Nano, 3 przyciskach oraz wyświetlaczu podwójnym 7-segmentowym. 

Wciskając pierwszy i trzeci dodajemy, a wciskając drugi odejmujmy wartość. Standardowo osiągając zadaną wartość wracamy o zera i liczymy od nowa. Jeżeli idziemy w dół to program po zerze wraca do najwyższej możliwej wartości.

 

Zbliżając się do sedna, wykonałem algorytm długiego przytrzymania pierwszego przycisku i wciskając go właśnie chciałbym móc ustawić wartość zmiennej maksymalnej, oczywiście za pomocą tych samych przycisków wraz z sygnalizacją na wyświetlaczu.

Wciskając dłużej klawisz przechodzę do innej funkcji void... i właśnie jak dalej mogę to rozwiązać? 

 

Z góry dziękuję za pomoc!

Link do komentarza
Share on other sites

Przepraszam, myślałem że nie będzie to konieczne.

Kod poniżej:

//biblioteki
#include "SevSeg.h"

//inicjalizacja obslugi wyswietlacza
SevSeg sevseg;

//programowanie wejsc
const int DODAJ = 17;
const int ODEJMIJ = 16;
const int KRANCOWKA = 2;

//programowanie wyjscia przekaznika
const int SCIEZKA = 15;
const int LED = 3;

//ustawienie zmiennej i dla wyswietlacza
int i = 1;
int b = 10;

int StanSciezka = LOW;
int StanLED = LOW;
int StanP1;
int StanP2;
int StanP3;
int OstatniStanP1 = HIGH;
int OstatniStanP2 = HIGH;
int OstatniStanP3 = HIGH;
int odczytP1;

unsigned long AktCzas;       //przechowanie czasu 
unsigned long CzasPrzeszly;
unsigned long Deboucing = 50;
unsigned long ShortPress = 100;  //czas drgania przycisków
unsigned long LongPress = 1500;
unsigned long CzasPress1;
unsigned long CzasPress2;
unsigned long CzasPress3;

void setup() {

//programowanie wyswietlacza
  byte numDigits = 2;
  byte digitPins[] = {11, 12};
  byte segmentPins[] = {10, 9, 8, 7, 6, 5, 4};
  bool resistorsOnSegments = true; // 'false' means resistors are on digit pins
  byte hardwareConfig = N_TRANSISTORS; // See README.md for options
  
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);

//ustawienie stanu wejsc na przycisk i czujnik TUZ
  pinMode (DODAJ, INPUT_PULLUP);
  pinMode (ODEJMIJ, INPUT_PULLUP);
  pinMode (KRANCOWKA, INPUT_PULLUP);

//ustawienie stanu wyjscia na przekaznik
  pinMode (SCIEZKA, OUTPUT);
  pinMode (LED, OUTPUT);

//ustawienie stanu przekanizka na OFF
  digitalWrite(SCIEZKA, StanSciezka);
  digitalWrite(LED, StanLED);

  sevseg.setNumber(i, 2);
  sevseg.refreshDisplay();
}

void StanPrzyciskow(){
  
  sevseg.setNumber(i, 2);
  sevseg.refreshDisplay();

/*-----Opoznienie funkcji o czas drgania stykow-----*/
  if(AktCzas - CzasPrzeszly > Deboucing){

/*-----Odczyt stanu przyciskow-----*/
  odczytP1 = digitalRead(DODAJ);
  int odczytP2 = digitalRead(ODEJMIJ);
  int odczytP3 = digitalRead(KRANCOWKA);

/*-----Sprawdzenie przycisku nr 1-----*/
   if(odczytP1 == LOW && OstatniStanP1 == HIGH){
    CzasPress1 = AktCzas;
   }
   if(odczytP1 == HIGH && OstatniStanP1 == LOW && (AktCzas - CzasPress1) > ShortPress){
    i++;
   }
   if(odczytP1 == LOW && OstatniStanP1 == LOW && (AktCzas - CzasPress1) > LongPress){
    Ustawienia();
   }
   
/*-----Sprawdzenie przycisku nr 2-----*/
   if(odczytP2 == LOW && OstatniStanP2 == HIGH){
    CzasPress2 = AktCzas;
   }
   if(odczytP2 == HIGH && OstatniStanP2 == LOW && (AktCzas - CzasPress2) > ShortPress){
    i--;
   }

/*-----Sprawdzenie przycisku nr 3-----*/
   if(odczytP3 == LOW && OstatniStanP3 == HIGH){
    CzasPress3 = AktCzas;
   }
   if(odczytP3 == HIGH && OstatniStanP3 == LOW && (AktCzas - CzasPress3) > ShortPress){
    i++;
   }
   
/*-----Zapis stanu przyciskow po wykonaniu funkcji-----*/
  OstatniStanP1 = odczytP1;
  OstatniStanP2 = odczytP2;
  OstatniStanP3 = odczytP3;
/*-----Zapis czasu do pamieci po wykonaniu funkcji-----*/
  CzasPrzeszly = AktCzas;
}
}

void Ustawienia(){
  odczytP1 = HIGH;


  }


void loop() {

/*-----Zapis aktualnego czasu do pamieci-----*/
  AktCzas = millis();
  
/*-----Wyswietlenie numeru na wyswietlaczu-----*/
  

  if(i > b){
    i = 0;
  }

  if(i < 0){
    i = b;
  }
 
  if(i == 0){
    StanSciezka = HIGH;
    digitalWrite(SCIEZKA, StanSciezka);
  }
    
  if(i != 0){
    StanSciezka = LOW;
    digitalWrite(SCIEZKA, StanSciezka);
  }

  StanPrzyciskow();
  
}

 

Link do komentarza
Share on other sites

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

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.