Go Down

Topic: Fonction + boucle , dur dur .. (Read 1 time) previous topic - next topic

nestea57

Jun 04, 2010, 07:56 pm Last Edit: Jun 04, 2010, 07:57 pm by nestea57 Reason: 1
Bonjour,
Je viens de finir ma maquette de feu tricolore mais j'aurais besoin d'aide pour la programmation.
Je pense que le language arduino est trop simple, je n'arrive pas à faire ce que je veux.

Je voudrais faire une fonction qui modifie les 1 en HIGH et les 0 en LOW et qui me fasse :

allume_del (a,b,c,d,e,f,g)
{

[une autre fonction qui modifie les a,b,c,d... en HIGH ou LOW ( là aussi en boucle pour pas se taper x fois if a=1 a=HIGH; if b=1 ...]

 digitalWrite(R1, a);
 digitalWrite(O1, b);
 digitalWrite(V1, c);
...
}

comme ça je peux faire mes séries d'allumage en appelant la fonction :
allume_del(1,0,0,0,0,1);
delay(1000);
et mettre ceci plusieurs fois en modifiant les 0 et 1...

Je sais le faire en php mais je n'arrive même pas à faire ma propre fonction sur arduino pourtant c'est pas faute d'avoir chiner des exemples.

Je vous remercie :)


Metos

Salut,
je commence en arduino et le C++ est lointain.
donc la syntaxe exacte...

tu passes un tableau en parametre de allume_del

tu déclares un tableau de tableaux.

tu fais un
for(i=0;i<taille(tableau_de_tableaux);i++) {
 allume_del(tableau_de_tableaux);
}

y a d'autres solutions possibles ;)
j'espere que ça t'aide un peu.


nestea57

#2
Jun 05, 2010, 07:28 am Last Edit: Jun 05, 2010, 08:47 am by nestea57 Reason: 1
Merci mais ce que tu m'as mis c'est pour faire varier tout seul les 0 et les 1 or c'est le seul truc que je veux garder sous mon contrôle. ( les 4 feux verts ne doivent pas s'allumer en même temps. )

Je vais tenter en C ou C++, peut on mettre du code C/C++ comme ça ? avec le language arduino ou il faut déclarer quelque chose ? et je peux utiliser les variables définis avec arduino dans du langage C ?

Luj06

#3
Jun 05, 2010, 10:05 am Last Edit: Jun 05, 2010, 10:09 am by julien@pobot.org Reason: 1
Le langage Arduino, c'est du C++ avec seulement un main simplifié et des #include implicites.

Donc oui tu peux faire des classes C++ à côté (onglets) et les importer dans ton sketch (.pde) Arduino :

Code: [Select]

#include "feu.h"

Feu fa, fb, fc, fd, fe;

void loop()
{
 if (fa.estVert() && fb.estRouge())
{
  fa.passeAuRouge();
  fb.passeVert();
  // etc...
}
}



nestea57

#4
Jun 05, 2010, 06:31 pm Last Edit: Jun 05, 2010, 06:40 pm by nestea57 Reason: 1
Oula pas tout compris mais j'ai avancé, j'ai fait ma fonction mais je n'arrive toujours pas à faire un truc simple.
a prendra la valeur de 0 ou 1 lorsque j'appelle la fonction.
Ensuite, en fonction de sa valeur, je la modifie par HIGH ou LOW et donc ensuite je met à 5 ou 0V.

 char a = 1;
 if (a==1) a="HIGH" else a="LOW";
 digitalWrite(rouge, a); // Donc si a=1 la sortie rouge sera à 5V sinon à 0V

Il me dit : error: invalid conversion from 'const char*' to 'char

En fait c'est beaucoup plus dur que je ne le pensais, le php/mysql c'est beaucoup plus simple.

Jean-François

Tu veux faire quoi avec tes HIGH et tes LOW ?
Commander une sortie numérique ?
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Luj06

#6
Jun 05, 2010, 08:17 pm Last Edit: Jun 05, 2010, 08:18 pm by julien@pobot.org Reason: 1
Quote
Je pense que le language arduino est trop simple,...


Oui mais il faut déjà le maitriser.

nestea57

#7
Jun 05, 2010, 08:22 pm Last Edit: Jun 05, 2010, 08:24 pm by nestea57 Reason: 1
Je m'étais mal exprimé, je pense surtout qu'il faut le comprendre, il fonctionne vraiment pas pareil que les langages comme ceux que je connais.

Alors oui je veux commander des sorties numériques, j'ai déjà tout fait il me reste qu'à régler le problème de la fonction.
Je cherche toujours sur google comment faire :

si a=1 alors mettre a = HIGH sinon mettre a=LOW
et mettre digitalWrite(rouge, a);

Donc une variable "a" en chaine de caractère et inclure ce qu'elle contient dans digitalWrite.

Jean-François

#8
Jun 05, 2010, 08:28 pm Last Edit: Jun 05, 2010, 08:29 pm by jfs Reason: 1
Ici :

http://arduino.cc/fr/Main/DigitalWrite

Quote
Syntaxe

digitalWrite(broche, valeur)

Paramètres

   * broche: le numéro de la broche de la carte Arduino
   * valeur : HIGH ou LOW (ou bien 1 ou 0)


Casse toi pas la tête à convertir, mets ta pin numérique à 1 ou 0, ça fera la même chose que si tu la mets à HIGH ou LOW.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

nestea57

Wa je te remercie ! Pourtant je l'avais vu je ne sais combien de fois la page là !
Merci d'avoir résolu mon problème :) mais il faut persévérer en programmation donc je tenterais quand même de trouver comment faire un changement comme ça.
Bon bah mon système de feux tricolores avance :)

Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Franxoois

Le truc surtout c'est que HIGH et LOW sont des constantes de type entier qui valent 1 et 0.

Php est bien sympa de convertir les constantes qu'il ne connait pas en chaine de caractères mais ça ne veut pas dire qu'il faut coder de cette façon.
Je serais toi je rajouterais la ligne error_reporting(E_ALL); au début de tes scripts, tu aurais de mauvaises surprises mais ça devrait éclaircir pas mal de bizarreries.

nestea57

Oui mais j'ai toujours eu l'habitude de coder avec php, pas besoin de définir le type de la variable, on peut mettre ce que l'on veut dedans ... les int, char etc... c'est pour la base de donnée.
J'ai rarement utilisé error_reporting(E_ALL);...

Jean-François

#13
Jun 05, 2010, 10:04 pm Last Edit: Jun 05, 2010, 10:04 pm by jfs Reason: 1
Essaie un truc comme ça, mais ça mettra tes valeurs à 1 ou 0 , tu n'arriveras pas à faire imprimer "HIGH" ou "LOW".

Code: [Select]
int test = 2;
boolean essai = false;

void setup(){
Serial.begin(9600);
}

void loop(){
 
 Serial.print ("test = ");
 Serial.println (boolean(test),BIN);   // boolean(test)   convertit "test" en booleen
 
 Serial.print ("essai = ");
 Serial.println (essai,BIN);
 
 test= !test;
 essai=!essai;
 
 delay(600);
 
}
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Franxoois

#14
Jun 05, 2010, 10:35 pm Last Edit: Jun 05, 2010, 10:35 pm by Franxoois Reason: 1
Après faut voir ce qu'on veut faire. Je verrais plutôt un
Code: [Select]


int etat = 0 ;

loop()
{
switch( etat )
{
case 0 :
// On allume le feu vert
digitalWrite( pin_vert  , HIGH ); // identique à digitalWrite( pin_vert  , 1 );
digitalWrite( pin_orange  , LOW );
digitalWrite( pin_rouge  , LOW );
delay( 6000 );
etat++;
break ;
case 1 :
digitalWrite( pin_vert  , LOW );
digitalWrite( pin_orange  , HIGH );
digitalWrite( pin_rouge  , LOW );
delay(1500);
etat++;
break ;
case 2 :
digitalWrite( pin_vert  , LOW );
digitalWrite( pin_orange  , LOW );
digitalWrite( pin_rouge  , HIGH );
delay(4500);
etat = 0 ;
break ;
}

}




Go Up