[Problème] Bouton simple..

c'est normal, ton arduino fait beaucoup de cycles le temps que tu appuyes sur le bouton...

Il faut que tu ajoutes une pause juste après l'envoie. delay(1000); juste en dessous de radio_envoie("a"); et c'est bon

Effectivement, y a l'autre solution comme tu le faisais qui empêche ce problème, j'avais pas pensé que c'était un effet recherché

Oui ^^

Et le problème du delay(1000) c'est que si je le met, et que j'appuie deux fois sur le bouton en moins de 1 sec, il ne prendra que une seule fois. :stuck_out_tongue:

Ceci dit, mon problème est totalement réglé, j'avais un bug avec les deux cartes arduino branchées sur le même PC et dans mon recepteur ça ne compilait pas, donc ça pouvait pas marcher..

Merci à tous!

EDIT: Y-a-t'il un bouton "résolu"?

kouacks a raison !!!!

Le fait de garder l'état des boutons dans un tableau permet d'eviter d'envoyer 100 fois la commande.

Le fait d'inserer un delay n'arrange rien puisqu'il ne se passera rien pendant le temps du délai.

donc sur ce coup vohu tu n'es pas de bons conseils.

kouacks ton soft est quasi fini, reste sur la dernière version et tente de comprendre ce qui ne va pas !!!

add :

Comment as-tu branché tes boutons ? avec une resistance ? sinon pose toi la question dans ton code de ce qui se passe quand tu relâche un bouton...

qu'on remplisse un tableau ou non, si on veut emp?cher l'envoie d'une valeur qui a déjà été envoyée. Il faut tester ce tableau.

Dans le cas présent, il n'y a aucun code qui fais ce travail sur le tableau.

C'est pour ça que j'ai proposé d'alléger tout ça...

Le coup du tableau c'est bien, mais il n'a aucun intérêt si on teste de toute façon l'état de chaque bouton.

Il faudrait alors écrire l'état de chaque bouton dans le tableau, sans faire de tests, et faire ceux ci dans une fonction qui affiche la différence entre l'ancien et le nouveau tableau. Ce qui permet d'envoyer les ordres...

Cela permet de commander autant de boutons qu'on veut, en tenant compte de la durée d'appuie sur chaque bouton, et même l'appuies sur plusieurs boutons à la fois.
C'est le principe du fonctionne du MIDI.

Dans le cas présent, il n'y a aucun code qui fais ce travail sur le tableau.

je ne suis pas entierement d'accord avec toi car dans :

if((val != etat[i]) && (val == LOW))
  {
    state = 1;
  }
  else
  {
    state = 0;
  }

Il y a bien un test qui vérifie l'atat du bouton par rapport au dernier état.

Donc cela n'envoie qu'une seule fois la commande quand on a appuyé sur le bouton, même si on reste en position appuyée.

De plus, cela n'empêche en rien d'appuyer sur un autre bouton tout en gardant un bouton appuyé.

Donc, le programme de kouacks n'est pas faux en ce sens. Maintenant si on prend 5 personnes pour réaliser ce programme on aura 5 programmes différents.

Propose ta version de programme (complet) et faisons avancer le schmilblik.

Le but n'est pas de donner un code tout fait aux gens, mais je suis d'accords avec toi, et je l'aurai fait si j'avais MON pc sous la main, et un arduino sur moi... Ce qui n'est pas le cas.

Pour en revenir au pb,ce que je veux dire, c'est que cette fonction, qui teste seulement 1 valeur du tableau est inutile... comme j'ai tenté de lui montré avant, il est possible de faire tenir ce code dans le main() en ajoutant pas grand chose...

Dans son cas, j'aurai fait un truc du genre : (sans tableau)

int oldState = 0;
int newState = 0;

void loop()
{
 
   if (newState = digitalRead(bt1) &&  oldState == 0)
      radio_envoie("a");
   oldState = newState;

}

Une version plus évoluée, avec des tableaux.

  • dont les boutons ne sont pas forcément sur des broches qui se suivent.
  • si on ajoute des boutons, il suffit de modifier les variables publiques et le define. selon le besoin, modifier la fonction qui doit envoyer les données
  • si on fabrique une matrice d’interrupteurs, c'est facilement adaptable ( c'est la méthode que j'ai utilisée pour utiliser les 60 touches d'un clavier)
  • avec un code de ce genre,
//ce n'est pas un sketch utilisable, ce sont des bouts de code qu'il faudrait adapter
--- variables publiques ---
#define NBRPIN  5
int pinTab[NBRPIN] = {2,4,5,6,9}
int oldTab[NBRPIN] = {0};
int newTab[NBRPIN] = {0};

---- init pin dans fonction setup()---
 for (int i =0; i<NBRPIN; i++)
  {
    pinMode(pinTab[i], OUTPUT);
  }
  
---------------------------------------

void lireEtat( int *etatTab, int *pinTab, int nbrMax)
{
 for (i = 0; i<NbrMax; i++)
	etatTab[i] = digitalRead(pinTab[i]);
 
}

void diffEtatExec( int *etatTab, int *oldTab, int nbrMax)
{
 for (i = 0; i<NbrMax; i++)
	if(etatTab[i] != oldTab[i]) // ou autre test selon besoin...
	{
		
		//ici on voit ce qu'on fait dans le cas ou l'état de pinTab[i] à changé
                // on ne s'occupe plus de rien... on sait juste que i représente le numéro du bouton enfoncé ou dont l'état à changé (selon le test effectué  au dessus)
		// ne sachant pas ce que le PO veut faire :
		// si action différente ou valeur envoyée différente selon le bouton appuyée
		// pour ne pas mal conseiller ;), selon ce qu'on veut faire, 
		// - je traiterai soit l'action ICI, 
		// - soit je renverais une structure ou un tableau contenant ce que j'ai besoin 
		//   pour que l'action soit traitée dans une autre fonction dédiée... 
		//   (ce qui demanderais d'ajouter un pointeur en paramettre de la fonction... 
		//   ou alors de changer son type
		
    }
}

void cpEtat( int *etatN, int *etatO, int nbrMax)
{
  for (int i = 0; i <nbrMax; i++)
    etatO[i] = etatN[i];
}

loop()
{
    lireEtat(newTab, pinTab); // on lit les pin, et on enregistre leur état dans newTab
    diffEtatExec(newTab, oldTab); //on cherche les différences
    cpEtat(newTab, oldTab); //on garde une copie de l'état actuel du tableau dans oldTab pour le prochain test..
}

Je rappelle que j'ai pas les outils pour coder ici, j'ai taper ce code comme j'ai pu, et il n'a absolument pas pu être testé... donc, possible erreur de pointeurs, de ";" ou autre...

Je vois..pour le moment, je n'ai pas encore appris les pointeurs, une fois appris je me pencherai sur ton code et regarderai un peu tous ça.

c'est sur que sans pointeurs, tu te limites à beaucoup de choses, surtout qu'un tableau... est un pointeur...

Mon code n'est pas compliqué...

En fait, pour faire simple, un tableau étant un pointeur. Quand tu veux envoyer un tableau à une fonction, il suffit de lui envoyer ton tableau sans * ni [], l'étoile apparaît uniquement dans le parametre de la fonction.

Ensuite, dans ta fonction, tu utilises ton tableau comme si tu l'utilisais ailleurs.

Ce qui est important avec les tableaux, c'est qu'en C, on n'a pas de propriété contenant la taille de celui-ci. Comme en C++, ou on aurait un truc genre len(tableau) ou tableau.length...
Du coup, tu dois "trimbaler" une variable qui contient le nombre de cases de ton tableau...

Hmm je comprends alors, les pointeurs sont casi indispensables..

pas quasi, ils sont indispensables.
Sans pointeur,

  • pas de chaines de caractères ni de tableaux
  • les fonctions ne pourront manipuler que des variables à type bien limité...
  • elles ne peuvent retourner qu'une seule valeur.
  • ça force l'utilisation des variables globales, ce qui n'est pas très conseillé

et sans doute encore beaucoup de choses...

Il faut pas oublier qu'en C, tu ne manipules pas des objets, mais des cases dans la mémoire.

C'est vrai..je vais donc bien lire les châpitres sur les pointeurs ^^

Bonjour,

J'ai une petite question je souhaiterais envoyer des données sur un serveur grâce à l'appui de boutons poussoirs. L'envoie de données marche avec un bouton poussoir mais quand j'en rajoute un autre, il n'est pas pris en compte et vu que j'ai mis un délais après l'envoie de données, il envoie la première donnée puis la deuxième 10 sec plus tard ce qui corepond au délais. Si quelqu'un un exemple de code pour cela XD
Mon code actuel:

#include <SPI.h>         
   #include <Ethernet.h>
   #include <EthernetUdp.h>         
   #include <Server.h>
   #include <VirtualWire.h>
   // Enter a MAC address and IP address for your controller below.
   // The IP address will be dependent on your local network:
   byte mac[] = {  
   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
   IPAddress ip(192, 168, 1, 0);

   unsigned int localPort = 9999;      // local port to listen on

   // buffers for receiving and sending data
   char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
   char  ReplyBuffer[] = "acknowledged";       // a string to send back

   // An EthernetUDP instance to let us send and receive packets over UDP
   EthernetUDP Udp;


//---- tableau de l'adresse IP de la carte Arduino
byte ipLocal[] = { 192, 168, 1, 40 }; // le réseau local a numéro 192.168.1.x
//----- tableau de l'adresse de la passerelle --- 
byte passerelle[] = { 192, 168, 1, 1 }; // l'adresse du PC de connexion à internet ou de la box
//----- tableau du masque de sous réseau 
byte masque[] = { 255, 255, 255, 0 }; // idem masque sous-réseau du PC ou de la box : 255.255.255.0
//---- IP du serveur distant de connexion ---- 
//byte server[] = { 192,168,1,26 }; // pigebox : 192.168.1.26
byte ipServeurDistant[] = { 192,168,1,26 }; // serveur Arduino sur meme reseau local

    
    int inPin = 40;             // un bouton poussoir connecté à la broche 40
    int InPin2 = 41;             // un bouton poussoir connecté à la broche 41
    const int buttonPin = 40;    
    const int buttonPin2 = 41;
    EthernetClient client;

void setup() {
   //---- initialise la connexion Ethernet avec l'adresse MAC du module Ethernet, l'adresse IP Locale 
   //---- l'adresse IP de la passerelle internet et le masque du réseau local
   Ethernet.begin(ipLocal, passerelle, masque);
   delay(1000); // donne le temps à la carte Ethernet de s'initialiser

   IPAddress (192, 168, 1, 40); // ip de l'arduino
  
    Udp.begin(8888);
    // initialize the pushbutton pin as an input:
    pinMode(buttonPin, INPUT);
    pinMode(buttonPin2, INPUT);
  }

void loop() {
    
 
    // read the state of the pushbutton value:
     buttonState = digitalRead(buttonPin);
     buttonState = digitalRead(buttonPin2);

     // check if the pushbutton is pressed.     
    if (buttonState == HIGH)(buttonPin); {
     
    IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: debut");
    Udp.endPacket();  
    delay(10000);
    }
    
    
    if (buttonState == HIGH)(buttonPin2); {
   
    IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: fin");
    Udp.endPacket();
    delay(10000); 
    
    if (buttonState == LOW) 
    client.stop();
    }
  }

Cordialement

Bonjour,

// read the state of the pushbutton value:
     buttonState = digitalRead(buttonPin);
     buttonState = digitalRead(buttonPin2); // La valeur précédente a été écrasé ici

     // check if the pushbutton is pressed.     
    if (buttonState == HIGH)(buttonPin); { // Ce if n'as pas de sens
     
    IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: debut");
    Udp.endPacket();  
    delay(10000);
    }
    
    
    if (buttonState == HIGH)(buttonPin2); {
   
    IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: fin");
    Udp.endPacket();
    delay(10000); 
    
    if (buttonState == LOW) 
    client.stop();
    }

Aucune chance que ça marche ! :wink:
(ça va compiler car au niveau purement syntaxique il n'y as pas d'erreur, mais pas marcher du tout car sémantiquement c'est totalement faux)

// read the state of the pushbutton value:
     byte buttonState1 = digitalRead(buttonPin);
     bytebuttonState2 = digitalRead(buttonPin2);

     // check if the pushbutton is pressed.     
if (buttonState1 == HIGH) {
     
    IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: debut");
    Udp.endPacket();  
    delay(10000);
}
    
    
if (buttonState2 == HIGH) {
   
    IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: fin");
    Udp.endPacket();
    delay(10000); 

}
    
if (buttonState1 == LOW || buttonState2 == LOW) 
    client.stop();
}

Problème résolue :smiley: merci beaucoup à toi bonne journée et bonne continuation.

Cordialement Armando