فهرست مطالب:

ماشین حساب صفحه لمسی آردوینو: 7 مرحله
ماشین حساب صفحه لمسی آردوینو: 7 مرحله

تصویری: ماشین حساب صفحه لمسی آردوینو: 7 مرحله

تصویری: ماشین حساب صفحه لمسی آردوینو: 7 مرحله
تصویری: حرکات زشت سحر قریشی در باشگاه مردانه در دبی#سحرقریشی #امیرتتلو #تتلو #سحر_قریشی 2024, جولای
Anonim
ماشین حساب صفحه لمسی آردوینو
ماشین حساب صفحه لمسی آردوینو

سلام! این پروژه ساخت ماشین حساب صفحه لمسی با استفاده از Arduino Uno و سپر LCD TFT است. من برای کلاس برنامه نویسی مدرسه خانگی خود ایده ای ارائه کردم و تجربه ساخت این پروژه بسیار جالب بود. این ماشین حساب می تواند چهار عمل ساده ریاضی (جمع ، تفریق ، ضرب و تقسیم) را انجام دهد. همچنین تا دو نقطه اعشار را برای پاسخ های تقسیم شده نمایش می دهد. بیایید درست شیرجه بزنیم! لوازم مورد نیاز این پروژه در زیر فهرست شده است.

تدارکات

- آردوینو اونو

-2.4 TFT LCD Shield (اینجا جایی است که من آن را خریدم:

- کابل USB A به B (سیم برای اتصال Arduino به کامپیوتر)

- رایانه با Arduino IDE نصب شده است

- همچنین باید دو کتابخانه را بارگیری کنید: MCUFRIEND_kbv و صفحه لمسی. اولین مورد را می توانید در github پیدا کنید (پیوند: https://github.com/prenticedavid/MCUFRIEND_kbv) یا می توانید از فایل زیپ کتابخانه ای که در زیر قرار داده ام استفاده کنید. مورد دوم در مدیریت کتابخانه Arduino برای نصب است.

مرحله 1: اتصالات سخت افزاری

اتصالات سخت افزاری
اتصالات سخت افزاری
اتصالات سخت افزاری
اتصالات سخت افزاری
اتصالات سخت افزاری
اتصالات سخت افزاری

اتصال سپر صفحه لمسی به Arduino Uno ساده و سریع است. تنها کاری که باید انجام دهید این است که پایین ترین پین های سپر را با کمترین پین ها روی آردوینو قرار دهید و سپر را به پین ها فشار دهید. پین 5 ولت بالا و پین بدون برچسب در طرف منبع تغذیه نباید دارای پین هایی از سپر باشد ، زیرا پارامترهای مشابهی برای پین هایی با برچسب SCL و SDA در طرف دیگر برد وجود دارد. اکنون ، ما آماده کدگذاری هستیم!

مرحله 2: کد: تعاریف و راه اندازی جهانی

#عبارتند از

MCUFRIEND_kbv tft؛ // به هر حال برای سپرهای سازمان ملل متحد محکم است

#عبارتند از

#Ep A3 را تعریف کنید

#تعریف XM A2

#تعریف YM 9

#XP را تعریف کنید 8

TouchScreen ts = صفحه لمسی (XP ، YP ، XM ، YM ، 300) ؛

#تعریف فشار 10

این آغاز کد است ، جایی که ما کتابخانه ها (MCUFRIEND_kbv و صفحه لمسی) را شامل می شود ، پین های X و Y را تعریف می کنیم ، پارامترهای صفحه لمسی را تنظیم می کنیم و حداقل فشار مورد نیاز برای آردوینو برای ثبت پرس کاربر را مشخص می کنیم.

شناسه int ؛

int user_selection؛

شناور save_number = 0؛

float term1؛

int op_num؛

نتیجه شناور ؛

int cursorLocX = 5؛

int cursorLocY = 20؛

درست قبل از راه اندازی ، ما باید برخی متغیرهای جهانی را تنظیم کنیم. ID به فعال و راه اندازی صفحه لمسی کمک می کند. user_selection عددی را نگه می دارد که مربوط به کلیدی است که کاربر هنگام فشار دادن صفحه لمسی انتخاب می کند. save_number متغیری است که پس از ورود کاربر روی صفحه چاپ می کنیم (توضیحات بیشتر در حلقه). این یک شناور است بنابراین می تواند اعداد اعشاری و همچنین اعداد صحیح را در خود نگه دارد. term1 متغیری است که پس از انتخاب عملوند ، اولین عدد معادله در آن ذخیره می شود. op_num عملوند را به عنوان یک عدد ذخیره می کند (1 برای جمع ، 2 برای تفریق ، 3 برای ضرب و 4 برای تقسیم). result متغیری است که پس از فشار دادن علامت برابر بر روی صفحه چاپ می شود. همچنین شناور است. cursorLocX و cursorLocY نقاط نقشه برداری روی صفحه لمسی هستند که مکان نما در آن چندین بار تنظیم شده است (در نوار خاکستری در بالا قرار دارد ، در غیر این صورت به عنوان فیلد نتایج شناخته می شود).

void setup () {

tft.reset ()؛

ID = tft.readID ()؛

tft.begin (ID) ؛

tft.setRotation (0) ؛

tft.fillScreen (TFT_DARKGREY) ؛

مربع () ؛

شماره()؛

tft.setTextSize (3) ؛

tft.setTextColor (TFT_BLUE ، TFT_DARKGREY) ؛

}

عملکرد راه اندازی ما ابتدا شامل مقداردهی اولیه برای محافظ صفحه لمسی است (خطوط 1-3). جهت سپر با استفاده از دستور () tft.setRotation تنظیم می شود و 0 صاف است. کل صفحه با دستور tft.fillScreen () به رنگ خاکستری تیره رنگ آمیزی شده است ، که ما آن را در بالای صفحه (به جز فیلد نتایج) می نویسیم. توابع مربع () و اعداد () مربع های ماشین حساب را ترسیم می کنند ، مربع ها را سیاه و سفید به صورت تخته شطرنجی رنگ می کنند و اعداد/عملوندها را روی مربع ها به رنگ آبی می نویسند. در مرحله بعد به آن ها می رسیم. دستور tft.setTextSize () اندازه متن فیلد نتایج را روی 3 قرار می دهد که یک فونت متوسط است. دستور tft.setTextColor () رنگ متن زمینه نتایج را آبی می کند که روی قسمت خاکستری تیره نوشته شده است.

مرحله 3: کد: حلقه

حلقه خالی () {numberSelect ()؛

تأخیر (100) ؛

if (user_selection == 16) {

;

} دیگری {

if (user_selection <10) {

save_number = تعداد_ ذخیره شده * 10 + user_selection؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print (تعداد ذخیره شده) ؛

} else if (user_selection> 10) {

سوئیچ (user_selection) {

مورد 11:

op_num = 1؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print ("+") ؛

term1 = تعداد_ ذخیره شده ؛

ذخیره شده_تعداد = 0؛

زنگ تفريح؛

مورد 12:

op_num = 2 ؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print ("-") ؛

term1 = تعداد_ ذخیره شده ؛

ذخیره شده_تعداد = 0؛

زنگ تفريح؛

مورد 13:

op_num = 3 ؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print ("X") ؛

term1 = تعداد_ ذخیره شده ؛

ذخیره شده_تعداد = 0؛

زنگ تفريح؛

مورد 14:

op_num = 4 ؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print ("/") ؛

term1 = تعداد_ ذخیره شده ؛

ذخیره شده_تعداد = 0؛

زنگ تفريح؛

مورد 15:

ذخیره شده_تعداد = 0؛

term1 = 0 ؛

op_num = 0؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print ("")؛

زنگ تفريح؛

}

tft.setCursor (cursorLocX ، cursorLocY) ؛

این چیزهای زیادی برای جویدن است ، بنابراین موارد بالا را توضیح می دهم. ما با فراخوانی تابع numberSelect () شروع می کنیم که به هر مربع روی صفحه لمسی یک عدد اختصاص می دهد. هنگامی که کاربر یکی از آن مربع ها را فشار می دهد ، تابع متغیر user_selection را به تعداد مربع تنظیم می کند. اولین دستور if این است که فقط در صورت انجام یک انتخاب معتبر کاربر از طریق حلقه اجرا شود. اگر چنین است ، دستور if بعدی می پرسد آیا user_selection عددی کمتر از 10 در آن ذخیره شده است (اعداد 0-9). در این صورت ، شماره ذخیره شده در 10 ضرب می شود و عدد انتخاب کاربر به تعداد ذخیره شده اضافه می شود ، که در قسمت نتایج روی صفحه لمسی چاپ می شود. اگر اینطور نیست ، دستور if بعدی می پرسد آیا user_selection عددی بیشتر از 10 در آن ذخیره شده است (اعداد عملوند: 11 برای +، 12 برای -، 13 برای X ، 14 برای /و 15 برای مربع صفحه روشن) یک تابع سوئیچ از هر مورد مراقبت می کند (توسط user_selection تعیین می شود). به متغیر op_num عددی داده می شود که مربوط به عملوند انتخاب شده است (1 برای +، 2 برای -، 3 برای X و 4 برای /). مقدار ذخیره شده در تعداد متغیر 1 ذخیره می شود تا از متغیر ذخیره شده برای نیمه دوم معادله استفاده شود. نماد عملوند به همراه پاک کردن اعداد در قسمت نتایج روی صفحه چاپ می شود. تنها استثنا مربع صفحه روشن است که همه متغیرهای محاسبه را بازنشانی می کند و زمینه نتایج را از هر چیزی که در آن وجود دارد پاک می کند.

} دیگری {

تغییر (op_num) {

مورد 1:

نتیجه = term1 + تعداد_ ذخیره شده ؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print (دو برابر (نتیجه)) ؛

زنگ تفريح؛

مورد 2:

نتیجه = term1 - تعداد ذخیره شده ؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print (دو برابر (نتیجه)) ؛

زنگ تفريح؛

مورد 3:

نتیجه = term1 * تعداد_ ذخیره شده ؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print (دو برابر (نتیجه)) ؛

زنگ تفريح؛

مورد 4:

result = float (term1) / float (تعداد_ ذخیره شده) ؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print (نتیجه) ؛

زنگ تفريح؛

}

tft.setCursor (cursorLocX ، cursorLocY) ؛

save_number = result؛

term1 = 0 ؛

op_num = 0؛

تاخیر (1000) ؛

}

}

}

آخرین قسمت حلقه به رویداد انتخاب علامت برابر توسط کاربر (user_selection == 10) می پردازد. یک تابع سوئیچ دیگر از طریق چهار تابع ریاضی (که توسط op_num تعیین می شود) کار می کند. مورد اضافی (مورد 1) term1 و number_number را با هم جمع می کند و عدد را در متغیر نتیجه ذخیره می کند. نتیجه به صورت دو برابر در قسمت نتایج چاپ می شود. مورد تفریق (مورد 2) تعداد ذخیره شده را از term1 کم می کند و عدد را در متغیر نتیجه ذخیره می کند. نتیجه به صورت دو برابر در قسمت نتایج چاپ می شود. مورد ضرب (مورد 3) term1 را با save_number ضرب می کند و عدد را در متغیر نتیجه ذخیره می کند. نتیجه به صورت دو برابر در فیلد نتایج چاپ می شود. مورد تقسیم (مورد 4) term1 را بر تعداد ذخیره شده_هم تقسیم می کند و عدد را در متغیر نتیجه ذخیره می کند. نتیجه در قسمت نتایج به صورت شناور چاپ می شود (زیرا پاسخهای تقسیم می توانند اعداد اعشاری باشند). پس از پرینت یک شماره ، عملوند یا نتیجه روی صفحه ، مکان نما بازنشانی می شود ، شماره ذخیره شده بر روی نتیجه قبلی تنظیم شده و term1 & op_num بازنشانی می شود.

چند نکته: کاربر نمی تواند اعداد اعشاری را در ماشین حساب وارد کند به دلیل نداشتن مربع نقطه اعشار. همچنین ، کاربر می تواند در یک زمان فقط یک معادله انجام دهد. شما نمی توانید یک نتیجه را محاسبه کرده و سپس آن نتیجه را اضافه/تفریق/ضرب/تقسیم کنید. در تابع numberSelect () ، یک تابع وجود دارد که پس از چاپ یک نتیجه ، اگر کاربر مربع دیگری را فشار داده باشد ، صفحه را پاک می کند.

مرحله 4: تابع Code: Squares

مربع های خالی () {

// مربع های سیاه و سفید در هر ردیف متناوب هستند و ردیف های اول و سوم الگوی متضادی نسبت به ردیف دوم و چهارم دارند

tft.fillRect (0 ، 60 ، 60 ، 65 ، TFT_BLACK) ؛ // اولین ردیف مربع ها شروع می شود ، سیاه تا سفید tft.fillRect (60 ، 60 ، 60 ، 65 ، TFT_WHITE) ؛

tft.fillRect (120 ، 60 ، 60 ، 65 ، TFT_BLACK) ؛

tft.fillRect (180 ، 60 ، 60 ، 65 ، TFT_WHITE) ؛ // ردیف اول مربع ها به پایان می رسد

tft.fillRect (0 ، 125 ، 60 ، 65 ، TFT_WHITE) ؛ // ردیف دوم مربع شروع می شود ، سفید به سیاه tft.fillRect (60 ، 125 ، 60 ، 65 ، TFT_BLACK) ؛

tft.fillRect (120 ، 125 ، 60 ، 65 ، TFT_WHITE) ؛

tft.fillRect (180 ، 125 ، 60 ، 65 ، TFT_BLACK) ؛ // ردیف دوم مربع ها به پایان می رسد

tft.fillRect (0 ، 190 ، 60 ، 65 ، TFT_BLACK) ؛ // ردیف سوم مربع شروع می شود ، سیاه و سفید tft.fillRect (60 ، 190 ، 60 ، 65 ، TFT_WHITE) ؛

tft.fillRect (120 ، 190 ، 60 ، 65 ، TFT_BLACK) ؛

tft.fillRect (180 ، 190 ، 60 ، 65 ، TFT_WHITE) ؛ // ردیف سوم مربع ها به پایان می رسد

tft.fillRect (0 ، 255 ، 60 ، 65 ، TFT_WHITE) ؛ // ردیف چهارم مربع شروع می شود ، سفید به سیاه tft.fillRect (60 ، 255 ، 60 ، 65 ، TFT_BLACK) ؛

tft.fillRect (120 ، 255 ، 60 ، 65 ، TFT_WHITE) ؛

tft.fillRect (180 ، 255 ، 60 ، 65 ، TFT_BLACK) ؛ // ردیف چهارم مربع ها به پایان می رسد

}

تابع مربع () بسیار ساده است. دستور tft.fillRect (X1 ، Y1 ، X2 ، Y2 ، TFT_COLOR) با توجه به پارامترهای منتقل شده به آن ، مستطیل رسم می کند که عبارتند از موقعیت های اول x و y ، موقعیت دوم x و y و رنگی که مستطیل با آن پر شده است به این تابع هر چهار ردیف مربع (از نظر فنی مستطیل) را ترسیم می کند و هر مربع را با رنگی که به آن منتقل می شود پر می کند.

مرحله 5: تابع کد: اعداد

اعداد خالی () {

tft.setTextColor (TFT_BLUE) ؛ // تعداد/رنگ کاراکتر را به آبی تنظیم می کند

tft.setTextSize (5) ؛ // تعداد/اندازه کاراکتر را روی 5 تنظیم می کند

tft.setCursor (18 ، 75) ؛ // مکان نما را برای اولین خط اعداد/کاراکترها تنظیم می کند

tft.print ("7 8 9 /") ؛ // اولین خط اعداد/کاراکترها را چاپ می کند

tft.setCursor (18 ، 140) ؛ // مکان نما را برای خط دوم اعداد/کاراکترها تنظیم می کند

tft.print ("4 5 6 X") ؛ // خط دوم اعداد/کاراکترها را چاپ می کند

tft.setCursor (18 ، 205) ؛ // مکان نما را برای خط سوم اعداد/کاراکترها تنظیم می کند

tft.print ("1 2 3 -") ؛ // خط سوم اعداد/کاراکترها را چاپ می کند

tft.setCursor (18 ، 270) ؛ // مکان نما را برای خط چهارم اعداد/کاراکترها تنظیم می کند

tft.print ("C 0 = +") ؛ // خط چهارم اعداد/کاراکترها را چاپ می کند

}

تابع اعداد () نیز ساده است. دو خط اول اندازه متن را بزرگتر و رنگ را آبی می کند. دستور tft.setCursor () مکان نما را در موقعیتی در هر سطر قرار می دهد که نوشتن اعداد از آنجا شروع می شود. سپس دستور tft.print () اعداد/کاراکترها را روی مربع ها چاپ می کند.

مرحله 6: کد: NumberSelect Function

void numberSelect () {

TSPoint p = ts.getPoint ()؛

pinMode (XM ، OUTPUT) ؛

pinMode (YP ، OUTPUT) ؛

if (p.z> MINPRESSURE) {

p.x = نقشه (p.x، 250، 845، 0، 239)؛

p.y = نقشه (p.y ، 245 ، 860 ، 0 ، 319) ؛

اگر (نتیجه! = 0) {

نتیجه = 0 ؛

ذخیره شده_تعداد = 0؛

tft.print ("پاک کردن ارزش ها") ؛

تأخیر (500) ؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

tft.print ("")؛

tft.setCursor (cursorLocX ، cursorLocY) ؛

}

برای شروع عملکرد numberSelect () ، با دستور ts.getPoint () ورودی کاربر را از صفحه لمسی درخواست می کنیم. پس از جمع آوری این داده ها ، بررسی می کنیم که آیا از حداقل فشار بیشتر شده است (یا به عبارت دیگر ، آیا کاربر جایی را در صفحه لمسی فشار داده است). در صورت وجود ، مختصات x و y از مختصات دکارتی به مختصات صفحه لمسی اختصاص داده می شوند. (0 ، 0) گوشه سمت چپ بالای صفحه لمسی است که محور x از عرض و محور y پایین می رود. قسمت بعدی بررسی می کند که آیا عددی در نتیجه ذخیره شده است یا خیر. در صورت وجود ، نتیجه و شماره ذخیره شده به 0 تنظیم می شود. پیام "CLEAR VALUES" روی قسمت نتایج چاپ می شود و صفحه با مکان نما به موقعیت اولیه خود پاک می شود.

if (ص 60) {// ردیف اول مربع ها

اگر (p.x <60)

user_selection = 7؛

else if (p.x <120)

user_selection = 8؛

else if (p.x <180)

user_selection = 9؛

else user_selection = 14؛

} else if (p.y 125) {// ردیف دوم مربع ها

اگر (p.x <60)

user_selection = 4؛

else if (p.x <120)

user_selection = 5؛

else if (p.x <180)

user_selection = 6؛

else user_selection = 13؛

} else if (p.y 190) {// ردیف سوم مربع ها

اگر (p.x <60)

user_selection = 1؛

else if (p.x <120)

user_selection = 2؛

else if (p.x <180)

user_selection = 3؛

else user_selection = 12؛

} else if (p.y> 255) {// ردیف چهارم مربع ها

اگر (p.x <60)

user_selection = 15؛

else if (p.x <120)

user_selection = 0؛

else if (p.x <180)

user_selection = 10؛

else user_selection = 11؛

}

} دیگری {

user_selection = 16؛ // user_selection روی 16 تنظیم شده است (هیچ چیز متغیر نیست)

}

}

این قسمتی است که تعیین می کند کدام دکمه انتخاب شده است. با شروع سطر بالای مربع ها و پایان دادن به سطر پایین ، آردوینو به دنبال مکانی است که صفحه واقعاً در آن فشار داده شده بود. سپس یک مربع یک شماره اختصاص می دهد و آن عدد را در user_selection ذخیره می کند. اعداد 0-9 مربوط به مربع اعداد ، اعداد 11-15 مربوط به مربع عملوند و مربع روشن و عدد 10 مربوط به مربع علامت برابر است. اگر هیچ مربعی انتخاب نشده باشد ، user_selection روی 16 تنظیم شده است ، که باعث می شود حلقه دوباره شروع شود (عملکرد حلقه را ببینید).

مرحله 7: از پروژه به پایان رسیده خود لذت ببرید

آنجا شما آن را دارید! شما اکنون یک ماشین حساب صفحه لمسی دارید که می تواند جمع ، تفریق ، ضرب و تقسیم را انجام دهد. این پروژه کل روشی که فکر می کردم ماشین حساب کار می کند را تغییر داد. وقتی مشغول کار روی این پروژه بودم ، به یاد دارم که در کلاس به مربی خود گفتم: "من دیگر هرگز به یک ماشین حساب به همان شکل نگاه نمی کنم!" هنگامی که پشت کامپیوتر هستید و سعی می کنید از ایده خود الگوبرداری کنید ، کارکردهایی که شما به عنوان یک کاربر فکر می کنید آسان است ، تا حدودی دشوار است. امیدوارم از پروژه لذت برده باشید و امیدوارم طرز فکر شما در مورد نحوه عملکرد ماشین حساب نیز تغییر کرده باشد!

در اینجا کل کد برای راحتی شما آمده است. این کامنت پر از نظرات است بنابراین اگر مشکلی دارید آنها باید به شما نشان دهند که هر خط چه کاری انجام می دهد.

توصیه شده: