AQUABOUN'S /// GESTION D'AQUARIUM RECIFAL

Merci al1fch et J.m

Donc quoi qu'il en soit je doit isoler le module, peut importe le mode de transfert utilisé. Je vais me pencher la dessus (car le module atlas a 24€/p + module entre 40 et 60€/p + les sondes, sa commence a faire ... surtout si on en installe 3 ! )

Pour le protocole, je creuse la piste des port série virtuel ou je change de route vers le I2C ?

Oui c’est leur business

Ils ont pour 100euros le shield tentacule avec 4 entrées (4 EZO Circuits bien sûr à acheter séparément) et isolation comprise...

Je suppose qu’on peut arriver à faire une bonne isolation pour moins cher en ‘bidouillant » soi même mais les plans de masse c’est un métier! (@68tjs peut être pourrait donner des conseils)

J-M-L: Oui c’est leur business Ils ont pour 100euros le shield tentacule avec 4 entrées (4 EZO Circuits bien sûr à acheter séparément) et isolation comprise...

oui vu le prix je n'ai même pas envisager cette possibilité.

Je suppose qu’on peut arriver à faire une bonne isolation pour moins cher en ‘bidouillant » soi même

c'est l'idée :)

mais les plans de masse c’est un métier!

j'ai regardé ADM3260 qui est utilisé par Atlas Page 16 il y a le montage typique et rien ne semble sorcier, des condensateurs, des résistances … Autre "problème" ce composant semble peu commun car peu distribuer et le prix tourne (quand même) au tour de 8€/p

L'ADUM1250ARZ isole 2 port I2C pour 3€/p (tout comme l'ADM3260 il faut ajouter résistances et condensateurs) et pour la partie alimentation j'ai trouvé le RFM-0505S a 1.20€ mais je suis loin d'être un spécialiste :/

(@68tjs peut être pourrait donner des conseils)

Je suis preneur :) :) :)

(@68tjs peut être pourrait donner des conseils)

Je suis "gentiment" invité dans un sujet que je ne suivais pas et qui comporte 1149 réponses :disappointed_relieved:

Cela ne va pas être simple, je vais très certainement poser des questions auxquelles il a déjà été répondu mais je ne vais pas lire 1149 messages.

Pour commencer je pose une question : L'isolation concerne-t-elle la totalité des accès de la carte Ezo-Ph ou ne concerne-t-elle que la liaison avec la sonde Ph. Et accessoirement quelle est la datasheet de cette sonde et son mode de connexion.

Sur le brochage de la carte EZo-Ph je vois Gnd du coté UART/I2C et PGND coté sonde. A priori on pourrait penser que si GND n'est pas relié à PGND l'isolation est déjà faite et seule la liaison avec la sonde est concernée. Vous qui vous êtes déjà penché sur le sujet ai-je faux ?

Il suffirait alors de faire attention à ne pas mélanger les "masses" en câblant.

Il est indiqué d'utilisé du fil blindé pour la liaison entre la carte (PRB) et les sondes. Il existe deux catégories de fil blindé : - le blindé classique : un fil entouré d'un blindage isolé ou pas -> il faut qu'il soit isolé car il arrivera bien à toucher une masse globale ce qui mélangera les masses. - le blindé tri axial : le fil blindé précédent est recouvert d'un autre blindage qu'on appelle aussi "écran" (isolé ou non c'est moins important). L'utilisation est différente. Avec le premier type le blindage est connecté à PGND, le fil à PRB. Avec le second type les deux premiers fils sont connectés de la même façon(PRB/PGnd) et l'écran sera connecté à la masse [u]générale/u.

Dans la datasheet ils interdisent les cartes pastillées (proto board) c'est une ânerie. Il faut juste interdire les cartes pastillées avec une face plan de masse mais ce modèle est très cher et dur à approvisionner donc peu de risques.

Dans le câblage il faut juste faire attention à ne pas mélanger la masse générale GND de la masse locale PGND. Attention aussi à la mécanique, les parties métalliques étant à la masse générale.

Sinon pour ne pas mélanger les masses il y a les opto-coupleurs, en choisir un de "course" pour avoir de la bande passante afin de monter en fréquence (I2C/UART). Rappel : pour transmettre carré un signal carré à la fréquence fo il faut un circuit de bande passante entre 7 à 10 fois fo, sinon on n'obtient qu'un sinus.

Re bonjour 68tjs,

Content de vous voir ici :)

L'isolation concerne-t-elle la totalité des accès de la carte Ezo-Ph ou ne concerne-t-elle que la liaison avec la sonde Ph. Et accessoirement quelle est la datasheet de cette sonde et son mode de connexion.

d'après le datasheet de la carte Enzo PH page 6, il dise que l'alimentation et les données doivent être isolé. d'autant plus quand d'autre module (ORP, D.O …) sont utilisés en même temps (ce qui seras le cas) et page 7 il explique comment il isole le module avec un ADM3260 Il n'est nul part fait mention d'isoler la sonde. voici le datasheet de la sonde PH Elle sera connecter en BNC Ce qui m'interpelle c'est que mise a par la page 6 et 7 tout les montages d'exemple sont sans isolation.

Sur le brochage de la carte EZo-Ph je vois Gnd du coté UART/I2C et PGND coté sonde. A priori on pourrait penser que si GND n'est pas relié à PGND l'isolation est déjà faite et seule la liaison avec la sonde est concernée. Vous qui vous êtes déjà penché sur le sujet ai-je faux ?

C'est effectivement se que j'ai pensé que l'isolation sonde était faite d'ailleurs, ici, il indique bien de ne pas le connecter au GND

Il est indiqué d'utilisé du fil blindé pour la liaison entre la carte (PRB) et les sondes.

Il n'était pas prévu d'utiliser du fil entre la carte et la sonde. Je vais faire un PCB ou il y aura le connecteur BNC de la sonde. cela posent il probleme ?

Il n'était pas prévu d'utiliser du fil entre la carte et la sonde. Je vais faire un PCB ou il y aura le connecteur BNC de la sonde. cela posent il probleme ?

Non, il faudra faire attention que le connecteur BNC qui extérieurement est relié à la masse ne touche rien.

Je suppose que tu utilises des BNC parce que la sonde sort en BNC . C'est dommage car rien ne vaut un connecteur vissé : TNC qui est la version vissé du BNC, peu courant hélas, ou SMA vissé et plus petit. Bien évidement SMA bas de gamme car en SMA on trouve de tout de la fiche qui transmet des kHz à celle qui transmet de GigaHertz (mais pas au même prix).

Quand à la documentation du produit je suis dubitatif. J'ai l'impression de voir une usine à gaz pour rien avec des personnes qui ne maîtrisent pas leur sujet comme le coup des protoboards alors que dans ma recherche je suis tombé sur un document Sparkfun qui montrait une réalisation sur protoboard !

As tu trouvé un schéma de cette carte ? Est-ce qu'a l'ohmmètre GND et PGnd sont isolés l'un de l'autre ? Dans la cas de plusieurs sondes les sondes doivent être isolée les une des autres.

Non, il faudra faire attention que le connecteur BNC qui extérieurement est relié à la masse ne touche rien.

Oui j'ai bien compris qu'il faillais absolument séparé pour que la sonde ne soit en contact avec le GND

Je suppose que tu utilises des BNC parce que la sonde sort en BNC .

Oui, cela permet de pouvoir utiliser n'importe qu'elle sonde. d'ailleurs elle sont quasi toute en BNC

As tu trouvé un schéma de cette carte ?

non, et avec la résine coulé sur les composant, impossible de lire quelque chose :(

Est-ce qu'a l'ohmmètre GND et PGnd sont isolés l'un de l'autre ?

j'ai 8.5M Ohms donc non ?

Dans la cas de plusieurs sondes les sondes doivent être isolée les une des autres.

et ca, il n'en parle jamais pourtant ...

Quand à la documentation du produit je suis dubitatif. J'ai l'impression de voir une usine à gaz pour rien avec des personnes qui ne maîtrisent pas leur sujet

d'un point de vu opérationel, sur les différente carte PH que j'ai testé (4 model diffèrent) c'est celle qui a été la plus simple d'utilisation, la plus fiable et stable dans les mesures.

Quote

Est-ce qu'a l'ohmmètre GND et PGnd sont isolés l'un de l'autre ?

j'ai 8.5M Ohms donc non ?

Si ce doit être isolé, il est probable que tu mesure ta propre impédance.

a ok.

Donc celons toi, qu'es que je doit faire comme montage et avec quelle composant pour arriver a des mesure fiable/stable sur les diffèrent module ?

L'idée est de pouvoir utiliser jusque a 4 modules en même temps : PH de l'aquarium PH du réacteur a calcaire Redox (ORP) Salinité (Conductivité)

Ce que je ferai dans un cas comme celui là sans avoir la possibilité de faire des manip moi-même : très difficile.

Je reviens à la base : l'isolation c'est pour avoir plus de précision, elle n'est pas obligatoire. ---> si j'ai bon dans la non obligation je procèderai ainsi : Si tu as au minimum deux sondes je procéderai par étape en restant très pragmatique : Avec une seule sonde en service en utilisant l'isolement "naturel" de la carte EZ Chaque sonde étant testée à son tour : chaque sonde étant à sa destination définitive pour ne pas introduire de variation de câblage. Examen des résultats : sont-ils concluant ? Si oui Utilisation des deux sondes simultanément Les accès I2C et alim sont commun aux deux cartes EZ, les sondes sont sur des circuits séparé (PGnd et PRB). Examen des résultats : il y a-t-il dégradation et si oui de combien de % ?

Puis avec 3 sondes et encore avec 4 sondes.

Ok merci. Le temps (et l'argent) pour commander tout le materiel et je vous tient informer. Merci bcp

Bonjour,

J'ai reçu les modules et les sondes. J'ai mis les modules en mode I2C et lancer les test.

Voila se qu'il en ressort :

module PH : seul : stable Avec module ORP : instable, variation ~10% Avec module conductivité : instable, variation ~10% Avec les 3 modules : instable, variation ~10%

Module ORP: Seul : stable Avec module PH : instable, variation ~35% Avec module conductivité : instable, variation ~35% Avec les 3 modules : instable, variation ~35%

Module conductivité: Seul : stable Avec module PH : stable Avec module ORP : stable Avec les 3 modules : stable

Il fa donc falloir envisager d'isoler chaque circuit comme le préconisait atlas … mais comment … une autre approche que les premiere recherche que j'ai effectué ?

j'ai regardé ADM3260 qui est utilisé par Atlas Page 16 il y a le montage typique et rien ne semble sorcier, des condensateurs, des résistances … Autre "problème" ce composant semble peu commun car peu distribuer et le prix tourne (quand même) au tour de 8€/p

L'ADUM1250ARZ isole 2 port I2C pour 3€/p (tout comme l'ADM3260 il faut ajouter résistances et condensateurs) et pour la partie alimentation j'ai trouvé le RFM-0505S a 1.20€ mais je suis loin d'être un spécialiste :/

Salut - là c'est hors de mon monde... @68tjs devrait sans doute avoir des idées

Bonjour a tous, un long moment que je ne suis pas passer par ici (j'y arrive tout seul hihihi), non en faite je manque cruellement de temp … Je rénove ma maison de A a Z alors sa prend beaucoup de temps, de place …

J'essai de temps en temps d'avancer un peu sur le code, le graphisme et le PCB. C'est justement ce dernier que je partage avec vous aujourd'hui.

Les plus grosse modification sont sur les connectiques. J'au utiliser des connexion ne nécessitant pas a se que je soude mes câble moi même. Donc du din5, rca, jack, sub d et rj45 Il inclus également la possibilité d'installer 3 modules atlas scientifique et les led on été déporter vers l'extérieur pour être visible. Pas de gros changement pour le reste a par de l'optimisation.

Voila le résultat :

|375x500 |281x500 |281x500 |281x500

répartition du brassage avec sélection du type de pompe |281x500 |281x500 |281x500 |281x500 |281x500 |281x500

Salut !

vous êtes devenu un pro, plus besoin de bons points :)

bravo.

Merci mais j'ai eu de bon professeur :wink:

:-[ :D

bonjour a tous,

j’espère que tout le monde va bien en ces temps bien difficile.

un utilisateur a travailler sur une nouvelle fonction que j’ai tout de suite trouvé sympa, la lecture des évènements directement sur l’écran de l’aquabouns.

il ma transmis le bout de code en question mais :

utilisation de “string” pour récupérer les données.
ne peut on pas lire une ligne spécifique ? (ex : lire tout les données de la ligne 53)

Voici son code :

if (myFile) {
  n=0;
  n1=1;
    while ((myFile.available())&&(n1==1)) {
      n++;
      buffersd2 = myFile.readStringUntil('\n');
      char buffersd1[buffersd2.length()+1];
      buffersd2.toCharArray(buffersd1,buffersd2.length()+1);
      switch (n) {
      case 1:
        valeursd00.setText(buffersd1);
        break;
      case 2:
        valeursd01.setText(buffersd1);
        break;
      case 3:
        valeursd02.setText(buffersd1);
        break;
      case 4:
        valeursd03.setText(buffersd1);
        break;
      case 5:
        valeursd04.setText(buffersd1);
        break;
      case 6:
        valeursd05.setText(buffersd1);
        break;
      case 7:
        valeursd06.setText(buffersd1);
        break;
      case 8:
        valeursd07.setText(buffersd1);
        break;
      case 9:
        valeursd08.setText(buffersd1);
       break;
      case 10:
        valeursd09.setText(buffersd1);
        break;
      case 11:
        valeursd10.setText(buffersd1);
        break;
      case 12:
        valeursd11.setText(buffersd1);
        break;
      case 13:
        valeursd12.setText(buffersd1);
        break;
      case 14:
        valeursd13.setText(buffersd1);
        break;
      case 15:
        valeursd14.setText(buffersd1);
        break;
      case 16:
        valeursd15.setText(buffersd1);
        break;
      case 17:
        valeursd16.setText(buffersd1);
        break;
      case 18:
        valeursd17.setText(buffersd1);
        break;
      case 19:
        valeursd18.setText(buffersd1);
        break;
      case 20:
        n=0;
        valeursd19.setText(buffersd1);
        n1=2;
        break;
      }
   }  
  } else {    
   DPRINTF("error opening test.txt");  
  }
  DPRINTF("page sd");  DPRINTLN(); // debug
}

qu’en pensez vous ?

Salut !! ça faisait longtemps !

Oui on peut faire mieux et se passer des Strings!

C'est sur un écran Nextion et vous avez 20 champs de texte valeursd0 à valeursd19 que vous remplissez avec 20 lignes du fichier, c'est ça ?

Comment est défini la variable buffersd1 ? (on dirait un tableau de caractère)

ca fait pas si longtemps ;) mais ca fais plaisir de voir que je te manque 8)

oui c'est bien ca, sur 18 lignes après réorganisations.

et voici les déclarations dans la librairie :

uint16_t NexText::getText(char *buffer, uint16_t len)
{
    String cmd;
    cmd += "get ";
    cmd += getObjName();
    cmd += ".txt";
    sendCommand(cmd.c_str());
    return recvRetString(buffer,len);
}

bool NexText::setText(const char *buffer)
{
    String cmd;
    cmd += getObjName();
    cmd += ".txt=\"";
    cmd += buffer;
    cmd += "\"";
    sendCommand(cmd.c_str());
    return recvRetCommandFinished();    
}

J'ai bosser dessus toute la journée et j'ai réussi a l'intégrer dans la fonction qui lis la carte sd :

/* lis sur la carte SD */
boolean lisSurSd(const char * nomDuFichierTxt, char *donneeLueSurSD, size_t indexEcritureMAX) {
 boolean lectureOK = false; // retourne l'etat de lecture
 uint8_t i = zero;
 uint8_t ligneNextion = 0;
 uint16_t rechercheLigne = 0;
 DPRINTF("Ouverture de : "); DPRINTLN(nomDuFichierTxt);//debug
 myFile = SD.open(nomDuFichierTxt, O_READ); // ouvre le fichier
 if (myFile) {
   donneeLueSurSD[0] = '\0'; // on initialise la chaine à vide
   while (myFile.available()) { // on lit l'intégralité du fichier, à concurrence de l'espace dispo dans notre buffer
     if (i < indexEcritureMAX) {
       donneeLueSurSD[i] = myFile.read(); // lit le fichier
       i++;
       if (pageActuelNextion == sd) {
         if (donneeLueSurSD[i - 1] == '\n') {
           donneeLueSurSD[i] = '\0';  // il n'y a plus rien à lire dans le fichier, on termine
           i = 0;
           DPRINTF("ligne nextion :"); DPRINT(ligneNextion); DPRINTF(" / ligne actuel :"); DPRINT(ligneActuel); DPRINTF(" / rechercheligne :"); DPRINT(rechercheLigne); DPRINTLN();
           if (rechercheLigne == ligneActuel) {
             ligneActuel++;
             switch (ligneNextion) {
               case 1:
                 valeursd00.setText(donneeLueSurSD);
                 break;
               case 2:
                 valeursd01.setText(donneeLueSurSD);
                 break;
               case 3:
                 valeursd02.setText(donneeLueSurSD);
                 break;
               case 4:
                 valeursd03.setText(donneeLueSurSD);
                 break;
               case 5:
                 valeursd04.setText(donneeLueSurSD);
                 break;
               case 6:
                 valeursd05.setText(donneeLueSurSD);
                 break;
               case 7:
                 valeursd06.setText(donneeLueSurSD);
                 break;
               case 8:
                 valeursd07.setText(donneeLueSurSD);
                 break;
               case 9:
                 valeursd08.setText(donneeLueSurSD);
                 break;
               case 10:
                 valeursd09.setText(donneeLueSurSD);
                 break;
               case 11:
                 valeursd10.setText(donneeLueSurSD);
                 break;
               case 12:
                 valeursd11.setText(donneeLueSurSD);
                 break;
               case 13:
                 valeursd12.setText(donneeLueSurSD);
                 break;
               case 14:
                 valeursd13.setText(donneeLueSurSD);
                 break;
               case 15:
                 valeursd14.setText(donneeLueSurSD);
                 break;
               case 16:
                 valeursd15.setText(donneeLueSurSD);
                 break;
               case 17:
                 valeursd16.setText(donneeLueSurSD);
                 break;
               case 18:
                 valeursd17.setText(donneeLueSurSD);
                 break;
             }
             if (ligneNextion >= nbr2Lignes) {
               donneeLueSurSD[i] = '\0'; // ajoute caractere de fin
               lectureOK = true; // la lecture c'est bien passé
               myFile.close(); // ferme le fichier
               break;
             }
             ligneNextion++;
           }
           rechercheLigne++;
         }
       }
     }
     else {
       donneeLueSurSD[indexEcritureMAX] = '\0'; // ajoute caractere de fin
       break;
     }
   }
   donneeLueSurSD[i] = '\0';  // il n'y a plus rien à lire dans le fichier, on termine
   lectureOK = true; // la lecture c'est bien passé
   myFile.close(); // ferme le fichier
   effaceBufferTexte(); // efface le buffer
   strncpy_P (bufferTexte, texteNextionImportationDe, maxbufferTexte); // recupere "char" en memoire flash et le copie
   bufferTexte[maxbufferTexte] = '\0'; // ajoute le caractere de fin
   if (strlen(bufferTexte) + strlen(nomDuFichierTxt) < maxbufferTexte) {
     strcat(bufferTexte, nomDuFichierTxt); // ajoute a la chaine de caractere
     if (strlen(bufferTexte) + strlen(nomDuFichierTxt) < maxbufferTexte) {
       strcat(bufferTexte, ", OK"); // ajoute a la chaine de caractere
       if (pageActuelNextion == demarrage) { // si l'ecran est sur la page de demarrage
         texte4.Set_font_color_pco(vert); // texte couleur vert
         texte4.setText(bufferTexte);// envoi char a l'ecran nextion// envoi char a l'ecran nextion
         DDELAY(mille);
       }
       else {
         effaceBufferTexte();
         strncpy_P (bufferTexte, texteNextionPasDeFichier, maxbufferTexte); // recupere "char" en memoire flash et le copie
         bufferTexte[maxbufferTexte] = '\0'; // ajoute le caractere de fin
         strcat(bufferTexte, nomDuFichierTxt); // ajoute a la chaine de caractere
         if (pageActuelNextion == demarrage) { // si l'ecran est sur la page de demarrage
           texte4.Set_font_color_pco(rouge); // text couleur rouge
           texte4.setText(bufferTexte);// envoi char a l'ecran nextion// envoi char a l'ecran nextion
         }
         DPRINT(bufferTexte); DPRINTLN(); // debug
         DDELAY(mille);
       }
       DPRINT(bufferTexte); DPRINTLN(); // debug
     }
     else {
       DPRINTF("probleme de place memoire dans lisSurSd niveau 2");  DPRINTLN(); // debug
     }
   }
   else {
     DPRINTF("probleme de place memoire dans lisSurSd niveau 1");  DPRINTLN(); // debug
   }
 }
 else {
   myFile = SD.open(nomDuFichierTxt, O_WRITE | O_CREAT | O_AT_END);
   myFile.close(); // ferme le fichier
 }
 return lectureOK;
}

en faite je compte les saut de ligne pour pouvoir "naviger d'une page a une autre : si je click bas je prend la suite de la dernier ligne lu Si je click haut je soustrait 38 a la ligne actuel, je compte les saut de ligne est quand je suis a l'identique j'affiche les 18 lignes suivante.

mais plus on descend et plus c'est long (le temps de recompter les saut de ligne depuis le début) d'un autre cote je me dit que ce n'est pas une fonction principal et qu'il ne faut peut être pas monter une usine a gaz.

je post une vidéo bientot