[RESOLU] Trouver une fonction dans la librairie modbus-arduino

Bonjour à tous,

Je suis sur un projet sur lequel je veux interfacer ma chaudière avec un 2560 et le protocole Modbus. J'utile la librairie modbus-arduino et je voudrais piloter un relais bistable, mais je ne parviens pas à gérer l'impulsion pour celui-ci. J'arrive juste à le faire basculer en continue.(clignoté)
Voici le bout de code avec lequel je me bats, tiré des exemples de la librairie.

#include <SPI.h>
#include <Ethernet2.h>
#include <Modbus.h>
#include <ModbusIP2.h>

// Modbus register offset (0-9999)
const int LAMP1_COIL = 100;
// Used pins
const int ledPin = 9;

// ModbusIP object
ModbusIP mb;

void setup() {
    // The media access control (ethernet hardware) address for the shield
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    // The IP address for the shield
    byte ip[] = { 192, 168, 1, 177 };
    // Config Modbus IP
    mb.config(mac, ip);
    // Set ledPin mode
    pinMode(ledPin, OUTPUT);
    // Add LAMP1_COIL digital output register
    mb.addCoil(LAMP1_COIL);
}

void loop() {
   // Call once inside loop() - all magic here
   mb.task();

   // Attach ledPin to LAMP1_COIL register
   digitalWrite(ledPin, mb.Coil(LAMP1_COIL) ? HIGH : LOW);
   delay(300);
   digitalWrite(ledPin, LOW);
}

Il faudrait que je trouve comment écrire dans le registre pour que l'action soit prise en compte, mais mon niveau de compétence est limité.
Merci de votre aide.

Bonjour,

Tu actionne le relais à chaque fois que tu passes dans la loop().
Il faut actionner le relais uniquement quand mb.Coil(LAMP1_COIL) passe à 1.

void loop() {
  // Call once inside loop() - all magic here
  static int prevCoil = 0;
  mb.task();

  // Attach ledPin to LAMP1_COIL register
  int coil = mb.Coil(LAMP1_COIL);
  if (coil != prevCoil)
  {
    prevCoil = coil;
    if (coil != 0)
    {
      digitalWrite(ledPin, HIGH);
      delay(300);
      digitalWrite(ledPin, LOW);
    }
  }
}

C'est bien ça !
Merci pour ton coup de main, je cherchais à faire trop compliquer. Pour reprendre mon exemple du 1er post il fallait faire :

void loop() {
  // Call once inside loop() - all magic here
  mb.task();

  if (mb.Coil(LAMP1_COIL) != 0)
  {
    digitalWrite(ledPin, HIGH);
    delay(300);
    digitalWrite(ledPin, LOW);
    mb.Coil(LAMP1_COIL, LOW);
  }
}

Merci encore @kamill :slight_smile: