11-11-2016, 06:00
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
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?
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?