Aller au contenu


Photo
- - - - -

Besoin d'aide pour langage Arduino


  • Veuillez vous connecter pour répondre
10 réponses à ce sujet

#1 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 08 avril 2012 - 02:34

Bonjour à tous !!

Je viens de finir mon projet de PPE à l'instant, mais je souhaiterai ajouter un petit quelque chose à mon programme : mon programme s'exécute impécable, et à la fin, il ne se redémarre pas tout seul, il faut éteindre l'arduino pour que le programme recommence ce qui est normal. Or je voudrai que dès que le programme se termine, il se redémarre tout seul, sans avoir a éteindre à chaque fois l'arduino.

Merci par avance

ps : voila le programme :
#include <stdlib.h>
#include <stdio.h>
#include <Metro.h>
#include <LiquidCrystal.h>


const int RS=12;
const int E=11;
const int D4=5;
const int D5=4;  
const int D6=7; 
const int D7=6; 


LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
Metro ledMetro = Metro(3000);


int pos_rad_BP;
int pos_deg_BP;
int pos_rad1_BP;
int pos_deg1_BP;
int vitesse_BP;
int vitesse;
int pos_rad;
int pos_deg;
int pos_deg1;
int pos_rad1;
int nbre_impulsion;
int nbre_impulsion1;
int nbre_impulsion_vitesse;
volatile int front_montant = LOW;
int BPState = 8;


void setup() // fonction setup - début de l'exécution du programme
{
  Serial.begin(9600);
  lcd.begin(20,4);
  attachInterrupt(0, counter, RISING);
  attachInterrupt(1, positionBP, RISING);
  pinMode(BPState, INPUT);
  lcd.setCursor(0,0);
  lcd.print("    PROJET DE PPE   ");
  lcd.setCursor(0,1);
  lcd.print("     2011 - 2012    ");
  lcd.setCursor(0,2);
  lcd.print("   PUJOL-STOECKLIN  ");
  lcd.setCursor(0,3);
  lcd.print("   SYLVAIN-WOZNIAK  ");
  delay(4000);
  lcd.clear();
  delay(10);
}

void counter()
{
  ++nbre_impulsion;
  ++nbre_impulsion1;
  ++nbre_impulsion_vitesse;
}

void positionBP()

{
  pos_rad_BP = pos_rad;
  pos_deg_BP = pos_deg;
  vitesse_BP = vitesse;
  pos_rad1_BP = pos_rad1;
  pos_deg1_BP = pos_deg1;
}

void loop()

{

lcd.clear();


int BP = digitalRead(8);
if (BP == HIGH)

       {

   while (pos_deg <= 90)

{

lcd.clear();

if (ledMetro.check() != 1)
      {
    vitesse = ((nbre_impulsion_vitesse*(3.14/2)/90)/2)*1000;
    pos_rad = (nbre_impulsion*(3.14/2)/90)*1000;
    pos_deg = nbre_impulsion;

    lcd.setCursor(0,0);
    lcd.print("POS DEG: ");
    lcd.setCursor(10,0);
    lcd.print(pos_deg);

    lcd.setCursor(0,1);
    lcd.print("POS MRAD: ");
    lcd.setCursor(10,1);    
    lcd.print(pos_rad);

    lcd.setCursor(0,2);
    lcd.print("vitesse :");
    lcd.setCursor(10,2);
    lcd.print(vitesse);
      }    	
   	
if (ledMetro.check() == 1)
{
nbre_impulsion_vitesse = 0;
lcd.clear();
delay(100);
}

}

while (pos_deg >= 90)
{
    lcd.setCursor(0,0);
    lcd.print("POS DEG BP: ");
    lcd.setCursor(14,0);
    lcd.print(pos_deg_BP);

    lcd.setCursor(0,1);
    lcd.print("POS MRAD BP: ");
    lcd.setCursor(14,1);    
    lcd.print(pos_rad_BP);

    lcd.setCursor(0,2);
    lcd.print("vitesse BP:");
    lcd.setCursor(14,2);
    lcd.print(vitesse_BP);


  delay (100);
  lcd.clear();


    lcd.setCursor(0,0);
    lcd.print("POS DEG BP: ");
    lcd.setCursor(14,0);
    lcd.print(pos_deg_BP);

    lcd.setCursor(0,1);
    lcd.print("POS MRAD BP: ");
    lcd.setCursor(14,1);    
    lcd.print(pos_rad_BP);

    lcd.setCursor(0,2);
    lcd.print("vitesse BP:");
    lcd.setCursor(14,2);
    lcd.print(vitesse_BP);

delay (15000);
lcd.clear();



}    

       }

if(BP == LOW)

       {
pos_deg1 = 90-(nbre_impulsion);
   while (pos_deg1 > 0)

{

lcd.clear();

if (ledMetro.check() != 1)
      {
    vitesse = ((nbre_impulsion_vitesse*(3.14/2)/90)/2)*1000;
    pos_rad1 = ((3.14/2)-(nbre_impulsion*(3.14/2)/90))*1000;
    pos_deg1 = 90-nbre_impulsion;

    lcd.setCursor(0,0);
    lcd.print("POS DEG: ");
    lcd.setCursor(10,0);
    lcd.print(pos_deg1);

    lcd.setCursor(0,1);
    lcd.print("POS MRAD: ");
    lcd.setCursor(10,1);    
    lcd.print(pos_rad1);

    lcd.setCursor(0,2);
    lcd.print("vitesse :");
    lcd.setCursor(10,2);
    lcd.print(vitesse);
      }    	
   	
if (ledMetro.check() == 1)
{
nbre_impulsion_vitesse = 0;
lcd.clear();
delay(100);
}

}

while (pos_deg1 <= 0)
{
    lcd.setCursor(0,0);
    lcd.print("POS DEG BP: ");
    lcd.setCursor(14,0);
    lcd.print(pos_deg1_BP);

    lcd.setCursor(0,1);
    lcd.print("POS MRAD BP: ");
    lcd.setCursor(14,1);    
    lcd.print(pos_rad1_BP);

    lcd.setCursor(0,2);
    lcd.print("vitesse BP:");
    lcd.setCursor(14,2);
    lcd.print(vitesse_BP);


  delay (100);
  lcd.clear();


    lcd.setCursor(0,0);
    lcd.print("POS DEG BP: ");
    lcd.setCursor(14,0);
    lcd.print(pos_deg1_BP);

    lcd.setCursor(0,1);
    lcd.print("POS MRAD BP: ");
    lcd.setCursor(14,1);    
    lcd.print(pos_rad1_BP);

    lcd.setCursor(0,2);
    lcd.print("vitesse BP:");
    lcd.setCursor(14,2);
    lcd.print(vitesse_BP);


delay (15000);
lcd.clear();

}    


       }

}

Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.


#2 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 08 avril 2012 - 05:45

Salut,
je vais peut être dire une connerie vu que je ne travaille pas sous arduino mais je me lance quand même : si tu fais une boucle infinie qui englobe tout ton programme, ça ne marche pas ? Ou sinon, tu ne peux pas faire un truc comme en assembleur : une balise nommée start et une instruction en fin de programme qui permet d'y retourner ?

#3 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 08 avril 2012 - 07:18

J'ai essayé de créer une boucle infinie genre créer une variable, dire qu'elle est égale à 1 tout le programme, et tant que la variable est égale à 1, le programme tourne, mais visiblement, sa ne marche pas ...

Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.


#4 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 08 avril 2012 - 07:49

J'ai toujours cru que sur arduino le programme tournait en boucle comme pour tout... Je pense que ça doit être faisable, attends que les habitués passent, ils pourront sûrement te renseigner ;)

#5 SRWieZ

SRWieZ

    Membre

  • Membres
  • PipPip
  • 231 messages
  • Gender:Male
  • Location:Evreux, Haute-Normandie, France

Posté 08 avril 2012 - 09:48

La fonction loop() est celle qui doit tourner sans fin sauf si interruption par un delay() (déjà t'en a deux de 15 secondes, c'est pas un peu long ?) ou une librairie qui attend une réponse (dans ton cas je ne vois pas de fonction qui pourrait retenir le code).

Si tu m'explique à quoi servent exactement les 2 boucles while() ce serait plus simple car je pense que l'une d'entre elle tourne sans s’arrêter, du coup le code reste bloqué à l'intérieur.

#6 Thor

Thor

    Habitué

  • Membres
  • PipPip
  • 251 messages
  • Gender:Male

Posté 08 avril 2012 - 09:48

La fonction loop tourne indéfiniment normalement.

Edit: grilled :ph34r:

#7 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 09 avril 2012 - 08:01

La fonction loop tourne indéfiniment normalement


Ca m'étonnait aussi... Un programme qui peut pas tourner en boucle, c'est pas très utile... "^^

#8 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 09 avril 2012 - 09:16

Alors en fait mon programme est un calculateur de vitesse et de position via un encodeur rotatif. Le BP sert à indiquer o programme si l'on part en position ouverte ou fermée. J'ai placé un interrupteur qui lorsque l'on appuie dessus enregistre la Position et la vitesse. La position et la vitesse à cet instant sont affichés quand le portail à fini son ouverture ou sa fermeture : c'est pourquoi j'ai mis des boucles while : tant que la position est différente de 0 ou 90, afficher les positions et vitesses et quand la Position est égale à 0 ou 90, alors afficher la Position et vitesse de l'interrupteur. Mais g peut être compris mon erreur : si je met while pos_deg = 0 ou 90, sa va rester dans cette boucle vu que cette valeur ne va plus changer, il vaudrait mieux faire avec if pos_deg = 0 ou 90 non ?

Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.


#9 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 09 avril 2012 - 10:19

Effectivement, le problème venait du while(), que j'ai remplacé par if() et sa marche impécable !

Merci à tous de votre aide !!

Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.


#10 SRWieZ

SRWieZ

    Membre

  • Membres
  • PipPip
  • 231 messages
  • Gender:Male
  • Location:Evreux, Haute-Normandie, France

Posté 09 avril 2012 - 10:44

Mais g peut être compris mon erreur : si je met while pos_deg = 0 ou 90, sa va rester dans cette boucle vu que cette valeur ne va plus changer, il vaudrait mieux faire avec if pos_deg = 0 ou 90 non ?


Je suis arrivé tard mais c'est exactement ce que je voulais te faire remarqué, que la valeur ne change pas donc la boucle ne s’arrête jamais.

Effectivement, le problème venait du while(), que j'ai remplacé par if() et sa marche impécable !

Merci à tous de votre aide !!


De rien, bonne continuation ;)

#11 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 09 avril 2012 - 08:47

Pas grave ! Merci quand même :)

Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users