Skocz do zawartości

System blokowania zamka , dlaczego wartość tablicy jest o 1 większa ?


Pomocna odpowiedź

Dzień dobry,

Chciałem przetestować działanie systemu blokującego zamek do drzwi . Projekt posiada wyświetlacz LCD , klawiaturę,myservo,a całość jest sterowana na pomocą arduino . Analizując kod nie mogę zrozumieć jednej rzeczy , a mianowicie - dlaczego tablica znaków, która przechowuje hasło musi być o 1 większa  ? Gdzieś wyczytałem, że jest to określona liczba miejsc na wprowadzone znaki z klawiatury + 1 extra dla wartości 0 . Czy ta wartość 0 to wartość kursora na wyświetlaczu LCD, która nie może być później porównywana z wprowadzonym hasłem  ? Będę bardzo wdzięczny jeśli ktoś mi to wytłumaczy.  Poniżej wklejam kod :

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Servo.h>

Servo myservo;

LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);

#define dlugoschasla 7 

int pozycja ;   

char rozmiarhasla[dlugoschasla];
char prawidlowe_haslo[dlugoschasla] = "111111"; 
byte wpis =0;

char klawisz ; 

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'}
};
bool zamek = 1 ; 

byte rowPins[ROWS] = {14, 15, 16, 17}; 
byte colPins[COLS] = {18, 19, 20, 21}; 

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

void setup()
{
  myservo.attach(A8);
  ZamekZamykanie();
  lcd.begin(16, 2);
  lcd.print(" Zamek do drzwi");
  lcd.setCursor(0, 1);
  lcd.print("Projekt");
  delay(3000);
  lcd.clear();

}

void loop()
{
  if (zamek == 0)
  {
    klawisz= klawiatura.getKey();

    if (klawisz== '#')

    {
      lcd.clear();
      ZamekZamykanie();
      lcd.print("Drzwi zamkniete");
      delay(3000);
      zamek = 1;
    }
  }

  else DrzwiOtwieranie();
}

void ZerowanieWartosci()
{
  while (wpis != 0)
  { 
    rozmiarhasla[wpis--] = 0; 
  }
  return;
}

void ZamekOtwieranie()
{
  for (pozycja = 180; pozycja >= 0; pozycja -= 5) { 
    myservo.write(pozycja);              
    delay(15);                       
  }
}

void ZamekZamykanie()
{
  for (pozycja = 0; pozycja <= 180; pozycja+= 5) { 
    myservo.write(pozycja);            
    delay(15);                       
  }
}

void DrzwiOtwieranie()
{
  lcd.setCursor(0, 0);
  lcd.print(" Podaj Haslo");
  
 klawisz = klawiatura.getKey();
  if (klawisz) 
  {
    rozmiarhasla[wpis] = klawisz; 
    lcd.setCursor(wpis, 1); 
    lcd.print(rozmiarhasla[wpis]); 
    wpis++; 
  }

  if (wpis == dlugoschasla - 1) 
  {
    if (strcmp(rozmiarhasla, prawidlowe_haslo)==0) 
    {
      lcd.clear();
      ZamekOtwieranie();
      lcd.print("Drzwi otwarte");
      zamek = 0;
    }
    else
    {
      lcd.clear();
      lcd.print("  Zle haslo");
      delay(1000);
     zamek= 1;
    }
    ZerowanieWartosci();
  }
}

 

Edytowano przez Navers
Link to post
Share on other sites

To jest taka konwencja w języku C, żeby wiedzieć jak długi jest napis — zawsze się go kończy zerem, w ten sposób kod który kopiuje albo porównuje napisy wie kiedy ma skończyć. 

  • Lubię! 2
Link to post
Share on other sites
(edytowany)
17 minut temu, Navers napisał:

- dlaczego tablica znaków, która przechowuje hasło musi być o 1 większa 

Bo w jakiś sposób trzeba zapisać długość napisu siedzącego w tablicy. Znak o kodzie 0 oznacza po prostu "tu napis się kończy", ale gdzieś go trzeba zmieścić. Dlatego właśnie n-znakowy napis zajmuje n+1 bajtów.

@deshipu szybszy byłeś 🙂

Edytowano przez ethanak
  • Lubię! 2
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.