Arduino 2.4 tft display calculator
การแสดงผลและตรรกะของเครื่องคิดเลข
วาดปุ่มสำหรับตัวเลขและตัวดำเนินการ รวมถึงช่องแสดงผลของเครื่องคิดเลข ปุ่มตัวเลขและตัวดำเนินการทั้งหมดมีขนาดเท่ากัน ดังนั้น พิกัดของแต่ละปุ่มสามารถคำนวณได้ในโปรแกรม
เมื่อตรวจพบการกดหน้าจอ โปรแกรมจะคำนวณพิกัดแถวและคอลัมน์ และระบุปุ่มที่ถูกกด
หากกดปุ่มตัวเลข โปรแกรมจะเพิ่มตัวเลขนั้นลงใน `char array` มี `array` สองชุดสำหรับเก็บตัวเลขแรกและตัวเลขที่สอง หาก `array` แรกและ `operator` ว่างเปล่า จะเพิ่มตัวเลขที่กดลงใน `array` แรก หาก `operator` ไม่ว่างเปล่า จะเพิ่มตัวเลขลงใน `char array` ที่สอง
เมื่อกดปุ่ม ‘=’ จะตรวจสอบทั้ง `array` ทั้งสองและ `operator` หากมีอย่างน้อยหนึ่งรายการว่างเปล่า จะกลับไปยังส่วน `loop` โดยไม่คำนวณอะไร
หากทั้ง `array` ทั้งสองและ `operator` มีค่า จะทำการแปลง `array` แรกและ `array` ที่สองให้เป็นตัวเลข `integer` ก่อน ฟังก์ชันด้านล่างนี้ทำการแปลง :
int32_t chararraytoint(char *a)
{
int32_t len = strlen(a);
int32_t finalnum = 0;
int32_t intval = 0;
int32_t placeval = 1;
if (len > 0)
{
for (int i = len - 1; i >= 0; i--)
{
intval = chartoint(a[i]);
intval = intval * placeval;
finalnum = finalnum + intval;
placeval *= 10;
}
}
return finalnum;
}
ใน `character array` ตัวเลขในตำแหน่งสุดท้ายของ `array` จะอยู่ในหลักหน่วย สำหรับการแปลง `array` ให้เป็นตัวเลข เราจะวนซ้ำจากตำแหน่งสุดท้ายของ `array` ไปยังตำแหน่งที่ 0
ในการเริ่มต้น ค่าประจำหลักของตัวเลขจะถูกตั้งค่าเป็น 1 (หลักหน่วย) ลูป `for` จะวนซ้ำจนกว่าจะถึงตำแหน่งที่ 0 ของ `array`
ในการแปลงตำแหน่ง `character` ให้เป็น `integer` จะใช้ฟังก์ชัน `chartoint()` เมื่อได้ `integer` สำหรับตัวเลขนั้นแล้ว จะนำไปคูณกับค่าประจำหลักของมัน และผลลัพธ์จะถูกเพิ่มไปยังตัวแปร `finalnum` ค่า `placevalue` จะถูกคูณด้วย 10 ในการวนซ้ำแต่ละครั้งของ `loop` เพื่อให้เมื่อถึงตำแหน่งที่ 0 จะมีค่า `placevalue` สูงที่สุด
ตัวแปร `finalnum` จะมีค่า `integer` เมื่อสิ้นสุดลูป `for`
นอกจากนี้ยังมี `screen saver` ซึ่งจะทำงานหลังจากไม่มีการใช้งานเป็นเวลา 15 วินาที ตัวแปรชื่อ `time` จะเพิ่มขึ้นทีละ 1 ทุกวินาที เมื่อตรวจพบการสัมผัส จะตั้งค่าตัวแปร `time` เป็น 0 หากตัวแปร `time` เกิน 15 วินาที จะเข้าสู่ `screen saver loop` ภายใน `loop` นี้ จะอ่านค่าจาก `touchscreen` อย่างต่อเนื่อง และพิมพ์รูปทรงด้วยสีและขนาดแบบสุ่ม เมื่อใดก็ตามที่ตรวจพบการสัมผัส ตรรกะจะกลับไปยัง `main loop` โดยรีเซ็ตตัวแปร `time` เป็น 0
รายละเอียดทางเทคนิคเพิ่มเติม
การพัฒนา GUI และ Touch Interface
โปรเจกต์นี้เปลี่ยน Arduino และ TFT shield ให้เป็นเครื่องคิดเลขกราฟิกที่ทำงานได้อย่างสมบูรณ์แบบและทำงานได้ด้วยตัวเอง
- Touchscreen Matrix: ใช้ 4-wire resistive touch interface ของ
TFTขนาด 2.4 นิ้วArduinoใช้ตรรกะ "Button Mapping" ซึ่งพิกัดการสัมผัส (X, Y) ที่ระบุจะถูกแปลงเป็นอินพุตตัวเลขหรือตัวดำเนินการ ('+', '-', '*', '/') - Arithmetic Engine:
firmwareจะจัดการการคำนวณfloating-pointและจัดการstring-to-number bufferเพื่อให้สามารถคำนวณตัวเลขหลายหลักได้
การเรนเดอร์ภาพ
- Adafruit_GFX UI: เค้าโครงของเครื่องคิดเลขมีปุ่มแบบมีเงาและแถบ "Result Display" แบบเรียลไทม์ โค้ดใช้การเรนเดอร์แบบ "Invalidate" ที่ปรับให้เหมาะสม โดยจะวาดซ้ำเฉพาะบางพื้นที่ของหน้าจอเท่านั้น เพื่อรักษา
user interfaceให้รวดเร็วและตอบสนองได้ดี