Arduino Polska Forum

Pełna wersja: zmienne na jednym pinie sterowane z klawiatury
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam, 

Trafiłem na forum ponieważ na etapie wdrażania się w świat arduino natknąłem się na problem. 
Mój projekt zakładał do dziś że za pomocą klawiatury przyciski 1,2,3,A będą uruchamiały 1 pin i nadawał mu rożne warianty.


Układ miał wyglądać następująco 
case 1. podawaj sygnał 5v co 10 sek (po naciśnięciu przycisku 1)
case 2. podawaj sygnał 5v co 50 sek (po naciśnięciu przycisku 2)
case 3. podawaj sygnał 5v co 100 sek (po naciśnięciu przycisku 3)
case 4. stan wysoki (po naciśnięciu przycisku 4)

ta sama funkcja na kolejnym pinie

Mamy pytanie czy pomiędzy case mam zastosować jakiś warunek który zatrzyma obecnie realizowane zadanie?
Proszę o wyrozumiałość.
kod:
Kod:
#include <Keypad.h>
#define LEDPIN10  10
#define LEDPIN11  11



const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
 Serial.begin(9600);
 

 pinMode(LEDPIN10, OUTPUT);
 pinMode(LEDPIN11, OUTPUT);


 digitalWrite(LEDPIN10, HIGH);  
 digitalWrite(LEDPIN11, HIGH);

}
 
void loop()
{
 char key = keypad.getKey();
 if(key)  // Check for a valid key.
 {
   switch (key)
   {
     case '1':
       digitalWrite(LEDPIN10, LOW);
       delay(10000)
       break;
     case '2':
       digitalWrite(LEDPIN10, LOW);
       delay(50000)
       break;
     case '3':
       digitalWrite(LEDPIN10, LOW);
       delay(100000)
       break;
     case 'A':
       digitalWrite(LEDPIN10, HIGH);
       break;
     case '4':
       digitalWrite(LEDPIN11, LOW);
       delay(10000)
       break;
     case '5':
       digitalWrite(LEDPIN11, LOW);
       delay(50000)
       break;
     case '6':
       digitalWrite(LEDPIN11, LOW);
       delay(100000)
       break;
       case 'A':
       digitalWrite(LEDPIN11, HIGH);
       break;
       
     default:
       Serial.println(key);
   }
 }
}
Witam

Funkcja "delay" jest dosyć paskudna ponieważ zatrzymuje cały program i w tym czasie nie działa nic także klawiatura , poniższy kod działa na zasadzie "blink without delay" czyli bez zatrzymywania programu .

Kod:
#include <Keypad.h>
#define LEDPIN10  10
#define LEDPIN11  11



const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

long Pm = 0 ;
long Interval = 0;

void setup(){
  Serial.begin(9600);
  

  pinMode(LEDPIN10, OUTPUT);
  pinMode(LEDPIN11, OUTPUT);


  digitalWrite(LEDPIN10, HIGH);  
  digitalWrite(LEDPIN11, HIGH);

}
  
void loop()
{
  long Cm = millis();
  char key = keypad.getKey();
  if(key)  // Check for a valid key.
  {
    switch (key)
    {
      
      case '1':
        Interval = 10000 ;
        Pm = Cm ;
        break;
      case '2':
        Interval = 20000 ;
        Pm = Cm ;
        break;
      case '3':
        Interval = 30000 ;
        Pm = Cm ;
        break;
      case 'A':
        break;
      case '4':
        break;
      case '5':
        break;
      case '6':
        break;
        case 'B':
        break;
        
    //  default:
    //     Serial.println(key);
    }
  }
  if ( Cm - Pm <= Interval ){digitalWrite(LEDPIN10, LOW);}
        else{digitalWrite(LEDPIN10, HIGH);}

Serial.println(key);
//Serial.print(" / ");
//Serial.print(Cm);
//Serial.print(" / ");
//Serial.print(Pm);
//Serial.print(" / ");
//Serial.print(Interval);
//Serial.print(" / ");
//Serial.println(digitalRead(LEDPIN10));
        
}