Skocz do zawartości

Proste podświetlanie schodów na Arduino. Prośba o pomoc w stworzeniu programu


Wprost123

Pomocna odpowiedź

To ciekawe. U mnie nie wyrzuca błędu, ale to na symulatorze. W kursie z forbot.pl funkcja która ma być wywołana przez przerwanie, też nie była dodatkowo wcześniej deklarowana, tylko w  "attachInterrupt....."

Dodałem więc  void resetZmienna2();  w definicjach.  Może teraz zadziała na realnym Arduino.

 

#define led1 4
#define led2 5
#define led3 6
#define led4 7
#define led5 8
#define led6 9
#define led7 10
#define przycisk1 2
#define przycisk2 3

unsigned long oldTime= 0; //zmienna starego czasu między rozświetlaniem diod
unsigned long newTime = 0;

  
unsigned long oldTimePodtrzymania = 0; //zmienna starego czasu podtrzymania świecenia
unsigned long newTimePodtrzymania = 0;

byte zmiennaP1 = 0; //zmienna dla przycisku 1 - ilość case-ów 
byte zmiennaP2 = 0; //zmienna dla przycisku 2- ilość case-ów

byte stanPrzycisku1 = 0; //0-puszczony, 1-wciśnięty
byte stanPrzycisku2 = 0;

int odczytanaWartosc = 0;
byte zmienna2 = 0; //zmienna ilosci seknud które mineły w podtrzymaniu
int czasPodtrzymania = 1; // NIE zero żeby warunek w loop if(stanPrzycisku1==0 and zmienna2 >= czasPodtrzymania Nie był od razu spełniony na starcie
int dodatkowePodtrzymanie=0; //zmienna zwiększająca odczytaną wart. czasPodtrzymania. Jeśli jesteśmy w ledsOn i naciśnięto przycisk to przedłuża czas podtrzym.

volatile int ileRazy = 0; //ilość naciśnięć przycisku 

void ledsOnDoGory();
void ledsOffNaDol();
void czasCzekania();

void resetZmienna2(); //Ta deklaracja może być zbędna, może wystarczy ta z attachInterrupt

void setup()
{ 
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);

  pinMode(przycisk1, INPUT_PULLUP); //przycisk 1
  pinMode(przycisk2, INPUT_PULLUP); // przycisk 2

attachInterrupt(digitalPinToInterrupt(przycisk1), resetZmienna2, FALLING); // Przerwanie reagujące na zbocze malejące
  
  
  Serial.begin(9600);
}

void loop()
{  
  
  
  if (digitalRead(przycisk1) == 0)
  {
    stanPrzycisku1 = 1;
  }
  if (digitalRead(przycisk2) == 0)
  {
    stanPrzycisku2 = 1;
  }


    if (stanPrzycisku1 == 1)
    {
      ledsOn();    
    }
  
    if (stanPrzycisku2 == 1)
    {
      ledsOn();
    }
  if(stanPrzycisku1==0 and zmienna2 >= czasPodtrzymania){  // wejście do f gaszenia
    ledsOff();
  }
  
   if((stanPrzycisku1==1)&& (zmiennaP1>8)){  // Jeśli kolejne naciśnięcie przycisku, a jesteśmy w gaszeniu to rozświetl od początku
    zmiennaP1=0;
    zmienna2=0;
     ledsOn();
  }
 
  }


void ledsOn(){
   if((stanPrzycisku1==1)&&(digitalRead(przycisk1)==0)&&(zmiennaP1>2)&&(zmiennaP1<=7)){ // Jeśli jesteśmy w rozświetlaniu i zapaliły się więcej niż 2 diody to kolejne naciśnięcie przycisku zwiększa podtrzymanie o 5 jedn
    dodatkowePodtrzymanie=3;
  }
  
 newTime = millis();
  if (newTime - oldTime >= 1000)
  {
    oldTime = newTime;
    zmiennaP1++;
    Serial.print("zmiennaP1 z ledsOn ");
    Serial.println(zmiennaP1);
  }
  switch (zmiennaP1) //dzięki temu że minęla 1sek możemy wybrać co się stanie
  {
  case 1: //jeśli minęły 1sek włączasz led1
    digitalWrite(led1, HIGH);
    break;
  case 2: //odliczasz kolejną 1sek i włączasz led2
    digitalWrite(led2, HIGH);
    break;
  case 3:
    digitalWrite(led3, HIGH); //itd
    break;
  case 4:
    digitalWrite(led4, HIGH);
    break;
  case 5:
    digitalWrite(led5, HIGH);
    break;
  case 6:
    digitalWrite(led6, HIGH);
    break;
  case 7:
    digitalWrite(led7, HIGH);
    
    break;
  case 8:
    czasCzekania(); //zamiast tego mozna zastosować delay jak pisałem wyżej.
    stanPrzycisku1 = 0;
    break;
  }
}

void ledsOff(){
newTime = millis();
  Serial.print("newTime z ledsOff ");
    Serial.println(newTime);
  if (newTime - oldTime >= 1000)
  {
    oldTime = newTime;
    zmiennaP1++;
    Serial.print("wart zmiennaP1 z ledsOff ");
    Serial.println(zmiennaP1);
  }
  
  switch (zmiennaP1) //kontynuacja switchów z wcześniejszej części
  {
  case 9:
    digitalWrite(led1, LOW); //wyłączasz led1
    break;
  case 10: //wyłączasz led2
    digitalWrite(led2, LOW);
    break;
  case 11: //wyłaczasz led3
    digitalWrite(led3, LOW);
    break;
  case 12:
    digitalWrite(led4, LOW);
    break;
  case 13:
    digitalWrite(led5, LOW);
    break;
  case 14:
    digitalWrite(led6, LOW);
    break;
  case 15:
    digitalWrite(led7, LOW);
    stanPrzycisku2 = 0;
    zmiennaP1 = 0;
    zmienna2=0;
    break;
  }
}

void czasCzekania()
{    //jako że program nie jest wymagający to tutaj również można użyć delay'a bo i tak program jest wstrzymany
  do //cała ta pętla wstrzyma Ci cały program póki nie zostanie spełniony warunek za wyrażeniem while
  {
   
  
    
    odczytanaWartosc = analogRead(A0);                        //odczytujesz wartość z portu A0
    czasPodtrzymania = map(odczytanaWartosc, 0, 1023, 0, 10); //zamienia zmienną z przedziału od 0 do 1023 na zmienną od 0 do 10 (sekund)
  Serial.print("t podtrzym z potenc. ");
  Serial.println(czasPodtrzymania); 
    czasPodtrzymania=czasPodtrzymania+dodatkowePodtrzymanie;
   
    
    Serial.print("t podtrzym+ dodatk ");
    Serial.println(czasPodtrzymania);
    
  
    
    newTimePodtrzymania = millis();
    if (newTimePodtrzymania - oldTimePodtrzymania >= 1000) // odliczaj po 1s
    {
      oldTimePodtrzymania = newTimePodtrzymania;
      zmienna2++; //co 1sek zwiększasz wartość zmiennej2
 
      if(ileRazy>=1){  //Jeśli naciśnięto  kolejny raz przycisk to reset zmienna2
      zmienna2=0;
      ileRazy=0;
    }
    
      
    Serial.print("ZMIENNA 2 akt. wart. ");
    Serial.println(zmienna2);
      
    }
  } while (zmienna2 <= czasPodtrzymania); //a pętla trwa póki zmienna2 nie osiągnie wartości zmapowanej zmiennej czasPodtrzymania
   
 
}

void resetZmienna2()
{
  ileRazy++;
  Serial.print("ile razy ");
  Serial.println(ileRazy);
}
  

 

Link do komentarza
Share on other sites

Chciałbym jeszcze dodać  opcję włączania na stałe tym samym przyciskiem.

Miałoby to wyglądać tak,  że jeśli jesteśmy w ledsOn, i szybko naciśniemy 2x przycisk (np pomiędzy 1 a 2 naciśnięciem jest mniej niż 0,5s) , to wszystkie diody się zaświecą na stałe, a przy kolejnym naciśnięciu zgasną. 

Natomiast jeśli kolejne naciśnięcia są w odstępach większych niż 0,5s to zmienna2 jest zwiększana o te ustawione np. 3 wartości i tym samym przedłuża się podtrzymanie w funkcji czasCzekania.

 

Próbowałem  w ten sposób zmienić funkcję resetZmienna2, ale nie działa. Od razu włączyły mi się wszystkie diody, mimo że przycisk nacisnąłem pierwszy raz. (Dodałem funkcję wlaczNaStale i zmienną czasWcisniecia). 

void resetZmienna2() //f do resetowania zmiennej2 (gdy jesteśmy w f czasCzekania)
{
    czasWcisniecia=millis();
  
     if((digitalRead(przycisk1)==0) && (millis()-czasWcisniecia<200)){
       wlaczNaStale();
     }
     else{    
  ileRazy++;
  Serial.print("ile razy ");
  Serial.println(ileRazy);
     }

 

Link do komentarza
Share on other sites

41 minut temu, Wprost123 napisał:

To ciekawe. U mnie nie wyrzuca błędu, ale to na symulatorze. W kursie z forbot.pl funkcja która ma być wywołana przez przerwanie, też nie była dodatkowo wcześniej deklarowana, tylko w  "attachInterrupt....."

Dodałem więc  void resetZmienna2();  w definicjach.  Może teraz zadziała na realnym Arduino

-> OTO EFEKT <-

Lewa "czujka" nie działała z racji że wyskoczył mi przewód z arduino ale nie zmienia to działania prawej "czujki".

Edytowano przez matrix0606
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)

Jak narazie nie pisałem nic na drugą czujkę. Gdy uda się z pierwszą wszystkie funkcje, to drugą powinno się udać zrobić przez analogie. 

Przestaję już ufać symulatorowi. W nim sekwencja zapalania diod uruchamia się poprawnie- tylko raz. 

Zostawiam więc kwestię uruchamiania na stałe jednym przyciskiem.

 

Pytanie, czy poniższy warunek jest poprawny tzn. czy jeśli naciśnę przycisk tylko raz, to diody rozświetlą się na czas ustalony z potentcjometru, a jeśli będąc w ledsOn nacisnę kolejny raz, to czasCzekania będzie równy potencjometr+dodatkowe np. 3 okresy?  Czy może będzie tak że za każdym razem czasCzekania będzie równy potencjometr+np3 okresy, nawet gdy nacisnę przycisk tylko raz? 

Czy ma tutaj jakieś znaczenie to, że zmienna ileRazy po naciśnięciu przycisku zostanie zliczona zapewne nie raz, ale kilka lub kilkanascie bo Arduiono szybko naliczy (chyba drgania styków też w to wejdą)? 

 

void ledsOn(){
   if((stanPrzycisku1==1)&&(digitalRead(przycisk1)==0)&&(zmiennaP1>2)&&(zmiennaP1<=7)){ // Jeśli jesteśmy w rozświetlaniu i zapaliły się więcej niż 2 diody to kolejne naciśnięcie przycisku zwiększa podtrzymanie o 3   
    // CZY POWYŻEJ JEST POPRAWNIE ?? 
     
    dodatkowePodtrzymanie=3;
  }
  
 newTime = millis();
  if (newTime - oldTime >= 200)
  {
    oldTime = newTime;
    zmiennaP1++;
    Serial.print("zmiennaP1 z ledsOn ");
    Serial.println(zmiennaP1);
  }
  switch (zmiennaP1) //dzięki temu że minęla 1sek możemy wybrać co się stanie
  {
  case 1: //jeśli minęły 1sek włączasz led1
    digitalWrite(led1, HIGH);
    break;
  case 2: //odliczasz kolejną 1sek i włączasz led2
    digitalWrite(led2, HIGH);
    break;
  
      // itd.

W symulatorze działa poprawnie, tzn. czasCzekania jest zależny od ilości naciśnięć, ale w rzeczywistości pewnie nie będzie tak ładnie.  W poniedziałek lub  wtorek będę miał Arduino, więc  zobaczę jak działa na żywo. 

Edytowano przez Wprost123
Link do komentarza
Share on other sites

(edytowany)

Mam już Arduino.  Program jako tako działa, ale niestety dodawanie dodatkowego czasu do czasCzekania, gdy jesteśmy w ledsOn źle funkcjonuje. Nawet   mimo jednego naciśnięcia, do zmiennej2 itak jest dodawana dodatkowa wartość.

Myślę, że coś źle zrobiłem w warunku poniżej z funkcji ledsOn.  Chciałem, żeby było tak "gdy zmiennaP1>3 i mniejsza od 8 oraz przycisk wciśnięty" to wtedy dodatkowe podtrzymanie=6. Jeśli nie, to dodatkowePodtrzymanie=0. Proszę o podpowiedź co zrobiłem źle i czy to własnie z budowy tego warunku może wynikać problem?

void ledsOn(){
   if((zmiennaP1>3 && zmiennaP1<8)&& (digitalRead(przycisk1==LOW))) { // Jeśli jesteśmy w rozświetlaniu i zapaliły się więcej niż 3 diody to kolejne naciśnięcie przycisku zwiększa podtrzymanie o 5 jedn
    
    dodatkowePodtrzymanie=6; 
}
  else{
  dodatkowePodtrzymanie=0;
  }

  
 newTime = millis();
  if (newTime - oldTime >= 800)
  {
    oldTime = newTime;
    zmiennaP1++;
    Serial.print("zmiennaP1 z ledsOn ");
    Serial.println(zmiennaP1);
  }
  switch (zmiennaP1) //dzięki temu że minęla 1sek możemy wybrać co się stanie
  {
  case 1: //jeśli minęły 1sek włączasz led1
    digitalWrite(led1, HIGH);
    break;
 ciąg dalszy

 

Edytowano przez Wprost123
Link do komentarza
Share on other sites

(edytowany)

@matrix0606 Mam już Arduino.  Program jako tako działa, ale niestety dodawanie dodatkowego czasu do czasCzekania, gdy jesteśmy w ledsOn źle funkcjonuje. Nawet   mimo jednego naciśnięcia, do zmiennej2 itak jest dodawana dodatkowa wartość.

Myślę, że coś źle zrobiłem w warunku poniżej z funkcji ledsOn.  Chciałem, żeby było tak "gdy zmiennaP1>3 i mniejsza od 8 oraz przycisk wciśnięty" to wtedy dodatkowe podtrzymanie=6. Jeśli nie, to dodatkowePodtrzymanie=0. Proszę o podpowiedź co zrobiłem źle i czy to własnie z budowy tego warunku może wynikać problem? A może umieściłem warunek w złym miejscu??

 
Przypadkiem dwa razy wysłałem ten sam post. 
Edytowano przez Wprost123
Link do komentarza
Share on other sites

Nie do końca potrafię odpowiedzieć Ci na pytanie ale wiem że w pierwszej linii w tym kodzie masz nawias w niewłaściwym miejscu. Poniżej już poprawiony fragment.

void ledsOn(){
   if(zmiennaP1>3 && zmiennaP1<8 && (digitalRead(przycisk1)==LOW)) { // Jeśli jesteśmy w rozświetlaniu i zapaliły się więcej niż 3 diody to kolejne naciśnięcie przycisku zwiększa podtrzymanie o 5 jedn

 

Natomiast poniżej masz kod który u mnie działa jak na filmiku który nagrywałem Ci gdzieś tam wyżej, pozmieniaj sobie tylko pinologię na początku w sekcji #drfine.
 

#include <Arduino.h>

#define led1 2
#define led2 3
#define led3 4
#define led4 5
#define led5 6
#define led6 7
#define led7 8
#define przycisk1 0
#define przycisk2 1

unsigned long oldTime = 0; //zmienna starego czasu między rozświetlaniem diod
unsigned long newTime = 0;
unsigned long oldTimePodtrzymania = 0; //zmienna starego czasu podtrzymania świecenia
unsigned long newTimePodtrzymania = 0;

//byte iloscKrokow = 17; // il. diod x 4 bo co 2 case-y się zapalają + podtrzymanie np 4 okresy i gaszenie
byte zmiennaP1 = 0; //zmienna dla przycisku 1
byte zmiennaP2 = 0; //zmienna dla przycisku 2

byte stanPrzycisku1 = 0; //0-puszczony, 1-wciśnięty
byte stanPrzycisku2 = 0;

int odczytanaWartosc = 0;
byte zmienna2 = 0; //zmienna ilosci seknud które mineły w podtrzymaniu
int czasPodtrzymania = 0;
bool wpusc1 = 0;
bool wpusc2 = 0;

void ledsOnUp();
void ledsOnDown();
void czasCzekania();
//void odczytCzujek();
void zeruj();
void debugging();

void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);

  pinMode(przycisk1, INPUT_PULLUP); //przycisk 1
  pinMode(przycisk2, INPUT_PULLUP); // przycisk 2

  Serial.begin(9600);
}

void loop()
{
  //odczytCzujek();
  if ((digitalRead(przycisk1) == 0) && stanPrzycisku2 == 0) // && wpusc1 == 0)
  {
    stanPrzycisku1 = 1;
    zmiennaP1 = 0;
    wpusc1 = 1;
  }
  if ((digitalRead(przycisk2) == 0) && stanPrzycisku1 == 0) // && wpusc2 == 0)
  {
    stanPrzycisku2 = 1;
    zmiennaP2 = 0;
    wpusc2 = 1;
  }

  newTime = millis();
  if (newTime - oldTime >= 1000)
  {
    oldTime = newTime;

    if (stanPrzycisku1 == 1)
    {
      zmiennaP1++;
      ledsOnUp();
    }
    if (stanPrzycisku2 == 1)
    {
      zmiennaP2++;
      ledsOnDown();
    }
  }
  //delay(500);
  //debugging();
}

void ledsOnUp()
{
  switch (zmiennaP1)
  {
  case 1:
    digitalWrite(led1, HIGH);
    break;
  case 2:
    digitalWrite(led2, HIGH);
    break;
  case 3:
    digitalWrite(led3, HIGH);
    break;
  case 4:
    digitalWrite(led4, HIGH);
    break;
  case 5:
    digitalWrite(led5, HIGH);
    break;
  case 6:
    digitalWrite(led6, HIGH);
    break;
  case 7:
    digitalWrite(led7, HIGH);
    break;
  case 8:
    czasCzekania();
    break;
  case 9:
    digitalWrite(led1, LOW);
    break;
  case 10:
    digitalWrite(led2, LOW);
    break;
  case 11:
    digitalWrite(led3, LOW);
    break;
  case 12:
    digitalWrite(led4, LOW);
    break;
  case 13:
    digitalWrite(led5, LOW);
    break;
  case 14:
    digitalWrite(led6, LOW);
    break;
  case 15:
    digitalWrite(led7, LOW);
    stanPrzycisku1 = 0;
    wpusc1 = 0;
    break;
  }
}

void ledsOnDown()
{
  switch (zmiennaP2)
  {
  case 1:
    digitalWrite(led7, HIGH);
    break;
  case 2:
    digitalWrite(led6, HIGH);
    break;
  case 3:
    digitalWrite(led5, HIGH);
    break;
  case 4:
    digitalWrite(led4, HIGH);
    break;
  case 5:
    digitalWrite(led3, HIGH);
    break;
  case 6:
    digitalWrite(led2, HIGH);
    break;
  case 7:
    digitalWrite(led1, HIGH);
    break;
  case 8:
    czasCzekania();
    break;
  case 9:
    digitalWrite(led7, LOW);
    break;
  case 10:
    digitalWrite(led6, LOW);
    break;
  case 11:
    digitalWrite(led5, LOW);
    break;
  case 12:
    digitalWrite(led4, LOW);
    break;
  case 13:
    digitalWrite(led3, LOW);
    break;
  case 14:
    digitalWrite(led2, LOW);
    break;
  case 15:
    digitalWrite(led1, LOW);
    stanPrzycisku2 = 0;
    wpusc2 = 0;
    break;
  }
}

void czasCzekania()
{    //jako że program nie jest wymagający to tutaj również można użyć delay'a bo i tak program jest wstrzymany
  do //cała ta pętla wstrzyma Ci cały program póki nie zostanie spełniony warunek za wyrażeniem while
  {
    odczytanaWartosc = analogRead(A0);                        //odczytujesz wartość z portu A0
    czasPodtrzymania = map(odczytanaWartosc, 0, 1023, 0, 10); //zamienia zmienną z przedziału od 0 do 1023 na zmienną od 0 do 10 (sekund)
    newTimePodtrzymania = millis();

    void odczytCzujek();

    if (newTimePodtrzymania - oldTimePodtrzymania >= 1000) // odliczaj po 1s
    {
      oldTimePodtrzymania = newTimePodtrzymania;
      zmienna2++; //co 1sek zwiększasz wartość zmiennej2
    }
  } while (zmienna2 < czasPodtrzymania); //a pętla trwa póki zmienna2 nie osiągnie wartości zmapowanej zmiennej czasPodtrzymania
}

void zeruj()
{
  digitalWrite(led1, 0);
  digitalWrite(led2, 0);
  digitalWrite(led3, 0);
  digitalWrite(led4, 0);
  digitalWrite(led5, 0);
  digitalWrite(led6, 0);
  digitalWrite(led7, 0);
}

void debugging()
{
  Serial.print("zmiennaP1-");
  Serial.println(zmiennaP1);
  Serial.print("zmiennaP2-");
  Serial.println(zmiennaP2);
}

 

Edytowano przez matrix0606
Link do komentarza
Share on other sites

Kod Kolegi (narazie na jednym przycisku) też działa nieźle. Dodałem tylko na początku funkcji ledsOnUp zerowanie zmiennej2, ponieważ przy pierwszym uruchominiu program czekał czas określony przez potencjometr po czym rozpoczynał gaszenie, ale przy kolejnym naciśnięciu już tego nie robił, bo zmienna2  była już na tyle duża, że  od razu rozpoczynało się gaszenie.

Link do komentarza
Share on other sites

(edytowany)

Chciałbym jeszcze dodać możliwość podświetlenia wszystkich schodów na stałe, poprzez  dłuższe naciśnięcie przycisku. Proszę o podpowiedź jak to obwarunkować.

Myślałem, żeby w pętlii loop, przed dotychczasowymi warunkami czyli min. jeśli wciśnięto przycisk to stan przycisku==1 i uruchom funkcję ledsOn itd. dodać warunek, że jeśli  zmienna ileRazy została naliczona np więcej niż 30 razy, to wtedy uruchomi się funkcja wlaczNaStale rozświetlająca wszystkie diody.

Nie wiem niestety jak sprawić, aby program najpierw sprawdzał czy  naliczono więcej niż 30 razy zmiennej ileRazy, a jeśli nie, to żeby sprawdzał pozostałe warunki w funkcji loop.  Jeśli wlaczNaStale zostanie uruchomiona, to po kolejnym naciśnięciu przycisku powinna zostać uruchomiona funkcja wylaczStale która wygasi diody i program znów przejdzie do czekania na naciśnięcie przycisku- długie lub krótkie.

Napisałem kod jak poniżej, ale nie działa dobrze.  Proszę o podpowiedź jak można to zrealizować.

void loop()
{ 
    if(ileRazy>30 and wszystkieWlaczone==false){  // Jeśli wciśnięto dłużej przycisk to włącz ledy na stałe
  wlaczNaStale();
}
  if(digitalRead(przycisk1)==LOW and wszystkieWlaczone==true){  // Jeśli wszystkie włączone i wciśnięto przycisk, to wyłącz stałe podświetlanie
    wylaczStale();
  }
 
  else{
  
  if (digitalRead(przycisk1) == 0)
  {
    stanPrzycisku1 = 1;
  }
  if (digitalRead(przycisk2) == 0)
  {
    stanPrzycisku2 = 1;
  }


    if (stanPrzycisku1 == 1)
    {
      ledsOn();    
    }
  
    if (stanPrzycisku2 == 1)
    {
      ledsOn();
    }
  if(stanPrzycisku1==0 and zmienna2 >= czasPodtrzymania){  // wejście do f gaszenia
    ledsOff();
  }
  
   if((stanPrzycisku1==1)&& (zmiennaP1>8)){  // Jeśli kolejne naciśnięcie przycisku, a jesteśmy w gaszeniu to rozświetl od początku
    zmiennaP1=0;
    zmienna2=0;
     ledsOn();
  }
 
  }
}

Funkcja wlaczNaStale to wszystkie diody ustawione na HIGH i zmienna  wszystkieWlaczone ustawiona na true i zeruje zmienną ileRazy.

Funkcja wylaczStale to wszystkie diody na LOW i zmienna wszystkieWlaczone ustawiona na false i zeruje zmienną ileRazy.

Edytowano przez Wprost123
Link do komentarza
Share on other sites

Mam pytanie czy  w tym projekcie nie lepiej jest użyć biblioteki Timers. Gdzieś na tym forum jest opis jak jej użyć.Wydaje się ,że program się uprości.Gdybyście zdecydowali się na użycie biblioteki Timers  to muszę Wam powiedzieć,że są dwie różne o tej samej nazwie.Wersja biblioteki tylko z dwoma plikami jest  tą właściwą do tego projektu.

Timers.rar

Link do komentarza
Share on other sites

(edytowany)
5 godzin temu, matrix0606 napisał:

Jak by kolega mógł ciut jaśniej napisać bo nic nie rozumiem. Czy przycisk już istnieje i jest używany do czegoś czy go nie ma ? Jeśli nie ma to co stoi na przeszkodzie by taki przycisk dodać i po sprawie.

Przycisk już jest. Jeden (bo narazie robię tylko rozświetlanie w górę) i chciałbym, żeby w zależności od tego jak długo jest wciśnięty, uruchamiała się albo funkcja ledsOn albo wlaczNaStale. 

Przy krótkim naciśnięciu przycisku program nalicza mi ok 5-10 razy zmienną  ileRazy (wtedy powinna się uruchomić funkcja ledsOn).  Więc gdy przytrzymałbym przycisk odpowiednio długo to naliczy np. więcej niż 30 i wtedy powinna się uruchomić funkcja wlaczNaStale.  Jeśli  diody włączą się na stałe, to po ponownym naciśnięciu przycisku (już dowolna długość naciśnięcia) wszystkie diody powinny zgasnąć i program powinien czekać na kolejne krótkie lub długie naciśnięcie przycisku i zależnie od długości tego naciśnięcia, znów albo uruchomić rozświetlanie po kolei, albo wszystkie na stałe.  

A może da się ten wybór która funkcja ma zostać uruchomiona (czy rozświetlanie po kolei czy włączenie na stałe), jakoś inaczej uzależnić od tego jak długo jest wciśnięty przycisk, bez zliczania zmiennej ileRazy? Chociaż nie  mam zupełnie pomysłu jak.

@szymonw  Dziękuję. Poszukam informacji nt. tej biblioteki Timers. 

Edytowano przez Wprost123
Link do komentarza
Share on other sites

(edytowany)

@matrix0606   Jak narazie, mimo wielu prób nie udało mi się stworzyć sposobu aby dobrze rozróżnić jaka ma się wykonać akcja w zależności od długości naciśnięcia przycisku. Chyba jest tak dlatego, że gdy daję warunki  if(ileRazy<20) {ledsOn();} oraz if(ileRazy>20) {wlaczNaStale();} to ten pierwszy warunek zawsze zostanie spełniony gdy tylko nacisnę przycisk (nie zależnie od tego jak długo jest wciśnięty) i uruchomi przypisaną mu funkcję, a drugi warunek zostanie spełniony tylko gdy przytrzymam przycisk dłużej. 

Czyli pierwszy jest spełniony zawsze i ewentualnie drugi.  A chciałbym osiągnąć stan  albo jeden, albo drugi. 

Edytowano przez Wprost123
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.