Associer plusieurs code ( Star Destroyer Project)

Bonjour a tous

Toujours sans le cadre de ma maquette du Star Destroyer (https://forum.arduino.cc/index.php?topic=629489.0) j aimerais en plus de la commande de la lumière infrarouge qui est fonctionnel pouvoir faire clignoter une led et egalement piloter un servomoteur pour mettre en mouvement une tourelle DCA

Je dispose de ces 2 codes:

le blink:

void setup() {                
  // initialise la broche 3 en sortie numérique
  // la broche 3 a une LED déjà connectée sur la plupart des cartes Arduino :
  pinMode(3, OUTPUT);    
}

void loop() {
  digitalWrite(3, HIGH);   // allume la LED
  delay(1000);              // ne fait rien pendant 1 seconde
  digitalWrite(3, LOW);    // éteint la LED
  delay(1000);              // ne fait rien pendant 1 seconde
}

le servo

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(40);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(40);                       // waits 15ms for the servo to reach the position
  }
 
}

Et le code qui alimente le Destroyer:

/*

IR_remote_detector sketch
An IR remote receiver is connected to pin 2.
The LED on pin 13 toggles each time a button on the remote is pressed.
*/
#include <IRremote.h> //adds the library code to the sketch
const int irReceiverPin = 2; //pin the receiver is connected to
const int ledPin = 13; 
IRrecv irrecv(irReceiverPin); //create an IRrecv object
decode_results decodedSignal; //stores results from IR detector

void setup()
{
    pinMode(ledPin, OUTPUT);
    irrecv.enableIRIn();
}
boolean lightState = false;
unsigned long last = millis();

// Start the receiver object
//keep track of whether the LED is on
//remember when we last received an IR
void loop()
{
    if (irrecv.decode(&decodedSignal) == true) //this is true if a message has been received
    {
        if (decodedSignal.value == 0xFF30CF) { // touche lecture
           lightState = !lightState;
           //toggle the LED
           digitalWrite(ledPin, lightState);
        }
        last = millis();
        irrecv.resume();
        // watch out for another message
    }
}

Comment puis je réunir tous ces programme en un seul pour que quand j appuie sur ma touche play cela alimente mon servo mon relais qui alimente les leds du destroyer et également en faire clignoter une qui intégrera le diorama et l éteindre avec la même touche? ou pas d’ailleurs^^

Merci

Fais une machine d'état. J-M-L a fait un bon tuto sur le sujet (pub), en voici un autre que je trouve bien expliqué aussi.

Au passage, dans ton dernier code, la variable last ne sert pas.

Meme que je connais une technique pour tuer trois hommes en un coup rien qu’avec des feuilles mortes !Alors là, tu est tout seule ,tu as bien de la chance.

Plus sérieusement j'ai rien bité....

Tu me propose de faire un petit automate avec ma carte?

J'ai peu être oublier de dire que je ne bosse pas dans la programmation :grin: et que je suis incapable d’écrire une foutue ligne de code, je suis juste capable de piocher sur internet et de bidouiller dans mon coin^^.

Du coup c'est ce que je vais faire! Aprés avoir lu et relu le tuto que tu propose sans en comprendre un traitre mot je me suis dit: attend camarade

Il me reste 2 cartes nano, si chacune d'elles contient le code que je désire et quel sont alimenté par mon relais qui s'enclenchera et ce déclenchera à chaque pression de mon bouton ça ne peu que fonctionner! :grinning:

Je fais l'essai ce weekend...

Bon je suis d'accord, c'est de la bidouille et nous sommes loin de l'esprit programmation/réflexion/langage c++ de la muerte^^ mais ça va trop loin pour mon petit cerveau^^

Merci quand même!

Non, pas de mauvaise excuse pour glander, allez hop au taf !!! Ton problème est assez simple et désolé d'avoir sorti la grosse artillerie (face au destroyer...).

Pour joindre tes 3 codes, tu fais comme ça (recette générique, qu'il faut ensuite appliquer à ton cas particulier, pour résoudre ses problèmes spécifiques):

  • Tu pars d'un sketch vide et tu y mets les 3 en-têtes de tes 3 codes : ça définira les variables globales et les bibliothèques. Tu vérifies qu'il n'y a pas plusieurs fois le même nom de variable globale, sinon tu modifies tes codes pour éviter ce problème
  • Tu crées un setup et tu mets les 3 setup dedans
  • Tu prends les loop et tu les renommes : loopTourelle, loopServo, loopLED et tu les mets dans le sketch.
  • Il reste le plus dur : écrire la loop du code global qui va appeler tes trois anciennes loop en fonction de ton besoin.

Pour ce dernier point, on pourra t'aider si tu expliques bien ce que tu veux avoir au final...

vous pouvez vous entréner a combinner les deux premiers programmes
cela vous fera économiser un nano ou un uno .

vous garder le programe 2 tel quels
tout en considérant les zonnes suivante
le début de programme , le void setup { <=ici=> } , le void loop {<=ici=> }
en faisant du copier collé vous allé copier des lignes du programme 1
et les coller dans le programme 2 …MAIS PAS N ’ IMPORTE OU !!!
pour cela on regarde la structure du programme 1

c’ est : le void setup { <=ici=> } , le void loop {<=ici=> }
==> il n’y a pas de zonne "début de programme " CHOUET un truc en moins…
on prent l’unique ligne du void setup du programme 1 et on vient la coller dans la
le void setup du programe 2 ,plus precisément dans la zonne entre accolade ,au debut sans toucher aux accolades.

pour la void loop du programme1 on selectionne les 4 lignes en une fois , copier
puis on va les collés dans le void loop du programme 2
JUSTE AVANT LA DERNIERE ACCOLADE du programme 2 !!!..

J'avais pas vraiment regardé ces codes mais ils sont bloquants (présence de delay, boucle for pour le servo) donc il va falloir réfléchir un peu pour revoir leur structure. Mais, ils sont assez simples, donc rien d'insurmontable, juste un peu de jus de cerveau...

Merci messieurs!

lesept:
Non, pas de mauvaise excuse pour glander, allez hop au taf !!

Pas mon genre… :grin:

Bon ok je tente le coup:

Je suis le plan que tu me donne (la normalement tout le monde comprend que j’ai aucune idée de ce que je fait)

les 3 en-têtes des 3 codes + les 3 setup + les loop renommée + écrire la loop du code global

J etais pas sur de mon coup, l’IDE me le confirme…

/*

IR_remote_detector sketch
An IR remote receiver is connected to pin 2.
The LED on pin 13 toggles each time a button on the remote is pressed.
*/
#include <IRremote.h> //adds the library code to the sketch
const int irReceiverPin = 2; //pin the receiver is connected to
const int ledPin = 13; 
IRrecv irrecv(irReceiverPin); //create an IRrecv object
decode_results decodedSignal; //stores results from IR detector
#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() 
{
    pinMode(ledPin, OUTPUT);
    irrecv.enableIRIn();
}
boolean lightState = false;
unsigned long last = millis();

// Start the receiver object
//keep track of whether the LED is on
//remember when we last received an IR

{
  Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

{               
  // initialise la broche 3 en sortie numérique
  // la broche 3 a une LED déjà connectée sur la plupart des cartes Arduino :
  pinMode(3, OUTPUT);    
}

void loop()//led SD
{
    if (irrecv.decode(&decodedSignal) == true) //this is true if a message has been received
    {
        if (decodedSignal.value == 0xFF30CF) { // touche lecture
           lightState = !lightState;
           //toggle the LED
           digitalWrite(ledPin, lightState);
        }
        last = millis();
        irrecv.resume();
        // watch out for another message
    }
}

void loop()//servo DCA {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(40);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(40);                       // waits 15ms for the servo to reach the position
  }
 
}
void loop()//led blink {
  digitalWrite(3, HIGH);   // allume la LED
  delay(1000);              // ne fait rien pendant 1 seconde
  digitalWrite(3, LOW);    // éteint la LED
  delay(1000);              // ne fait rien pendant 1 seconde
}

Rapport d’erreur:

Arduino : 1.8.8 (Windows 10), Carte : "Arduino Nano, ATmega328P"

sketch_aug11a:31:1: error: expected unqualified-id before '{' token

 {

 ^

sketch_aug11a:36:1: error: expected unqualified-id before '{' token

 {               

 ^

sketch_aug11a:58:3: error: expected initializer before 'for'

   for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees

   ^

sketch_aug11a:58:17: error: 'pos' does not name a type

   for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees

                 ^

sketch_aug11a:58:29: error: 'pos' does not name a type

   for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees

                             ^

sketch_aug11a:63:3: error: expected unqualified-id before 'for'

   for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees

   ^

sketch_aug11a:63:19: error: 'pos' does not name a type

   for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees

                   ^

sketch_aug11a:63:29: error: 'pos' does not name a type

   for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees

                             ^

sketch_aug11a:68:1: error: expected declaration before '}' token

 }

 ^

Plusieurs bibliothèque trouvées pour "Servo.h"
Utilisé : C:\Users\dioge\OneDrive\Documents\Arduino\libraries\Servo
Non utilisé : C:\Program Files (x86)\Arduino\libraries\Servo
exit status 1
expected unqualified-id before '{' token

Bon je suis pas un expert mais visiblement il y a une cacade avec les accolades + et la, on vois les mecs qui savent ce qu’il font:

lesept:
J’avais pas vraiment regardé ces codes mais ils sont bloquants (présence de delay, boucle for pour le servo) donc il va falloir réfléchir un peu pour revoir leur structure. Mais, ils sont assez simples, donc rien d’insurmontable, juste un peu de jus de cerveau…

Oui apparemment il n’aime pas le code du servo^^

Je gratte je gratte…

Tu n'as pas fait comme je disais... Pour le setup, tu mets les instructions des trois setup dans un seul nouveau setup.

Ça donnera un truc comme ça

void setup () {
// instructions du premier setup

// instructions du second setup

// instructions du troisième setup

}

Les instructions seulement, pas les accolades de début et de fin des setup. Ensuite tu vérifies qu'il n'y a pas plusieurs fois la même chose et tu enlèves les doublons.

Pour les loops, tu les copies dans ton nouveau sketch et tu les renommes. Voir les exemples que je te donne. Puis tu crées une nouvelle loop qui appelle les trois loops renommées que tu viens de créer.

Ça te donnera un premier code, que tu pourras essayer de compiler, mais qui sera bloquant. Mais c'est déjà un premier code...

si vous combinez vos 3 prog dans votre programme final vous devez retrouver la même structure c' est a dire

UNE SEULE entête , UN SEUL void setup , UN SEUL void loop ( après des void et autres le cas échéant... )

un peut comme un être humain il naît avec 2 bras et deux jambes il a pas 4 bras etc .... il a la même structure que ces parents .... mais il ne cumule pas les 2 structures.

comme dans votre prog final il y a 3 void loop() , vous ne pourrez PAS compiler , ça marchera PAS..

vous ne les avez pas renommées vous les avez commentés .... les commentaires ne change rien a la compilation...

écrire la loop du code global , c'est le passage obligé , si non c'est créer des fonction ... il faudra quant méme une loop du code global ...

Ok ok… merci

Je crois que je comprend un peu… non je déconne! :grin:

Bon j’en suis rendu là:

/*

IR_remote_detector sketch
An IR remote receiver is connected to pin 2.
The LED on pin 13 toggles each time a button on the remote is pressed.
*/
#include <IRremote.h> //adds the library code to the sketch
const int irReceiverPin = 2; //pin the receiver is connected to
const int ledPin = 13; 
IRrecv irrecv(irReceiverPin); //create an IRrecv object
decode_results decodedSignal; //stores results from IR detector
#include <Servo.h>
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0;    // variable to store the servo position

void setup() 
{
   pinMode(ledPin, OUTPUT);
    irrecv.enableIRIn();

      Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object

    // initialise la broche 3 en sortie numérique
  // la broche 3 a une LED déjà connectée sur la plupart des cartes Arduino :
  pinMode(3, OUTPUT);    
}

void loop()

void led_Destroyer()//led Destroyer
{
    if (irrecv.decode(&decodedSignal) == true) //this is true if a message has been received
    {
        if (decodedSignal.value == 0xFF30CF) { // touche lecture
           lightState = !lightState;
           //toggle the LED
           digitalWrite(ledPin, lightState);
        }
        last = millis();
        irrecv.resume();
        // watch out for another message
    }
}

void servo_tourelle()//servo tourelle {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(40);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(40);                       // waits 15ms for the servo to reach the position
  }
 
}
void led_diorama()//led diorama {
  digitalWrite(3, HIGH);   // allume la LED
  delay(1000);              // ne fait rien pendant 1 seconde
  digitalWrite(3, LOW);    // éteint la LED
  delay(1000);              // ne fait rien pendant 1 seconde
}

Ca ce presente pas trop mal quand je compil:

Arduino : 1.8.8 (Windows 10), Carte : "Arduino Nano, ATmega328P"

sketch_aug11a:32:1: error: expected initializer before 'void'

 void led_Destroyer()//led Destroyer

 ^

Plusieurs bibliothèque trouvées pour "Servo.h"
Utilisé : C:\Users\dioge\OneDrive\Documents\Arduino\libraries\Servo
Non utilisé : C:\Program Files (x86)\Arduino\libraries\Servo
exit status 1
expected initializer before 'void'

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

L’IDE me jete pour la librairie servo?
Il me jete egalement pour la definition void led_Destroyer() mais pas pour les autres…

je continue de gratter

Il faut des accolades après la définition de la loop :

void loop() {

}

Ensuite tu écris des choses dans cette loop. Le plus simple c'est trois lignes qui appellent tes trois fonctions

void loop() {
led_Destroyer() ;
led_diorama();
servo_tourelle();
}

Et ensuite tu regardes ce que ça donne. Comme dit plus haut, tes fonctions sont bloquantes donc ça ne va pas fonctionner de manière optimale. Je te conseille de lire les tutos que je pointe dans le post suivant. Déjà ceux du premier message, voire même le second.

Ça devrait t'occuper l'après-midi... :D

Au passage, le compilateur t'indique que tu as un second répertoire arduino sur ton disque dur, dans C:\Program Files (x86)\Arduino\

Tu devrais l'effacer, ou bien si tu as peur de perdre son contenu, le renommer en Arduino_old de manière temporaire, pour qu'il ne te gêne plus lors des compilations. Si tu vois que ça va bien, tu pourras l'effacer.