สารบัญ:

แนวทางที่แตกต่างกับ Nextion: 3 ขั้นตอน
แนวทางที่แตกต่างกับ Nextion: 3 ขั้นตอน

วีดีโอ: แนวทางที่แตกต่างกับ Nextion: 3 ขั้นตอน

วีดีโอ: แนวทางที่แตกต่างกับ Nextion: 3 ขั้นตอน
วีดีโอ: การใช้งานออกแบบหน้าจอ HMI ด้วย Nextion LCD 2024, กรกฎาคม
Anonim
แนวทางที่แตกต่างกับ Nextion
แนวทางที่แตกต่างกับ Nextion

ในโครงการแรกของฉันกับ Arduino Nano ที่เชื่อมต่อกับหน้าจอสัมผัส Nextion ฉันได้เขียนชุดคำสั่งยาวๆ เพื่อสื่อสารกับ Nextion ผ่านพอร์ตอนุกรม และสิ่งนี้หลีกเลี่ยงไม่ได้หากเราต้องส่งคำสั่งอิสระโดยสิ้นเชิงในช่วงเวลาสุ่ม

ฉันต้องยอมรับด้วยว่าฉันใช้เวลา 'ต่อสู้' กับห้องสมุดมากกว่าสิ่งอื่นใด ดังนั้นฉันจึงค่อยๆ มาทำงานโดยไม่มีไลบรารี่ ITEAD ที่หนักหน่วง

ในไม่ช้าฉันก็รู้ว่าฉันไม่มีความเร่งด่วนที่จะสื่อสารกับ Nextion ถึงการเปลี่ยนแปลงคุณสมบัติของวัตถุที่มองเห็นได้ แต่ฉันชอบที่จะรอจนกว่าฉันจะรวบรวมมันและส่งพวกเขาไปยัง Nextion โดยรวมเมื่อฉันได้กลุ่มที่สมบูรณ์

ฉันจะพยายามอธิบายตัวเองให้ดีขึ้น

เมื่อในโครงการของฉันประกอบด้วยข้อความบ่งชี้ที่เป็นข้อความ 16 รายการ ฉันต้องการเปิดหรือปิดบางรายการ ฉันทำได้โดยใช้ประโยชน์จากแอตทริบิวต์ 'bco' ที่เปิดใช้งาน ผ่าน (เช่น) จากสีเทาเข้มเป็นสีขาว (หากอยู่ใน สี่เหลี่ยมสีดำ) และในทางกลับกันเพื่อปิด

ในแอปพลิเคชันของฉัน ฉันพบว่าการส่ง 16 คำสั่งไปยังพอร์ตอนุกรมนั้นไร้ประโยชน์ในช่วงเวลาที่แตกต่างกัน 16 คำสั่ง โดยหนึ่งคำสั่งสำหรับ 'bco' ของสัญญาณ 16 ตัว

ฉันชอบให้ Arduino รวบรวมสัญญาณที่ต้อง 'เปิด' (สูง) และสัญญาณใดต้อง 'ปิด' (ต่ำ) ในการลงทะเบียน 16 บิต โดยที่แต่ละบิตสอดคล้องกับสัญญาณ Nextion 16 แบบ

หลังจากอัปเดตแต่ละบิตของรีจิสเตอร์ ฉันส่งค่าไปยัง Nextion ซึ่งเป็นข้อความเดียวที่มีข้อมูลรวมเกี่ยวกับ 16 องค์ประกอบ

ด้วยวิธีนี้ การสื่อสารจาก Arduino และ Nextion จะลดลงอย่างมาก เนื่องจากในข้อความเดียวที่ส่งบนซีเรียลไปยัง Nextion ข้อมูลจะถูกรวบรวมซึ่งมิฉะนั้นจะต้องส่ง 16 ข้อความ

จริงอยู่ ไม่จำเป็นต้องอัปเดตรายงานทั้งหมดเสมอไป แต่ฉันแน่ใจว่าหากไม่ทำเช่นนั้นจะทำให้เสียเวลามากขึ้น

โดยปกติแต่ละบิตที่มีอยู่ในจำนวนเต็มที่ได้รับโดย Arduino จอแสดงผล Nextion จะต้องเชื่อมโยงกับแอตทริบิวต์ที่ต้องการ

ซึ่งหมายความว่าต้องเขียนโค้ดในหน้าจอ Nextion แต่ไม่ต้องกลัว: ถ้าฉันทำสำเร็จ …

มีข้อได้เปรียบสองประการ: Arduino จะมีโค้ดที่เบากว่า และจะมีส่วนร่วมน้อยลงในการสื่อสารแบบอนุกรมกับ Nextion

Nextion หลังจากได้รับข้อมูลในข้อความเดียว จะใช้ได้เร็วกว่าการรอ 16 ข้อความ ดังนั้นการเปิดหรือปิดสัญญาณ 16 แบบจึงเกือบจะพร้อมกันเมื่อเทียบกับโหมดปกติที่สุด ซึ่งเวลาสำหรับข้อความที่ไม่ทราบจำนวนจะผ่านไประหว่างการดำเนินการของคำสั่งสำหรับการส่งสัญญาณครั้งแรกและคำสั่งสำหรับการส่งสัญญาณครั้งสุดท้าย

ในจอแสดงผล Nextion ฉันสร้างระบบนี้ในแบบคลาสสิก นั่นคือ การเปลี่ยน 'มาสก์' รีจิสเตอร์ในแต่ละครั้งจะทำให้คุณสามารถตรวจสอบ 16 บิตแต่ละอันได้ เมื่อตรวจสอบบิตเป็น HIGH สัญญาณที่เกี่ยวข้องกับบิตนั้นจะสว่างขึ้นบนจอแสดงผลและดับลงเมื่อบิตต่ำ

ด้าน 'ด้านลบ' ของระบบนี้คือโค้ดที่เขียนในจอแสดงผล Nextion ไม่สะดวกที่จะจัดทำเป็นเอกสารมากกว่าโค้ด Arduino นอกจากนี้ รหัส Nextion ยังเสี่ยงต่อการกระจัดกระจายไปทั่ววัตถุต่างๆ ต้องใช้ความระมัดระวังในการจัดทำเอกสารสิ่งที่คุณทำทันที

ฉันใช้ Notepad ++ เพื่อเขียนโค้ดที่ฉันคัดลอกไปยังวัตถุ Nextion ซึ่งเกือบจะอยู่ใน tm0 ของหน้า 0 เท่านั้น

ไวยากรณ์ของภาษา Nextion มีข้อ จำกัด มากมาย แต่สามารถเอาชนะพวกเขาหรือหลีกเลี่ยงพวกเขาด้วยความพยายามขั้นต่ำและพยายามมองปัญหาจากมุมมองที่ผิดปกติเช่นกัน

ตัวอย่างเช่น ฉันรายงานวิธีที่ Arduino เขียนรีจิสเตอร์ที่จะส่ง ซึ่งฉันเขียนด้วยวิธีพื้นฐานที่สุดเท่าที่จะทำได้

ขั้นตอนที่ 1: วิธีการส่งทะเบียน

ในไฟล์ ArduinoCode. PDF ฉันแสดงภาพร่างทั้งหมดของฉัน (อ่านโค้ดตรงนี้ไม่ชัดเจน)

ที่นี่ฉันต้องการเพียงแสดงให้เห็นว่า Arduino ส่งการลงทะเบียน 16 บิตไปยัง Nextion อย่างไรโดยไม่ได้รับความช่วยเหลือจากไลบรารี่ แต่เคารพไวยากรณ์ที่ ITEAD อธิบายไว้

//***************************************************************************************

เป็นโมฆะ NexUpd()

//***************************************************************************************

{

SRSerial.print("vINP.val=");

SRSerial.print(InpReg); // ส่ง 16 บิตที่รวบรวมไปยัง Nextion Display

SRSerial.print(InpReg); // ส่ง 16 บิตที่รวบรวมไปยัง Nextion Display

SRSerial.write (สิ้นสุด); // 255

SRSerial.write (สิ้นสุด); // 255

SRSerial.write(สิ้นสุด); // 255

}

//***************************************************************************************

ขั้นตอนที่ 2:.. แต่ก่อน …

.. แต่ก่อน …
.. แต่ก่อน …

แน่นอนว่าโค้ดเริ่มต้นด้วยการประกาศและการตั้งค่า () ทั้งหมด

อินพุตคือ INPUT_PULLUP ดังนั้นสวิตช์อินพุตปกติจะเปิดและเมื่อปิด จะใช้ GND กับอินพุตที่เกี่ยวข้อง

(นี่เป็นคำสั่งแรกของฉันและฉันขอโทษที่แสดงรหัสของฉันในทางที่ไม่ดี โปรดดาวน์โหลดไฟล์ ArduinoCode. PDF ที่ชัดเจนมาก

มาคุยกันดีกว่า

ฉันได้พัฒนาวิธีการของตัวเองในการ 'บอก' ให้ Nextion แสดงสิ่งที่ต้องทำ โดยปกติ MCU (ในกรณีของฉัน Arduino) จะส่งข้อความสำหรับทุกรูปแบบเพื่อนำไปใช้กับแอตทริบิวต์ของวัตถุใด ๆ วิธีการนี้เสียเวลามากในการทำสิ่งต่าง ๆ ไม่เร่งด่วนเสมอไปในการโหลด Serial Line อย่างต่อเนื่อง ฉันพบว่าสะดวกกว่าที่ Arduino รวบรวมเป็น 16 บิตเพื่อลงทะเบียนข้อมูลเกี่ยวกับแอตทริบิวต์ที่แตกต่างกันใน Nextion ทุกๆ 500 mS Arduino ของฉันจะส่งหนึ่งข้อความไปยัง Nextion ที่มี 16 บิตที่มีอยู่ในการลงทะเบียนแต่ละครั้ง เห็นได้ชัดว่าใน Nextion เราต้องการโค้ดที่จัดการสิ่งที่ต้องดำเนินการ การกระจายงาน (และรหัส) นี้ทำให้ได้รับประโยชน์อื่นๆ มากมาย เช่น คิดวิธีทำให้ไฟกระพริบ! ด้วยวิธีการของฉัน มันง่าย: ตั้งค่าเล็กน้อยในการลงทะเบียน Arduino และส่งไปที่ Nextion รีจิสเตอร์คู่ Nextion สามารถอัพเดตจาก Arduino ได้น้อยมาก เนื่องจากความถี่การกะพริบที่เป็นอิสระจากการสื่อสาร ความถี่การกะพริบขึ้นอยู่กับวัตถุ Timer ไปที่ Nextion และสามารถทำงานโดยใช้เวลาฐานขั้นต่ำใกล้กับ 50 mS ดังนั้นด้วยวิธีของฉัน เราสามารถกระพริบไฟใน Nextion ที่ความถี่ค่อนข้างสูง (สมมติว่า 2 Hz) แม้ว่า Arduino ของฉันจะส่งข้อความทุก ๆ 10 วินาทีเพียงเพื่อเป็นตัวอย่างที่รุนแรง สิ่งนี้สามารถแนะนำปัญหาตรงข้าม: จะทำอย่างไรถ้าการสื่อสารล้มเหลว นี่ไม่ใช่เป้าหมายของการสนทนานี้ แต่ฉันได้แก้ไขปัญหานี้ด้วย Watch Dog ชนิดหนึ่ง: หนึ่งในรหัส Arduino และอีกอันในรหัส Nextion

การกะพริบถูกควบคุมโดยรหัส Nextion โดยที่แสงทุกดวงจะปฏิบัติตามกฎเกณฑ์ที่เหมาะสม: เปิด/ปิด หรือ สีเขียว/แดง หรือเปลี่ยนการเขียนภายใน (หรืออื่นๆ เพิ่มเติม) ฉันสามารถบอกสิ่งอื่น ๆ เกี่ยวกับโครงการของฉันได้ แต่ฉันชอบที่จะรอคำถามของคุณก่อนที่จะเพิ่มคำมากเกินไปซึ่งไม่ง่ายสำหรับฉันที่จะแปลได้ดีเท่าที่ฉันจะทำได้

ขั้นตอนที่ 3: การแก้ไข Nextion Objects

การแก้ไขวัตถุ Nextion
การแก้ไขวัตถุ Nextion

นี่เป็นส่วนหนึ่งของรหัสที่ฉันเขียนด้วย Nextion Editor บนวัตถุ tm0

เราไม่ได้สังเกตเห็นว่าด้วย 16 บิตที่ได้รับจาก Arduino จอแสดงผล Nextion ไม่เพียงเปิดและปิดสัญญาณ ในขณะนี้ฉันละเว้นคำอธิบายเพื่อไม่ให้เกิดความเข้าใจที่ซับซ้อน

ฉันเป็นมือใหม่ ดังนั้นควรดาวน์โหลดหน้า Nextion code. PDF แทนเพื่ออ่านโค้ดที่สับสนที่นี่ (ฉันขอโทษ นี่เป็นคำสั่งแรกของฉัน)

หากคุณต้องการคุณสามารถดาวน์โหลดรหัสที่สมบูรณ์ "HMI" สำหรับแอปพลิเคชันของฉันนี้ ชื่อไฟล์ของรหัสนี้คือ POW1225. HMI มันสามารถทำงานในจอแสดงผล Nextion ของคุณ NX4024T032 ได้ แต่เพื่อให้เข้าใจคุณต้องว่ายน้ำเข้าไปในหลาย ๆ วัตถุและดูรหัสภายในหน้าต่างเล็ก ๆ ของตัวแก้ไข เลยคิดว่าจะดูโค้ดหลักได้ง่ายขึ้น เขียนเป็นไฟล์ Nextion code. PDF

// โครงการ POW1225. HMI 15 พฤษภาคม 2562

// vACC (va0) ตัวสะสม

// vINP (va1) อินพุต รีจิสเตอร์ xxxx xxxx xxxx xxxx

tm0.en=1 // tm0 เริ่ม

tm0.tim=50 // tm0 ฐานเวลา 50 mS

// RDY ***************

vACC.val=vINP.val&0x0001 // Mask

if(vACC.val!=0) // ทดสอบ RDY

{

tRDY.pco=สีน้ำเงิน // RED

}อื่น

{

tRDY.pco=GREY // สีเทาเข้ม

}

// ป.ป.ช. ***************

vACC.val=vINP.val&0x0002

if(vACC.val!=0) // ทดสอบ PWR

{

tPWR.pco=GREEN // สีเขียวอ่อน

tPON.txt="ON" // ON

tPON.pco=GREEN // สีเขียวอ่อน

}อื่น

{

tPWR.pco=GREY // สีเทาเข้ม 33808

tPON.txt="OFF" // OFF

tPON.pco=GREY // สีเทาเข้ม 33808

}

// แห้ง ***************

vACC.val=vINP.val&0x0004

if(vACC.val!=0) // ทดสอบ DRY

{

tDRV.pco=สีน้ำเงิน // BLUE

tDRY.pco=BLUE // BLUE

}อื่น

{

tDRV.pco=GREY // สีเทาเข้ม 33808

tDRY.pco=GREY // สีเทาเข้ม 33808

}

// วิ่ง ***************

vACC.val=vINP.val&0x0018

if(vACC.val!=0) // ทดสอบ RUN

{

tRUN.bco=RED // MARCIA RED (เปิด)

tRUN.pco=BLACK // บน BLACK

tDIR.bco=RED // DIR RED

tDIR.pco=BLACK // บน BLACK

}อื่น

{

tRUN.bco=32768 // MARCIA GREY (ปิด)

tRUN.pco=GREY // บน GREY

tDIR.bco=32768 // DIR สีเขียวเข้ม 1024

tDIR.pco=GREY // DIR GREY

tDIR.txt="---" // STOP

}

// ซ้าย **************

vACC.val=vINP.val&0x0008

if(vACC.val!=0) // ทดสอบ RUN Right

{

tDIR.txt="<<< " // DIR ซ้าย

}

// ขวา *************

vACC.val=vINP.val&0x0010

if(vACC.val!=0) // ทดสอบ RUN Left

{

tDIR.txt=" >>>" // ถูกต้อง

}

// ทั้งสอง **************

vACC.val=vINP.val&0x0018

if(vACC.val==24) // ทดสอบ RUN ทั้งคู่

{

tDIR.txt=">>!<<" // DIR ทั้งคู่

}

// ทดสอบ **************

vACC.val=vINP.val&0x0020

if(vACC.val!=0) // ทดสอบ TEST

{

tTEST.pco=WHITE // WHITE

tw tTEST, 1 // เปิดใช้งานเหตุการณ์การแตะ

}อื่น

{

tTEST.pco=GREY // สีเทาเข้ม 33808

tsw tTEST, 0 // ปิดใช้งานกิจกรรมการแตะ

}

// ความผิดพลาด *************

vACC.val=vINP.val&0x0040

if(vACC.val==0) // ทดสอบ FAULT

{

tFLT.pco=GREY // ไม่มีข้อผิดพลาด

}

ถ้า(vACC.val!=0)

{

tFLT.pco=YELLOW // ความผิดพลาดในปัจจุบัน

}

// อีเอ็มอี ***************

vACC.val=vINP.val&0x0080

if(vACC.val==0) // ทดสอบ EME

{

tEME.pco=GREY // ไม่มี EME

}

ถ้า(vACC.val!=0)

{

tEME.pco=RED // EME นำเสนอ

}

}

// เฟอร์โม *************

vACC.val=vINP.val&0x0100

if(vACC.val!=0) // ทดสอบ FERMO

{

tFER.pco=BLACK // BLACK

tFER.bco=GREEN // GREEN

}อื่น

{

tFER.pco=GREY // GREY

tFER.bco=672 // สีเขียวเข้ม

}

// *******************

การรับทราบ

ฉันต้องการแสดงความขอบคุณต่อ Gideon Rossouwv เพราะการอ่าน Instructables ของเขา ฉันได้รับส่วนหนึ่งของวัตถุประสงค์อย่างรวดเร็ว ขอบคุณนาย Gideon Rossouwv

แนะนำ: