Lecții arduino

Lecții arduino

Vom învăța cum să creați propria noastră bibliotecă pentru programare în Arduino.

În ultima lecție, am terminat crearea clasei Button - butonul. Toate au fost verificate, au fost depanate codul și o vom folosi în alte proiecte pentru Arduino. Numai cum să utilizați practic clasa creată. Nu sa dovedit cu succes.







  • În noul program, trebuie să copiați descrierea clasei și codul metodei. În acest caz, trebuie să selectați aceste blocuri din programul vechi și să nu confundați nimic.
  • Aceste părți ale programului au fost mult timp testate, depistate și uitate. Cu toate acestea, ele se vor întâlni întotdeauna, vor spori codul programului, vor înrăutăți structura și lizibilitatea.
  • Chiar și în aceste module, puteți înregistra accidental o eroare și apoi copiați versiunea greșită la următoarele programe.

O soluție plăcută și practică este crearea unei biblioteci pentru un obiect Button.

Secvența de acțiuni pentru crearea unei biblioteci în programele pentru Arduino.

Biblioteca din Arduino nu este altceva decât o clasă suplimentară. De aceea, în primul rând, este necesar să definim funcții pentru bibliotecă ca o clasă. Cum se face acest lucru este descris în detaliu în lecția 7.

Proiectați-vă funcțiile ca o clasă înainte de a continua și folosiți clasa Button pregătită din lecția 8.

Biblioteca trebuie să aibă cel puțin două fișiere:

  • fișierul antet (extensia .h);
  • fișier cu cod sursă (extensie .cpp).

Primul fișier conține o descriere a clasei în sine, a variabilelor, a constantelor. Codul programului nu este aici. Iar al doilea fișier conține codul de program al metodelor.

Apelați noua bibliotecă Button și creați fișierul header Button.h.

Fișierul de antet Button.h

informații despre bibliotecă

Tot restul conținutului fișierului h, trebuie să încheiem în proiect:

// verificați dacă biblioteca nu este încă conectată
#ifndef Button_h // dacă biblioteca de butoane nu este conectată
#define Button_h // apoi conectați-l

Aceste directive exclud excluderea din bibliotecă.

În interiorul structurii scrieți:

Directiva #include instruiește compilatorul să includă în codul de program textul din fișier, al cărui nume urmează directiva. În acest caz, va fi inclus fișierul Arduino.h care conține constantele standard și variabilele limbajului Arduino. În programele normale, acesta este adăugat automat, iar pentru bibliotecă trebuie specificat în mod explicit.

Rămâne să adăugăm o descriere a clasei noastre Button. Completați fișierul Button.h arată astfel.

/ *
Button.h - bibliotecă pentru procesarea digitală a contactelor cu butoane
și semnale ale altor componente printr-un proces paralel

Într-un proces paralel, una dintre următoarele metode ar trebui să fie numită în mod regulat:
void scanState (); // metoda de testare care așteaptă o stare de semnal stabilă
void filterAvarage (); // metoda de filtrare a semnalului cu valoarea medie

Ca urmare, se formează următoarele semne:

pentru metoda scanState ():
- flagPress = adevărat
- flagPress = false când este apăsat butonul
- când faceți clic pe butonul flagClick = adevărat

pentru metoda filterAvarage ():
- la un semn de semnal scăzutPress = adevărat
- la semn de semnal înaltPress = false
- atunci când schimbați statul de la înalt la scăzut flagClick = true

Obiectul unui buton are următorii parametri atunci când creează:
- numărul ieșirii la care este conectat butonul sau semnalul
- timpul de procesare a semnalului (înmulțit cu perioada apelului metodei scanState () sau filterAvarage ()

Butonul buton 1 (12, 15); // creați un obiect pentru butonul conectat la pinul 12
cu un timp de filtrare de 30 ms (cu un ciclu de 2 ms)

// verificați dacă biblioteca nu este încă conectată
#ifndef Button_h // dacă biblioteca de butoane nu este conectată
#define Button_h // apoi conectați-l

// clasa de prelucrare a semnalului
clasa Button
publice:
Buton (octet octet, byte timeButton); // constructor
boolean flagPress; // se apasă butonul atribut (semnal la nivel scăzut)
boolean flagClick; // semnul clicului pe buton (din față)
void scanState (); // metoda de testare care așteaptă o stare de semnal stabilă
void filterAvarage (); // metoda de filtrare după valoarea medie
void setPinTime (octet octet, byte timeButton); // setați numărul de ieșire și timpul de filtrare

privat:
byte _buttonCount; // contor de timp filtru
byte _timeButton; // timpul de filtrare
byte _pin; // numărul de ieșire
>;

Fișierul sursă pentru biblioteca Button.cpp.

La începutul fișierului, vom plasa aceleași informații textuale ca și în Button.h. Nu se știe care dintre fișiere va fi studiată de utilizator.

Apoi, scriem direcțiile #include pentru a include funcțiile standard Arduino și fișierul antet.

#include "Arduino.h"
#include "Button.h"

Și apoi codurile metodelor noastre de clasă.







Complet fișierul Button.cpp arată astfel:

/ *
Button.h - bibliotecă pentru procesarea digitală a contactelor cu butoane
și semnale ale altor componente printr-un proces paralel

Într-un proces paralel, una dintre următoarele metode ar trebui să fie numită în mod regulat:
void scanState (); // metoda de testare care așteaptă o stare de semnal stabilă
void filterAvarage (); // metoda de filtrare a semnalului cu valoarea medie

Ca urmare, se formează următoarele semne:

pentru metoda scanState ():
- flagPress = adevărat
- flagPress = false când este apăsat butonul
- când faceți clic pe butonul flagClick = adevărat

pentru metoda filterAvarage ():
- la un semn de semnal scăzutPress = adevărat
- la semn de semnal înaltPress = false
- atunci când schimbați statul de la înalt la scăzut flagClick = true

Obiectul unui buton are următorii parametri atunci când creează:
- numărul ieșirii la care este conectat butonul sau semnalul
- timpul de procesare a semnalului (înmulțit cu perioada apelului metodei scanState () sau filterAvarage ()

Butonul buton 1 (12, 15); // creați un obiect pentru butonul conectat la pinul 12
cu un timp de filtrare de 30 ms (cu un ciclu de 2 ms)

#include "Arduino.h"
#include "Button.h"
// metoda de filtrare a semnalului cu valoarea medie
// pentru un semnal de nivel scăzut flagPress = true
// pentru un semnal de nivel înalt flagPress = false
// atunci când starea se schimbă de la înalt la jos flagClick = true
void Button :: filterAvarage ()

dacă (flagPress! = digitalRead (_pin))
// starea butonului rămâne aceeași
dacă (_buttonCount! = 0) _buttonCount--; // contor de confirmări - 1 cu restricție la 0
>
altfel
// starea butonului a fost modificată
_buttonCount ++; // +1 la numărul de confirmări

dacă (_buttonCount> = _timeButton)
// starea semnalului a atins pragul _timeButton
flagPress =. flagPress; // inversarea semnului de stat
_buttonCount = 0; // reinițializați numărul de confirmări

dacă (flagPress == true) flagClick = true; / / semn de clic pe buton
>
>
>
// metoda de testare care așteaptă o stare de semnal stabilă
// când este apăsat butonul flagPress = true
// când apăsați flagPress = false
// când faceți clic pe flagClick = true
void Button :: scanState ()

dacă (flagPress! = digitalRead (_pin))
// flagPress flag = starea butonului curent
// (inversă de la starea activă a butonului LOW)
// ie. starea butonului rămâne aceeași
_buttonCount = 0; // resetați contorul de confirmare a stării butoanelor
>
altfel
// flagPress flag not = starea butonului curent
// starea butonului a fost modificată
_buttonCount ++; // +1 la contorul de stare a butonului

dacă (_buttonCount> = _timeButton)
// starea butonului nu a căzut pentru timpul specificat
// starea butonului a devenit stabilă
flagPress =. flagPress; // inversarea semnului de stat
_buttonCount = 0; // resetați contorul de confirmare a stării butoanelor

dacă (flagPress == true) flagClick = true; // semnul frontal al butonului care trebuie apăsat
>
>
>
// metoda de setare a numărului de ieșire și a duratei de confirmare
void Button :: setPinTime (octet octet, byte timeButton)

_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definiți ieșirea ca intrare
>

// descrierea constructorului clasei Button
Buton :: buton (octet octet, byte timeButton)

_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definiți ieșirea ca intrare
>

Pentru ca Arduino IDE să evidențieze noi tipuri și metode din biblioteca noastră, puteți crea un fișier numit keywords.txt.

scanState KEYWORD2
filterAvarage KEYWORD2
setPinTime KEYWORD2

Fiecare rând conține un cuvânt cheie, o filă (nu spații) și tipul cuvântului cheie. KEYWORD1 definește clasele, metodele KEYWORD2.

Descărcați arhiva zip cu trei fișiere ale bibliotecii Button aici.

Acum trebuie să plasați corect fișierele de bibliotecă.

  • Am lansat ID-ul Arduino.
  • Fișier -> Setări -> Locația folderului schiță a fost setată de D: \ Arduino Projects. Am indicat dosarul proiectelor mele Arduino (D: \ Arduino Projects).
  • În acest dosar, am creat dosarul de biblioteci (D: \ Arduino Projects \ libraries).
  • În dosarul biblioteci, ați creat un dosar pentru noua bibliotecă Button (D: \ Arduino Projects \ libraries \ Button).
  • Și deja în acest dosar copiați fișierele Button.h. Button.cpp și keywords.txt.

Pentru verificare, trebuie să închideți și să reporniți ID-ul Arduino. Deschideți schița -> Conectați biblioteca și vedeți că există o nouă bibliotecă de butoane din lista de biblioteci.

Cum se utilizează biblioteca.

Este foarte simplu. La începutul programului, includeți fișierul antet cu o directivă

Acum puteți folosi toate metodele deschise și variabilele clasei Button în același mod ca și în lecția precedentă.

Rescriem programul de control al LED-urilor din lecția anterioară. Folosind natural biblioteca Button.

/ * Program sketch_9_1 lecție 9
* 2 butoane și LED-uri sunt conectate la placa Arduino
* Fiecare apăsare a butonului 1 inversează starea LED-ului pe placa Arduino
* Fiecare apăsare a butonului 2 inversează starea LED-ului pe panoul de paine * /

#define LED_1_PIN 13 // LED 1 conectat la pinul 13
#define BUTTON_1_PIN 12 // butonul 1 este conectat la pinul 12
#define BUTTON_2_PIN 11 // butonul 2 este conectat la pinul 11
#define LED_2_PIN 10 // LED-ul 2 conectat la pinul 10

boolean ledState1; // variabilă LED 1
boolean ledState2; // variabilă LED 2

Butonul buton 1 (BUTTON_1_PIN, 15); // crea un obiect pentru butonul 1
Butonul buton2 (BUTTON_2_PIN, 15); // crea un obiect pentru butonul 2

void setup ()
pinMode (LED_1_PIN, OUTPUT); // determina ieșirile LED-urilor ca ieșiri
pinMode (LED_2_PIN, OUTPUT);
>

button1.filterAvarage (); // apelați metoda filtru pe mijloc pentru butonul 1
butonul2.scanState (); // apelați starea stabilă de așteptare pentru butonul 2


// Unitate de control LED 1
dacă (button1.flagClick == true)
/ / a fost un clic pe un buton
button1.flagClick = false; // resetați caracteristica
ledState1 =. ledState1; // starea de inversiune a LED-ului
digitalWrite (LED_1_PIN, ledState1); // scoateți starea LED-ului
>

// Unitate de control LED 2
dacă (button2.flagClick == true)
/ / a fost un clic pe un buton
button2.flagClick = false; // resetați caracteristica
ledState2 =. ledState2; // starea de inversiune a LED-ului
digitalWrite (LED_2_PIN, ledState2); // scoateți starea LED-ului
>

Nimic inutil. Numai obiectele cu care lucrăm.

Un exemplu bun de adăugat la fișierele de bibliotecă sunt exemplele. Dar vom avea suficiente exemple în lecțiile ulterioare.

În următoarea lecție vom învăța cum să lucrăm cu întreruperi pe cronometrul hardware.

Sau poate că ar fi mai bine să nu includeți biblioteca extensiei portului în biblioteca Button, ci să o includeți în programul principal? Dar apoi nu-mi dau seama cum să atribuiți corect pini unui obiect Button folosind biblioteca

Bună ziua Edward! Aveți o soluție pregătită sau o bibliotecă de filtre de intrare cu nivel ridicat activ? Se presupune că este folosit pentru a filtra semnalul de la diferite module de arduino în care nivelul activ ridicat. Mulțumesc

Bine ai venit!
Pentru a face acest lucru, este suficient să faceți modificări în fișierul Button.cpp în 2 locuri.

dacă (flagPress! = digitalRead (_pin)) este înlocuită cu
dacă (flagPress == digitalRead (_pin))

De fapt, ieșirea este inversată.







Articole similare

Trimiteți-le prietenilor: