Étape 3: Le contrôle à distance code
Si vous êtes allé la manière dur & malpropre et fabriqué un PCB bord comme le mien, et si tout va bien alors ce code ci-dessous devrait fonctionner comme un charme. Si vous êtes allé la manière facile avec hors-la conseils plateau fabriqués par quelques mineurs d’édition de code moyen pourraient être nécessaires. Cette étape suppose que vous êtes familiarisé avec la programmation en C Arduino. Malgré tout, le code a beaucoup de commentaires qui je pense pourrait être utile à y naviguer.---LE CODE TÉLÉCOMMANDE---
inclure le code de bibliothèque :
#include < LiquidCrystal.h >
#include < SPI.h >
#include « nRF24L01.h »
#include « RF24.h »
/ *---MON STRUCTS PERSONNALISÉS « ENVELOPPE »---* /
struct pour diffuser des messages
typedef struct {}
int X ;
int Y ;
booléenne touches [4] ;
}
Charge utile ;
struct pour obtenir
données télémétriques
typedef struct {}
int rudderAng ;
int Z ;
int S ;
}
Vos commentaires ;
/ *---BATTERIE SUIVI DES VARIABLES CONNEXES---* /
broches analogiques lire V_out/V2 de diviseur de tension
const int battPin = A5 ;
référence par défaut sur le circuit utilisé (5.0, 3.3, 1.1)
const double refV = 5.0 ;
Combien de volts est 1 mesure de l’ADC ?
V_incr double const = refV/1024.0 ;
valeurs des résistances utilisées pour diviseur de tension
const double R1 = 68,4 ;
const double R2 = 46,6 ;
déterminer le ratio de diviseur de tension
voltageRatio double const = (R2 /(R1 + R2)) ;
/ *---LES VARIABLES LIÉES AU BOUTON---* /
broche « pad » bouton
const int buttonPin = A3 ;
Schémas de configuration de touche
Broche analogique 5
// |
//Ground--1K--|--------|--------|-------|
// | | | |
btn1 btn2 btn3 btn4
// | | | |
220 Ohm Ohm 390 680 ohms 2,2 K
// |--------|--------|-------|-- +5V
int j = 1 ;
« j » est le nombre entier utilisé dans l’analyse du tableau désignant le numéro de colonne
Ces gammes ci-dessous reposent sur les schémas ci-dessus et peut
doivent être modifiés manuellement pour compenser les divers facteurs
int touche [15] [3] = {{1, 836, 840}, / / bouton 1
{2, 732, 738}, / / bouton 2
{3, 600, 625}, / / bouton 3
{4, 310, 335}, / / bouton 4
{5, 890, 900}, / / bouton 1 + 2
{6, 870, 880}, / / bouton 1 + 3
{7, 840, 860}, / / bouton 1 + 4
{8, 810, 830}, / / bouton 2 + 3
{9, 760, 780}, / / bouton 2 + 4
{10, 665, 685} / / bouton 3 + 4
};
étiquette d’int = 0 ; pour avoir signalé l’étiquette du bouton
int compteur = 0 ; Combien de fois nous avons vu la nouvelle valeur
long temps = 0 ; la dernière fois que la broche de sortie a été échantillonnée
int debounce_count = 5 ; nombre de millis/échantillons à examiner avant de déclarer une entrée debounced
int current_state = 0 ; la valeur d’entrée debounced
int ButtonVal ;
/* ---------------------------------------------------------------------------------------------------- */
initialiser la bibliothèque avec les numéros des broches interface
Innovente lcd (8, 7, 5, 4, 3, 2) ;
initialiser la radio avec CE, codes pin CN
RF24 radio(9,10) ;
const uint64_t pipes [2] = {}
0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL} ;
OUT-« pigeon »
Paquet de charge utile ;
IN-« pigeon »
Vos commentaires telemetrics ;
long previousMillis = 0 ;
intervalle long = 25 ;
/* ---------------------------------------------------------------------------------------------------- */
/ * CONFIGURATION * /
void setup() {}
Serial.Begin(57600) ;
radio.Begin() ;
radio.openWritingPipe(pipes[0]) ;
radio.openReadingPipe(1,pipes[1]) ;
radio.startListening() ;
pinMode (buttonPin, entrée) ;
mis en place nombre de l’écran LCD de colonnes et de lignes :
LCD.Begin (16, 2) ;
}
/* ------------------------------------------------------------------------ */
/ *---BIENVENUE À LA BOUCLE---* /
/* ------------------------------------------------------------------------ */
void loop() {}
surveiller la tension de la batterie de la télécommande
int val = analogRead(battPin) ;
double BattV usagées = VoltageCheck(val) ;
paquet. X = analogRead(A0) ;
Delay(1) ;
paquet. Y = analogRead(A1) ;
Delay(1) ;
/ *---POIGNÉE BOUTON PRESSES---* /
Si nous sommes allés à la prochaine milliseconde
Si (millis()! = temps)
{
Vérifiez la valeur de la touche analogique goupille et l’enregistrer sur ButtonVal
ButtonVal = analogRead(buttonPin) ;
Delay(1) ;
Serial.println(ButtonVal) ; DÉBOGAGE
Si (ButtonVal == current_state & & compteur > 0)
{
compteur--;
}
Si (ButtonVal! = current_state)
{
compteur ++ ;
}
Si ButtonVal a montré la même valeur pour assez longtemps nous allons passer
Si (compteur > = debounce_count)
{
compteur = 0 ;
current_state = ButtonVal ;
Vérifie quel bouton ou combo touche a été enfoncée
Si (ButtonVal > 100) {}
ButtonCheck();} else {}
Package.Buttons[0] = 0 ;
Package.Buttons[1] = 0 ;
Package.Buttons[2] = 0 ;
Package.Buttons[3] = 0;}
}
temps = millis() ;
}
/ *---RADIO « TOUR » GROUND CONTROL---* /
Si (radio.available())
{
bool = false ;
tandis que (! fait)
{
fait = radio.read (& telemetrics, sizeof(telemetrics)) ;
}
radio.stopListening() ;
bool ok = radio.write (& package, sizeof(package)) ;
radio.startListening() ;
}
/ *---AFFICHAGE À CRISTAUX LIQUIDES POIGNÉE---* /
/ * LIGNE 1 * /
lcd.setCursor(0,0) ;
sale hack codé ci-dessous
if(telemetrics. Z 100 <) {}
lcd.setCursor(2,0) ;
LCD.Print("") ;
lcd.setCursor(0,0) ;
}
LCD.Print (telemetrics. Z) ;
lcd.setCursor(6,0) ;
sale hack codé ci-dessous
Si {(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 (telemetrics. S) ;
/ * LIGNE 2 * /
lcd.setCursor (0, 1) ;
LCD.Print ("X:") ;
lcd.setCursor (2, 1) ;
LCD.Print (paquet. X) ;
lcd.setCursor (6, 1) ;
LCD.Print ("y") ;
lcd.setCursor (8, 1) ;
LCD.Print (paquet. Y) ;
lcd.setCursor(12,1) ;
LCD.Print(battV) ;
/* --------------------------------------------------------------------------- */
} / / fermer loop()
/* ------------------------------ HELPING FUNCTIONS ------------------------------ */
lire cette tension de la batterie
double VoltageCheck (int v) {}
double pinV = v * V_incr ;
double volts_in = pinV * 1/voltageRatio ;
Return volts_in ;
}
vérifie quel bouton (ou combo de 2) a été enfoncée, le cas échéant...
Sub ButtonCheck()
{
boucle pour le tableau de boutons de numérisation.
pour (int i = 0; i < = 10; i ++)
{
vérifie la ButtonVal contre les hautes et basses vallées du tableau
Si (ButtonVal > = touche [i] [j] & & ButtonVal < = Button[i][j+1])
{
stocke le numéro de bouton à une variable
label = touche [i] [0] ;
commutateur (étiquette) {}
cas 1 :
Package.Buttons[0] = 1 ;
Package.Buttons[1] = 0 ;
Package.Buttons[2] = 0 ;
Package.Buttons[3] = 0 ;
Serial.println ("bouton 1") ;
rupture ;
cas 2 :
Package.Buttons[0] = 0 ;
Package.Buttons[1] = 1 ;
Package.Buttons[2] = 0 ;
Package.Buttons[3] = 0 ;
Serial.println ("bouton 2") ;
rupture ;
cas 3 :
Package.Buttons[0] = 0 ;
Package.Buttons[1] = 0 ;
Package.Buttons[2] = 1 ;
Package.Buttons[3] = 0 ;
Serial.println ("bouton 3") ;
rupture ;
cas 4 :
Package.Buttons[0] = 0 ;
Package.Buttons[1] = 0 ;
Package.Buttons[2] = 0 ;
Package.Buttons[3] = 1 ;
Serial.println ("bouton 4") ;
rupture ;
cas no 5 :
Serial.println ("bouton 1 + 2") ;
Package.Buttons[0] = 1 ;
Package.Buttons[1] = 1 ;
Package.Buttons[2] = 0 ;
Package.Buttons[3] = 0 ;
rupture ;
cas 6 :
Serial.println ("bouton 1 + 3") ;
Package.Buttons[0] = 1 ;
Package.Buttons[1] = 0 ;
Package.Buttons[2] = 1 ;
Package.Buttons[3] = 0 ;
rupture ;
cas 7 :
Serial.println "(bouton 1 + 4") ;
Package.Buttons[0] = 1 ;
Package.Buttons[1] = 0 ;
Package.Buttons[2] = 0 ;
Package.Buttons[3] = 1 ;
rupture ;
cas 8 :
Serial.println "(bouton 2 + 3") ;
Package.Buttons[0] = 0 ;
Package.Buttons[1] = 1 ;
Package.Buttons[2] = 1 ;
Package.Buttons[3] = 0 ;
rupture ;
cas 9 :
Serial.println "(bouton 2 + 4") ;
Package.Buttons[0] = 0 ;
Package.Buttons[1] = 1 ;
Package.Buttons[2] = 0 ;
Package.Buttons[3] = 1 ;
rupture ;
cas no 10 :
Serial.println "(bouton 3 + 4") ;
Package.Buttons[0] = 0 ;
Package.Buttons[1] = 0 ;
Package.Buttons[2] = 1 ;
Package.Buttons[3] = 1 ;
rupture ;
} / / interrupteur à proximité
}
}
}