Arduino Polska Forum

Pełna wersja: Proram Czytnika kart perforowanych
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam wszystkich,

Ostatnio staram się zrobić program czytnika matrycy światłoczułej, który odczyta liczbę i prześle ją do pc, który odeśle informację zwrotną. (coś jak zamek na kartę perforowaną przy drzwiach).

Jednak program nie działa tak jak powinien bo przy podaniu 1 na pin odpowiadający za rozpoczęcie odczytu nic się nie dzieje. Testy na razie robiłem jedynie podając na piny różne stany i obserwując emulator portu szeregowego. Nie ukrywam że to moja pierwsza przygoda z Arduino. Będę bardzo wdzięczny za pomoc i przepraszam z góry jeśli problem jest banalny lub czegoś nie dopatrzyłem.

Pozdrawiam

Kod:
//Nazwy Predefiniowane określające piny wyjść sygnalizacyjnych oraz pin
//czujnika reagującego na włożenie karty
#define PRZERWANIE 3
#define ZIELONA 4
#define CZERWONA 5
#define BUZZER 6
#define PRACA 7

//Deklaracje i inicjacje używanych w programie zmiennych
int odczyt=0;                                   //zmienna przechowująca wartość odczytaną
int iteracja=0;                                 //zmienna pomocnicza obsługi diody sygnalizacyjnej PRACA
long oczekiwanie=0;                             //Zmienna pomocnicza zliczająca testowanie przychodzącej informacji zwrotnej
bool flaga_out=0;                               //Flaga służąca do wielokrotnego sprawdzania obecności danych przychodzących
String odpowiedz;                               //Łańcuch przechowujący odpowiedź zwrotną z PC

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// Ustawienia Początkowe
void setup() {
  delay(500);                                   //Opóźnienie - ustabilizowania pracy.

  DDRB=0;                                       //Ustawienie Portu B jako wejścia dla matrycy światłoczułej
  pinMode(PRZERWANIE, INPUT);                   //Ustawienie Bitu czujnika włożenia karty
  pinMode(ZIELONA, OUTPUT);                     //Ustalenie pinów "kontrolek" sygnalizacyjnych: zielona: dostęp, czerwona: brak dostępu,
  pinMode(CZERWONA, OUTPUT);                    //migające czerwona z zieloną: brak karty w bazie, migające naprzemiennie: brak informacji zwrotnej
  pinMode(BUZZER,OUTPUT);                       //Ustawienie pinu synalizatora dźwiękowego
  pinMode(PRACA,OUTPUT);                        //Ustawienie pinu kontrolki oczekiwania na włożenie karty
  digitalWrite(ZIELONA, LOW);                   // Początkowe wygaszenie diód kontrolnych
  digitalWrite(CZERWONA, LOW);
  digitalWrite(BUZZER, LOW);                    // Wyłączenie Buzzera
  digitalWrite(PRACA, HIGH);                    //Ustawienie diody sygnalizującej pracę

  Serial.begin(9600);                           //Ustalenie prędkości transmisji szeregowej.
}

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//Proram Główny
void loop() {

     delay(100);

//Pętla oczekuje na włożenie karty (wejście nastąpi po synale wysokim z czujnika włożenia karty)
     if(digitalRead(PRZERWANIE)){
        
        digitalWrite(PRACA, LOW);              //Wygaszenie kontrolki sygnalizacji oczekiwania na kartę
        delay(100);
        
        odczyt=PINB;                          //Odczyt z wejściowego rejestru sześcio -pinowego portu B, wejścia matrycy.
        Serial.println(odczyt);              //Przesłanie odczytu do PC
         
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------          
//Obsługa oczekiwania na informacje zwrotną
          while(!flaga_out)                     // Pętla będzie się wykonywać do momentu, w którym któryś if ustawi flagę.
          {
            if(Serial.available()>0)            //Sprawdzanie obecności danych do odebrania, oraz ich zapis w przypadku pojawienia się.
            {
              odpowiedz=Serial.readStringUntil('\n');
              flaga_out=1;                      //ustawienie flagi i wyjście z pętli
            }

//Po 10 000 000 sprawdzeń wejścia program przestaje je testować i informuje o braku informacji zwrotnej

            if((oczekiwanie==100000000)&&(flaga_out==0))          
            {
              
//Sekwencja informacyjna dla błędu braku informacji zwrotnej
          digitalWrite(ZIELONA, LOW);                     
          digitalWrite(CZERWONA, HIGH);          
          tone(BUZZER, 200);
          digitalWrite(ZIELONA, HIGH);                     
          digitalWrite(CZERWONA, LOW);
          delay(200);
          tone(BUZZER, 400);
          digitalWrite(ZIELONA, LOW);                     
          digitalWrite(CZERWONA, HIGH);
          delay(200);
          tone(BUZZER, 200);
          digitalWrite(ZIELONA, HIGH);                     
          digitalWrite(CZERWONA, LOW);
          delay(200);
          tone(BUZZER, 400);
          digitalWrite(ZIELONA, LOW);                     
          digitalWrite(CZERWONA, HIGH);
          delay(200);
          digitalWrite(ZIELONA, LOW);                     
          digitalWrite(CZERWONA, LOW);
          noTone(BUZZER);
              
          flaga_out=1;                          //Ustawienie flagi i opuszczenie pętli
            }
        oczekiwanie++;                         //inkrementacja licznika prób odczytu danej z portu
          }

//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Obsługa informacji zwrotnej
          
        if(odpowiedz == "tak")
        {
//Sekwencja informacyjna dla uzyskania dostępu
          digitalWrite(ZIELONA, HIGH);                     
          digitalWrite(CZERWONA, LOW);         
          tone(BUZZER, 3000);
          delay(200);
          noTone(BUZZER);
          delay(200);
          tone(BUZZER, 3000);
          delay(200);
          noTone(BUZZER);
          delay(200);
          tone(BUZZER, 2000);
          delay(400);
          noTone(BUZZER);
   
        }

        if(odpowiedz == "nie")
        {

//Sekwencja informacyjna dla odmowy dostępu
          digitalWrite(ZIELONA, LOW);                     
          digitalWrite(CZERWONA, HIGH);
          tone(BUZZER, 100);
          delay(500);
          noTone(BUZZER);
          delay(100);
          tone(BUZZER, 100);
          delay(500);
          noTone(BUZZER);
        }

//Sekwencja informacyjna dla błędu braku karty w bazie
        if(odpowiedz == "brak")
        {
          digitalWrite(ZIELONA, HIGH);                     
          digitalWrite(CZERWONA, HIGH);    
          tone(BUZZER, 200);
          delay(200);
          digitalWrite(ZIELONA, LOW);                     
          digitalWrite(CZERWONA, LOW);
          delay(200);
          digitalWrite(ZIELONA, HIGH);                     
          digitalWrite(CZERWONA, HIGH);
          delay(200);
          digitalWrite(ZIELONA, LOW);                     
          digitalWrite(CZERWONA, LOW);
          delay(200);
          digitalWrite(ZIELONA, HIGH);                     
          digitalWrite(CZERWONA, HIGH);
          delay(200);
          digitalWrite(ZIELONA, LOW);                     
          digitalWrite(CZERWONA, LOW);
          noTone(BUZZER);
        }

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Ustawienia końcowe po procedurze odczytu karty i powrotu do pętli oczekiwania na włożenie karty
        digitalWrite(ZIELONA, LOW);                     
        digitalWrite(CZERWONA, LOW);
        flaga_out=0;
        delay(2000);      
     }

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------     
//Obsługa kontrolki sygnalizacji pracy
     if(PRACA&&(iteracja==5))                   //Reakcja na zapaloną diodę      
     {
      digitalWrite(PRACA, LOW);                 //Zmiana wartości na pinie diody na przeciwny
      iteracja=0;                               //wyzerowanie licznika iteracji głównej pętli programu
     }
     if((!PRACA)&&(iteracja==5))                //Reakcja na zgaszoną diodę
     {
      digitalWrite(PRACA, HIGH);                //Zmiana wartości na pinie diody na przeciwny
      iteracja=0;                               //wyzerowanie licznika iteracji głównej pętli programu
     }
  iteracja++;                                  //iteracja głównej pętli loop
}

PS: Dorzucę jeszcze co jest nie tak bo głupio trochę napisałem. Zmiany na porcie B nie są widziane (Podawanie na różne nóżki 1 lub 0 nie zmieniają wysyłanej wartości. Oraz na początku układ bez pytania sczytuje jakąś wartość i zawsze na początku po resecie wykonuje się obługa błędu przekroczenia czasu oczekiwania na odpowiedź z PC. Dlaczego?