Mục lục:

Một cách tiếp cận khác với Nextion: 3 bước
Một cách tiếp cận khác với Nextion: 3 bước

Video: Một cách tiếp cận khác với Nextion: 3 bước

Video: Một cách tiếp cận khác với Nextion: 3 bước
Video: Điều khiển LED với màn hình cảm ứng TJC HMI (phiên bản copy Nextion) 2024, Tháng bảy
Anonim
Một cách tiếp cận khác với Nextion
Một cách tiếp cận khác với Nextion

Trong dự án đầu tiên của tôi với Arduino Nano được kết nối với màn hình cảm ứng Nextion, tôi đã viết một chuỗi dài các lệnh để giao tiếp với Nextion qua cổng nối tiếp và điều này là không thể tránh khỏi nếu chúng tôi cần gửi các lệnh hoàn toàn độc lập, trong những khoảnh khắc ngẫu nhiên.

Tôi cũng phải thừa nhận rằng tôi đã dành nhiều thời gian để 'chiến đấu' với các Thư viện hơn bất cứ thứ gì khác. Vì vậy, tôi dần dần làm việc hoàn toàn mà không cần đến các thư viện ITEAD nặng nề.

Tôi sớm nhận ra rằng tôi không cần thiết phải truyền đạt cho Nextion những thay đổi đối với thuộc tính của các đối tượng trực quan, nhưng tôi thích đợi cho đến khi tôi thu thập chúng và gửi chúng cho Nextion nói chung, khi tôi có một nhóm hoàn chỉnh.

Tôi sẽ cố gắng giải thích bản thân mình tốt hơn.

Khi trong dự án của tôi bao gồm 16 chỉ báo bằng văn bản, tôi muốn bật hoặc tắt một số trong số chúng, tôi thực hiện điều đó bằng cách tận dụng thuộc tính 'bco' để bật, chuyển (ví dụ) từ màu xám đậm sang màu trắng (nếu trong hình chữ nhật màu đen) và ngược lại để tắt.

Trong ứng dụng của mình, tôi thấy thật vô ích khi gửi 16 lệnh tới cổng nối tiếp trong 16 khoảnh khắc khác nhau, một lệnh cho mỗi 'bco' trong số 16 tín hiệu.

Thay vào đó, tôi thích Arduino thu thập tín hiệu nào phải 'bật' (CAO) và tín hiệu nào phải 'tắt' (THẤP) trong thanh ghi 16 bit, trong đó mỗi bit tương ứng với một trong 16 tín hiệu của Nextion.

Sau khi cập nhật từng bit của thanh ghi, tôi truyền giá trị của nó tới Nextion, một thông báo duy nhất chứa thông tin tổng hợp liên quan đến 16 phần tử.

Bằng cách này, giao tiếp từ Arduino và Nextion bị giảm đáng kể bởi vì trong một thông điệp duy nhất được truyền trên nối tiếp tới Nextion, thông tin được thu thập mà nếu không sẽ yêu cầu truyền 16 thông điệp.

Đúng, không phải lúc nào cũng cần cập nhật tất cả các báo cáo, nhưng tôi chắc chắn rằng làm theo cách khác sẽ lãng phí nhiều thời gian hơn.

Đương nhiên mỗi bit chứa trong số nguyên mà Arduino nhận được, màn hình Nextion sẽ phải liên kết nó với thuộc tính mong muốn.

Điều này có nghĩa là mã phải được viết trong màn hình Nextion, nhưng đừng sợ: nếu tôi thành công…

Sau đó, có một lợi thế kép: Arduino sẽ có mã nhẹ hơn và sẽ ít tham gia vào giao tiếp nối tiếp với Nextion.

Nextion sau khi nhận dữ liệu trong một tin nhắn, sẽ sử dụng chúng nhanh hơn nhiều so với việc phải đợi 16 tin nhắn. Do đó, việc bật hoặc tắt 16 tín hiệu sẽ gần như đồng thời đối với chế độ thông thường nhất, trong đó thời gian cho một số lượng bản tin không xác định sẽ trôi qua giữa việc thực hiện lệnh cho tín hiệu đầu tiên và lệnh cho tín hiệu cuối cùng.

Trong màn hình Nextion, tôi đã tạo hệ thống này theo cách cổ điển, tức là mỗi lần quay một thanh ghi 'mặt nạ' cho phép bạn kiểm tra từng bit trong số 16 bit. Khi bit được kiểm tra là CAO, tín hiệu liên quan đến bit đó sẽ sáng trên màn hình và tắt khi bit ở mức THẤP.

Khía cạnh 'tiêu cực' của hệ thống này là mã được viết trong màn hình Nextion kém thuận tiện hơn để được ghi lại bằng mã của Arduino. Hơn nữa, mã Nextion có nguy cơ bị phân tán trên các đối tượng khác nhau. Cần phải cẩn thận để ghi lại những gì bạn làm ngay lập tức.

Tôi sử dụng Notepad ++ để viết mã mà sau đó tôi sao chép vào đối tượng Nextion, hầu như chỉ nằm trong tm0 của trang 0.

Cú pháp của ngôn ngữ Nextion có nhiều hạn chế, nhưng nó có thể vượt qua chúng hoặc vượt qua chúng với một nỗ lực tối thiểu và cố gắng nhìn nhận vấn đề từ những quan điểm cũng không bình thường.

Ví dụ, tôi báo cáo cách Arduino ghi thanh ghi để truyền, do tôi viết theo cách cơ bản nhất có thể.

Bước 1: Đăng ký được truyền như thế nào

Trong tệp ArduinoCode. PDF, tôi hiển thị tất cả bản phác thảo của mình. (Đọc mã ở đây nó không rõ ràng lắm)

Ở đây, tôi chỉ muốn chỉ ra cách Arduino gửi Đăng ký 16 bit tới Nextion, mà không cần sự trợ giúp của các thư viện, nhưng chỉ cần tôn trọng cú pháp được ITEAD mô tả.

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

void NexUpd ()

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

{

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

SRSerial.print (InpReg); // truyền 16 bit đã thu thập tới Nextion Display

SRSerial.print (InpReg); // truyền 16 bit đã thu thập tới Nextion Display

SRSerial.write (điểm cuối); // 255

SRSerial.write (điểm cuối); // 255

SRSerial.write (điểm cuối); // 255

}

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

Bước 2:.. Nhưng Trước khi…

.. Nhưng trước đó …
.. Nhưng trước đó …

Tất nhiên mã bắt đầu với tất cả các khai báo và thiết lập ().

Các đầu vào là INPUT_PULLUP, vì vậy các công tắc đầu vào thường mở và khi đóng, chúng áp dụng GND cho đầu vào tương ứng.

(Đây là tài liệu có thể hướng dẫn đầu tiên của tôi và tôi rất tiếc phải hiển thị cho bạn mã của tôi theo cách không tốt này. Vui lòng tải xuống tệp ArduinoCode. PDF rất rõ ràng.

Hãy để tôi nói về nó nhiều hơn

Tôi đã phát triển cách riêng của mình để 'nói' với màn hình Nextion những gì nó phải làm. Thông thường, MCU (trong trường hợp của tôi là Arduino) gửi một thông báo cho mọi biến thể đơn lẻ để áp dụng cho thuộc tính của bất kỳ đối tượng đơn lẻ nào. Mốt này lãng phí nhiều thời gian để làm những việc không phải lúc nào cũng khẩn cấp để tải liên tục Dòng nối tiếp. Tôi thấy thuận tiện hơn khi Arduino thu thập thành 16 bit đăng ký thông tin về các thuộc tính để thay đổi trên Nextion. Cứ khoảng 500 mS, Arduino của tôi gửi tới Nextion một thông báo chứa 16 bit có trong mỗi thanh ghi tại một thời điểm. Rõ ràng trong Nextion, chúng ta cần mã xử lý những gì phải được thực thi. Việc phân phối nhiệm vụ (và mã) này cho phép nhận được nhiều lợi thế khác. Ví dụ, hãy nghĩ cách tạo ra ánh sáng nhấp nháy! Với cách tiếp cận của tôi, thật dễ dàng: đặt một chút vào thanh ghi Arduino và gửi nó đến Nextion. Các thanh ghi kép Nextion có thể được cập nhật từ Arduino rất hiếm, vì tần số nhấp nháy của nó độc lập với giao tiếp; tần số nhấp nháy phụ thuộc từ đối tượng Bộ hẹn giờ vào Nextion và có thể chạy với cơ sở thời gian tối thiểu gần 50 mS. Vì vậy, với phương pháp của tôi, chúng tôi có thể nhấp nháy một ánh sáng trong Nextion ở tần số tương đối cao (giả sử 2 Hz), ngay cả khi Arduino của tôi gửi tin nhắn 10 giây một lần, chỉ là một ví dụ điển hình. Điều này có thể gợi ra một vấn đề ngược lại: làm thế nào nếu Giao tiếp thất bại? Đây không phải là đối tượng của cuộc thảo luận này, nhưng tôi đã giải quyết vấn đề này với một loại Watch Dog: một bên trong Mã Arduino, một bên trong mã Nextion.

Việc nhấp nháy được điều chỉnh bởi mã Nextion, trong đó mọi ánh sáng tuân theo các quy tắc thích hợp của nó: BẬT / TẮT hoặc XANH / ĐỎ hoặc cũng có thể thay đổi chữ viết bên trong (hoặc nhiều hơn nữa). Tôi có thể nói một số điều khác về dự án của mình nhưng tôi muốn chờ đợi câu hỏi của bạn, trước khi thêm quá nhiều từ không dễ để tôi dịch tốt như tôi muốn.

Bước 3: Chỉnh sửa các đối tượng Nextion

Chỉnh sửa các đối tượng Nextion
Chỉnh sửa các đối tượng Nextion

Đây là một phần của đoạn mã tôi đã viết bằng Nextion Editor trên đối tượng tm0.

Không tránh khỏi nhận thấy của chúng tôi rằng với 16 bit nhận được từ Arduino, màn hình Nextion không chỉ bật và tắt các tín hiệu. Hiện tại, tôi bỏ qua phần giải thích để không làm phức tạp thêm sự hiểu biết.

Tôi là người mới bắt đầu và vì vậy tốt hơn hết bạn nên tải xuống trang Nextion code. PDF để đọc mã nhầm lẫn ở đây. (Tôi xin lỗi vì đây là hướng dẫn đầu tiên của tôi)

Nếu bạn muốn, bạn có thể tải xuống mã hoàn chỉnh "HMI" cho ứng dụng của tôi này. Tên tệp của mã này là POW1225. HMI. Nó có thể chạy vào màn hình Nextion NX4024T032 của bạn nhưng để hiểu được nó, bạn phải tìm hiểu nhiều đối tượng và xem mã bên trong cửa sổ nhỏ của trình soạn thảo. Vì vậy, tôi nghĩ rằng sẽ dễ dàng hơn để tìm mã chính, được viết trong tệp Nextion code.

// Dự án POW1225. HMI ngày 15 tháng 5 năm 2019

// Bộ tích lũy vACC (va0)

// vINP (va1) Đăng ký đầu vào xxxx xxxx xxxx xxxx

tm0.en = 1 // tm0 Bắt đầu

tm0.tim = 50 // tm0 Cơ sở thời gian 50 mS

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

vACC.val = vINP.val & 0x0001 // Mặt nạ

if (vACC.val! = 0) // Kiểm tra RDY

{

tRDY.pco = BLUE // ĐỎ

}khác

{

tRDY.pco = GRAY // dark GRAY

}

// PWR ***************

vACC.val = vINP.val & 0x0002

if (vACC.val! = 0) // Kiểm tra PWR

{

tPWR.pco = GREEN // nhạt XANH

tPON.txt = "ON" // BẬT

tPON.pco = GREEN // light GREEN

}khác

{

tPWR.pco = GRAY // dark GRAY 33808

tPON.txt = "TẮT" // TẮT

tPON.pco = GRAY // dark GRAY 33808

}

// KHÔ ***************

vACC.val = vINP.val & 0x0004

if (vACC.val! = 0) // Kiểm tra DRY

{

tDRV.pco = BLUE // BLUE

tDRY.pco = BLUE // BLUE

}khác

{

tDRV.pco = GRAY // dark GRAY 33808

tDRY.pco = GRAY // dark GRAY 33808

}

// CHẠY ***************

vACC.val = vINP.val & 0x0018

if (vACC.val! = 0) // Kiểm tra RUN

{

tRUN.bco = RED // MARCIA RED (bật)

tRUN.pco = BLACK // trên BLACK

tDIR.bco = RED // DIR RED

tDIR.pco = BLACK // trên BLACK

}khác

{

tRUN.bco = 32768 // MARCIA GRAY (tắt)

tRUN.pco = GRAY // trên GRAY

tDIR.bco = 32768 // DIR Dark GREEN 1024

tDIR.pco = GRAY // DIR GRAY

tDIR.txt = "---" // DỪNG

}

// BÊN TRÁI **************

vACC.val = vINP.val & 0x0008

if (vACC.val! = 0) // Kiểm tra RUN Right

{

tDIR.txt = "<<<" // DIR TRÁI

}

// ĐÚNG *************

vACC.val = vINP.val & 0x0010

if (vACC.val! = 0) // Kiểm tra RUN Left

{

tDIR.txt = ">>>" // DIR RIGHT

}

// CẢ HAI **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Kiểm tra CHẠY cả hai

{

tDIR.txt = ">>! <<" // DIR CẢ HAI

}

// KIỂM TRA **************

vACC.val = vINP.val & 0x0020

if (vACC.val! = 0) // Kiểm tra KIỂM TRA

{

tTEST.pco = WHITE // TRẮNG

tsw tTEST, 1 // Bật sự kiện Touch

}khác

{

tTEST.pco = GRAY // dark GRAY 33808

tsw tTEST, 0 // Tắt sự kiện Touch

}

// LỖI *************

vACC.val = vINP.val & 0x0040

if (vACC.val == 0) // Kiểm tra FAULT

{

tFLT.pco = GRAY // FAULT vắng mặt

}

if (vACC.val! = 0)

{

tFLT.pco = YELLOW // FAULT hiện tại

}

// EME ***************

vACC.val = vINP.val & 0x0080

if (vACC.val == 0) // Kiểm tra EME

{

tEME.pco = GRAY // EME vắng mặt

}

if (vACC.val! = 0)

{

tEME.pco = RED // EME hiện tại

}

}

// FERMO *************

vACC.val = vINP.val & 0x0100

if (vACC.val! = 0) // Kiểm tra FERMO

{

tFER.pco = BLACK // BLACK

tFER.bco = GREEN // XANH

}khác

{

tFER.pco = GRAY // GRAY

tFER.bco = 672 // XANH LÁ đậm

}

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

Nhìn nhận

Tôi muốn gửi lời cảm ơn tới Gideon Rossouwv vì đọc Sách hướng dẫn của anh ấy, tôi đã nhanh chóng đạt được một phần mục tiêu của mình. Xin cảm ơn ông. Gideon Rossouwv

Đề xuất: