Բովանդակություն:

Ստանդարտ ֆիրմայից այն կողմ անցնելը - կրկին այցելել ՝ 5 քայլ
Ստանդարտ ֆիրմայից այն կողմ անցնելը - կրկին այցելել ՝ 5 քայլ

Video: Ստանդարտ ֆիրմայից այն կողմ անցնելը - կրկին այցելել ՝ 5 քայլ

Video: Ստանդարտ ֆիրմայից այն կողմ անցնելը - կրկին այցելել ՝ 5 քայլ
Video: Բերում եմ «ֆիրմա» փաստեր, որ Նիկոլն անբարոյական է. Արմեն Աշոտյան 2024, Հուլիսի
Anonim
StandardFirmata- ից այն կողմ - Վերանայվում է
StandardFirmata- ից այն կողմ - Վերանայվում է

Քիչ առաջ ինձ դիմեց դոկտոր Մարտին Ուիլերը, ով pymata4- ի օգտագործող է, pymata4 գրադարանին DHT22 խոնավության/ջերմաստիճանի տվիչի աջակցություն ավելացնելու համար: Pymata4 գրադարանը, Arduino- ի իր գործընկերոջ ՝ FirmataExpress- ի հետ համատեղ, թույլ է տալիս օգտվողներին վերահսկել և վերահսկել իրենց Arduino սարքերը հեռակա կարգով: Էլփոստի փոխանակման մի քանի փուլերի ընթացքում դոկտոր Ուիլերը հաջողությամբ փոփոխեց ինչպես pymata4- ը, այնպես էլ FirmataExpress- ը: Արդյունքում, DHT22 և DHT11 տվիչների աջակցությունը այժմ pymata4- ի և FirmataExpress- ի ստանդարտ մասն է:

2014 -ի մայիսին ես հոդված գրեցի Firmata- ին լրացուցիչ սարքերի համար աջակցություն ավելացնելու մասին: Անդրադառնալով այդ հոդվածիս ՝ ես հասկացա, թե որքան շատ բան է փոխվել այն բանից հետո, երբ այդ հոդվածի համար գրիչ եմ վերցրել թղթի վրա: Այս հոդվածից բացի, դոկտոր Ուիլերը փաստեց իր ջանքերը, և գուցե ցանկանաք դա նույնպես ստուգել:

FirmataExpress- ը հիմնված է StandardFirmata- ի վրա, և StandardFirmata գրացուցակի կառուցվածքը զարգացել է: Բացի այդ, pymata4 API- ն նույնպես մի փոքր տարբերվում է 2014 -ի սկզբնական PyMata API- ից: Կարծում էի, որ սա կատարյալ ժամանակ կլինի այդ հոդվածը վերանայելու և թարմացնելու համար: Որպես հիմք օգտագործելով դոկտոր Ուիլերի աշխատանքը, եկեք ուսումնասիրենք, թե ինչպես ընդլայնել pymata4/FirmataExpress ֆունկցիոնալությունը:

Նախքան սկսելը. Որոշ նախնական տեղեկություններ Arduino/Firmata- ի մասին

Այսպիսով, ինչ է Firmata- ն: Մեջբերում կատարելով Firmata- ի էջից ՝ «Firmata- ն ընդհանուր արձանագրություն է` ընդունող համակարգչի ծրագրակազմից միկրոկոնտրոլերների հետ հաղորդակցվելու համար »:

Arduino Firmata- ն օգտագործում է սերիական ինտերֆեյս `Arduino միկրոկոնտրոլերի և համակարգչի միջև հրամանատարական և հաշվետվական տեղեկատվությունը փոխադրելու համար, սովորաբար օգտագործելով սերիական/USB հղում, որը սահմանվել է 57600 զ/վրկ: Այս հղումով փոխանցվող տվյալները երկուական են, և արձանագրությունը ներդրված է հաճախորդ/սերվեր մոդելում:

Սերվերի կողմը բեռնված է Arduino միկրոկառավարիչի վրա `Arduino էսքիզի տեսքով: StandardFirmata ուրվագիծը, որը ներառված է Arduino IDE- ի հետ, վերահսկում է Arduino մուտքի/ելքային կապերը, ինչպես պատվիրված է հաճախորդի կողմից: Այն նաև հայտնում է հաճախորդին մուտքագրման քորոցների փոփոխությունների և հաշվետվության այլ տեղեկությունների մասին: FirmataExpress- ը StandardFirmata- ի ընդլայնված տարբերակն է: Այն աշխատում է 115200 բիթ / վրկ սերիական հղման արագությամբ:

Այս հոդվածի համար օգտագործվող Arduino հաճախորդը pymata4 է: Դա Python ծրագիր է, որը կատարվում է ԱՀ -ի վրա: Այն և՛ հրամաններ է ուղարկում, և՛ հաշվետվություններ է ստանում Arduino սերվերից: Քանի որ pymata4- ն իրականացվում է Python- ում, այն աշխատում է Windows, Linux (ներառյալ Raspberry Pi) և macOS համակարգիչների վրա:

Ինչու՞ օգտագործել Firmata- ն:

Arduino միկրոկառավարիչները հիանալի փոքր սարքեր են, բայց պրոցեսորների և հիշողության ռեսուրսները որոշ չափով սահմանափակ են: Պրոցեսորով կամ հիշողությամբ աշխատող ծրագրերի համար հաճախ քիչ ընտրություն կա, քան ռեսուրսների պահանջը համակարգչից բեռնաթափել, որպեսզի ծրագիրը հաջողակ լինի:

Բայց դա StandardFirmata- ի օգտագործման միակ պատճառը չէ: Ավելի թեթև քաշով Arduino ծրագրեր մշակելիս համակարգիչը կարող է տրամադրել գործիքներ և կարգաբերման հնարավորություններ, որոնք ուղղակիորեն հասանելի չեն Arduino միկրոկոնտրոլերի վրա: «Ֆիքսված» հաճախորդի և սերվերի օգտագործումը օգնում է կիրառման բարդությունը սահմանափակել ԱՀ -ով, որն ավելի հեշտ է կառավարվում: Դիմումը կատարելագործվելուց հետո այն կարող է թարգմանվել սովորական, անկախ Arduino էսքիզի:

Ինչու՞ օգտագործել pymata4- ը:

Լինելով դրա հեղինակը, իհարկե, ես կողմնակալ եմ: Ասածս այն է, որ սա Python- ի վրա հիմնված Firmata հաճախորդն է, որը շարունակաբար պահպանվել է վերջին մի քանի տարիների ընթացքում: Այն ապահովում է ինտուիտիվ և հեշտ օգտագործման API: StandardFirmata- ի վրա հիմնված էսքիզներից բացի, այն աջակցում է WiFi- ի միջոցով Firmata- ին ESP-8266- ի նման սարքերի համար, երբ օգտագործում եք StandardFirmataWifI էսքիզը:

Բացի այդ, pymata4- ը նախագծվել է օգտագործողի կողմից հեշտությամբ ընդլայնվելու համար `լրացուցիչ սենսորների և գործարկիչների աջակցման համար, որոնք ներկայումս չեն աջակցվում StandardFirmata- ի կողմից:

Քայլ 1. Հասկանալով Firmata արձանագրությունը

Հասկանալով Firmata արձանագրությունը
Հասկանալով Firmata արձանագրությունը

Arduino Firmata հաղորդակցության արձանագրությունը բխում է MIDI արձանագրությունից, որն օգտագործում է մեկ կամ մի քանի 7 բիթ բայթ ՝ տվյալները ներկայացնելու համար:

Firmata- ն նախատեսված էր օգտագործողի համար ընդարձակելի լինելու համար: Այս ընդարձակելիությունն ապահովող մեխանիզմը System Exclusive (SysEx) հաղորդագրությունների արձանագրությունն է:

SysEx հաղորդագրության ձևաչափը, ինչպես սահմանված է Firmata Protocol- ով, ցուցադրված է վերևի նկարում: Այն սկսվում է START_SYSEX բայթով `վեցանկյուն 0xF0 ֆիքսված արժեքով, և դրան հաջորդում է յուրահատուկ SysEx հրամանի բայթ: Հրամանի բայտի արժեքը պետք է լինի տասնվեցական 0x00-0x7F տիրույթում: Այնուհետև հրամանի բայթին հաջորդում է 7-բիթանոց տվյալների բայթերի չճշտված թիվը: Ի վերջո, հաղորդագրությունը դադարեցվում է END_SYSEX բայթով ՝ վեցանկյունական 0xF7 ֆիքսված արժեքով:

Ֆիրմատայի տվյալների կոդավորում/վերծանում

Քանի որ SysEx հաղորդագրության օգտվողի տվյալների մասը բաղկացած է 7 բիթ բայթերի շարքից, կարող եք մտածել, թե ինչպես է մեկը ներկայացնում 128-ից մեծ արժեք (0x7f): Firmata- ն կոդավորում է այդ արժեքները `դրանք ապամոնտաժելով 7-բայթանոց բազմաթիվ կտորների, նախքան տվյալների համընկնումը տվյալների հղման վրա: Տվյալների ամենաքիչ էական բայթը (LSB) ուղարկվում է առաջինը, որին հաջորդում են պայմանականորեն տվյալների նյութի ավելի ու ավելի զգալի բաղադրիչները: Տվյալների ամենակարևոր բայթը (MSB) վերջին ուղարկված տվյալների տարրն է:

Ինչպես է սա աշխատում:

Ենթադրենք, մենք ցանկանում ենք 525 արժեք ներառել SysEx հաղորդագրության տվյալների մասի մեջ: Քանի որ 525 արժեքը ակնհայտորեն ավելի մեծ է, քան 128-ը, մենք պետք է այն բաժանենք կամ ապամոնտաժենք 7 բիթանոց «կտորների»:

Ահա թե ինչպես է դա արվում.

525-ի արժեքը տասնորդական արժեքին համարժեք է 0x20D տասնմեկանիշ արժեքին, 2 բայթ արժեքին: LSB- ն ստանալու համար մենք քողարկում ենք արժեքը ՝ AND'ing այն 0x7F- ով: Ստորև բերված են «C» և Python իրականացումները.

// «C» իրականացում ՝ LSB- ն մեկուսացնելու համար

int max_distance_LSB = max_distance & 0x7f; // դիմակավորել ստորին բայթը # Python- ի իրականացում ՝ LSB- ի մեկուսացման համար max_distance_LSB = max_distance & 0x7F # դիմակավորել ստորին բայթը

Դիմակավորումից հետո max_distance_LSB- ը կպարունակի 0x0d: 0x20D & 0x7F = 0x0D:

Հաջորդը, մենք պետք է մեկուսացնենք MSB- ն այս 2 բայթ արժեքի համար: Դա անելու համար մենք 0x20D արժեքը կտեղափոխենք աջ ՝ 7 տեղ:

// «C» իրականացում ՝ MSB- ն 2 բայթ արժեքով մեկուսացնելու համար

int max_distance_MSB = max_distance >> 7; // տեղափոխել բարձր կարգի բայթ # Python- ի իրականացումը 2 բայթ արժեքով MSB- ի izoloate max_distance_MSB = max_distance >> 7 # shift վերին բայթ ստանալու համար Փոխվելուց հետո max_distance_MSB- ը կպարունակի 0x04 արժեք:

Երբ «փոշիացված» մարշալացված տվյալները ստացվում են, այն պետք է նորից հավաքվի մեկ արժեքի մեջ: Ահա թե ինչպես են տվյալները համախմբվում ինչպես «C», այնպես էլ Python- ում

// «C» իրականացում ՝ 2 բայթը նորից հավաքելու համար, // 7 բիթանոց արժեքներ մեկ արժեքի մեջ int max_distance = argv [0] + (argv [1] << 7); # Python- ի ներդրում ՝ 2 բայթ, # 7 բիթ արժեքները մեկ արժեքի մեջ հավաքելու համար max_distance = տվյալներ [0] + (տվյալներ [1] << 7)

Հավաքվելուց հետո արժեքը մեկ անգամ ևս հավասար է 525 տասնորդական կամ 0x20D տասնվեցականի:

Այս ապամոնտաժման/հավաքման գործընթացը կարող է իրականացվել կամ հաճախորդի կամ սերվերի կողմից:

Քայլ 2: Եկեք սկսենք

Նոր սարքին աջակցելը պահանջում է փոփոխություններ ինչպես Arduino ռեզիդենտ սերվերում, այնպես էլ ԱՀ ռեզիդենտ Python հաճախորդում: Դոկտոր Ուիլերի աշխատանքը կօգտագործվի անհրաժեշտ փոփոխությունները պատկերելու համար:

Թերևս ամենակարևոր քայլը որոշելն է `կցանկանայի՞ք ինտեգրել գոյություն ունեցող օժանդակ սարքի գրադարանը հավասարման Arduino կողմում, թե գրել ձեր սեփականը: Խորհուրդ է տրվում, եթե գտնեք գոյություն ունեցող գրադարան, այն օգտագործելն ավելի պարզ է, քան զրոյից սեփականը գրելը:

DHT սարքի աջակցության համար դոկտոր Ուիլերը հիմնեց իր երկարացման ծածկագիրը DHTNew գրադարանի վրա: Շատ խելամտորեն, դոկտոր Ուիլերը բաժանեց DHTNew գրադարանի ֆունկցիոնալությունը Arduino- ի և հավասարման pymata4 կողմերի վրա `Arduino- ի կողմից նվազագույն արգելափակում ապահովելու համար:

Եթե նայենք DHTNew- ին, այն կատարում է հետևյալ բոլորը.

  • Սահմանում է ընտրված փին թվային ելքային ռեժիմը:
  • Clամացույցը դուրս է բերում կոդավորված ազդանշան `խոնավության և ջերմաստիճանի վերջին արժեքները ստանալու համար:
  • Ստուգում և հայտնում է ցանկացած սխալ:
  • Հաշվվում է մարդու համար ընթերցվող ջերմաստիճանի և խոնավության արժեքները ՝ վերցված չմշակված տվյալներից:

FirmataExpress- ի կողմից իրերը հնարավորինս արդյունավետ պահելու համար դոկտոր Ուիլերը բեռնեց տվյալների փոխակերպման ռեժիմները Arduino- ից pymata4:

Քայլ 3. Փոփոխեք FirmataExpress- ը DHT աջակցության համար

The FirmataExpress տեղեկատու ծառը

Ստորև բերված են բոլոր ֆայլերը, որոնք ներառում են FirmataExpress պահոցը: Այս ծառը նույնական է StandardFiramata- ին, պարզապես ֆայլերի որոշ անուններ արտացոլում են պահեստի անունը:

Փոփոխության կարիք ունեցող ֆայլերն այն ֆայլերն են, որոնց կողքին կա աստղանիշ (*):

FirmataExpress

* Տախտակներ. Ժ

├── օրինակներ

Irm └── FirmataExpress

Տախտակ

├── * FirmataExpress.ino

IC ├── ԼԻENԵՆԻ. Txt

Makefile

* FirmataConstants.h

├── * FirmataDefines.h

├── FirmataExpress.cpp

├── FirmataExpress.h

├── FirmataMarshaller.cpp

FirmataMarshaller.h

├── FirmataParser.cpp

FirmataParser.h

Դիտարկենք ֆայլերից յուրաքանչյուրը և կատարված փոփոխությունները:

Տախտակներ.հ

Այս ֆայլը պարունակում է pin տիպի մակրո սահմանումներ `աջակցվող տախտակներից յուրաքանչյուրի համար: Այն սահմանում է աջակցվող սարքերի առավելագույն թիվը, երբ անհրաժեշտ է մեկից ավելի սարքերի աջակցություն:

DHT սարքի համար միաժամանակ կարող են միացվել մինչև 6 սարք, և այս արժեքը սահմանվում է հետևյալ կերպ.

#ifndef MAX_DHTS

#սահմանեք MAX_DHTS 6 #endif

Բացի այդ, փին տիպի մակրոները կարող են ըստ ցանկության սահմանվել նոր սարքի համար ՝ տախտակի բոլոր տեսակների համար կամ պարզապես ձեզ հետաքրքրող: Այս մակրոները հիմնականում օգտագործվում են հաշվետվական նպատակների համար և չեն օգտագործվում սարքերը վերահսկելու համար: Այս մակրոները սահմանում են սարքն ապահովող երկու կապում ՝

#սահմանել IS_PIN_DHT (p) (IS_PIN_DIGITAL (p) && (p) - 2 <MAX_DHTS)

Ինչպես նաև մակրո ՝ կապի համարի փոխակերպումը սահմանելու համար:

#սահմանել PIN_TO_DHT (p) PIN_TO_DIGITAL (p)

FirmataConstants.h

Այս ֆայլը պարունակում է որոնվածի տարբերակի համարը, որը գուցե ցանկանաք փոփոխել ՝ հետևելու համար, թե որ տարբերակն եք բեռնել ձեր Arduino- ում: Այն պարունակում է նաև Firmata հաղորդագրության արժեքները, ներառյալ Firmata SysEx հաղորդագրությունները:

Այս ֆայլում պետք է ձեր սարքի համար նոր հաղորդագրություն կամ հաղորդագրությունների շարք նշանակեք: DHT- ի համար ավելացվել է երկու հաղորդագրություն: Մեկը քորոցը կարգավորում է որպես «DHT» քորոց, իսկ մյուսը ՝ որպես լրագրողի հաղորդագրություն ՝ վերջին DHT տվյալները հաճախորդին հետ ուղարկելու ժամանակ:

ստատիկ կոնստրուկտոր DHT_CONFIG = 0x64;

ստատիկ const int DHT_DATA = 0x65;

Այս ֆայլում նշված են նաև կապի ռեժիմները: DHT- ի համար ստեղծվեց նոր քորոցային ռեժիմ.

ստատիկ const int PIN_MODE_DHT = 0x0F; // կապը կազմաձևված է DHT- ի համար

Նոր PIN ռեժիմ ավելացնելիս TOTAL_PIN_MODES- ը պետք է ճշգրտվի.

ստատիկ կոնստրուկտոր TOTAL_PIN_MODES = 17;

FirmataDefines.h

Այս ֆայլը պետք է թարմացվի, որպեսզի արտացոլի FirmataConstants.h- ին ավելացված նոր հաղորդագրությունները.

#ifdef DHT_CONFIG #undef DHT_CONFIG #endif #define DHT_CONFIG ֆիրմա:: DHT_CONFIG // DHT հարցում #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA firmata:: DHT_DATA_DDEDDEDDEDDEDDEDDEDDEDDEDDEDDEDDEIN:: PIN_MODE_DHT

FirmataExpress.ino

Այս քննարկման ընթացքում մենք կանդրադառնանք Arduino- ի էսքիզում կատարված փոփոխությունների «բարձր կետերին»:

Որպեսզի FirmataExpress- ը միաժամանակ աջակցի մինչև վեց DHT սարքի, ստեղծվել է 3 զանգված, որոնք հետևում են սարքի յուրաքանչյուր կապի համարին, նրա WakeUpDelay արժեքին և սարքի տեսակին, այն է ՝ DHT22 կամ DHT11:

// DHT տվիչներ

int numActiveDHTs = 0; // կցված DHT- ների թիվը uint8_t DHT_PinNumbers [MAX_DHTS]; uint8_t DHT_WakeUpDelay [MAX_DHTS]; uint8_t DHT_TYPE [MAX_DHTS];

Քանի որ սարքի երկու տեսակներն ընթերցումների միջև պահանջում են մոտ 2 վայրկյան, մենք պետք է համոզվենք, որ յուրաքանչյուր DHT- ն կարդում ենք միայն մեկ անգամ 2 վայրկյան ժամկետում: Որոշ սարքեր, ինչպիսիք են DHT սարքերը և HC-SR04 հեռավորության տվիչները, միայն պարբերաբար են հասանելի: Սա նրանց ժամանակ է տալիս շփվելու իրենց միջավայրի հետ:

uint8_t հաջորդDHT = 0; // ինդեքսավորեք dht հաջորդ սարքի համար, որը պետք է կարդալ

uint8_t ընթացիկ DHT = 0; // Հետևում է, թե որ սենսորն է ակտիվ: int dhtNumLoops = 0; // Մի քանի անգամ թիրախավորեք b4 հանգույցի միջոցով DHT int dhtLoopCounter = 0 մուտք գործելը; // Օղակի հաշվիչ

DHT սարքի կազմաձևում և ընթերցում

Երբ FirmataExpress- ը ստանում է SysEx հրաման DHT- ի համար քորոց կազմաձևելու համար, այն հաստատում է, որ DHT սարքերի առավելագույն թիվը չի գերազանցվել: Եթե նոր DHT- ն կարող է աջակցվել, DHT զանգվածները թարմացվում են: Եթե DHT- ի տեսակն անհայտ է, ստեղծվում է SysEx տողային հաղորդագրություն և հետ է փոխանցվում pymata4

գործ DHT_CONFIG: int DHT_Pin = argv [0]; int DHT_type = argv [1]; եթե (numActiveDHTs <MAX_DHTS) {եթե (DHT_type == 22) {DHT_WakeUpDelay [numActiveDHTs] = 1; } else if (DHT_type == 11) {DHT_WakeUpDelay [numActiveDHTs] = 18; } else {Firmata.sendString ("ՍԽԱԼ. ԱՆՀԱՅՏ ՍԵՆՍՈՐԻ ՏԵՍԱԿ, ՎԱ SԱՌ Սենսորներ 11, 22 են"); ընդմիջում; } // ստուգել սենսորը DHT_PinNumbers [numActiveDHTs] = DHT_Pin; DHT_TYPE [numActiveDHTs] = DHT_type; setPinModeCallback (DHT_Pin, PIN_MODE_DHT);

FirmataExpress- ը այնուհետև փորձում է շփվել DHT սարքի հետ: Սխալների առկայության դեպքում այն ձևավորում է SysEx հաղորդագրություն սխալի տվյալներով և SysEx հաղորդագրությունը հետ է ուղարկում pymat4: _Bits փոփոխականը ցանկության դեպքում պահպանում է DHT սարքի կողմից վերադարձված տվյալները `pymata4- ի կողմից լրացուցիչ մշակման համար:

Firmata.write (START_SYSEX);

Firmata.write (DHT_DATA); Firmata.write (DHT_Pin); Firmata.write (DHT_type); համար (uint8_t i = 0; i> 7 & 0x7f); } Firmata.write (abs (rv)); Firmata.write (1); Firmata.write (END_SYSEX);

Եթե վավերական տվյալները վերադարձվեն, ակտիվ DHT- ների թիվը ավելանում է: Նաև ճշգրտվում է այն փոփոխականը, որը հետևում է, թե քանի օղակի կրկնություն պետք է լրացնել ՝ տվյալների հաջորդ DHT- ն ստուգելուց առաջ: Այս փոփոխականը հավաստիացնում է, որ անկախ նրանից, թե որքան DHT- ներ կավելացվեն համակարգին, դրանք բոլորը կկարդան 2 վայրկյանի ընթացքում:

int rv = readDhtSensor (numActiveDHTs);

եթե (rv == DHTLIB_OK) {numActiveDHTs ++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // ամեն ինչ լավ է}

Եթե մեկ կամ ավելի DHT սարքեր կազմաձևվել են ուրվագծի օղակի գործառույթում, ապա ընթերցվում է հաջորդ DHT սարքը: Կամ վավեր տվյալները, կամ դրանց սխալի կարգավիճակը վերադարձվում են pymata4 ՝ SysEx հաղորդագրության տեսքով.

եթե (dhtLoopCounter ++> dhtNumLoops) {if (numActiveDHTs) {int rv = readDhtSensor (nextDHT); uint8_t ընթացիկ_փին = DHT_PinNumbers [nextDHT]; uint8_t ընթացիկ_տիպ = DHT_TYPE [nextDHT]; dhtLoopCounter = 0; ընթացիկ DHT = հաջորդ DHT; if (nextDHT ++> = numActiveDHTs - 1) {nextDHT = 0; } if (rv == DHTLIB_OK) {// TEST CHECKSUM uint8_t sum = _bits [0] + _bits [1] + _bits [2] + _bits [3]; if (_bits [4]! = գումար) {rv = -1; }} // հետ ուղարկել հաղորդագրությունը սխալի կարգավիճակով Firmata.write (START_SYSEX); Firmata.write (DHT_DATA); Firmata.write (ընթացիկ_փին); Firmata.write (ընթացիկ_տիպ); (uint8_t i = 0; i <sizeof (_bits) - 1; ++ i) {Firmata.write (_bits ); // Firmata.write (_bits ;} Firmata.write (abs (rv)); Firmata.write (0); Firmata.write (END_SYSEX);}}

DHT սարքի հետ հաղորդակցվելու համար օգտագործվող կոդը ստացվում է անմիջապես DHTNew գրադարանից.

int readDhtSensor (int ինդեքս) {

// INIT BUFFERVAR ՏՎՅԱԼՆԵՐ ՍՏԱՆԱԼ uint8_t դիմակ = 128; uint8_t idx = 0; // Դատարկ բուֆեր // մեմսեթ (_bit, 0, sizeof (_bits)); for (uint8_t i = 0; i 5 BYTES for (uint8_t i = 40; i! = 0; i--) {loopCnt = DHTLIB_TIMEOUT; while (digitalRead (pin) == LOW) {if (--loopCnt == 0) վերադարձ DHTLIB_ERROR_TIMEOUT;} uint32_t t = micros (); loopCnt = DHTLIB_TIMEOUT; մինչդեռ (digitalRead (pin) == HIGH) {if (--loopCnt == 0) վերադարձ DHTLIB_ERROR_TIMEOUT;} եթե ((micros ()-t) 40) {_bits [idx] | = դիմակ;} դիմակ >> = 1; եթե (դիմակ == 0) // հաջորդ բայթ? {Mask = 128; idx ++;}} վերադարձ DHTLIB_OK;}

Քայլ 4. Փոփոխեք Pymata4- ը DHT աջակցության համար

private_constants.h

DHT- ին աջակցելու համար մենք պետք է այս ֆայլին ավելացնենք և՛ նոր տիպի, և՛ SysEx հաղորդագրություններ.

# կապի ռեժիմներ INPUT = 0x00 # pin- ը սահմանվել է որպես մուտք OUTPUT = 0x01 # pin- ը սահմանվել է որպես ելք ANALOG = 0x02 # անալոգային քորոց անալոգային Մուտքի ռեժիմ PWM = 0x03 # թվային փին PWM ելքային ռեժիմում SERVO = 0x04 # թվային փին Servo ելքային ռեժիմում I2C = 0x06 # կապը ներառված է I2C կարգաբերման մեջ STEPPER = 0x08 # ցանկացած քորոց stepper ռեժիմում SERIAL = 0x0a PULLUP = 0x0b # pinանկացած քորոց քաշման ռեժիմում SONAR = 0x0c # pinանկացած քոր SONAR ռեժիմում TONE = 0x0d # pinանկացած քոր տոնային ռեժիմում PIXY = 0x0e # վերապահված է pixy տեսախցիկի ռեժիմին DHT = 0x0f # DHT տվիչ IGNORE = 0x7f # DHT SysEx հրամանի հաղորդագրություններ DHT_CONFIG = 0x64 # dht կազմաձևման հրաման DHT_DATA = 0x65 # dht տվիչի պատասխան

Ավելացված քորոցի տեսակը և SysEx հրամանները պետք է համապատասխանեն FirmataExpress- ին ավելացված FirmataConstants.h արժեքներին:

pymata4.py

Pymata4- ը օգտագործում է Python բառարան ՝ արագ Firmata հաղորդագրությունը արագորեն կապելու համար հաղորդագրությունների մշակողի հետ: Այս բառարանի անունը report_dispatch է:

Բառարանի գրառման ձևաչափն է.

{MessageID: [message_handler, տվյալների բայթերի քանակը, որոնք պետք է մշակվեն]}

Բառարանին մուտքագրվեց մուտքի DHT հաղորդագրությունները կարգավորելու համար:

{PrivateConstants. DHT_DATA ՝ [self._dht_read_response, 7]}

Հաղորդագրության 7 բայթ տվյալներն են Arduino թվային փին համարը, DHT սարքի տեսակը (22 կամ 11) և 5 բայթ չմշակված տվյալները:

_Dht_read_response մեթոդը ստուգում է հաղորդված սխալների առկայությունը: Եթե չկան հաղորդված սխալներ, խոնավությունը և ջերմաստիճանը հաշվարկվում են Arduino DHTNew գրադարանից տեղափոխված ալգորիթմի միջոցով:

Հաշվարկված արժեքները հաղորդվում են օգտագործողի կողմից տրամադրված հետադարձ կապի մեթոդի միջոցով: Նրանք նաև պահվում են ներքին pin_data տվյալների կառուցվածքում: Հաղորդված վերջին արժեքը կարող է հետ կանչվել ՝ dht_read մեթոդի միջոցով քվեարկելով pin_data:

Նոր DHT սարքի կազմաձևում

Նոր DHT սարք ավելացնելիս կոչվում է set_pin_mode_dht մեթոդը: Այս մեթոդը թարմացնում է pin_data- ն թվային կապում: Այն նաև ստեղծում և ուղարկում է DHT_CONFIG SysEx հաղորդագրություն FirmataExpress- ին:

Քայլ 5: Փաթեթավորում

Ինչպես տեսանք, նոր սարքի Firmata աջակցություն ավելացնելը պահանջում է փոփոխել Arduino FirmataExpress սերվերի ծածկագիրը և Python- ի վրա հիմնված pymata4 հաճախորդի ծածկագիրը: FirmataExpress ծածկագիրը կարող է դժվար լինել կարգաբերելու համար: FirmataExpress- ին ավելացվել է printData կոչվող մեթոդը ՝ վրիպազերծման գործընթացին օգնելու համար: Այս մեթոդը թույլ է տալիս տվյալների արժեքներ ուղարկել FirmataExpress- ից և դրանք տպել pymata4 վահանակի վրա:

Այս գործառույթը պահանջում է և՛ նիշերի տողի ցուցիչ, և՛ այն արժեքը, որը ցանկանում եք դիտել: Եթե տվյալների արժեքը պարունակվում է argc կոչվող փոփոխականում, կարող եք զանգահարել printData հետևյալ պարամետրերով:

printData ((char*) "argc =", argc);

Եթե ունեք հարցեր, թողեք մեկնաբանություն, և ես ուրախ կլինեմ պատասխանել:

Շնորհավոր կոդավորում:

Խորհուրդ ենք տալիս: