Bonjour,
J’ai simplifié le code et ajouté l’option onewire / dallas afin de faire du relevé de température depuis le nano. Car depuis que le plugin est out bah mes sondes le sont aussi.
On peut donc relever plusieurs sondes, normalement la limite c’est 100 sondes sur le même slot. A condition de l’alimenter séparément du nano.
J’ai aussi intégrer le Wifi et vais faire des tests prochainement, le temps de faire le montage.
/*
Carte I/O modbus TCP/IP + fonction température DS18B20.
Hardware: Nano + ethernet shield ENC28J60
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.
IP / Mac fixe.
Source : André Sarmento Barbosa http://github.com/andresarmento/modbus-arduino
*/
/*--------------------------BIBLIOTHEQUES-----------------------------*/
#include <ModbusIP_ENC28J60.h> //Mode TCP/IP
#include <DallasTemperature.h>
#include <OneWire.h>
/*-----------RENSEIGNER ADRESSE IP ET MAC (MODE TCP/IP)---------------*/
//Adresse MAC de votre shield.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE8 };
//Adresse IP de votre shield.
byte ip[] = {192, 168, 1, 51};
/**------------------CONFIGURATION DES I/O et PIN --------------------*/
//Pins 10, 11, 12, 13 non dispo pour ENC28J60.
//Digitales
#define NBRE_DO 8
byte DigitalOut [NBRE_DO]; //Tableau Digital Output
const byte First_pinDO = 2; //Numéro 1er DO
#define NBRE_DI 0
byte DigitalIn [NBRE_DI]; //Tableau Digital Input
const byte First_pinDI = (First_pinDO + NBRE_DO); //Numéro 1er DI sauf si NBRE_DO=8
//Analogiques
#define NBRE_ANO 0
const byte First_pinANO = 15; //Numéro 1er ANO "15" alias "A1"
byte AnalogOut [NBRE_ANO]; //Tableau Analog Output
#define NBRE_ANI 0
const byte First_pinANI = (First_pinANO + NBRE_ANO); //Numéro 1er ANI
byte AnalogIn [NBRE_ANI]; //Tableau Analog Input
//Configuration des registres modbus (adr. possible 0-9999) par catégories.
const byte First_RegDO = 100; //Numéro 1er DO
byte REG_DOut [NBRE_DO]; //Tableau registre Digital Output
const byte First_RegDI = 200; //Numéro 1er DI
byte REG_DIn [NBRE_DI]; //Tableau registre Digital Input
const byte First_RegANO = 300; //Numéro 1er ANO
byte REG_ANO [NBRE_ANO]; //Tableau registre Analog Output
const byte First_RegANI = 400; //Numéro 1er ANI
byte REG_ANI [NBRE_ANI]; //Tableau registre Analog Input
/*-----------------Configuration onewire-dallas----------------------*/
OneWire oneWire(14); // pin 14 (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() {
//Config Modbus IP
mb.config(mac, ip);
Serial.begin(9600);
sensors.begin();
if (NBRE_DO > 0) {
for (int i, j = 0; i, j < NBRE_DO; i++, j++) {
byte pin = First_pinDO + i;
DigitalOut[i] = pin;
pinMode (DigitalOut[i], OUTPUT); //Toutes les pins sont en OUT
byte reg = First_RegDO + j;
REG_DOut [j] = reg;
mb.addCoil(REG_DOut [j], HIGH); //addCoil() pour digital outputs initialise a Off les relais
}
}
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();
/*Gestion des sorties*/
if (NBRE_DO > 0) {
for (int i = 0; i < NBRE_DO; i++) {
byte pin = First_pinDO + i;
DigitalOut[i] = pin;
int reg = First_RegDO + i;
REG_DOut [i] = reg;
digitalWrite (DigitalOut [i], mb.Coil(REG_DOut[i])); //Association registres/pins
} //EndFor
} //Endif
/*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
}
Voilà résultat sous Jeedom :
Et dans le plugin mymodbus la configuration :
Par contre faut que je me penche sur la conso du raspi, car si je fait dialoguer en permanence le charge du PI est conséquente. Je relève toute les secondes…pour le température mais aussi pour les I/O inutile. Peu être créer deux équipements avec la même IP, pour scinder les températures des I/O.
Voilà le code prend 45% du nano donc on a encore de la place pour d’autres fonction.
Je dois encore ajouté un pullup et d’autres chose.
A+