Stap 3: De code van de afstandsbediening
Als je ging de harde & rommelige manier en een PCB boord zoals de mijne en verzonnen als alles ging Nou dan dit onderstaande code zou moeten werken zoals te tovermiddel. Als je ging de gemakkelijke manier met uit-het is mogelijk de plank per-verzonnen planken enkele kleine tot middelgrote codebewerking vereist. Deze stap wordt ervan uitgegaan dat u bekend bent met de Arduino C programmeren. Ongeacht heeft de code tal van opmerkingen die mij misschien wel handig om te navigeren.---DE AFSTANDSBEDIENING CODE---
de code van de bibliotheek omvatten:
#include < LiquidCrystal.h >
#include < SPI.h >
#include "nRF24L01.h"
#include "RF24.h"
/ *---MIJN OP MAAT 'ENVELOP' STRUCTS---* /
struct te voeren berichten
typedef struct {}
int X;
int Y;
Booleaanse knoppen [4];
}
Lading;
struct te krijgen
telemetrische gegevens
typedef struct {}
int rudderAng;
int Z;
int S;
}
Feedback;
/ *---BATTERIJ MONITORING VAN VERWANTE VARIABELEN---* /
analoge pin V_out/V2 lezen van spanning divider
Const int battPin = A5;
standaard referentie op circuit gebruikt (5.0, 3.3, 1.1)
Const dubbele refV = 5.0;
Hoeveel volt doet 1 ADC maatregel?
Const dubbele V_incr = refV/1024.0;
waarden van weerstanden gebruikt voor spanning divider
Const dubbele R1 = 68,4;
Const dubbele R2 = 46.6;
bepalen van de verhouding van de spanning divider
Const dubbele voltageRatio = (R2 /(R1 + R2));
/ *---KNOP-GERELATEERDE VARIABELEN---* /
knop 'pad' pin
Const int buttonPin = A3;
Knop installatie schema
Analoge pin 5
// |
//Ground--1K--|--------|--------|-------|
// | | | |
btn1 btn2 btn3 btn4
// | | | |
220 Ohm 390 Ohm 680 Ohm 2.2K
// |--------|--------|-------|-- +5V
int j = 1;
'j' is het gehele getal gebruikt bij het scannen van de array kolomnummer aanwijzen
deze bereiken hieronder zijn afhankelijk van de schema's hierboven en kan
moeten handmatig worden aangepast om te compenseren voor verschillende factoren
int knop [15] [3] = {{1, 836, 840} / / knop 1
{2, 732, 738} / / knop 2
{3, 600, 625} / / knop 3
{4, 310, 335} / / button 4
{5, 890, 900} / / button 1 + 2
{6, 870, 880} / / button 1 + 3
{7, 840, 860} / / button 1 + 4
{8, 810, 830} / / button 2 + 3
{9, 760, 780} / / button 2 + 4
{10, 665, 685} / / knop 3 + 4
};
int label = 0; voor het melden van het label van de button
int counter = 0; Hoeveel keer hebben we nieuwe waarde
lange tijd = 0; de laatste keer dat de uitgang-pins werd bemonsterd
int debounce_count = 5; aantal millis/monsters om te overwegen vóór het declareren van een debounced-ingang
int current_state = 0; de debounced invoerwaarde
int ButtonVal;
/* ---------------------------------------------------------------------------------------------------- */
initialiseren van de bibliotheek met de nummers van de pennen van de interface
LiquidCrystal lcd (8, 7, 5, 4, 3, 2);
initialiseren van radio met CE, CN pincodes
RF24 radio(9,10);
Const uint64_t pijpen [2] = {}
0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
OUT-'duif'
Pakket van de lading;
IN-'duif'
Feedback telemetrie;
lange previousMillis = 0;
lange interval = 25;
/* ---------------------------------------------------------------------------------------------------- */
/ * INSTALLATIE * /
VOID Setup {}
Serial.begin(57600);
Radio.begin();
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.startListening();
pinMode (buttonPin, INPUT);
de LCD's aantal kolommen en rijen instellen:
LCD.begin (16, 2);
}
/* ------------------------------------------------------------------------ */
/ *---WELKOM OP DE LUS---* /
/* ------------------------------------------------------------------------ */
void loop {}
monitor accuspanning op afstandsbediening
int val = analogRead(battPin);
dubbele battV = VoltageCheck(val);
pakket. X = analogRead(A0);
delay(1);
pakket. Y = analogRead(A1);
delay(1);
/ *---HANDVAT KNOOPPERSEN---* /
Als we zijn gegaan op naar de volgende milliseconde
Als (millis()! = tijd)
{
analoge pin voor de waarde van de knop controleren en sla het op ButtonVal
ButtonVal = analogRead(buttonPin);
delay(1);
Serial.println(ButtonVal); DEBUG
Als (ButtonVal == current_state & & teller > 0)
{
teller--;
}
Als (ButtonVal! = current_state)
{
teller ++;
}
Als ButtonVal heeft aangetoond dezelfde waarde voor lang genoeg laten we schakelen
Als (teller > = debounce_count)
{
Counter = 0;
current_state = ButtonVal;
Controleert welke knop of de keuzelijst met de knop is ingedrukt
Als (ButtonVal > 100) {}
ButtonCheck();} else {}
package.buttons[0] = 0;
package.buttons[1] = 0;
package.buttons[2] = 0;
package.buttons[3] = 0;}
}
tijd = millis();
}
/ *---RADIO 'TOWER' GROUND CONTROL---* /
Als (radio.available())
{
BOOL = false;
terwijl (! gedaan)
{
= radio.read (& telemetrie, sizeof(telemetrics));
}
radio.stopListening();
BOOL ok = radio.write (& pakket, sizeof(package));
radio.startListening();
}
/ *---HANDVAT LCD DISPLAY---* /
/ * LIJN 1 * /
lcd.setCursor(0,0);
vuile hardgecodeerde houwer hieronder
if(telemetrics. Z < 100) {}
lcd.setCursor(2,0);
LCD.Print("");
lcd.setCursor(0,0);
}
LCD.Print (telemetrie. Z);
lcd.setCursor(6,0);
vuile hardgecodeerde houwer hieronder
Als (telemetrics.rudderAng < 100) {}
lcd.setCursor(8,0);
LCD.Print("");
lcd.setCursor(6,0);
}
LCD.Print(telemetrics.rudderAng);
lcd.setCursor(12,0);
if(telemetrics. S < 100) {}
lcd.setCursor(14,0);
LCD.Print("");
lcd.setCursor(12,0);
}
LCD.Print (telemetrie. S);
/ * LIJN 2 * /
lcd.setCursor (0, 1);
LCD.Print ("X:");
lcd.setCursor (2, 1);
LCD.Print (pakket. X);
lcd.setCursor (6, 1);
LCD.Print ("Y:");
lcd.setCursor (8, 1);
LCD.Print (pakket. Y);
lcd.setCursor(12,1);
LCD.Print(battV);
/* --------------------------------------------------------------------------- */
} / / Sluit loop
/* ------------------------------ HELPING FUNCTIONS ------------------------------ */
Lees dat accuspanning
dubbele VoltageCheck (int v) {}
dubbele pinV = v * V_incr;
dubbele volts_in = pinV * 1/voltageRatio;
Return volts_in;
}
controleert welke knop (of een combo van 2) heeft gedrukt, eventueel...
VOID ButtonCheck()
{
lus voor het scannen van de knop-matrix.
for (int i = 0; ik < = 10; i ++)
{
controleert de ButtonVal tegen de boven- en onderlimieten vales in de matrix
Als (ButtonVal > = knop [i] [j] & & ButtonVal < = Button[i][j+1])
{
de knop getal aan een variabele wordt opgeslagen
Label = knop [i] [0];
schakelaar (label) {}
Case 1:
package.buttons[0] = 1;
package.buttons[1] = 0;
package.buttons[2] = 0;
package.buttons[3] = 0;
Serial.println ("knop 1");
breken;
Case 2:
package.buttons[0] = 0;
package.buttons[1] = 1;
package.buttons[2] = 0;
package.buttons[3] = 0;
Serial.println ("knop 2");
breken;
Case 3:
package.buttons[0] = 0;
package.buttons[1] = 0;
package.buttons[2] = 1;
package.buttons[3] = 0;
Serial.println ("knop 3");
breken;
Case 4:
package.buttons[0] = 0;
package.buttons[1] = 0;
package.buttons[2] = 0;
package.buttons[3] = 1;
Serial.println ("knop 4");
breken;
Case 5:
Serial.println ("knop 1 + 2");
package.buttons[0] = 1;
package.buttons[1] = 1;
package.buttons[2] = 0;
package.buttons[3] = 0;
breken;
Case 6:
Serial.println ("knop 1 + 3");
package.buttons[0] = 1;
package.buttons[1] = 0;
package.buttons[2] = 1;
package.buttons[3] = 0;
breken;
Case 7:
Serial.println ("knop 1 + 4");
package.buttons[0] = 1;
package.buttons[1] = 0;
package.buttons[2] = 0;
package.buttons[3] = 1;
breken;
zaak 8:
Serial.println ("knop 2 + 3");
package.buttons[0] = 0;
package.buttons[1] = 1;
package.buttons[2] = 1;
package.buttons[3] = 0;
breken;
Case 9:
Serial.println ("knop 2 + 4");
package.buttons[0] = 0;
package.buttons[1] = 1;
package.buttons[2] = 0;
package.buttons[3] = 1;
breken;
zaak 10:
Serial.println ("knop 3 + 4");
package.buttons[0] = 0;
package.buttons[1] = 0;
package.buttons[2] = 1;
package.buttons[3] = 1;
breken;
} / / sluiten van de schakelaar
}
}
}