Skocz do zawartości

Arduino - funkcja obsługi wejść wyjść


Pomocna odpowiedź

Napisano

Cześć!

piszę hobbistycznie program na arduino i chciałbym zrobić funkcję do załączania wyjść w zależności od tego jakie wejście zostało włączone.
Np:
LED1 załączany/wyłączany przyciskiem 1; załączany przyciskiem 2 z automatycznym wyłączeniem po upływie czasu.
LED2 j/w kolejnymi przyciskami
...
LEDn

Napisałem najpierw funkcję i sprawdziłem z jednym zestawem We/Wy. Działa dobrze, ale mam problem gdy chciałbym tę funkcję użyć kilkukrotnie. Rozkminiam już drugi dzień i domyślam się, że problem leży w zmiennych które są wspólne, ale nie wiem jak to ugryźć. Nie mogę też znaleźć analogicznych przykładów. A może robię jakiś głupi błąd? Wdzięczność będzie ma wielka za pomoc wszelaką.

 

const int in1 = 2;
const int in2 = 3;
const int led1 = 0;

const int in3 = 4;
const int in4 = 5;
const int led2 = 1;

int pb1_state, pb3_state, pir1,pir2;

/*  ZMIENNE DLA FUNKCJI: */
 unsigned long startMillis;
 unsigned long currentMillis; 

 bool q1;
 bool q2;
 bool wyjscie;

/*  ---- */





void setup()
{
  pinMode(in1, INPUT_PULLUP);
  pinMode(in2, INPUT_PULLUP);
  pinMode(led1, OUTPUT);
  
  pinMode(in3, INPUT_PULLUP);
  pinMode(in4, INPUT_PULLUP);
  pinMode(led2, OUTPUT);
   
  startMillis = millis();  //initial start time
}

void loop()
{
  
  pb1_state = !digitalRead(in1);
  pir1 = !digitalRead(in2);
  
  pb3_state = !digitalRead(in3);
  pir2 = !digitalRead(in4);
  
  digitalWrite(led1, funkcja(pb1_state, pir1, 2000));
  
  digitalWrite(led2, funkcja(pb3_state, pir2, 4000));


  
}


bool  funkcja(bool we1, bool we2, int czas)
{



  
  
    if (we1){
      q1 = !q1;
    }
  
  
 
  if (we2){
    q2 = 1;
    startMillis = millis();}
                
  
  if (q2){
    currentMillis = millis();
    if ((currentMillis - startMillis >= czas) | we1){
      q2 = 0;
      startMillis = currentMillis;
    }
   
  }
  
  
  wyjscie = q1 or q2;
  return wyjscie;


}

Nawet jak wykomentuje millis to przełączanie wyjść działa dla obu na raz. Nie wiem dlaczego...

projekt testuję na www.tinkercad.com :

Przechwytywanie.thumb.JPG.bd746e5716e370092271d17bdd29c806.JPG

 

 

Dobra już sobie poradziłem. Dla potomnych - jeżeli funkcja musi przechować wartość to trzeba ją gdzieś zapamiętać. Zrobiłem więc tablice zmiennych i funkcję wywołuję z argumentem odnoszącym się do danej tablicy.

Tylko jednego jeszcze nie kumam, ale to może kwestia zmęczenia. Jak wywaliłem z funkcji millis i zostało tylko przełączanie wyjścia. Nie działało mimo, że funkcja nie musiał nic pamiętać... no nie wiem, może jutro załapię...

const int in1 = 2;
const int in2 = 3;
const int led1 = 0;

const int in3 = 4;
const int in4 = 5;
const int led2 = 1;

int pb1_state, pb3_state, pir1,pir2;

/*  ZMIENNE DLA FUNKCJI: */
 unsigned long startMillis[32];
 unsigned long currentMillis[32]; 

 bool q1[32];
 bool q2[32];
 bool wyjscie[32];

/*  ---- */





void setup()
{
  pinMode(in1, INPUT_PULLUP);
  pinMode(in2, INPUT_PULLUP);
  pinMode(led1, OUTPUT);
  
  pinMode(in3, INPUT_PULLUP);
  pinMode(in4, INPUT_PULLUP);
  pinMode(led2, OUTPUT);
   
  for (int i; i<33; i++){
  startMillis[i] = millis();  //initial start time
  }
}

void loop()
{
  
  pb1_state = !digitalRead(in1);
  pir1 = !digitalRead(in2);
  
  pb3_state = !digitalRead(in3);
  pir2 = !digitalRead(in4);
  
  digitalWrite(led1, funkcja(1, pb1_state, pir1, 2000));
  
  digitalWrite(led2, funkcja(2, pb3_state, pir2, 4000));


  
}

bool  funkcja(int nr, bool we1, bool we2, int czas)
{

 
    if (we1){
      q1[nr] = !q1[nr];
    }
  
  
 
  if (we2){
    q2[nr] = 1;
    startMillis[nr] = millis();}
                
  
  if (q2){
    currentMillis[nr] = millis();
    if ((currentMillis[nr] - startMillis[nr] >= czas) | we1){
      q2[nr] = 0;
      startMillis[nr] = currentMillis[nr];
    }
   
  }
  
  
  wyjscie[nr] = q1[nr] or q2[nr];
  return wyjscie[nr];


}

Jakby jakiś fachura miał jakieś sugestie co do optymalizacji to proszę się nie krępować 🙂

 

 

  • Lubię! 1

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