Bonjour a tous
Je me présente, Thierry, pseudo Papy94, 57 ans et grand père depuis 3 semaines
Malheureusement, Je pense que je ne pourrais rien vous apporter et que je serais plutôt du type boulet car plutôt manuel, mais j’essayerais de rester discret
Je fais du modélisme ,dans les sous-marin, l’arduino NANO me plait bien pour sa taille, et me paraissait d’un abord facile d’après ce que j’avais lu sur le web
Mon but :
Avec un capteur de pression, gérer des sécurités profondeur maxi, faire monter et descendre les périscopes
Avec un accéléromètre, gérer ce qu’on appelle la pesée du sous-marin (garder niveau horizontal)
Mesurer la tension de ma batterie
Mesurer la température
Définir un niveau d’alarme
J’ai donc écrit un programme, en piochant à droite et à gauche sur le web
Ce programme fonctionne correctement, il ne respect surement pas les conventions d’écritures, mais comme je n’ai jamais appris et que passé les 50 ans les cellules du cerveau se barrent, il ne faut pas m’en vouloir
morceaux du programme explications du fonctionnement et code envois des données
je n'ai pas put coller tout le code de mon programme arduino émission qui fonctionne,je dépasse le nbre de lignes autorisé ,je le met en zip
/* --- Programme Arduino version 1.0.1--- 03/06/2013
MMA7361 (A7)--> Arduino Nano--< 2 servos(D11,D12) , recepteur voie 8 = (A0)
permet l'equilibrage automatique du soum si la voie 8 du recepteur est activee
alimentation du MMA7361 ainsi que les 2 servos en 3.3 volts via l'arduino niveau = 330
alimentation du MMA7361 ainsi que les 2 servos en 5 volts via l'arduino niveau = 570
BMP085 (A4 & A5)(--> Arduino Nano--< servo ballast(D10) et periscope , recepteur voie 6 = (A1)
Permet de mettre le servo ballast en position vidange si profondeur maxi depassee, prend la main sur la voie6
Permet de faire monter ou descendre le periscope en fonction de la profondeur
Detecteur d eau (D5)--> Arduino Nano--< servo ballast(D10)
Permet de mettre le servo ballast en position vidange si entree d eau detectee, prend la main sur la voie6
Permet de mettre le servo barre de plongee en position remontee si entree d eau detectee ou profondeur excesive, prend la main sur la voie3
Relais et ILS--> Arduino Nano--< moteur pompe periscope
2 Relais, (D8 & D9) pour commande et inversion du moteur pompe
2 ILS, (D6 & D7) Fin de course du periscope, coupe le moteur pompe periscope en fin de course
Alimentation autre que par l'arduino nano,avec le 4,8 volts du recepteur par exemple
Batterie (A4)--> Arduino Nano--< Mesure tension
permet de lire la tension de la batterie et d enclencher une action
+ batterie ---> 1 resistance 3k3 -|
---> Pin A6 Arduino
- batterie ---> 1 resistance 1K1 -|
*/
//************************* routines
void Data(){ //pour envoi serial
Serial.print(Alarm);Serial.print(";");
Serial.print(Val_X - Ang_Milieu);Serial.print(";");
Serial.print(Pression_Relative);Serial.print(";");
Serial.print(bmp.readTemperature());Serial.print(";");
Serial.print(Tension)
Serial.println();
Avec ce programme, j’arrive à sortir sur le serial monitor la trame :
2;-5;565;21.36;7.65
Ce qui correspond à Alarm ;Niveau ;Profondeur ;Temperature ;Tension
3 entiers et 2 floats
J’aimerais rajouter un deuxième NANO relie en serial TX/RX et lui envoyer cette trame et la parser pour pouvoir faire réagir ce deuxième NANO avec les valeurs de la trame,
J’ai essayé le programme de SKYWOOD en essayant de le modifier (merci a lui pour ses exemples), mais je n’y arrive pas, un copain m’a envoyé un programme, mais il ne tourne pas correctement, erreur de variables, et les variables je n’y comprends rien, mon cerveau refuse
// DEFINITIONS
#define SIZE_INFOS 5 //Pour 5 infos de 0 Ã 4
// TABLEAUX GLOBAUX
byte tblInfos[SIZE_INFOS]; // Ici on déclare un tableau de 5 cases, de 0 à 4
//INITIALISATION
void setup() {
Serial.begin(9600); //Port Tx / Rx par défaut
}
// BOUCLE
void loop() {
//Reception des données
receptionTrame();
//Traitements
//ici tblInfos[0] contiendra l'info 1
//ici tblInfos[1] contiendra l'info 2
//ici tblInfos[2] contiendra l'info 3
//ici tblInfos[3] contiendra l'info 4
//ici tblInfos[4] contiendra l'info 5
delay(90ms);
}
// FONCTION : receptionTrame()
void receptionTrame() {
int i = 0;
char *inf[SIZE_INFOS];
char *ptr, buffer[SIZE_INFOS]; //Buffer
memset(buffer, 0, SIZE_INFOS); //Mise à 0 du buffer
//Si on a une trame
if(Serial.available() > 0) {
//Pour chaque caractères reçu
while(Serial.available() > 0) {
buffer[i] = Serial.read(); //Contenu "read()" dans le buffer
delay(3);
++i; //Incrémenter - Ici ne pas confondre avec i++.
}
//Parser les données
inf[0] = strtok_r(buffer, ";", &ptr); //Parse la chaine et sort la première info
//Pour toutes les autres infos
for(int j = 1; j < (SIZE_INFOS); j++) {
cmds[j] = strtok_r(NULL, ";", &ptr); //Parse la chaine de nouveau et sort la commande suivante
}
//Transformer chaque commande en plaçant dans le tableau final les infos.
for(int k = 0; k < (SIZE_INFOS); k++) {
tblInfos[k] = atoi(cmds[k]); //Ici Atoi transforme pour sortir du byte.
}
}
}
Le code du programme plante avec le cmds[j] ,variable pas déclarée, je ne sais pas quoi mettre comme variable,mes essais ce sont soldées par des echecs
Pouvez-vous m’aider en me guidant vers une solution, soit le programme de SKYWOOD modifié par ces soins pour recevoir ma trame, ou m’aider à corriger l’erreur cmds(y)
Merci d’avance, je vous avais dit que j’étais un boulet
_Platine_NANO_V1.zip (5.38 KB)