Arduinodbus - Coffret I/O sous Modbus

Pour te répondre effectivement je pense avoir oublié d’initialiser les sorties.

Si tu ajoute digitalWrite après pinMode dans le void setup() ca devrait rentrer dans l’ordre je testerais ce soir.

      pinMode (DigitalOut[i], OUTPUT); //Toutes les pins sont en OUT
      digitalWrite (DigitalOut[i], HIGH); // Mise à 1 a l'initialisation

Fab.

Bonjour, alors voilà le Modbus par wifi fonctionne enfin. @naboleo
Je vous colle le sketch ci dessous.
J’en avais besoin pour faire le pilotage de mes volets roulants Eveno. Il ne sont pas domotisable en l’état alors je vais ajouter un Wemos / Modbus à chaque télécommande pour simuler actionner ses boutons par des MOC3021.

/*
   Carte I/O modbus TCP/IP DHCP + fonction température DS18B20.
   Hardware: Wemos D1 Mini
             Carte 8 relais 5vdc / 230v 10A
   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> //Mode WIFI ESP8266
#include <DallasTemperature.h>
#include <OneWire.h>
/**------------------CONFIGURATION DES I/O et PIN --------------------*/
//Registres
const int Relais1 = 100;
const int Relais2 = 101;
const int Relais3 = 102;
const int Relais4 = 103;
const int Relais5 = 104;
const int Relais6 = 105;
const int Relais7 = 106;
const int Relais8 = 107;

//Relais KA*
const int DO1 = 5;
const int DO2 = 4;
const int DO3 = 0;
const int DO4 = 2;
const int DO5 = 14;
const int DO6 = 12;
const int DO7 = 13;
const int DO8 = 15;

/*-----------------Configuration onewire-dallas----------------------*/
OneWire oneWire(A0); // pin ADC0 (A0)
DallasTemperature sensors(&oneWire);

/*Configuration sonde multiple*/
#define NBRE_SONDE 1
/*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");
  while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected");  
    Serial.println("IP address: ");
   Serial.println(WiFi.localIP());
  
  sensors.begin();

/*Configuration des pins Arduino*/
  pinMode(DO1,OUTPUT);
  pinMode(DO2,OUTPUT);
  pinMode(DO3,OUTPUT);
  pinMode(DO4,OUTPUT);
  pinMode(DO5,OUTPUT);
  pinMode(DO6,OUTPUT);
  pinMode(DO7,OUTPUT);
  pinMode(DO8,OUTPUT);

/* Associe l'adresse d'un relais à un coil.Add to register - Use addCoil() for digital outputs*/
/*Arret des relais au démarage (cas coupure courant)*/
    mb.addCoil(Relais1,HIGH);
    mb.addCoil(Relais2,HIGH);
    mb.addCoil(Relais3,HIGH);
    mb.addCoil(Relais4,HIGH);
    mb.addCoil(Relais5,HIGH);
    mb.addCoil(Relais6,HIGH);
    mb.addCoil(Relais7,HIGH);
    mb.addCoil(Relais8,HIGH);
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();

/*Attach ledPin to Relais1 register*/
   digitalWrite(DO1, mb.Coil(Relais1));
   digitalWrite(DO2, mb.Coil(Relais2));
   digitalWrite(DO3, mb.Coil(Relais3));
   digitalWrite(DO4, mb.Coil(Relais4));
   digitalWrite(DO5, mb.Coil(Relais5));
   digitalWrite(DO6, mb.Coil(Relais6));
   digitalWrite(DO7, mb.Coil(Relais7));
   digitalWrite(DO8, mb.Coil(Relais8));

/*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
}

J’ai préparé un zip avec les bibliothèques que j’ai utilisé et modifié pour les deux module cablé et Wifi.
Renommé en .zip.
ARDnBUS.txt (465,8 Ko)

Voilà amusez vous bien.
Fab

2 « J'aime »

Hello,

Bon, ben j’ai plus qu’à me lancer ! Merci !
Je peux abuser carrément et te demander tes .stl pour l’impression 3D du support D1 et de la carte 8 relais ?

Des que je trouve le temps je test ça sur un sonoff 4ch pro :wink:, merci pour ton partage.

@naboleo Salut je le modifie car j’ai du repercer les passage de fil aprés l’impression et je te le partage.
@Bebel27 sur un sonoff comment ça il se flashe avec arduino? :drooling_face: cool.

Ps : le pin 8 sur wemos semble être connecté a la led de celui-ci.
Et autre chose je viens de débrancher et rebrancher le wemos en test par USB et sa coince, obligé de débrancher de la carte relancer wemos, puis brancher a chaud le wemos sur la carte relais.
Surement à cause de l’usb.

1 « J'aime »

Le Wemos (et autre carte à base d’ESP8266) est un peu particulier, tu as certain GPIO qui doivent être impérativement à 1 (VCC) lors de la mise sous tension, sinon, il passe en mode programmation et attend des données sur le port série.
C’est le gpio 0, si il se trouve à 0 (gnd) lors de la mise sous tension…le wemos est bloqué en mode programmation.

As tiens donc je savais pas, mais alors il ne devrais pas se lancer tous seul sans la carte relais raccordé.
Le D0 est non connecté et absent du code.
Si je le force à 1 dans de le code cela suffit-il ?

c’est pas D0 mais D3 !
D0 = gpio16
D3 = gpio 0
ça serait trop simple si D0= gpio 0 !

Super donc je suis passé complètement à côté de ça.
HIGH Run, Low Flash, donc D3 sur HIGH pour démarrer
J’utilise D1 à D8.
D3 est à HIGH comme tous ses copains au démarrage donc je m’en sors bien.
Ce qui explique le reboot correct sans la carte relais. Je vais tester avec alimentation externe.

Édit : alim externe c’est pas ça, d3 a low c’est pas ça je cherche.
Au reboot j’ai la sortie d3 et d8 qui pilote les relais associé donc il sont à 0

Oui, mais non…c’est pas au démarrage qu’il faut que D3 soit à HIGH mais avant le démarrage (à la mise sous tension).

Pour D8, c’est normal, sur le schéma du Wemos tu as une résistance de rappel sur gnd (pull down)
tu devrais tester en débranchant D3 pour voir si c’est lui le fautif.
mais ça peut aussi être un problème d’alimentation trop faible, au démarrage le wemos consomme pas mal tant qu’il n’est pas sur le réseau wifi.
PS: schéma de la carte wemos
D8 = pull down par R5
D3 et D4 = pull up par R10 et R11


par contre ta sonde dallas ? elle est sur A0 ? et ça fonctionne ?
normalement dallas c’est du numérique et A0 c’est une entrée analogique !

Bon ben du coup j’ai retirer le wemos de son support, pour en refaire un avec le câblage différent.
D3 déconnecter ça faisait pareil.
D8 allumé.
J’ai fouillé un peu le net, il semble que Wemos c’est 3,3v et pas 5v comme je le connecte actuellement. Possible que cela en soit la cause?
Édit alors effectivement il y a bien un problème de pinout. D3,D4 et D8 sont à ne pas utiliser car il font partie du trio de bootloader… ça fait tombé à 6 pinout…

Effectivement j’ai mis A0 comme sur les sketch des nanos et sur ceux ci je remonte bien des temps. J’ai pas testé sur wemos.

J’ai pas trop avancé mais je viens de trouver un post intéressant pour le wemos.
Téléverser en wifi

J’intègrerais ça très bientôt pour voir ce que ça donne. J’ai pas trouvé la même chose sur Arduino pour l’instant dommage.

Édit j’ai rien dit ça existe:
Televerser par Ip sur Arduino
Là ça m’intéresse plus.Surtout pour les coffrets destiné aux combles…

Salut, je viens de finaliser le proto qui domotisera mes volets roulants de la marque EVENO, vendu par POINT PINPIN :wink:
Je suis pas peu fier même si rien n’est parfait et que je refairais bien un pcb plus compact mais ca marche et en Modbus svp.

J’ai donc un wemos D1 avec son transfo 230V/5V son programme ArdNBus dédié et je pilote les trois commande des télécommandes radio ZUNI R Opy, soit : Montée, Descente et Stop. Surement même par combinaison la position médiane enregistré. (Montée+Stop)
J’ai récupérer les infos du précédent forum et j’ai couplé au modbus.

Je vous entends déjà crier c’est dégueulasse ce boulot bla bla bla, :sob:oui je sais mais c’est mon premier PCB on peu pas tout savoir faire :slight_smile:

Il seront très vite intégrés dans une boite d’encastrement murale sur laquelle je viendrais fixer ma télécommande Zuni R. Ni vu ni connu, ce sera placé sous un interrupteur à proximité des volets afin d’alimenter le module en 230V.

Voilou pour le moment. Je planche encore sur les coffrets pour gestion de ma cheminé. Il parait que l’on va devoir passer du temps a domicile d’ici peu … :frowning:
A+
Fab.

1 « J'aime »

Des volets roulant en modbus :grin:, te voilà dans le club des fans de modbus :heart:.
C’est une création perso ArdNBus ?

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
}