W tym artykule zostanie przedstawione podłączenie klawiatury membranowej do arduino. Przy wykorzystaniu jej, razem z wyświetlaczem, stworzymy kalkulator, który będzie w stanie wykonywać proste działania, takie jak dodawanie, odejmowanie, mnożenie, dzielenie.
Spis treści
- Specyfikacja
- Połączenie
- Sprawdzenie działania klawiatury
- Zaprogramowanie arduino
- Działanie kalkulatora
- Pliki do pobrania
Specyfikacja
- ilość przycisków: 16
- wymiary: 77 x 70 x 0,8 mm
- długość taśmy wraz ze złączem: 83 mm
- rodzaj złącza: 1 x 8 pin, raster 2.54 pod goldpin
Połączenie
Połączenie będzie bardzo proste, trzymając na przeciwko klawiaturę, zaczynamy podłączać od lewej jej strony do kolejnych pinów arduino 12, 11, 7, 6, 5, 4, 3, 2. Moglibyśmy zacząć od pinu 9, ale przez to, że będziemy używać wyświetlacza, to wymaga on pinów 10, 9 i 8. Na schemacie poniżej wygląd całego połączenia.
Sprawdzenie działania klawiatury
Aby sprawdzić działanie, wykorzystamy do tego bibliotekę, która przyda nam się do obsługi tej klawiatury. Bibliotekę można pobrać na samym dole artykułu, wykorzystamy z niej przykład który pozwoli na sprawdzenie jej działania.
Wybieramy przykład ”Custom keypad”
Teraz będziemy musieli podmienić kod od linijki 15 do 22 na ten podany niżej
char hexaKeys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {12, 11, 7, 6}; //connect to the row pinouts of the keypad byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
Po podmianie wgrywamy do naszego arduino i sprawdzamy, czy wszystkie klikane cyfry lub liczby rzeczywiście odpowiadają za te które są na klawiaturze.
Jeżeli klikany na klawiaturze numer lub litera się nie zgadza, należy sprawdzić połączenie. W przeciwnym wypadku nasza klawiatura działa prawidłowo.
Zaprogramowanie arduino
Z pomocą naszej klawiatury, można zrobić prosty kalkulator, użyję tu wyświetlacza (LCD TFT – 1.8′ – SPI artykuł o nim znajdziecie pod tym linkiem https://ajmaker.pl/2022/01/11/p/), dla lepszej wizualizacji, ale ten kto nie posiada takowego wyświetlacza, może wykorzystać do tego monitor portu szeregowego, chodź nie będzie, to tak efektowne. Do zrobienia kalkulatora na wyświetlaczu, przerobiłem kod który znajdziecie tutaj, a gotowy prezentuje się w ten sposób.
#include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <Keypad.h> #if defined(ARDUINO_FEATHER_ESP32) // Feather Huzzah32 #define TFT_CS 14 #define TFT_RST 15 #define TFT_DC 32 #elif defined(ESP8266) #define TFT_CS 4 #define TFT_RST 16 #define TFT_DC 5 #else #define TFT_CS 10 #define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 8 #endif #if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__) SoftwareSerial mySerial(2, 3); #else // On Leonardo/M0/etc, others with hardware serial, use hardware serial! // #0 is green wire, #1 is white #define mySerial Serial1 #endif Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); long first = 0; long second = 0; double total = 0; char customKey; const byte ROWS = 4; const byte COLS = 4; char keys[ROWS][COLS] = { {'1', '2', '3', '+'}, {'4', '5', '6', '-'}, {'7', '8', '9', '*'}, {'C', '0', '=', '/'} }; byte rowPins[ROWS] = {12, 11, 7, 6}; //connect to the row pinouts of the keypad byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); void setup() { Serial.begin(9600); analogWrite(A0, 255); tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab tft.setTextSize(2); tft.setRotation(1); tft.fillScreen(ST77XX_BLACK); tft.setCursor(0, 0); } void loop() { customKey = customKeypad.getKey(); switch (customKey) { case '0' ... '9': first = first * 10 + (customKey - '0'); Serial.println(first); break; case '+': first = (total != 0 ? total : first); Serial.println("+"); tft.print("+"); second = SecondNumber(); total = first + second; Serial.println(total); tft.print(" = "); tft.print(total); first = 0, second = 0; break; case '-': first = (total != 0 ? total : first); Serial.println("-"); tft.print("-"); second = SecondNumber(); total = first - second; Serial.println(total); tft.print(" = "); tft.print(total); first = 0, second = 0; break; case '*': first = (total != 0 ? total : first); Serial.println("*"); tft.print("*"); second = SecondNumber(); total = first * second; Serial.println(total); tft.print(" = "); tft.print(total); first = 0, second = 0; break; case '/': first = (total != 0 ? total : first); Serial.println("/"); tft.print("/"); second = SecondNumber(); second == 0 ? Serial.println("Invalid") : total = (float)first / (float)second; Serial.println(total); tft.print(" = "); tft.print(total); first = 0, second = 0; break; case 'C': total = 0; tft.fillScreen(ST77XX_BLACK); tft.setCursor(0, 0); break; } switch (customKey) { case '1': tft.print("1"); break; case '2': tft.print("2"); break; case '3': tft.print("3"); break; case '4': tft.print("4"); break; case '5': tft.print("5"); break; case '6': tft.print("6"); break; case '7': tft.print("7"); break; case '8': tft.print("8"); break; case '9': tft.print("9"); break; case '0': tft.print("0"); break; } } long SecondNumber() { while ( 1) { customKey = customKeypad.getKey(); if (customKey >= '0' && customKey <= '9') { second = second * 10 + (customKey - '0'); Serial.println(second); } switch (customKey) { case '1': tft.print("1"); break; case '2': tft.print("2"); break; case '3': tft.print("3"); break; case '4': tft.print("4"); break; case '5': tft.print("5"); break; case '6': tft.print("6"); break; case '7': tft.print("7"); break; case '8': tft.print("8"); break; case '9': tft.print("9"); break; case '0': tft.print("0"); break; } if (customKey == '=') break; //return second; } return second; }