جدول المحتويات:

حاسبة اردوينو تعمل باللمس: 7 خطوات
حاسبة اردوينو تعمل باللمس: 7 خطوات

فيديو: حاسبة اردوينو تعمل باللمس: 7 خطوات

فيديو: حاسبة اردوينو تعمل باللمس: 7 خطوات
فيديو: ملخص حياة المبرمج 😂 #Shorts 2024, يوليو
Anonim
اردوينو آلة حاسبة تعمل باللمس
اردوينو آلة حاسبة تعمل باللمس

أهلا! هذا مشروع لإنشاء آلة حاسبة تعمل باللمس باستخدام Arduino Uno وغطاء TFT LCD. لقد توصلت إلى مفهوم فصل البرمجة في المنزل ، وكانت تجربة بناء هذا المشروع ممتعة للغاية. يمكن أن تقوم هذه الآلة الحاسبة بالعمليات الحسابية الأربع البسيطة (الجمع والطرح والضرب والقسمة). يعرض أيضًا ما يصل إلى نقطتين عشريتين لإجابات القسمة التي تحتوي عليها. دعنا نتعمق في! يتم سرد اللوازم لهذا المشروع أدناه.

اللوازم

- اردوينو أونو

- 2.4 TFT LCD Shield (هنا حيث اشتريته:

- كابل USB A إلى B (سلك لتوصيل Arduino بالكمبيوتر)

- جهاز كمبيوتر مثبت عليه Arduino IDE

- ستحتاج أيضًا إلى تنزيل مكتبتين: MCUFRIEND_kbv و Touchscreen. أول واحد يمكنك العثور عليه على github (الرابط: https://github.com/prenticedavid/MCUFRIEND_kbv) أو يمكنك استخدام ملف المكتبة المضغوط الذي قمت بتضمينه أدناه. والثاني في Arduino Library manager للتثبيت.

الخطوة 1: توصيلات الأجهزة

اتصالات الأجهزة
اتصالات الأجهزة
اتصالات الأجهزة
اتصالات الأجهزة
اتصالات الأجهزة
اتصالات الأجهزة

اتصال درع شاشة اللمس بـ Arduino Uno بسيط وسريع. كل ما عليك فعله هو محاذاة أدنى دبابيس على الدرع مع أدنى دبابيس على Arduino ودفع الدرع في المسامير. لا ينبغي أن يحتوي الدبوس 5V العلوي والدبوس غير الملصق على جانب الطاقة على دبابيس من الدرع بداخلهما ، مع تطبيق نفس المعلمات على المسامير المسمى SCL و SDA على الجانب الآخر من اللوحة. الآن ، نحن جاهزون للتشفير!

الخطوة 2: الكود: التعريفات العامة والإعداد

#يشمل

MCUFRIEND_kbv tft ؛ // سلكي لدروع UNO على أي حال

#يشمل

#define YP A3

#define XM A2

# تعريف YM 9

# تعريف XP 8

TouchScreen ts = TouchScreen (XP ، YP ، XM ، YM ، 300) ؛

#define MINPRESSURE 10

هذه هي بداية الكود ، حيث نقوم بتضمين المكتبات (MCUFRIEND_kbv & Touchscreen) ، وتحديد دبابيس X و Y ، وإعداد معلمات شاشة اللمس ، وتحديد الحد الأدنى من الضغط اللازم لـ Arduino لتسجيل ضغط المستخدم.

معرف int

اختيار المستخدم int ؛

تعويم save_number = 0 ؛

مصطلح تعويم 1 ؛

عدد العمليات ؛

نتيجة تعويم

int cursorLocX = 5 ؛

int cursorLocY = 20 ؛

قبل الإعداد مباشرة ، نحتاج إلى إعداد بعض المتغيرات العالمية. المعرف يساعد في الحصول على شاشة تعمل باللمس وتشغيلها. user_selection يحمل رقمًا يتوافق مع المفتاح الذي يختاره المستخدم عند الضغط على شاشة اللمس. save_number هو المتغير الذي نطبعه على الشاشة بعد إدخال المستخدم (المزيد حول هذا في الحلقة). إنه عدد عشري بحيث يمكنه الاحتفاظ بأرقام عشرية بالإضافة إلى أعداد صحيحة. مصطلح 1 هو المتغير الذي يتم حفظ الرقم الأول من المعادلة فيه بعد تحديد المعامل. يحفظ op_num المعامل كرقم (1 للجمع ، و 2 للطرح ، و 3 للضرب ، و 4 للقسمة). النتيجة هي المتغير الذي تتم طباعته على الشاشة بعد ضغط المستخدم على علامة يساوي. إنه أيضًا عائم. cursorLocX و cursorLocY هما نقطتا التعيين على شاشة اللمس حيث يتم تعيين المؤشر على عدة مرات (يقع في الشريط الرمادي في الأعلى ، والمعروف أيضًا باسم حقل النتائج).

الإعداد باطل(){

tft.reset () ،

المعرف = tft.readID () ،

tft.begin (معرف) ؛

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: الكود: Loop

حلقة باطلة () {numberSelect () ،

تأخير (100) ؛

إذا (user_selection == 16) {

;

}آخر{

إذا (اختيار المستخدم <10) {

save_number = save_number * 10 + user_selection ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print (save_number) ؛

} else if (user_selection> 10) {

التبديل (اختيار المستخدم) {

الحالة 11:

op_num = 1 ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print ("+") ؛

term1 = save_number ؛

save_number = 0 ؛

استراحة؛

الحالة 12:

op_num = 2 ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print ("-") ؛

term1 = save_number ؛

save_number = 0 ؛

استراحة؛

الحالة 13:

op_num = 3 ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print ("X") ؛

term1 = save_number ؛

save_number = 0 ؛

استراحة؛

الحالة 14:

op_num = 4 ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print ("/") ؛

term1 = save_number ؛

save_number = 0 ؛

استراحة؛

الحالة 15:

save_number = 0 ؛

المدى 1 = 0 ؛

op_num = 0 ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print ("") ؛

استراحة؛

}

tft.setCursor (cursorLocX، cursorLocY) ،

هذا كثير لمضغه ، لذلك سأشرح ما ورد أعلاه. نبدأ بالاتصال بوظيفة numberSelect () ، التي تعين رقمًا لكل مربع على الشاشة التي تعمل باللمس. عندما يضغط المستخدم على أحد هذه المربعات ، تقوم الوظيفة بتعيين متغير user_selection إلى رقم المربع. أول عبارة if يتم تشغيلها من خلال الحلقة فقط إذا تم تحديد مستخدم صالح. إذا كان الأمر كذلك ، فإن عبارة if التالية تسأل عما إذا كان user_selection يحتوي على رقم أقل من 10 محفوظ فيه (الأرقام من 0 إلى 9). إذا حدث ذلك ، فسيتم ضرب رقم save_number في 10 ويتم إضافة الرقم الموجود في user_selection إلى save_number ، والذي تتم طباعته في حقل النتائج على شاشة اللمس. إذا لم يكن الأمر كذلك ، فإن عبارة if التالية تسأل عما إذا كان user_selection يحتوي على رقم أكبر من 10 محفوظ فيه (أرقام المعامل: 11 لـ + ، 12 لـ - ، 13 لـ X ، 14 لـ / ، و 15 لمربع الشاشة الواضح). تهتم وظيفة التبديل بكل حالة (يتم تحديدها بواسطة user_selection). يُعطى المتغير op_num رقمًا يتوافق مع المعامل الذي تم تحديده (1 لـ + ، 2 لـ - ، 3 لـ X ، و 4 لـ /). يتم حفظ القيمة في save_number في المصطلح المتغير 1 بحيث يمكن استخدام متغير save_number للنصف الثاني من المعادلة. تتم طباعة رمز المعامل على الشاشة مع مسح أي أرقام في حقل النتائج. الاستثناء الوحيد هو مربع الشاشة الواضح ، والذي يعيد تعيين جميع متغيرات الحساب ويمسح حقل النتائج لأي شيء موجود عليه.

}آخر{

التبديل (op_num) {

حالة 1:

النتيجة = term1 + save_number ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print (مزدوج (نتيجة)) ؛

استراحة؛

الحالة 2:

النتيجة = term1 - save_number ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print (مزدوج (نتيجة)) ؛

استراحة؛

الحالة 3:

النتيجة = term1 * save_number ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print (مزدوج (نتيجة)) ؛

استراحة؛

الحالة 4:

النتيجة = float (term1) / float (save_number) ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print (نتيجة) ؛

استراحة؛

}

tft.setCursor (cursorLocX، cursorLocY) ،

save_number = نتيجة ؛

المدى 1 = 0 ؛

op_num = 0 ؛

تأخير (1000) ؛

}

}

}

الجزء الأخير من الحلقة يتعامل مع حدث اختيار المستخدم لعلامة المساواة (user_selection == 10). تعمل وظيفة التبديل الأخرى من خلال الوظائف الرياضية الأربعة (التي تحددها op_num). تضيف حالة الإضافة (الحالة 1) المصطلحين 1 و save_number معًا وتحفظ الرقم في متغير النتيجة. تتم طباعة النتيجة في حقل النتائج على هيئة مضاعفة. تطرح حالة الطرح (الحالة 2) رقم save_number من المصطلح 1 وتحفظ الرقم في متغير النتيجة. تتم طباعة النتيجة في حقل النتائج على هيئة مضاعفة. تضرب حالة الضرب (الحالة 3) الحد 1 في save_number وتحفظ الرقم في متغير النتيجة. تتم طباعة النتيجة في حقل النتائج على هيئة مضاعفة. تقسم حالة القسمة (الحالة 4) المصطلح 1 على save_number معًا وتحفظ الرقم في متغير النتيجة. تتم طباعة النتيجة في حقل النتائج على شكل عائم (لأن إجابات القسمة يمكن أن تكون أرقامًا عشرية). بعد حدث طباعة رقم أو مُعامل أو نتيجة على الشاشة ، تتم إعادة تعيين المؤشر ، وتعيين save_number إلى النتيجة السابقة ، وإعادة تعيين term1 & op_num.

بعض الملاحظات: لا يمكن للمستخدم إدخال أرقام عشرية في الآلة الحاسبة بسبب عدم وجود مربع فاصلة عشرية. أيضًا ، يمكن للمستخدم إجراء معادلة واحدة فقط في كل مرة. لا يمكنك حساب نتيجة ثم إضافة / طرح / ضرب / قسمة تلك النتيجة. في وظيفة numberSelect () ، توجد وظيفة تمسح الشاشة بعد طباعة النتيجة إذا ضغط المستخدم على مربع آخر.

الخطوة 4: الكود: وظيفة المربعات

المربعات الفارغة () {

// تتناوب المربعات بالأبيض والأسود في كل صف ويكون للصفين الأول والثالث نمط معاكس عن الصفين الثاني والرابع

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

رقم باطل حدد () {

TSPoint p = ts.getPoint () ،

pinMode (XM ، الإخراج) ؛

pinMode (YP ، الإخراج) ؛

إذا (p.z> MINPRESSURE) {

ص = خريطة (ص ، 250 ، 845 ، 0 ، 239) ؛

ص = خريطة (ص ، 245 ، 860 ، 0 ، 319) ؛

إذا (النتيجة! = 0) {

النتيجة = 0 ؛

save_number = 0 ؛

tft.print ("قيم واضحة") ؛

تأخير (500) ؛

tft.setCursor (cursorLocX، cursorLocY) ،

tft.print ("") ؛

tft.setCursor (cursorLocX، cursorLocY) ،

}

لبدء تشغيل وظيفة numberSelect () ، نطلب إدخال المستخدم من شاشة اللمس باستخدام الأمر ts.getPoint (). بمجرد جمع هذه البيانات ، نتحقق لمعرفة ما إذا تم تجاوز الحد الأدنى من الضغط (أو بعبارة أخرى ، ما إذا كان المستخدم قد ضغط في مكان ما على الشاشة التي تعمل باللمس). إذا كان الأمر كذلك ، يتم تعيين إحداثيات x و y من الإحداثيات الديكارتية إلى الإحداثيات الخاصة بشاشة اللمس. (0 ، 0) هي الزاوية اليسرى العلوية للشاشة التي تعمل باللمس ، حيث يمر المحور x بالعرض والمحور y يتجه لأسفل. يتحقق الجزء التالي لمعرفة ما إذا كان هناك رقم محفوظ في النتيجة. إذا كان هناك ، يتم إعادة تعيين النتيجة ورقم save_number إلى 0. تتم طباعة الرسالة "CLEAR VALUES" فوق حقل النتائج ، ويتم مسح الشاشة مع عودة المؤشر إلى موضع البداية.

إذا (ص 60) {// أول صف من المربعات

إذا (ص. x <60)

اختيار المستخدم = 7 ؛

وإلا إذا (p.x <120)

اختيار المستخدم = 8 ؛

وإلا إذا (p.x <180)

اختيار المستخدم = 9 ؛

آخر user_selection = 14 ؛

} else if (p.y 125) {// الصف الثاني من المربعات

إذا (ص. x <60)

اختيار المستخدم = 4 ؛

وإلا إذا (p.x <120)

اختيار المستخدم = 5 ؛

وإلا إذا (p.x <180)

اختيار المستخدم = 6 ؛

آخر user_selection = 13 ؛

} else if (p.y 190) {// الصف الثالث من المربعات

إذا (p.x <60)

اختيار المستخدم = 1 ؛

وإلا إذا (p.x <120)

اختيار المستخدم = 2 ؛

وإلا إذا (p.x <180)

اختيار المستخدم = 3 ؛

آخر user_selection = 12 ؛

} else if (p.y> 255) {// الصف الرابع من المربعات

إذا (p.x <60)

اختيار المستخدم = 15 ؛

وإلا إذا (p.x <120)

user_selection = 0 ؛

وإلا إذا (p.x <180)

اختيار المستخدم = 10 ؛

آخر user_selection = 11 ؛

}

}آخر{

اختيار المستخدم = 16 ؛ تم ضبط // user_selection على 16 (لا يوجد متغير)

}

}

هذا هو الجزء الذي يحدد الزر الذي تم تحديده. بدءًا من الصف العلوي من المربعات وانتهاءً بالصف السفلي ، يبحث Arduino عن المكان الذي تم فيه الضغط على الشاشة بالفعل. ثم يقوم بتعيين رقم للمربع ويحفظ هذا الرقم في اختيار المستخدم. الأرقام من 0 إلى 9 تتوافق مع مربعات الأرقام ، والأرقام من 11 إلى 15 تتوافق مع مربعات المعامل والمربع الصافي ، والعدد 10 يتوافق مع مربع علامة يساوي. إذا لم يتم تحديد مربع ، فسيتم تعيين user_selection على 16 ، مما سيجعل الحلقة تبدأ من جديد (انظر وظيفة الحلقة).

الخطوة 7: استمتع بمشروعك النهائي

ها أنت ذا! لديك الآن آلة حاسبة تعمل باللمس يمكنها إجراء عمليات الجمع والطرح والضرب والقسمة. لقد غير هذا المشروع الطريقة التي اعتقدت أن الآلة الحاسبة تعمل بها بالكامل. أثناء عملي في هذا المشروع ، أتذكر أنني أخبرت معلمي في الفصل ، "لن أنظر إلى آلة حاسبة بنفس الطريقة مرة أخرى!" الوظائف التي تعتقد كمستخدم أنها سهلة تكون صعبة إلى حد ما عندما تكون خلف الكمبيوتر في محاولة لمحاكاة فكرتك. أتمنى أن تكون قد استمتعت بالمشروع ، وآمل أن تتغير طريقة تفكيرك حول كيفية عمل الآلة الحاسبة أيضًا!

هذا هو الكود الكامل لراحتك. إنه مليء بالتعليقات ، لذا إذا كان لديك أي مشاكل ، فيجب أن يوضحوا لك ما يفعله كل سطر.

موصى به: