Skocz do zawartości

Modyfikacja systemu alarmowego na Arduino


saikeN_N

Pomocna odpowiedź

@saikeN_N, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 26.11.2018 o 22:16, saikeN_N napisał:

zastanawiam się czy jest możliwość zmodyfikowania tego projektu i użycia klawiatury pojemnościowej opartej na układzie TTP229, a zamiast kontaktronu użycie elektromagnesa z wysuwanym bolcem jako zabezpieczenia w drzwiach. Jest to do zrealizowania ?

Oczywiście, że da się wprowadzić zmiany, o które pytasz. Arduino jest uniwersalne i możesz tak edytować program, aby spełniał Twoje oczekiwania. Uważaj tylko przed testami w praktyce, aby czegoś nie pomylić. Tutaj pisałeś o zamianie kontaktronu (czujnika) na elektromagnes (element wykonawczy) - nie ma sensu pisać o używaniu jednego "zamiast" drugiego. To zupełnie inne elementy. Możesz jednak bez problemu zrezygnować z kontaktronu i dodać osobno elektromagnes 😉

Pytanie wydzielono z:

 

Link do komentarza
Share on other sites

(edytowany)

Dzięki za odpowiedź! 

Na razie natrafiłem na pewien problem. Podłączyłem moduł klawiatury pojemnościowej i wyświetlacz z konwerterem I2C. Mój kod wygląda tak: 

/* LCM1602 & Arduino Uno polaczenie
 *  VCC - > 5V
 *  GND - > GND
 *  SCL - > A5
 *  SDA - > A4
 */

#include <Wire.h> // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // biblioteka I2C dla wyswietlacza
#include <TTP229.h> // biblioteka klawiatury
#include <Password.h> // biblioteka odpowiedzialna za hasło

const int SCL_PIN = 2; // Wyprowadzenie pinu zegara
const int SD0_PIN = 3; // Wyprowadzenie pinu danych

TTP229 ttp229(SCL_PIN, SD0_PIN); // inicjalizacja klawiatury
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu wyśietlacza
Password password = Password( "1234" ); // Ustawienie hasła

void setup()
{
  lcd.begin(16,2); // Inicjalizacja
  
  Serial.begin(115200);
  
  lcd.backlight(); // Podswietlenie
  lcd.setCursor(0,0); // Kursor w pozycji 0,0 ( pierwszy wiersz, pierwsza kolumna)
  lcd.print("Podaj kod");
  delay(500);
  lcd.setCursor(0,1); // Kursor w pozycji 0,1 (drugi wiersz, pierwsza kolumna)
  lcd.blink();
  delay(500);

}

void loop()
{
  lcd.backlight(); // zalaczenie podswietlenia
  uint8_t key = ttp229.ReadKey16(); // Blocking
  if (key) Serial.println(key);
  if (key){
    lcd.print(key);
  }
}

void clr()  // funkcja czyszczenia
{
  lcd.clear();
  lcd.print("Podaj kod");
  lcd.setCursor(0,1);
  lcd.blink();
}

 

Staram się pisać sobie komentarze dla ułatwienia. Ale chciałbym teraz napisać część kodu która funkcjonowała by jako zamek. Czyli po wpisaniu kodu, który ustawiłem za pomocą biblioteki Password.h żeby na wyświetlaczu pojawił się komunikat o poprawności albo błędnym kodzie. Tak, żeby to był zamek z prawdziwego zdarzenia. Tylko nie wiem w jaki sposób to zrealizować, ktoś mógłby pomóc ?

Chodzi o to, że w przypadku użycia klawiatury z układem TTP229 nie potrafię dodać jakiegoś event listenera tak jak jest to w przypadku klawiatury membranowej z biblioteką keypad.h. 

Edytowano przez saikeN_N
Dopisanie informacji
Link do komentarza
Share on other sites

(edytowany)

Próbowałem czegoś takiego

int counter = 0;
char text[5] = { 'f','f', 'f', 'f', '\0'};

void loop()
{
  lcd.backlight(); // zalaczenie podswietlenia
  uint8_t key = ttp229.ReadKey16(); // Blocking
  if (key) Serial.println(key);
  if (key){
    lcd.print(key);
    if(key!=0){
      text[counter] = key; 
      char keyPassword = key;
//      password.append(key);
      counter++;//zostaw
      Serial.println(text);
      uint8_t a = key;
      Serial.println(a);
      char b = (char*) &a;
      Serial.println(b);
    }
  }
 if(counter == 4){
  Serial.println( password.is(text)?"true":"false" );
  Serial.println(text);//usun
//  Serial.println( password.evaluate()?"true":"false" );
  counter = 0;
 }
}

Ale podczas gdy chce wypisać sobie liczbę pobraną jakby z klawiatury, otrzymuję jakieś kwadraciki. I teraz pytanie w jaki sposób skonwertować zmienną uint8_t na zmienną typu char ?

Edytowano przez saikeN_N
Link do komentarza
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

Dnia 4.12.2018 o 23:45, kaczakat napisał:

Jeśli w setup masz tak jak wcześniej Serial.begin(115200); to upewnij się, że terminal tez masz ustawiony na 115200. Serial.print bez problemu radzi sobie z liczbami uint8_t i żadna konwersja nie jest potrzebna.

Terminal jest też ustawiony na 115200. Mimo tego w terminalu pojawiają się takie rzeczy jak załączyłem w obrazku. Myślisz, że to może być wina klawiatury ?

kwadraty.png

Link do komentarza
Share on other sites

Problem jest z tym kodem. Niestety nie mam takiej klawiatury więc nie zrobię testu. Na pewno zapoznaj się z tablicą ASCII. Typy byte, char i uint8_t to tak na prawdę to samo w pamięci, jest tam liczba od 0-255 i jeśli powiesz programowi, że chodzi o literki to liczbę pokazuje jak literkę. Nie wszystkie jednak są "drukowalne", pewnie więc drukujesz jakieś śmieci z pamięci. Na początku najlepiej dla napisów korzystać z tablic, można łatwo zerknąć do np. 3 komórki tablicy i sprawdzić jaka tam jest literka, a jeśli drukuje kwadracik to wyświetlić jaka tam jest liczba.

char text[5] = { 'f','f', 'f', 'f', '\0'};

uint8_t liczba = (uint8_t) text[0];

Serial.println(liczba); //dziesietnie

Serial.println(liczba,16);//hex
Serial.println (text[3]); //jako tekst
Serial.println((uint8_t) text[3],16); //jako liczba

 

Link do komentarza
Share on other sites

@Belferek char nie zawsze jest signed - to zależy od kompilatora, a nawet od opcji wybranych przy kompilacji (https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html). Nie zmienia to faktu, że zarówno signed char, jak i unsigned char w pamięci wyglądają tak samo - to po prostu 8 bitów. Różnica to jedynie interpretacja.

Inna sprawa, że oryginalne kodowanie znaków ASCII było 7 bitowe, więc najwyższy bit w przypadku bajtu ma wartość zero - co zupełnie nieweluje różnice między tymi typami.

  • Lubię! 1
Link do komentarza
Share on other sites

Gość es2

To:

uint8_t key = ttp229.ReadKey16(); // Blocking if (key) Serial.println(key);

Zamień na to:

	uint8_t key = ttp229.ReadKey16();
	char txt[10];
	sprintf( txt, "k=%x ", key ); if (key) Serial.print(txt);

i napisz co otrzymujesz w monitorze po naciśnięciu kolejnych przycisków.

 

Edytowano przez es2
Link do komentarza
Share on other sites

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.