Fonction + boucle , dur dur ..

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 :)

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 :wink:
j’espere que ça t’aide un peu.

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 ?

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 :

#include "feu.h"

Feu fa, fb, fc, fd, fe;

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

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.

Tu veux faire quoi avec tes HIGH et tes LOW ? Commander une sortie numérique ?

Je pense que le language arduino est trop simple,...

Oui mais il faut déjà le maitriser.

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.

Ici :

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

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.

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 :)

;)

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.

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);...

Essaie un truc comme ça, mais ça mettra tes valeurs à 1 ou 0 , tu n'arriveras pas à faire imprimer "HIGH" ou "LOW".

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);
  
}

Après faut voir ce qu'on veut faire. Je verrais plutôt un

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 ;
}

}

Ce que je disais c'était juste pour la conversion, pas pour allumer et éteindre des loupiotes ;D

Ah oui effectivement, et donc, comment on fait pour imprimer HIGH ou LOW ou encore autre chose ? voici comment j'ai fait finalement :

//#################################################################### // Déclarer la fonction qui va contrôler les 6 feux en même temps. //#################################################################### void allumeLED(int R,int O,int V,int r,int o,int v) { digitalWrite(R1, R); digitalWrite(O1, O); digitalWrite(V1, V); digitalWrite(R2, r); digitalWrite(O2, o); digitalWrite(V2, v); }

//#################################################################### // Les feux qui s'allument et s'éteignent dans l'ordre. // Code exécuté en boucle. //#################################################################### void loop() { allumeLED(1,0,0,0,0,1); delay(40000); allumeLED(1,0,0,0,1,0); delay(3000); allumeLED(1,0,0,1,0,0); delay(1000); allumeLED(0,0,1,1,0,0); delay(40000); allumeLED(0,1,0,1,0,0); delay(3000); allumeLED(1,0,0,1,0,0); delay(1000); }

Vu que c'est un projet, j'ai mis les commentaires. Je n'ai pas pu essayer car je n'ai pas la platine d'essai chez moi. Je verrais la semaine prochaine.