- Wymagane składniki
- APDS9960 RGB i czujnik gestów
- Schemat obwodu
- Objaśnienie kodu
- Testowanie bezdotykowego podnoszenia sterowanego gestami
W czasach pandemii Corona windy stały się miejscem wysokiego ryzyka, w którym wszyscy dotykają tych samych przycisków. W wielu miejscach ludzie odkryli sztuczki zapobiegające kontaktowi z przyciskami windy, takie jak użycie papieru do pompowania, wykałaczek lub chusteczek higienicznych do naciskania przycisków podnośnika.
Kontynuując nasze poprzednie projekty dotyczące bezpieczeństwa Corona, takie jak automatyczna maszyna odkażająca, bezkontaktowe monitorowanie temperatury i społeczny czujnik odległości, tutaj zamierzamy zbudować prototyp windy sterowanej gestami przy użyciu Arduino Nano.
Ta bezkontaktowa winda wykorzystuje Arduino Nano, czujnik gestów APDS9960 i moduł wyświetlacza OLED. Za pomocą tego opartego na gestach panelu sterowania możesz łatwo sterować podnośnikiem, wykonując gest ręką. Do odczytywania gestów służy czujnik APDS9960. Gesty GÓRA i DÓŁ służą do ustawiania numeru piętra, gest w lewo służy do zamykania drzwi windy i poruszania windą zgodnie z numerem piętra, a gest w prawo służy do otwierania drzwi.
Wymagane składniki
- Arduino Nano
- Moduł wyświetlacza OLED
- APDS9960 RGB i czujnik gestów
- Płytka prototypowa
- Przewody połączeniowe
APDS9960 RGB i czujnik gestów
APDS9960 RGB i moduł wykrywania gestów to mała płytka rozdzielająca, która jest wyposażona we wbudowany czujnik APDS-9960, filtry blokujące promieniowanie UV i IR, cztery oddzielne diody czułe na różne kierunki oraz interfejs zgodny z I2C. Ten czujnik może być używany do pomiaru światła otoczenia i koloru, wykrywania bliskości i bezdotykowego wykrywania gestów. Ma zasięg wykrywania gestów od 10 do 20 cm i może być używany do sterowania mikrokontrolerem, robotem oraz w wielu innych projektach.
Funkcje:
- Napięcie operacyjne: od 2,4 V do 3,6 V.
- Zakres roboczy: 4-8 cali (10-20 cm).
- Interfejs I2C (adres I2C: 0x39).
- Światło otoczenia i wykrywanie kolorów RGB, bliskość
- Wyczuwanie i wykrywanie gestów w module optycznym
- Interfejs zgodny z szybkim trybem I2C-bus z szybkością transmisji danych do 400 kHz.
Schemat obwodu
Schemat obwodu windy bezkontaktowej używającej APDS9960 jest podany poniżej.
Łączymy Arduino Nano z czujnikiem APDS9960 i wyświetlaczem OLED. Piny VCC i GND zarówno czujnika APDS9960, jak i wyświetlacza OLED są podłączone do 3,3 V i GND Arduino. Podczas gdy piny SCL i SDA czujnika APDS9960 i wyświetlacza OLED są połączone odpowiednio z pinami A5 i A4 Arduino.
OLED i APDS9960 Pin |
Arduino Nano Pin |
VCC |
3,3 v |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Tak będzie wyglądać kompletna konfiguracja windy sterowanej gestami za pomocą Arduino:
Aby dowiedzieć się więcej o wyświetlaczu OLED i jego interfejsach z innymi mikrokontrolerami, kliknij łącze.
Objaśnienie kodu
Pełny kod do windy zbliżeniowej używającej APDS9960 znajduje się na końcu strony. Tutaj wyjaśniamy kilka ważnych części kodu. W tym programie będziemy korzystać z bibliotek APDS9960 i Adafruit_SH1106 . Bibliotekę APDS9960 można pobrać z Arduino IDE. Aby pobrać bibliotekę, przejdź do Sketch> Library Manager> Search, a następnie wprowadź Arduino APDS9960. Choć biblioteka Adafruit_SH1106 można pobrać stąd.
Więc jak zwykle rozpocznij kod, dołączając wszystkie wymagane biblioteki. Adafruit_SH1106.h to zmodyfikowana wersja oryginalnej biblioteki Adafruit.
#zawierać
W następnych wierszach zdefiniuj zmienne, aby zapisać bieżące piętro i numer piętra, na które użytkownik chce się udać.
int floornum = 0; int currentfloor = 0;
Następnie wprowadź mapy bitowe dla obrazów Strzałka w górę, Strzałka w dół, Otwarte drzwi i Zamknij drzwi. Kod HEX dla obrazu można wygenerować za pomocą konwertera, takiego jak Image2cpp. Aby dowiedzieć się więcej o tym, jak korzystać z Image2cpp, skorzystaj z tego samouczka generatora kodu QR Arduino.
const unsigned char up PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ………………………………………………………..}; const unsigned char down PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ………………………………………………………..}; const unsigned char dooropen PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xe0, ………………………… …………………………………………………………..};
W funkcji setup () zainicjuj monitor szeregowy przy szybkości transmisji 9600 w celu debugowania. Następnie w kolejnych wierszach zainicjuj wyświetlacz OLED i czujnik APDS9960 metodą begin () w następujący sposób:
Serial.begin (9600); if (! APDS.begin ()) {Serial.println ("Błąd podczas inicjalizacji czujnika APDS9960!"); } Serial.println ("Wykrywanie gestów…"); display.begin (SH1106_SWITCHCAPVCC, 0x3C);
Po zainicjowaniu wyświetlacza i czujnika wyczyść bufor wyświetlania metodą clearDisplay () i ustaw rozmiar i kolor czcionki za pomocą metod display.setTextSize () i display.setTextColor () .
display.setTextSize (2); display.setTextColor (BIAŁY); display.clearDisplay (); display.display ();
Wewnątrz pustej pętli () , stale sprawdzać, czy każdy gest powstał. Jeśli tak, odczytaj wartości gestów i sprawdź, który to jest (GÓRA, DÓŁ, PRAWO, LEWO) i drukuje odpowiedni odczyt na monitorze szeregowym. Gesty UP i DOWN służą do ustawiania numeru piętra, na które użytkownik chce się udać. Gest w lewo polega na zamknięciu drzwi windy i przesunięciu windy zgodnie z numerem piętra, podczas gdy gest w prawo służy do otwarcia drzwi.
if (APDS.gestureAvailable ()) {int gest = APDS.readGesture (); przełącznik (gest) {przypadek GESTURE_UP: Serial.println ("Wykryty gest UP"); display.clearDisplay (); floornum ++; Dom 1(); przerwa; case GESTURE_DOWN: Serial.println ("Wykryty gest W DÓŁ"); display.clearDisplay (); floornum -; Dom 1(); przerwa; case GESTURE_LEFT: Serial.println ("Wykryto lewy gest"); display.clearDisplay (); początek(); przerwa; case GESTURE_RIGHT: Serial.println ("Wykryty gest PRAWY"); display.clearDisplay (); Dom 1(); przerwa; domyślnie: przerwa; }
Funkcja home1 () służy do rysowania widoku głównego windy. Składa się ze strzałek w górę, strzałki w dół, znaków otwartych drzwi, zamkniętych drzwi i numeru bieżącego piętra. Funkcja drawBitmap () służy do rysowania obrazów na wyświetlaczu OLED. Składnia funkcji drawBitmap () jest podana poniżej:
drawBitmap (int16_t x, int16_t y, bitmap, int16_t w, int16_t h, kolor);
Gdzie:
int16_t x, int16_t y to współrzędne X i Y wyświetlacza OLED
bitmapa to nazwa mapy bitowej
int16_t w, int16_t h to wysokość i waga obrazu.
void home1 () {display.setCursor (101,23); display.println (floornum); display.drawBitmap (23, 0, uparrow, 40, 18, WHITE); display.drawBitmap (26, 46, strzałka w dół, 40, 18, BIAŁY); display.drawBitmap (0, 15, dooropen, 29, 30, WHITE); display.drawBitmap (60, 15, drzwi zamknięte, 29, 30, BIAŁY); display.display (); }
Funkcja start () służy do przemieszczania windy w górę lub w dół. W tym celu bieżące piętro nr jest porównywane z numerem piętra, na które użytkownik chce się udać. Jeśli numer piętra jest większy niż numer bieżącego piętra. wtedy winda jedzie w górę, a jeśli numer piętra jest mniejszy niż numer obecnego piętra. wtedy winda zjeżdża w dół. Winda zatrzyma się, gdy zarówno bieżące piętro nr. i piętro są takie same.
void start () {while (floornum> currentfloor) {Serial.println ("idzie W GÓRĘ"); currentfloor ++; display.drawBitmap (0, 0, w górę, 100, 64, BIAŁY); display.setCursor (101,23); display.println (currentfloor); display.display (); display.clearDisplay (); opóźnienie (2000); } while (floornum <currentfloor) {Serial.println ("going Down"); currentfloor--; display.drawBitmap (0, 0, dół, 100, 64, BIAŁY); display.setCursor (101,23); display.println (currentfloor); display.display (); display.clearDisplay (); opóźnienie (2000); } if (floornum == currentfloor) {Serial.println ("Osiągnięto"); display.clearDisplay (); Dom 1(); Serial.print (currentfloor); }}
Testowanie bezdotykowego podnoszenia sterowanego gestami
Gdy sprzęt i kod są gotowe, podłącz Arduino Nano do laptopa i prześlij kompletny kod podany poniżej. Jak widać, domyślnie OLED wyświetli interfejs windy.
Teraz pomachaj ręką w górę lub w dół, jak pokazano na poniższym filmie, aby ustawić podłogę tam, gdzie chcesz się udać. Następnie wykonaj gest w lewo, aby potwierdzić, że winda jedzie na to piętro. Jeśli chcesz zatrzymać podnoszenie, wykonaj odpowiedni gest ręką.
Pełne wideo robocze i kod dla tego projektu są podane poniżej. Mam nadzieję, że spodobał Ci się ten projekt. Jeśli masz jakieś pytania dotyczące tego projektu, zostaw je w sekcji komentarzy.