Go Down

Topic: AQUABOUN'S /// GESTION D'AQUARIUM RECIFAL (Read 102309 times) previous topic - next topic

djbouns

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é)

68tjs

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.


djbouns

#1157
Aug 13, 2019, 11:05 pm Last Edit: Aug 13, 2019, 11:05 pm by djbouns
Ok merci.
Le temps (et l'argent) pour commander tout le materiel et je vous tient informer.
Merci bcp

djbouns

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é ?
Quote
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 :/

J-M-L

Salut - là c'est hors de mon monde... @68tjs devrait sans doute avoir des idées
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

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 :







répartition du brassage avec sélection du type de pompe











J-M-L

Salut !

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

bravo.

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

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

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

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 :

Code: [Select]
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 ?

J-M-L

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)

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

#1166
Apr 10, 2020, 07:51 pm Last Edit: Apr 10, 2020, 07:54 pm by djbouns
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 :
Code: [Select]
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 :

Code: [Select]
/* 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


J-M-L

OK !

vous pourriez mettre les objets valeursd0... valeursd17 dans un tableau et éviter le gros switch case en faisant
Code: [Select]
tableauValeursd[ligneNextion-1].setText(donneeLueSurSD);

Pour booster un peu la navigation, il faudrait se souvenir de là où vous vous êtes arrêté dans le fichier ('position') et faire un 'seek' à  l'octet d'après la prochaine fois que vous venez (une variable static dans la fonction qui s'en souvient et vous mettez un paramètre bool optionnel à la fonction qui dit si vous voulez commencer au début du log ou là où vous vous êtes arrêté la fois d'avant

Code: [Select]
void afficher18Lignes(bool commenceAuDebut = true)
{
  static uint32_t teteDeLecture = 0; // 0 début du fichier
  if (commenceAuDebut) {
    teteDeLecture = 0;
  } 

  myFile = SD.open(nomDuFichierTxt, O_READ); // ouvre le fichier
  if (myFile) {
    myFile.seekSet(teteDeLecture); // seekSet pour la bibliothèque SDFat
 
   ... ici le code pour lire

   if (on est arrivé en fin de fichier) teteDeLecture = 0; // si on a atteint la fin du fichier lors du parcours
   else teteDeLecture = myFile.curPosition()+1; // sinon l'octet suivant

   myFile.close(); // ferme le fichier
 }
 ...
}
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

djbouns

j'avais pensé au seek le problème c'est que si je me replace a l'endroit X, pour aller en avant, ok, mais pour retour en arrière ? vu que je compte en nombre de ligne et pas en octet vu que chaque ligne a un nombre diffèrent de caractère.

djbouns


Go Up