Projet Lecture sondes pour interface Automate

Bonjour à tous!

Je suis tout nouveau dans le monde de l’Arduino, je suis automaticien avec peu de connaissances en langage C, je maîtrise le ladder, SFC et un peu de structured text, donc j’arrive un peu à voir la gymnastique à faire mais je me perds un peu (même souvent :o ), tout est plus simple dans le monde de l’API… :slight_smile: .

Mon projet est de lire des sondes de température Dallas DS18B20, je pars sur 20, dans ma maison et à l’extérieur pour ensuite traiter la valeur est la transmettre sous forme 0-10V à mon API qui gère toute la maison (Eclairage, chauffage, VMC, arrosage, etc…).
L’avantage de mettre un arduino avec les sondes vers une seule entrée API est le coût bien sûr, les cartes ANA sont assez chères et même en interfaçant avec des relais RT pour lire à tour de rôle, ça deviendrait une usine à GAZ (sans parler des cartes PT100 qui sont hors de prix).

Actuellement j’ai l’ARDUINO UNO mais pas les sondes, elles sont en transport, il me manque aussi l’interface pour transformer le signal PWM en ANA 0-10V.

Avant tout ceci je souhaite debugger mon code pour pouvoir avancer plus vite ensuite.

J’ai un peu de mal à savoir pourquoi et comment les sondes DALLAS doivent êtres configurées, et pourquoi une lecture directe ne marcherait pas?
Ensuite sur le fond, et pour ma culture, lorsque l’on fait un DELAY dans le programme, est-ce que la suite du programme est continuée d’être exécutée ou l’instruction fige durant le temps paramétré la scrutation? (en automate programmable, une tempo ne fige pas le reste du programme) à moins que ce ne soit pas la bonne instruction.

Pour le fond du problème, je doit lire à tour de rôle les 20 sondes ,et à chaque sonde activer une sortie pour permettre à l’automate en face de savoir quand il y a une nouvelle lecture et à qui l’attribuer, pour ne pas se perdre, la boucle fait un top à chaque début pour caler les lectures de chaque coté.

Voici le code que j’ai mis dans mon arduino, il lit des -127° mais comme j’ai pas de sonde je suppose que c’est normal, je voulais m’assurer qu’une fois le matos reçu, ça fonctionne et que mon code soit OK:

const int I_START = 13;
const int O_TOP = 2;
const int O_BOUCLE = 11;
const int O_ANATEMP = 1;
const int MIN_TEMP = -20;
const int MAX_TEMP = 60;
float TEMP;
int INT_TEMP;
int INDEX;


#include <OneWire.h> //Librairie du bus OneWire
#include <DallasTemperature.h> //Librairie du capteur

OneWire oneWire(1); //Bus One Wire sur la pin 1 de l'arduino
DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs avec la librairie

void setup()
{
    pinMode(O_TOP,OUTPUT);
    pinMode(O_BOUCLE,OUTPUT);
    pinMode(I_START,INPUT);
    pinMode(O_ANATEMP,OUTPUT);
    Serial.begin(9600);
  sensors.begin(); //Activation des capteurs
  sensors.getAddress(sensorDeviceAddress, 0); //Demande l'adresse du capteur à l'index 0 du bus
  sensors.setResolution(sensorDeviceAddress, 12); //Résolutions possibles: 9,10,11,12

    Serial.println("*** DEBUT BOUCLE ***");
}

void loop() {

    if (I_START) // test si START vaut 1
    {
        //boucle de comptage
        //compteur s'augmente de 1 à chaque tour
        for (INDEX=1;INDEX<=20;INDEX=INDEX+1)
        {
            Serial.println(INDEX);
    sensors.requestTemperatures(); //Demande la température aux capteurs
TEMP = (sensors.getTempCByIndex(INDEX));
    Serial.print("La température est: ");
    Serial.print(TEMP); //Récupération de la température en celsius du capteur n°INDEX
    Serial.println(" C°");
                //allume
                digitalWrite(O_TOP,HIGH);
INT_TEMP = map(TEMP,MIN_TEMP,MAX_TEMP,0,250);
INT_TEMP = constrain(INT_TEMP,0,250);

analogWrite(O_ANATEMP,INT_TEMP);
    Serial.print("La sortie ANA est: ");
    Serial.print(INT_TEMP);
    Serial.println("V");
                delay(500);
                //eteind
                digitalWrite(O_TOP,LOW);
                delay(250);
            }
            delay(500); //attente de 0.5s
        }
INDEX=0;
                //allume
                digitalWrite(O_BOUCLE,HIGH);
                delay(500);
                //eteind
                digitalWrite(O_BOUCLE,LOW);
                delay(250);

        Serial.println("*** BOUCLE OK ***");
}

Alors derrière ce 1er projet il y a la suite, lire des sondes d’humidité et capteur luxmètre sous le même principe (vers API), mais on verra ensuite, si tout est OK j’enclencherai.

Je ne sais pas si ce type de projet à déjà été fait, mais après quelques heures de recherches, je n’ai rien trouvé de semblable, j’ai donc mis bout à bout des bouts de code et ma propre expérience…
En attente de votre aide merci

Ça fait quand même usine à gaz d’utiliser 20 sortie de ton API pour choisir ta sonde de température et balancer sur l’entrée 0-10v. D’autant plus que arduino bosse en 5v, soit faut retravailler le signal de sortie pour élever jusqu’à 10v, soit perdre la moitié de l’échelle… moyen

Tu n’as pas de port série sur ton automate? Ou modbus? Quel automate tu utilises?

Non je n'utilise pas 20 sorties.

L'ARDUINO utilise 2 sorties qui sont reliées à l'API en entrées (2 entrées), une sortie de l'arduino clignote à chaque lecture et informe donc l'automate d'une nouvelle lecture, une sortie de l'arduino clignote en début de boucle pour reseter l'index de l'API.

En gros à ZERO je met les deux index à zero et à chaque clignotement de TOP, j'incrémente des deux cotés, comme ça je lis mes sondes les unes après les autres.

Concernant mon API, pour l'instant je suis avec un SLC500 avec cartes I/O sur Rack et FlexIO en RIO, mais je suis en train de migrer vers un Compactlogix avec des cartes POINTIO et FLEXIO en DeviceNET.
Le tout sur une supervision FTView.

Pour l’interfaçage 0-10V, il me semble qu'il y a des modules qui font cet upgrade de tension?

Bonjour

J'ai un peu de mal à savoir pourquoi et comment les sondes DALLAS doivent êtres configurées, et pourquoi une lecture directe ne marcherait pas?

La "lecture directe" (en respectant le protocole) est possible , deux choses sont poaramétrables dans les puces DS18B20 :
-la résolution : voilà ce qui figure dans la notice :

The resolution of the temperature sensor is user-configurable to 9, 10, 11, or 12 bits, corresponding to increments of 0.5°C, 0.25°C, 0.125°C, and 0.0625°C, respectively. The default resolution at power-up is 12-bit.

-des seuils haut et bas pour une éventuelle mémorisation interne de franchissement de ces seuils

sans configuration la conversion se fait, pas défaut , sur 12 bits (résolution 0,0625 °C)

Bonjour,

Ce qui veut dire que je peux donc supprimer les lignes de code?

sensors.getAddress(sensorDeviceAddress, 0); //Demande l'adresse du capteur à l'index 0 du bus
  sensors.setResolution(sensorDeviceAddress, 12); //Résolutions possibles: 9,10,11,12

Ou sont elles indispensables, et pour configurer tous les capteurs je dois le faire de 0 à 20? comment dois-je adresser les capteurs de 0 à 20, comment s'inscrivent t'ils sur le bus? Là je sèche j'ai pas tout compris.

Merci

hello
independemment des sondes, D0 et D1 sont utilisées par la liaison avec le moniteur

comme tu fais des "Serial.print", il faut changer ceci

const int O_ANATEMP = 1;
pinMode(O_ANATEMP,OUTPUT);

idem
OneWire oneWire(1); /

Merci effectivement dommage de perdre ces pin de liaison, je décale donc tout de 2 pin.

Pour le reste, le code ne comporte pas d'erreurs?