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.