فهرست مطالب:

رویکردی متفاوت با بعدی: 3 مرحله
رویکردی متفاوت با بعدی: 3 مرحله

تصویری: رویکردی متفاوت با بعدی: 3 مرحله

تصویری: رویکردی متفاوت با بعدی: 3 مرحله
تصویری: آموزش زبان انگلیسی به سبک توربوتاک با فائزه خدابنده لو - جلسه 3 2024, نوامبر
Anonim
رویکردی متفاوت با Nextion
رویکردی متفاوت با Nextion

در اولین پروژه خود با آردوینو نانو متصل به صفحه لمسی Nextion ، من یک سری دستورات طولانی نوشته بودم تا از طریق پورت سریال به Nextion ارسال شود و اگر در لحظه های تصادفی نیاز به ارسال دستورات کاملاً مستقل داشته باشیم ، این اجتناب ناپذیر است.

همچنین باید اعتراف کنم که بیشتر از هر زمان دیگری در "نبرد" با کتابخانه ها بودم. بنابراین به تدریج بدون کتابخانه های سنگین ITEAD به کار پرداختم.

به زودی متوجه شدم که هیچ فوریتی ندارم که تغییرات مربوط به ویژگی های اشیاء بصری را به Nextion اعلام کنم ، اما ترجیح می دهم منتظر بمانم تا آنها را جمع آوری کرده و در کل ، وقتی یک گروه کامل به دست آوردم ، آنها را به Nextion ارسال کنم.

سعی می کنم خودم را بهتر توضیح دهم.

وقتی می خواهم برخی از آنها را روشن یا خاموش کنم ، در پروژه ای که از 16 نشانگر متنی تشکیل شده است ، این کار را با استفاده از ویژگی "bco" انجام می دهم که برای روشن کردن ، از خاکستری تیره به سفید (به عنوان مثال) یک مستطیل سیاه) ، و برعکس برای خاموش شدن.

در برنامه من ارسال 16 دستور به پورت سریال در 16 لحظه مختلف ، یک دستور برای هر "bco" از 16 سیگنال ، بی فایده بود.

من ترجیح می دهم آردوینو جمع آوری کند که کدام سیگنال ها باید "روشن" (HIGH) و کدام یک باید "خاموش" (پایین) در یک ثبت 16 بیتی باشد ، جایی که هر بیت مربوط به یکی از 16 سیگنالینگ Nextion است.

پس از به روز رسانی هر بیت از ثبت ، مقدار آن را به Nextion ، یک پیام واحد که حاوی اطلاعات جمعی مربوط به 16 عنصر است ، منتقل می کنم.

به این ترتیب ارتباطات آردوینو و نکستین به میزان قابل توجهی کاهش می یابد زیرا در آن پیام واحد که در سریال به Nextion منتقل می شود ، اطلاعاتی جمع آوری می شود که در غیر این صورت نیاز به ارسال 16 پیام داشت.

درست است که همیشه لازم نیست همه گزارش ها را به روز کنید ، اما مطمئن هستم که در غیر این صورت زمان بیشتری را هدر می دهید.

به طور طبیعی هر بیت موجود در عدد صحیح دریافت شده توسط آردوینو ، صفحه Nextion باید آن را به ویژگی مورد نظر مرتبط کند.

این بدان معناست که کد باید در صفحه Nextion نوشته شود ، اما نباید ترسید: اگر موفق شدم…

سپس یک مزیت مضاعف وجود دارد: آردوینو دارای کد سبک تری است و کمتر در ارتباط سریال با Nextion مشغول خواهد بود.

بعد از دریافت داده ها در یک پیام ، آنها را بسیار سریعتر از زمان انتظار برای 16 پیام استفاده می کند. بنابراین روشن یا خاموش کردن 16 سیگنال از نظر معمول ترین حالت تقریباً همزمان خواهد بود ، که در آن زمان برای تعداد نامعلوم پیام بین اجرای فرمان برای اولین سیگنال و فرمان برای آخرین سیگنالینگ می گذرد.

در صفحه Nextion من این سیستم را به روش کلاسیک ایجاد کردم ، یعنی هر بار چرخاندن یک "ماسک" به شما اجازه می دهد تا هر یک از 16 بیت را بررسی کنید. وقتی بیت مورد بررسی بالا باشد ، سیگنال مربوط به آن بیت روی صفحه نمایش روشن می شود و هنگامی که یک بیت پایین است خاموش می شود.

جنبه "منفی" این سیستم این است که کد نوشته شده در صفحه Nextion نسبت به کد آردوینو کمتر مستند است. علاوه بر این ، کد Nextion در معرض پراکندگی در اجسام مختلف است. باید مراقب باشید که کارهایی را که بلافاصله انجام می دهید مستند کنید.

من از Notepad ++ برای نوشتن کد استفاده می کنم و سپس آن را در شی Nextion که تقریباً به طور انحصاری در tm0 صفحه 0 است کپی می کنم.

نحو زبان Nextion دارای محدودیت های متعددی است ، اما می تواند بر آنها غلبه کرده یا با حداقل تلاش از آنها عبور کرده و سعی کند مشکلات را از دیدگاه غیرمعمول نیز ببیند.

به عنوان مثال ، من روشی را که آردوینو ثبت می کند را ارسال می کنم ، که توسط من به ابتدایی ترین شکل ممکن نوشته شده است.

مرحله 1: نحوه انتقال ثبت نام

در فایل ArduinoCode. PDF تمام طرح خود را نشان می دهم. (خواندن کد در اینجا چندان واضح نیست)

در اینجا ، فقط می خواهم نشان دهم که چگونه آردوینو بدون کمک کتابخانه ها ، ثبت نام 16 بیتی را به Nextion ارسال می کند ، اما به نحوی که ITEAD توصیف می کند احترام می گذارد.

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

void 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 (در مورد من آردوینو) برای هر تنوع یک پیام ارسال می کند تا به ویژگی هر شیء واحد اعمال شود. این روش زمان زیادی را صرف انجام کارهایی می کند که همیشه بارگذاری پیوسته خط سریال ضروری نیست. به نظر من راحت تر بود که آردوینو اطلاعات ثابتی را که در Nextion متغیر است ، در رجیسترهای 16 بیتی جمع آوری کند. تقریباً در هر 500 میلی ثانیه ، آردوینو من یک پیغام حاوی 16 بیت موجود در هر رجیستر را به Nextion ارسال می کند. بدیهی است که در Nextion ما به کدی نیاز داریم که باید اجرا شود. این توزیع وظیفه (و کد) می تواند مزایای بسیار دیگری را نیز به همراه داشته باشد. به عنوان مثال ، فکر کنید چگونه می توان یک چشمک زدن را به یک چراغ تبدیل کرد! با رویکرد من این کار آسان است: کمی وارد رجیستر آردوینو شوید و آن را به Nextion ارسال کنید. رجیسترهای دوقلو Nextion می توانند به ندرت از آردوینو به روز شوند ، زیرا فرکانس پلک زدن مستقل از ارتباط است. فرکانس پلک زدن از یک شیء تایمر به Nextion بستگی دارد و می تواند با حداقل زمان نزدیک به 50 میلی ثانیه اجرا شود. بنابراین با روش من می توانیم یک نور در Nextion با فرکانس نسبتاً زیاد (فرض کنیم 2 هرتز) چشمک بزنیم ، حتی اگر آردوینو هر 10 ثانیه پیام ارسال کند ، فقط برای یک مثال شدید. این می تواند مشکل مخالف را نشان دهد: در صورت شکست ارتباط چگونه باید عمل کرد؟ این موضوع این بحث نیست ، اما من قبلاً این مشکل را با نوعی Watch Dog حل کرده ام: یکی در داخل کد آردوینو ، دیگری در کد Nextion.

چشمک زدن توسط کد Nextion تنظیم می شود ، جایی که هر چراغ از قوانین مناسب خود پیروی می کند: روشن/خاموش یا سبز/قرمز یا تغییر داخل نوشته (یا موارد دیگر). من می توانم چیزهای دیگری در مورد پروژه خود بگویم ، اما ترجیح می دهم منتظر س questionsالات شما باشم ، قبل از اضافه کردن کلمات زیادی که ترجمه آنها برای من آسان نیست.

مرحله 3: ویرایش اشیاء Nextion

ویرایش اشیاء Nextion
ویرایش اشیاء Nextion

در اینجا قسمتی از کدی است که با Nextion Editor روی شی tm0 نوشتم.

متوجه نمی شویم که با 16 بیت دریافت شده از آردوینو ، صفحه Nextion فقط سیگنال ها را روشن و خاموش نمی کند. در حال حاضر من توضیحات را حذف می کنم تا درک را پیچیده نکنم.

من یک مبتدی هستم و بنابراین بهتر است کد Nextion را بارگیری کنید. در عوض صفحه PDF را بخوانید تا کد اشتباه را در اینجا بخوانید. (متاسفم که این اولین آموزش من است)

در صورت تمایل می توانید کد کامل "HMI" را برای این برنامه من بارگیری کنید. نام فایل این کد POW1225. HMI است. این می تواند به صفحه Nextion شما NX4024T032 راه پیدا کند ، اما برای درک آن باید به اشیاء زیادی وارد شوید و کد داخل پنجره کوچک ویرایشگر را مشاهده کنید. بنابراین من فکر می کنم کد اصلی که در فایل Nextion code. PDF نوشته شده است ، بسیار ساده تر به نظر می رسد

// پروژه POW1225. HMI 15 مه 2019

// vACC (va0) جمع کننده

// vINP (va1) ثبت نام ورودی xxxx xxxx xxxx xxxx

tm0.en = 1 // tm0 شروع

tm0.tim = 50 // tm0 پایه زمانی 50 میلی ثانیه

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

vACC.val = vINP.val & 0x0001 // ماسک

if (vACC.val! = 0) // RDY را آزمایش کنید

{

tRDY.pco = آبی // قرمز

} دیگری

{

tRDY.pco = خاکستری // خاکستری تیره

}

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

vACC.val = vINP.val & 0x0002

if (vACC.val! = 0) // تست PWR

{

tPWR.pco = سبز // سبز سبز

tPON.txt = "روشن" // روشن

tPON.pco = سبز // سبز سبز

} دیگری

{

tPWR.pco = خاکستری // خاکستری تیره 33808

tPON.txt = "خاموش" // خاموش

tPON.pco = خاکستری // خاکستری تیره 33808

}

// خشک ***************

vACC.val = vINP.val & 0x0004

if (vACC.val! = 0) // تست DRY

{

tDRV.pco = آبی // آبی

tDRY.pco = آبی // آبی

} دیگری

{

tDRV.pco = خاکستری // خاکستری تیره 33808

tDRY.pco = خاکستری // خاکستری تیره 33808

}

// اجرا کن ***************

vACC.val = vINP.val & 0x0018

if (vACC.val! = 0) // Test 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 = خاکستری // در خاکستری

tDIR.bco = 32768 // DIR سبز سبز 1024

tDIR.pco = خاکستری // خاکستری خشک

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

}

// ترک کرد **************

vACC.val = vINP.val & 0x0008

if (vACC.val! = 0) // Test RUN Right

{

tDIR.txt = "<<<" // DIR چپ

}

// درست *************

vACC.val = vINP.val & 0x0010

if (vACC.val! = 0) // Test RUN Left

{

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

}

// هر دو **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // تست RUN هر دو

{

tDIR.txt = ">>! <<" // DIR BOTH

}

// تست **************

vACC.val = vINP.val & 0x0020

if (vACC.val! = 0) // تست TEST

{

tTEST.pco = WHITE // WHITE

tsw tTEST، 1 // فعال کردن رویدادهای Touch

} دیگری

{

tTEST.pco = خاکستری // خاکستری تیره 33808

tsw tTEST، 0 // غیرفعال کردن رویدادهای Touch

}

// عیب *************

vACC.val = vINP.val & 0x0040

if (vACC.val == 0) // تست خطا

{

tFLT.pco = خاکستری // خطا وجود ندارد

}

if (vACC.val! = 0)

{

tFLT.pco = YELLOW // FAULT در حال حاضر

}

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

vACC.val = vINP.val & 0x0080

if (vACC.val == 0) // تست EME

{

tEME.pco = خاکستری // EME وجود ندارد

}

if (vACC.val! = 0)

{

tEME.pco = RED // EME موجود است

}

}

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

vACC.val = vINP.val & 0x0100

if (vACC.val! = 0) // تست FERMO

{

tFER.pco = BLACK // BLACK

tFER.bco = سبز // سبز

} دیگری

{

tFER.pco = خاکستری // خاکستری

tFER.bco = 672 // سبز تیره

}

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

تصدیق

من می خواهم قدردانی خود را از گیدئون روسوف انجام دهم زیرا با خواندن دستورالعمل های او بخشی از اهداف خود را به سرعت به دست آورده ام. ممنون آقای گیدئون روسوف

توصیه شده: