Სარჩევი:

განსხვავებული მიდგომა შემდეგით: 3 ნაბიჯი
განსხვავებული მიდგომა შემდეგით: 3 ნაბიჯი

ვიდეო: განსხვავებული მიდგომა შემდეგით: 3 ნაბიჯი

ვიდეო: განსხვავებული მიდგომა შემდეგით: 3 ნაბიჯი
ვიდეო: ღმერთი ამბობს, რომ თუ თქვენ უგულებელყოფთ ამ შეტყობინებას, თქვენ იპოვით მის რისხვას! მოუსმინე ახლავე! 2024, ივლისი
Anonim
განსხვავებული მიდგომა შემდგომი
განსხვავებული მიდგომა შემდგომი

Arduino Nano– სთან დაკავშირებულ ჩემს პირველ პროექტში, Nextion სენსორულ ეკრანზე, მე დავწერე ბრძანებების გრძელი სერია, რომელიც უნდა მიეწოდოს Nextion– ს სერიული პორტის საშუალებით და ეს გარდაუვალია, თუ ჩვენ გვჭირდება სრულიად დამოუკიდებელი ბრძანებების გაგზავნა შემთხვევით მომენტებში.

ასევე უნდა ვაღიარო, რომ ბიბლიოთეკებთან "ბრძოლაში" უფრო მეტი დრო გავატარე, ვიდრე სხვა არაფერი. ასე რომ, მე თანდათანობით მოვედი სამუშაოდ სრულიად მძიმე ITEAD ბიბლიოთეკების გარეშე.

მალევე მივხვდი, რომ სასწრაფოდ არ მქონდა ნექსტიონისთვის ვიზუალური ობიექტების ატრიბუტებში ცვლილებების გაცნობის აუცილებლობა, მაგრამ მირჩევნია დაველოდო სანამ არ შევაგროვებ და გავგზავნი მთლიანად Nextion– ში, როდესაც მივიღებ სრულ ჯგუფს.

შევეცდები უკეთ ავხსნა საკუთარი თავი.

როდესაც ჩემს პროექტში, რომელიც შედგება 16 ტექსტური მითითებისაგან, მინდა ზოგიერთი მათგანი ჩართო ან გამორთო, ამას ვაკეთებ "bco" ატრიბუტის უპირატესობით, რომელიც ჩართვისას (მაგალითად) მუქი ნაცრისფერიდან თეთრზე გადადის (თუ შავი ოთხკუთხედი) და პირიქით გამორთვა.

ჩემს განაცხადში მე აღმოვაჩინე უსარგებლო 16 ბრძანების სერიულ პორტში 16 სხვადასხვა მომენტში გაგზავნა, ერთი 16 სიგნალის თითოეული "bco" - სთვის.

მე მირჩევნია Arduino– მ შეაგროვოს რომელი სიგნალები უნდა იყოს „ჩართული“(მაღალი) და რომელი სიგნალები უნდა იყოს „გამორთული“(დაბალი) 16 ბიტიან რეგისტრში, სადაც თითოეული ბიტი შეესაბამება Nextion– ის 16 სიგნალიდან ერთ – ერთს.

რეგისტრაციის თითოეული ნაწილის განახლების შემდეგ, მე ვაგზავნი მის მნიშვნელობას Nextion– ს, ერთ შეტყობინებას, რომელიც შეიცავს კოლექტიურ ინფორმაციას 16 ელემენტის შესახებ.

ამგვარად კომუნიკაცია არდუინოსა და ნექსტიონისგან მნიშვნელოვნად მცირდება, რადგან სერიალში Nextion– ზე გადაცემულ ერთ შეტყობინებაში გროვდება ინფორმაცია, რომელიც სხვაგვარად მოითხოვდა 16 შეტყობინების გადაცემას.

მართალია, ყოველთვის არ არის აუცილებელი ყველა ანგარიშის განახლება, მაგრამ დარწმუნებული ვარ, რომ სხვაგვარად გაკეთება უფრო მეტ დროს დაკარგავს.

ბუნებრივია, თითოეული ბიტი შეიცავს არდუინოს მიერ მიღებულ მთელ რიცხვს, Nextion ჩვენება უნდა დაუკავშიროს მას სასურველ ატრიბუტთან.

ეს ნიშნავს, რომ კოდი უნდა იყოს ჩაწერილი Nextion ეკრანზე, მაგრამ ის არ უნდა შეშინდეს: თუ მე შევძელი…

შემდეგ არის ორმაგი უპირატესობა: Arduino– ს ექნება უფრო მსუბუქი კოდი და ნაკლებად იქნება დაკავებული Nextion– თან სერიულ კომუნიკაციაში.

შემდეგი მონაცემების მიღების შემდეგ ერთი შეტყობინება, გამოიყენებს მათ ბევრად უფრო სწრაფად, ვიდრე 16 შეტყობინებას ელოდებოდა. ამრიგად, 16 სიგნალის ჩართვა ან გამორთვა თითქმის ერთდროულად იქნება ყველაზე ჩვეულებრივ რეჟიმში, რომლის დროსაც უცნობი რაოდენობის შეტყობინებების დრო გადის პირველი სიგნალის და ბოლო სიგნალის ბრძანების შესრულებას შორის.

Nextion ეკრანზე მე შევქმენი ეს სისტემა კლასიკური გზით, ანუ ყოველ ჯერზე "ნიღბის" რეგისტრაცია საშუალებას გაძლევთ შეისწავლოთ თითოეული 16 ბიტიდან თითოეული. როდესაც ბიტი შესწავლილია მაღალი, ამ ბიტთან დაკავშირებული სიგნალი ანათებს ეკრანზე და ითიშება, როდესაც ბიტი დაბალია.

ამ სისტემის "უარყოფითი" ასპექტი ის არის, რომ Nextion ეკრანზე ჩაწერილი კოდი ნაკლებად მოსახერხებელია დოკუმენტირებისთვის, ვიდრე Arduino კოდი. გარდა ამისა, Nextion კოდი საფრთხეს უქმნის გაფანტვას სხვადასხვა ობიექტზე. ზრუნვა უნდა იქნას მიღებული იმის დასადასტურებლად, თუ რას აკეთებთ დაუყოვნებლივ.

მე ვიყენებ Notepad ++ - ს კოდის დასაწერად, რომელსაც შემდეგ ვკოპირებ Nextion ობიექტში, რომელიც თითქმის ექსკლუზიურად არის 0 გვერდის tm0.

Nextion ენის სინტაქსს აქვს მრავალი შეზღუდვა, მაგრამ ის ახერხებს მათ გადალახვას ან მათ გარშემო მინიმუმ ძალისხმევას და ცდილობს შეხედოს პრობლემებს, რომლებიც ასევე უჩვეულოა.

როგორც მაგალითი, მე ვაფიქსირებ გზას, რომლითაც არდუინო წერს გადასაცემად რეგისტრს, ჩემს მიერ დაწერილი რაც შეიძლება ელემენტარულად.

ნაბიჯი 1: როგორ ხდება რეგისტრის გადაცემა

ფაილში ArduinoCode. PDF მე ვაჩვენებ ჩემს ყველა ესკიზს. (აქ კოდის წაკითხვა არც ისე ნათელია)

ქვემოთ, მე მხოლოდ მინდა ვაჩვენო, თუ როგორ უგზავნის არდუინომ 16 ბიტიანი რეგისტრაცია Nextion– ს ბიბლიოთეკების დახმარების გარეშე, მაგრამ პატივს სცემს ITEAD– ის მიერ აღწერილ სინტაქსს.

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

ბათილია NexUpd ()

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

{

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

SRSerial.print (InpReg); // გადასცეს 16 შეგროვებული ბიტი Nextion ეკრანზე

SRSerial.print (InpReg); // გადასცეს 16 შეგროვებული ბიტი Nextion ეკრანზე

SRSerial.write (ტერმინი); // 255

SRSerial.write (ტერმინი); // 255

SRSerial.write (ტერმინი); // 255

}

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

ნაბიჯი 2:.. მაგრამ ადრე…

.. მაგრამ ადრე…
.. მაგრამ ადრე…

რა თქმა უნდა, კოდი იწყება ყველა დეკლარაციით და კონფიგურაციით ().

შესასვლელი არის INPUT_PULLUP, ამიტომ შესასვლელი გადამრთველები ჩვეულებრივ ღიაა და როდესაც დახურულია, ისინი მიმართავენ GND– ს შესაბამის კორესპონდენტზე.

(ეს არის ჩემი პირველი ინსტრუქცია და ვწუხვარ, რომ გიჩვენებთ ჩემს კოდს ამ ცუდი გზით. გთხოვთ გადმოწეროთ ფაილი ArduinoCode. PDF, რომ ის ძალიან ნათელია.

ნება მომეცით ამაზე უფრო ვისაუბრო

მე შევიმუშავე საკუთარი გზა, რომ "ვუთხრა" Nextion ეკრანს რა უნდა გააკეთოს. როგორც წესი, MCU (Arduino ჩემს შემთხვევაში) აგზავნის შეტყობინებას თითოეული ვარიაციისთვის, რომ გამოიყენოს რომელიმე ობიექტის ატრიბუტი. ეს მეთოდი ბევრ დროს კარგავს იმისათვის, რომ საქმეები ყოველთვის არ იყოს სასწრაფოდ სერიული ხაზის დატვირთვისთვის. მე უფრო მოსახერხებელი აღმოვაჩინე, რომ Arduino– მ შეაგროვა 16 ბიტიან რეგისტრში ინფორმაცია Nextion– ზე განსხვავებული ატრიბუტების შესახებ. ყოველ 500 mS– ზე, ჩემი Arduino აგზავნის Nextion– ს ერთ შეტყობინებას, რომელიც შეიცავს 16 ბიტს, რომელიც შეიცავს თითოეულ რეგისტრს იმ დროს. ცხადია Nextion– ში ჩვენ გვჭირდება კოდი, რომელიც ამუშავებს იმას, რაც უნდა შესრულდეს. ამოცანის (და კოდის) ამ განაწილებამ შეიძლება ბევრი სხვა უპირატესობა მიიღოს. მაგალითად, იფიქრეთ იმაზე, თუ როგორ უნდა აციმციმდეს შუქი! ჩემი მიდგომით ადვილია: ჩაწერეთ ცოტა Arduino რეგისტრში და გააგზავნეთ Nextion– ში. Nextion ტყუპის რეგისტრები შეიძლება იშვიათად განახლდეს Arduino– დან, რადგან დახუჭვის სიხშირე დამოუკიდებელია კომუნიკაციისგან; დახუჭვის სიხშირე დამოკიდებულია ტაიმერის ობიექტიდან Nextion– ზე და შეუძლია გაუშვას მინიმალური დროის ბაზით 50 mS– მდე. ასე რომ, ჩემი მეთოდით ჩვენ შეგვიძლია დავხუჭოთ სინათლე Nextion– ში შედარებით მაღალი სიხშირით (დავუშვათ 2 Hz), მაშინაც კი, თუ ჩემი Arduino აგზავნის შეტყობინებებს ყოველ 10 წამში, მხოლოდ უკიდურესი მაგალითისთვის. ეს შეიძლება მიუთითებდეს საპირისპირო პრობლემას: როგორ მოვიქცეთ, თუ კომუნიკაცია ვერ მოხერხდება? ეს არ არის ამ დისკუსიის ობიექტი, მაგრამ მე უკვე გადავწყვიტე ეს პრობლემა ერთგვარი Watch Dog– ით: ერთი Arduino კოდის შიგნით, მეორე Nextion კოდში.

მოციმციმე რეგულირდება Nextion კოდით, სადაც ყველა შუქი მიჰყვება მის სათანადო წესებს: ON/OFF ან GREEN/RED ან ასევე შიგნიდან დაწერილი (ან სხვა მეტი). მე შემიძლია სხვა რამ გითხრათ ჩემი პროექტის შესახებ, მაგრამ მირჩევნია დაველოდო თქვენს შეკითხვებს, სანამ დავამატებ ძალიან ბევრ სიტყვას, რომლის თარგმნაც არც ისე ადვილია ჩემთვის.

ნაბიჯი 3: შემდგომი ობიექტების რედაქტირება

შემდგომი ობიექტების რედაქტირება
შემდგომი ობიექტების რედაქტირება

აქ არის კოდის ნაწილი, რომელიც დავწერე 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 mS

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

vACC.val = vINP.val & 0x0001 // ნიღაბი

თუ (vACC.val! = 0) // ტესტი RDY

{

tRDY.pco = ცისფერი // წითელი

} სხვა

{

tRDY.pco = ნაცრისფერი // მუქი ნაცრისფერი

}

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

vACC.val = vINP.val & 0x0002

თუ (vACC.val! = 0) // ტესტი PWR

{

tPWR.pco = მწვანე // ღია მწვანე

tPON.txt = "ჩართული" // ჩართული

tPON.pco = მწვანე // ღია მწვანე

} სხვა

{

tPWR.pco = ნაცრისფერი // მუქი ნაცრისფერი 33808

tPON.txt = "OFF" // OFF

tPON.pco = ნაცრისფერი // მუქი ნაცრისფერი 33808

}

// მშრალი ***************

vACC.val = vINP.val & 0x0004

თუ (vACC.val! = 0) // გამოცადეთ მშრალი

{

tDRV.pco = ცისფერი // ცისფერი

tDRY.pco = ცისფერი // ცისფერი

} სხვა

{

tDRV.pco = ნაცრისფერი // მუქი ნაცრისფერი 33808

tDRY.pco = ნაცრისფერი // მუქი ნაცრისფერი 33808

}

// გაუშვით ***************

vACC.val = vINP.val & 0x0018

თუ (vACC.val! = 0) // ტესტირება RUN

{

tRUN.bco = წითელი // MARCIA RED (ჩართული)

tRUN.pco = შავი // შავზე

tDIR.bco = RED // DIR RED

tDIR.pco = შავი // შავზე

} სხვა

{

tRUN.bco = 32768 // MARCIA GRAY (გამორთულია)

tRUN.pco = ნაცრისფერი // ნაცრისფერზე

tDIR.bco = 32768 // DIR მუქი მწვანე 1024

tDIR.pco = ნაცრისფერი // მშრალი ნაცრისფერი

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 მარცხნივ

{

tDIR.txt = ">>>" // DIR უფლება

}

// ორივე **************

vACC.val = vINP.val & 0x0018

თუ (vACC.val == 24) // გამოცადეთ ორივე

{

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

}

// ტესტი **************

vACC.val = vINP.val & 0x0020

თუ (vACC.val! = 0) // ტესტირება

{

tTEST.pco = WHITE // WHITE

tsw tTEST, 1 // Touch მოვლენების ჩართვა

} სხვა

{

tTEST.pco = ნაცრისფერი // მუქი ნაცრისფერი 33808

tsw tTEST, 0 // Touch მოვლენების გამორთვა

}

// ბრალია *************

vACC.val = vINP.val & 0x0040

თუ (vACC.val == 0) // გამოცდა გაუმართაობა

{

tFLT.pco = ნაცრისფერი // ბრალი არ არსებობს

}

თუ (vACC.val! = 0)

{

tFLT.pco = YELLOW // FAULT present

}

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

vACC.val = vINP.val & 0x0080

თუ (vACC.val == 0) // ტესტი EME

{

tEME.pco = ნაცრისფერი // EME არ არსებობს

}

თუ (vACC.val! = 0)

{

tEME.pco = RED // EME აწმყო

}

}

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

vACC.val = vINP.val & 0x0100

თუ (vACC.val! = 0) // ტესტი FERMO

{

tFER.pco = შავი // შავი

tFER.bco = მწვანე // მწვანე

} სხვა

{

tFER.pco = ნაცრისფერი // ნაცრისფერი

tFER.bco = 672 // მუქი მწვანე

}

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

აღიარება

მინდა მადლობა გადავუხადო გედეონ როსოვვს, რადგან მისი ინსტრუქციის კითხვისას მე სწრაფად მივაღწიე ჩემი მიზნების ნაწილს. მადლობა ბატონო გედეონ როსოვვი

გირჩევთ: