Arduinodbus - Coffret I/O sous Modbus

Gros fan de modbus car c’est relativement fiable et peu compliqué à utiliser sous arduino. Récemment j’ai intégré du dht22 sur mes coffrets + du 1wire le tous écrit dans des registres et relue par jeedom. L’intelligence est sur jeedom par contre.

ArdNBus c’est la contraction d’arduino et modbus je trouvez ça cool. :grin:

Tu nous partage ton programme ?

Oui mais demain promis, la je vais dormir.
A++

Bonne nuit alors :wink:, moi aussi je vais pas tarder à y aller.

1 « J'aime »

Hello, avant de partir au boulot, le petit code.
Gros bemol, pour le moment le wemos n’a finalement pas beaucoup d’entrée/sortie utilisable en l’état sans se trouver confronté à des pins de boot ou autre fonction caché au lancement.

/*
   Carte I/O modbus TCP/IP DHCP + fonction température DS18B20.
   Hardware: Wemos D1 Mini
             Carte MOC
			 Fonction: Pilotage des entrées sorties d'un arduino par modbus. Relève de température DS18B20.
   Commentaires : Alimentation 5Vdc auxiliaire requise, pour eviter une surconsomation sur l'arduino, sinon ça ne répond plus.
  Source : André Sarmento Barbosa http://github.com/andresarmento/modbus-arduino
*/
/*--------------------------BIBLIOTHEQUES-----------------------------*/
#include <ModbusIP_ESP8266.h>
#include <DallasTemperature.h>
#include <OneWire.h>
/**------------------CONFIGURATION DES I/O et PIN --------------------*/
/*Registres Modbus */
//const int Relais1 = 100;
//const int Relais2 = 101;
//const int Relais3 = 102;
const int Relais4 = 103;
const int Relais5 = 104;
const int Relais6 = 105;

/*Sorties pour Wemos D1 Mini*/
//const int DO0 = 16; not used cause pin wake
//const int DO1 = 5; 1WIRE
//const int DO2 = 4; not used
//const int DO3 = 0; not used cause bootloader
//const int DO4 = 2; not used cause bootloader
const int DO5 = 14;
const int DO6 = 12;
const int DO7 = 13; 
//const int DO8 = 15; not used cause bootloader

/*-----------------Configuration onewire-dallas----------------------*/
OneWire oneWire(D1); // pin D1 - 5
DallasTemperature sensors(&oneWire);

/*Configuration sonde multiple*/
#define NBRE_SONDE 1                      //Définit le nombre sonde
/*Configuration valeur de départ*/
int REG_SONDE [NBRE_SONDE];              //Tableau registre sonde
const int First_REGSONDE = 500;          //Numéro 1er registre
int SONDE [NBRE_SONDE];                  //Tableau des sondes
const int First_SONDE = 0;               //Numéro 1ere sonde

/*VARAIBLES*/
float TEMPFLOAT;                         //Variables temp flotant negatif possible
int TEMPCALC;                            //Variables temp entier

/*-----------------Configuration des fonctions----------------------*/
//ModbusIP object
ModbusIP mb;

/*TEMPO EN MILLISECONDES*/
long ts;

/*-------------------------------------------------------------------*/

void setup() {
   Serial.begin(115200);
/*Config Modbus WIFI*/
  mb.config("SSID", "password_wifi"); // Renseigner votre Wifi entre les guillemets.
  while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print("Connecting...");
    }
    Serial.println("");
    Serial.println("WiFi connected");  
    Serial.println("IP address: ");
   Serial.println(WiFi.localIP());
  
  sensors.begin();

/*Configuration des pins Arduino*/
  //pinMode(DO0,OUTPUT);
  //pinMode(DO1,INPUT);
  //pinMode(DO2,OUTPUT);
  pinMode(DO5,OUTPUT); //Descente
  pinMode(DO6,OUTPUT); //Montée
  pinMode(DO7,OUTPUT); //Stop
  

/* Associe l'adresse d'un relais par un coil.Add à un registre*/
/*Arret des relais au démarage (cas coupure courant)*/
    //mb.addCoil(Relais1,LOW);
    //mb.addCoil(Relais2,HIGH);
    //mb.addCoil(Relais3,HIGH);
    mb.addCoil(Relais4,LOW);
    mb.addCoil(Relais5,LOW);
    mb.addCoil(Relais6,LOW);
    
if (NBRE_SONDE > 0){
    for (int i = 0; i < NBRE_SONDE; i++){
    int Sx = First_REGSONDE + i;
    REG_SONDE[i] = Sx;
    sensors.begin();
    mb.addHreg(REG_SONDE[i], true);
    }
  }
  ts = millis();
}

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

/*Attache les sorties Relais aux statut du registre*/
   //digitalWrite(DO0, mb.Coil(Relais1));
   //digitalWrite(DO1, mb.Coil(Relais2));
   //digitalWrite(DO2, mb.Coil(Relais3));
   digitalWrite(DO5, mb.Coil(Relais4));
   digitalWrite(DO6, mb.Coil(Relais5));
   digitalWrite(DO7, mb.Coil(Relais6));

/*Relève des températures*/
if (millis() > ts + 3000) {
    ts = millis();
if (NBRE_SONDE > 0){
  for (int i = 0; i < NBRE_SONDE; i++){
    int Sx = First_SONDE + i;
    SONDE[i] = Sx;
    int Reg = First_REGSONDE + i;
    REG_SONDE[i] = Reg;
    sensors.requestTemperatures();
    TEMPFLOAT = sensors.getTempCByIndex(SONDE[i]);
    TEMPCALC = (int((TEMPFLOAT+100)*100));
    Serial.print("Relève sonde ");
    Serial.print(SONDE[i]);
    Serial.print(" : ");
    Serial.println(TEMPFLOAT);
    Serial.print("Valeur converti :");
    Serial.print(TEMPCALC);
    Serial.print(" envoyé sur le registre :");
    Serial.println(REG_SONDE[i]);
    mb.Hreg(REG_SONDE[i],(TEMPCALC));// Registre
   } //EndFor
  } //Endif NBRE
 } //Endif millis
}

Et dans une boîte ça donne ceci:


Fab

1 « J'aime »

C’est propre, le circuit imprimé c’est toi qui là fait c’est bien ça ?

Je l’ai fait faire sur un site bien connu, mais je l’ai entièrement conçu.
C’est propre mais il y a 2errreurs dessus et j’aurais pu faire plus compacte.
Les 5 exemplaires m’ont coûté 7€ livré en 1 mois environ.

Bien joué, c’est du bon boulot :clap:.

1 « J'aime »

Bonjour à tous,
J’utilise depuis quelques temps déjà un boitier à 3 relais largement inspiré de ce post (Merci Fabio133) pour domotiser mon portail. J’ai ajouté un capteur d’ouverture sur ce portail, et je voudrai pouvoir récupérer cette info dans Jeedom. Là ou je but, c’est sure le code de l’arduino. Je vois bien que je peux choisir le nombre de DO et DI, mais comment remonter l’info des DI ?
Merci d’avance pour vôtre temps

Salut,
Pour le DI j’avoue ne pas avoir tester, comme j’avais des modules Advantech ADAM, c’est sur eux que j’ai câblé mes entrées.

Normalement avec Arduino il faut mettre une résistance de pull-up pour éviter le rebond, et sur mymodbus c’est des Coil de mémoire.

FAB.

Bonsoir, petit update.
Voici un nouveau type de coffret en rail din cette fois, pour piloter 7 fils pilotes et toujours un petite sonde ds18b20.
Et le contacteur du chauffe eau aussi.

2 « J'aime »

Petit update coffret découper et floqués,
Essais pilotage réussi sur un de mes radiateurs. Au passage je l’ai basculé sous Jeeduino.:shushing_face:
Plus qu’à intégrer tous ça au tableau.

1 « J'aime »

Trop beau, super travail :+1: !
Par contre pour le modbus sur arduino tu n’as pas réussi a faire fonctionner du coup ?

Salut, j’ai mis jeeduino pour être certain du fonctionnement de la carte.
Je dois me repencher sur modbus mais cet hiver j’aurais pas le temps.
Mon code fonctionne a quelques adaptations prêt mais la latence sur le retour d’état n’est franchement pas bon. Je pourrais échanger plus tard le sketch.

D’accord, si ca marche nickel avec jeeduino c’est déjà une bonne solution

Après j’ai deux coffrets en modbus, un pour l’arrosage automatique et un pour la gestion des éclairage extérieur.
Qui fonctionne très bien à la latence prêt :weary:.
J’ai pas dis mon dernier registre :rofl:

Voilà implanter et connecté. Tous fonctionne même la gestion du chauffe eau👌



Pour reprogrammer suffit ré retirer le capot et accès à l’usb.
A+

1 « J'aime »

Bonjour
Ou as tu trouver cette carte
Je souhaite piloter mes radiateurs en fil pilote, cela semble correspondre à mon besoin
Je voudrais être exclusivement en Modbus la carte est elle prévus pour, à telle une connexion filaire pour aller sur mon Rpi3
Bonne journée

Salut alors elle est de ma création :grin:.
Gestion de 7 fils pilotes
Gestion d’un contact pour chauffe eau
Et une sonde température optionnelle.

Elle est en réseau comme le serait un pc.
Il est possible de la passer en modbus, mais je n’ai pas fait car mon programme ne semble pas pleinement compatible avec le mymodbus.
Pour cet hiver ce sera avec jeeduino.
Pour te connecter au raspi il y a le port usb de l’arduino et jeeduino le supporte.