Automatisera ditt hem genom dina fingerrörelser (4 / 6 steg)
Steg 4: Controller (The Arduino kod)
För att använda accelerometern behöver du HMC5883L bibliotek
För IR-kommunikation bör du använda detta bibliotek
Jag utarbetat min kod för att få funktioner:
flyta getRotation (char x):
denna funktion få accelerometer rotation och X -variabel definiera häxa axel att återvända.
flyta getRotation(char x) {float nummer.
sensors_event_t händelse;
mag.getEvent(&event); läsa data från accelerometern
om (x == "x") {rubrik = ARCTAN2 (event.magnetic.x, event.magnetic.y);}
annars om (x == "y") {rubrik = ARCTAN2 (event.magnetic.y, event.magnetic.z);}
annars om (x == "z") {rubrik = ARCTAN2 (event.magnetic.z, event.magnetic.x);}
returnera rubriken * 180/M_PI; }
bool verifiera (float nuvarande [3], float ursprung [4] [3], byte rad):
funktionen kontrollerar om accelerometern i en specifik position genom att jämföra Läs data lagras i matrisen "nuvarande [3]' till data i matrisen"ursprung [4] [3]"denna matris har 4 rader till varje punkt (i våra ritningar har vi bara 4 poäng) och variabeln 'rad' häxan rad att använda.
bool verifiera (float nuvarande [3], float origin_ [4] [3], int rad) {byte toler = 37. //this variabel ange toleransen att respektera
returnera SANT om under nästa förutsättningar
återgå origin_ [rad] [0]-toler < = nuvarande [0] & &
aktuella [0] < origin_ [rad] [0] + toler & &
origin_ [rad] [1]-toler < = nuvarande [1] & &
aktuella [1] < origin_ [rad] [1] + toler & &
origin_ [rad] [2]-toler < = nuvarande [2] & &
aktuella [2] < origin_ [rad] [2] + toler ;}
byte getPoint (float ursprung [4] [3]):
här fungerar kombinera de två sista funktionerna och returnera den accelerometer läge:
(Up(return 1), höger (retur 2), ner (avkastning 3), Left(return 4))
byte getPoint (float origin__ [4] [3]) {byte return_ = 0;
float current[3]={getRotation('x'),
getRotation('y'),
getRotation('z')};
om (verifiera (nuvarande, origin__, 0)) {return_ = 1;}
annars om (verifiera (nuvarande, origin__, 1)) {return_ = 2;}
annars om (verifiera (nuvarande, origin__, 2)) {return_ = 3;}
annars om (verifiera (nuvarande, origin__, 3)) {return_ = 4;}
återvända return_;
}
bool jämför (byte Mdrawing [4] [4], byte rad):
den här funktionen får de successiva poäng och se om de är i samma ordning av de punkter som lagras i "Mdrawing[4] [4]" det är 4 raws i denna matris som beror på hur mycket ritningar du har förklarat, i detta har vi bara 4 ritningar
bool jämför (byte Mdrawing [4] [4], byte rad) {byte Cpoint = getPoint (ursprung); //read den nuvarande punkten av accelerometern (ursprunget är en global variabel, det är rotationer för varje punkt)
byte Ppoint = 0; / / denna variabel kommer beståndet tidigare poäng
byte y = 0;
byte x = 0;
medan (Mdrawing [rad] [x]! = 0 & & x < 4) {x ++;} få antalet kolumner att värdet är annorlunda än 0
While(y<x) {
Cpoint = getPoint (ursprung); //read den nuvarande punkten
om (Cpoint == Mdrawing [rad] [y] & & Cpoint! = 0) {Ppoint = Cpoint; //if den nuvarande punkten är i samma ordning på punkten i "Mdrawing"
medan (Ppoint == Cpoint & & y!=x-1){Cpoint=getPoint(origin);} vänta att nuvarande punkt förändring
y++;} passera till nästa punkt
annars om (Cpoint! = Mdrawing [rad] [y] & & Cpoint! = 0) {return 0 ;}} om den aktuella punkten är annorlunda än punkten i "Mdrawing"
tillbaka 1.}
float ursprung [4] [3]:
denna samling innehåller rotation av varje poäng som du kan definiera den med filen kalibrering. Det ser ut:
flyta ursprung [4] [3] =
{{71.93,149.56,-29.04},//up punkt
{5.97,126.75,-82.03},//right punkt
{-72.14,162.31,-134.71},//down punkt
{97.64,-174.11,-52.44}};//left punkt
byte Mdrawing [4] [4]:
denna samling innehåller ordern att punkterna som ska för att göra en särskild ritning till exempel:(picture 1)