• 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
Jak do tego projektu dodać klawiaturę membranową?
#1
Question 
Projekt polega na tym, gdy przyłożymy(poprawną) kartę do czytnika RFID_RC522, zapala sie zielona dioda i obraca się silnik krokowy (28BYJ-48).
To akurat udało się zrobić, ale chciałbym do tego dodać klawiaturę membranową. Czyli gdy wpiszę kod ''123A" zadziało się to samo.
(Arduino MEGA 2560)

Podaje kod który jak na razie udało mi się zrobić:

#include <Wire.h>
#include <Stepper.h> 
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 53
#define RST_PIN 5
#define LED_Zielona 47  
#define LED_Czerwona  46  
#define ILOSC_KROKOW 32 
Stepper mojSilnik(ILOSC_KROKOW, 31, 35, 33, 37);


MFRC522 rfid(SS_PIN, RST_PIN); 

const byte poprawna_karta[] = {0x99, 0x67, 0xAC, 0x15};


void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  pinMode(LED_Zielona,OUTPUT); 
  pinMode(LED_Czerwona,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;


  if (rfid.uid.uidByte[0] == poprawna_karta[0] ||
      rfid.uid.uidByte[1] == poprawna_karta[1] ||
      rfid.uid.uidByte[2] == poprawna_karta[2] ||
      rfid.uid.uidByte[3] == poprawna_karta[3] )
    {
     
          Serial.println("Poprawna karta"); 
          digitalWrite(LED_Zielona,HIGH);
          mojSilnik.setSpeed(650);
          mojSilnik.step(1024);
          delay(500
         
          );
          digitalWrite(LED_Zielona,LOW);
   
   
  }
  else
  {
          Serial.println("Niepoprawna karta!!!");
          digitalWrite(LED_Czerwona,HIGH);
          delay(2000);
          digitalWrite(LED_Czerwona,LOW);
   
  }
 
  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}
 
Odpowiedź
#2
Naucz się używać millis(), timerów sprzętowych lub wykorzystywać biblioteki je oferujące, bez delay, bo inaczej zawsze dodanie elementu do programu będzie pisaniem wszystkiego od nowa, a najczęściej niewykonalne, bo jedna część będzie wpływać na inne w takim stopniu, że to nie będzie działać.
Otwórz przykład z blinkWithoutDelay z Arduino, na koniec swojego loop doklej tego blinka ale z czasem 50ms, zobacz na ile Twój program przestaje reagować. Pomyśl co byłoby gdybyś odpalił sobie Windowsa i włączył muzykę, zaczął coś pisać w Wordzie i czekał po 2-3s z wciśniętym przyciskiem by Word to zauważył. Tak na prawdę to nawet nie musiałbyś nic włączać, bo w tle działa już kilkadziesiąt programów i komputer w ogóle nie reagowałby nawet na próbę ruszenia myszką w celu odpalenia Word'a, zakładając że dotarłbyś do tego etapu bo nie musisz podać hasła do logowania.
 
Odpowiedź
#3
Zapalaniem diody i obracaniem silnika powinna zajmować się oddzielna funkcja.
Sprawdzaniem klawiatury powinna zajmować się oddzielna funkcja.
Sprawdzaniem czytnika powinna zajmować się oddzielna funkcja.
loop() powinna wywoływać odpowiednie funkcje w określonej kolejności.
Po to Bozia dała nam C++, żeby nie brnąć w to, co Ty robisz.
Kilka linijek kodu, a powoduje frustracje i nieczytelność nabytą.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości