• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
zmienne na jednym pinie sterowane z klawiatury
#1
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);
   }
 }
}
 
Odpowiedź
#2
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));
        
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości