Bonjour,
J'ai essayé bus.update sans succès
Attention bus.update n'est utilisé que pour envoyer des données, si vous attendez aussi une réponse il faut utiliser bus.receive(1000);
Les exemples de la bibliothèque BlinkTest et BlinkWithReponse sont explicites.
Pour le tableau, je pense que la bibliothèque est construite autour de byte mais ce n'est pas un soucis : les variables byte peuvent prendre des valeurs de 0 à 255.
C'est une question d'organisation: par exemple :
le premier feu prend les valeurs : eteint=0; allumé=1;
le deuxième feu : eteint= 2; allumé = 3;
etc....
le tout dans une variable byte feu1 = ...;
si 256 valeurs ne sont pas suffisantes vous pouvez créer une deuxième variable
feu2 = ...;
De plus le noeud qui reçoit le message ne peut pas gérer un nombre important de feu , si vous n'avez que rouge et vert par feu, donc 2 leds, vous ne gérerez au mieux que 8 feus. Gardez libre les broches de communication TX et RX et la broche de raccordement du bus. Je n'est pas l'architecture de votre réseau, mais tout l'intéret de la communication entre arduinos, c'est d'avoir des micros au plus prés des appareils à gérer (éclairage, servos, signalisation...)
Il me semble qu'un tableau avec 3 ou 4 variables est suffisant .
je vous transmets un petit programme dans ce sens. Il gère facilement les 17 broches de chaque noeud. Gardez aussi à l'esprit que chaque noeud à une adresse unique et que l'on peut parler qu'a une adresse.
- Code: Tout sélectionner
/*******Noeud 01********
* Un tableau de byte est créé (attention PJON ne travaille qu'avec des bytes ou des chars)
* on y met 3 variables (plus si necessaire), la première gère un menu, la deuxième la position
* d'un servo et la troisième la PWM d'une led.
* Une fonction lireBouton() est appelée à chaque tour de loop() et lie l'état des boutons. Si
* les boutons ont changé d'état, leur nouvelles valeur est mise a jour dans le tableau qui est
* envoyé aux autres noeuds.
*/
#define PJON_INCLUDE_SWBB // permet de n'inclure que la partie qu'on a besoin.
#include <PJON.h>
PJON<SoftwareBitBang> bus(01);
#include <RBD_Timer.h> // Bibliothèque pour gérer les boutons
#include <RBD_Button.h>
RBD::Button boutonPlus(2); //Déclaration des boutons
RBD::Button boutonMoins(3);
RBD::Button boutonServo(4);
RBD::Button boutonPwm(5);
byte pointeurMenu=0;
const byte valeurMin=0; // Valeur minimum du pointeurMenu
const byte valeurMax=10; // Valeur maximum du pointeurMenu
unsigned long dernierClic = 0;
byte servo=0;
byte pwm = 0;
/************************FONCTION POUR LIRE L'ETAT DES BOUTONS******************************/
void lireBouton() {
if (millis()-dernierClic>=200) {
if(boutonPlus.onPressed()) {
if(pointeurMenu<valeurMax){pointeurMenu++;}
dernierClic = millis();
}
else if(boutonMoins.onPressed()) {
if(pointeurMenu>valeurMin){pointeurMenu--;}
dernierClic = millis();
}
else if(boutonServo.onPressed()){
servo = !servo;
}
else if(boutonPwm.onPressed()){
pwm = pwm + 5;
}
}
}
/*************************FONCTION POUR ENVOYER LES DONNEES AUX AUTRES NOEUDS************/
void valeurEnvoyee(){
byte paquet [3] = {pointeurMenu,servo,pwm};
bus.send(PJON_BROADCAST,paquet,3);
}
void setup() {
bus.strategy.set_pin(8);
bus.begin();
}
void loop() {
bus.update();
valeurEnvoyee();
lireBouton();
}
- Code: Tout sélectionner
/******NOEUD 02****************
* Ce noeud reçoit les données et gère le servo, la PWM et les leds du Menu.
*/
#define PJON_INCLUDE_SWBB // permet de n'inclure que la partie qu'on a besoin.
#include <PJON.h>
PJON<SoftwareBitBang> bus(02);
#include <VarSpeedServo.h>
VarSpeedServo aiguille;
#define MIN_PULSE_WIDTH 700
#define MAX_PULSE_WIDTH 1100
const byte servoPin = 5;
byte pointeurMenu;
byte servo;
byte pwm;
const byte verte = 2;
const byte rouge = 4;
const byte jaune = 3;
/*********FONCTION QUI RECOIT LES DONNEES ET LES METS DANS LES VARIABLES CORRESPONDANTES**************/
void receiver_function(uint8_t *payload, uint16_t length, const PJON_Packet_Info &packet_info) {
pointeurMenu = payload[0];
servo = payload[1];
pwm = payload[2];
}
void setup() {
bus.strategy.set_pin(8);
bus.set_receiver(receiver_function);
bus.begin();
Serial.begin(9600);
pinMode (rouge,OUTPUT);
pinMode (verte,OUTPUT);
pinMode (jaune,OUTPUT);
aiguille.attach(servoPin);
}
void loop() {
bus.receive(1000);
Serial.println(servo);
switch(pointeurMenu){
case 0:digitalWrite(rouge,HIGH);digitalWrite(verte,LOW);break;
case 1:digitalWrite(rouge,LOW);digitalWrite(verte,HIGH);break;
case 2:digitalWrite(rouge,HIGH);digitalWrite(verte,HIGH);break;
case 3:digitalWrite(rouge,(millis()/200)%2);digitalWrite(verte,LOW);break;
case 4:digitalWrite(verte,(millis()/200)%2);digitalWrite(rouge,LOW);break;
case 7:digitalWrite(rouge,LOW);digitalWrite(verte,LOW);break;
}
if(servo == 0){
// aiguille.attach(servoPin);
aiguille.write(70,30,false);
// aiguille.detach();
}
if(servo == 1){
// aiguille.attach(servoPin);
aiguille.write(110,30,false);
// aiguille.detach();
}
analogWrite(jaune,pwm);
}
J'utilise trois bibliothèques qu'il vous faut charger/
<RBD_Timer.h> // Bibliothèques pour gérer les boutons
<RBD_Button.h>
<VarSpeedServo.h> // Bibliothèque pour gérer les servos
voilà , bon courage,