Съдържание:

Клавиатура с един щифт 4 × 4: 10 стъпки
Клавиатура с един щифт 4 × 4: 10 стъпки

Видео: Клавиатура с един щифт 4 × 4: 10 стъпки

Видео: Клавиатура с един щифт 4 × 4: 10 стъпки
Видео: Горячие клавиши Windows 10 секретные комбинации 2024, Юли
Anonim
Клавиатура с един щифт 4 × 4
Клавиатура с един щифт 4 × 4

Всеки път, когато видя клавиатура, тя идва с много щифтове, това е голяма загуба на вашите щифтове на Arduino, така че можем ли да пуснем клавиатура с един и само един щифт?. Отговорът е тук.

Стъпка 1: Сметка на материалите

Сметка на материалите
Сметка на материалите

Хардуер:

01 Arduino UNO

02 Бордове

01 LCD с I2C

16 бутони

04 резистори 1,5 kΩ

04 резистори 620 Ω

04 резистори 220 Ω

08 резистори 100 Ω

01 резистор 1 kΩ

07 Кабелни проводници

Софтуер:

Arduino IDE инсталиран на вашия компютър

Стъпка 2: Схеми и Cicruit

Схематичен и Cicruit
Схематичен и Cicruit
Схематичен и Cicruit
Схематичен и Cicruit

Цялата идея е, че имаме 4*4 матрица от бутони, свързани вертикално към земята от десния проводник и хоризонтално от другия проводник (проводника на бутона) и резистори от 1,5 kΩ, 620Ω, 220Ω и 100Ω, краищата на четирите реда са свързани с четири 100Ω резистора, както е показано на схемата.

Всеки път, когато натиснете бутон, затваряте веригата и токът преминава по различен път и различна верига от резистори, поради което щифт A0 получава различно аналогово четене за всеки бутон. Всичко, от което се нуждаете сега, е кодирането.

Стъпка 3: Кодът

#включва

#включва

LiquidCrystal_I2C LCD (0x3f, 20, 4);

int Бутон = A0;

int readvalue;

void setup ()

{

Serial.begin (9600);

lcd.begin ();

pinMode (Бутон, ВХОД);

lcd.backlight ();

lcd.print ("Здравей свят");

забавяне (2000);

lcd.clear ();

lcd.print ("Един щифт 4*4 клавиатура");

забавяне (2000); }

void loop ()

{

readvalue = analogRead (Бутон);

Serial.println (readvalue);

if (readvalue == 852) {lcd.clear (); lcd.print ("A");}

else {if (readvalue == 763) {lcd.clear (); lcd.print ("B");}

else {if (readvalue == 685) {lcd.clear (); lcd.print ("C");}

else {if (readvalue == 965) {lcd.clear (); lcd.print ("D");}

else {if (readvalue == 565) {lcd.clear (); lcd.print ("9");}

else {if (readvalue == 614) {lcd.clear (); lcd.print ("6");}

else {if (readvalue == 360) {lcd.clear (); lcd.print ("3");}

else {if (readvalue == 335) {lcd.clear (); lcd.print ("#");}

else {if (readvalue == 396) {lcd.clear (); lcd.print ("8");}

else {if (readvalue == 349) {lcd.clear (); lcd.print ("5");}

else {if (readvalue == 235) {lcd.clear (); lcd.print ("2");}

else {if (readvalue == 279) {lcd.clear (); lcd.print ("0");}

else {if (readvalue == 452) {lcd.clear (); lcd.print ("7");}

else {if (readvalue == 271) {lcd.clear (); lcd.print ("4");}

else {if (readvalue == 170) {lcd.clear (); lcd.print ("1");}

else {if (readvalue == 92) {lcd.clear (); lcd.print ("*");} else {}}}}}}}}}}}}}}}}}

Стъпка 4: Корекция на стойностите

Корекция на стойностите
Корекция на стойностите

Когато отворите серийния монитор, той ще покаже стойност 1023, ако натиснете бутон, той ще ви даде друго четене, трябва да вземете тези стойности и да направите някои промени в кода

Стъпка 5: Проект след критика и преглед

Проект след критика и преглед
Проект след критика и преглед

Няма съмнение, че всички сме тук, за да се учим и споделяме знанията си, благодарение на някои коментари, оставени от някои хора от общността, които бяха много полезни, реших да направя някои корекции и подобрения в моя проект:

Хардуерът:

Реших да запоя всички компоненти в печатна платка, за да избегна проблема с лошата връзка в макетите.

Кодът:

Един приятел ме посъветва да използвам софтуер за отстраняване на проблеми и това е просто цикъл (например "за" цикъл), за да накара програмата да отнеме известно време, за да избере четене, това означава, че прави много четения (500 в моя изпит), но отнема само последната.

for (i = 1; i <= 500; i ++) {// вземете само 500 -ия аналогов прочит

value = analogRead (Button);} // това помага да се отдели известно време и да се избегнат лоши показания

Друг приятел благодарение на него ме посъветва да сравня "readvalue" с диапазон от стойности, а не с един, защото "readvalue" приема много стойности за един и същ бутон. "A" например дава четене на: 849, 850, 851 852, 853, 854, 855, така че това е диапазон от 7 стойности: праг (852) и 3 стойности вляво и вдясно. това, което трябва да направим тук, е да сравним абсолютната стойност на разликата между "readvalue" и "852" до "3".

if (abs (readvalue-852) <= 8) {lcd.clear (); lcd.print ("A");}

Стъпка 6: След известна работа по запояване

След някои запояващи работи
След някои запояващи работи
След някои запояващи работи
След някои запояващи работи
След някои запояващи работи
След някои запояващи работи

Стъпка 7: Моментът на истината

Както можете да видите, програмата понякога обърква бутоните, но все още работи, на теория няма нищо лошо в схемата, но кодът се нуждае от повече калибриране.

Стъпка 8: Краят

Надявам се този проект да ви хареса и да се опитате да го направите, може би ще се справите по -добре от мен.

Попитайте ме, ако имате въпроси, оставете коментари и не забравяйте да гласувате за мен, ако това ви харесва.

Препоръчано: