3 arduinos + node red

a marqué ce sujet comme résolu.

Bonjour à tous,

je me permets de vous contacter car je suis un projet avec plusieurs arduinos et node red.

Voici ma config :

j’ai arduinos connectés en serial (sans firmata je précise car ca ne fonctionnait pas). j’ai un raspi qui me sert de "cerveau".

le premier arduino me sert à gérer l’ouverture d’une porte après la lecture de 3RFID. Une fois ces 3 RFID scannés, j’ai un relai qui se désactive pour ouvrir une porte et des leds qui s’allument également connecté sur un autre relai.

Le deuxième arduino me sert a capté la pression sur 6 balances, quand les 6 balances reçoivent une pression cela déclenche une autre séquence avec des vérins.

Voici mon problème. Pour sécuriser le tout et éviter des problèmes avec les ports com sur node red, mes skecths arduinos envoient des messages à node-red sous cette forme CAL*PHASE, CAL*FINISH pour que je puisse router tous les signaux commençant par CAL sur le bon arduino.

Même chose pour le deuxième arduino qui lui m’envoi des message sous cette forme BAL*T,BAL*E. Mais voilà, quand je veux envoyer depuis node red des message sous la forme CAL*LEDOPEN L’arduino ne lit que LEDOPEN, alors que dans mon sketch je lui dis qu’il faut ouvrir et allumer les leds avec CAL*LEDOPEN.

Comment faire pour que le message CAL*LEDOPEN soit envoyé complètement dans node-RED ?

Voici mes différents éléments :

CODE NODE RED :

[
    {
        "id": "acb98baf8d3310bb",
        "type": "function",
        "z": "d4915bbdfc76c620",
        "name": "split Topic/Message",
        "func": "var arr = msg.payload.toString().split(\"*\");\nmsg.payload=arr[1]\nmsg.topic=arr[0]\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 470,
        "y": 820,
        "wires": [
            [
                "c3494f061503f928"
            ]
        ]
    }
]

SKETCH CAL :

/* 
   Typical pin layout used:
   ----------------------------------
               MFRC522      Arduino
               Reader/PCD   Uno/101
   Signal      Pin          Pin
   ----------------------------------
   RST/Reset   RST          9
   SPI SS      SDA(SS)      10
   SPI MOSI    MOSI         11
   SPI MISO    MISO         12
   SPI SCK     SCK          13

*/


//DECLARATION DES VARIABLES
#include <SPI.h>
#include <MFRC522.h>

#define RelaiOuverture  7                 // Pin 7 pour la ventouse magnétique
#define RelaiLeds       8                 // Pin 8 pour le relai des LEDS 
#define RST_PIN         9                 // Configurable, see typical pin layout above
#define SS_PIN          10                // Configurable, see typical pin layout above


String command;
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
int phase = 0;
int on_position = 0;
const byte uids[4][7] = {
  {0x04, 0xfe, 0x36, 0xba, 0x6d, 0x67, 0x80},
  {0x04, 0x9f, 0x36, 0xba, 0x6d, 0x67, 0x80},
  {0x04, 0xa5, 0x36, 0xba, 0x6d, 0x67, 0x80},
  {0x04, 0xfe, 0x36, 0xba, 0x6d, 0x67, 0x80},
};
bool stringComplete = false;

MFRC522 mfrc522(SS_PIN, RST_PIN);

//DECLARATION DE LA CONFIGURATION INITIALE
void setup() {
  Serial.begin(57600);                  // Configuration de la vitesse du port série 57600 bauds
  SPI.begin();                          // Initialisation du bus SPI
  mfrc522.PCD_Init();                   // Initialisation du capteur MFRC522 (RFID)
  digitalWrite(RelaiOuverture, HIGH);   // Pin 7 doit est être alimentée
  pinMode(RelaiLeds, OUTPUT);           // Pin 8 est une sortie

  delay(2000);                          // Temps d'attente de l'initialisation 2 secondes

}

void reset_game() {
  phase = 0;
  on_position = 0;
}

void sendMessage(String mesg) {
  char charBuf[50];
  mesg.toCharArray(charBuf, 50);
  Serial.println(mesg);

}

void loop() {

  if (Serial.available()) {
    command = Serial.readStringUntil('*');
    command.trim();
    if (command.equals("CAL*LEDOPEN")) {
    digitalWrite(RelaiLeds, HIGH);
    digitalWrite(RelaiOuverture, LOW);
    }
    else if (command.equals("CAL*LEDCLOSE")) {
    digitalWrite(RelaiLeds, LOW);
      digitalWrite(RelaiOuverture, HIGH);
    }
    else {
      Serial.print("Mauvais ordre");
    }
    Serial.print("Command: ");
    Serial.println(command);
  }

delay(10);
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
if ( ! mfrc522.PICC_IsNewCardPresent()) {
  return;
}
// A new card is present : read it
if ( ! mfrc522.PICC_ReadCardSerial()) {
  return;
}

// for phase 0 to 3 read cards & go to next phase :
if (phase <= 3) {
  if ( (memcmp(uids[phase], mfrc522.uid.uidByte, 7) == 0) /*and (horaire == HIGH)*/) {
    switch (on_position) {
      case 0:
        previousMillis = millis();
        sendMessage("CAL*PHASE_" + String(phase) + "_" + String(on_position));
        on_position = 1;
        break;
      case 1:
        currentMillis = millis();
        if (currentMillis > previousMillis + 1000) {
          sendMessage("CAL*PHASE_" + String(phase) + "_" + String(on_position));
          phase++;
          on_position = 0;
        }
        break;
    }
  }
  return;
}

//sendMessage("CAL*PLAYROCK");
//sendMessage("CAL*FINISH");
reset_game();
}

Merci d’avance pour votre aide.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte