Go Down

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

J-M-L

#330
Nov 24, 2017, 06:18 pm Last Edit: Nov 24, 2017, 06:20 pm by J-M-L
effectivement ca marche :/
surprise :)


pour les " ou ' c'est important de bien faire la différence. un c'est un char *, l'autre un char
Code: [Select]
const char toto = 'x'; // c'est bon
const char toto = "x"; // c'est pas bon, une chaîne se terminant par un \0 il faudrait 2 caractères
const char * toto = "x"; // c'est bon


Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

djbouns

ba du coup cette partie est Ok, y  plus qu'a attendre de l'intégrer avec le gsm

djbouns

Je me suis basé au code du gsm pour copier le ssid une fois extrait du fichier txt.
J'ai donc fait
Code: [Select]
strncpy(ssid, lecture,lectureMAX);
et bien sur sa marche pas, rien ne se passe...

djbouns

a oui, c'est pas l'histoire que ssid fix un pointeur dans lecture et que lecture varie du cout sa pointe plus sur ce que l'on veut ?
 

djbouns


djbouns

Bon en plus de tout ca, j'ai fait pas mal de petite modif dans le code principal dont de nouvelle fonction :

l'osmolation, qui n'était pas prévu au programme, mais vu la demande ...
Code: [Select]
void OSMOLATION() {
  boolean compteur_osmolation = true;
  unsigned long temps_precedent_osmolation;
  unsigned long temps_attente_osmolation;
  if (pinIN_floteur_osmolation == LOW) { // si floteur en position basse
    if (compteur_osmolation == true) {  
    temps_precedent_osmolation = millis(); // activation de la duree d'osmolation
      compteur_osmolation = !compteur_osmolation;
    }
    if (osmolation_ON <= compteur_MAX_osmolation) { //si compteur MAX pas atteind
    if (millis() - temps_precedent_osmolation >= duree_osmolation_millis) { // osmolation si duree d'osmolation non depassé
        digitalWrite(pinOUT_relais_osmolation, HIGH); // relais osmolateur ON
        temps_attente_osmolation = millis(); // activation de la duree d'attente apres osmolation
      }
      else if (millis() - temps_attente_osmolation >= duree_osmolation_millis) { // attente si duree attente non depassé
        digitalWrite(pinOUT_relais_osmolation, LOW); // relais osmolateur OFF
      }
      else { // quand duree osmolation + duree atteinte
        compteur_MAX_osmolation++; // +1 au compteur d'osmolation
        compteur_osmolation = !compteur_osmolation;
      }
    }
    else { // quand compteur MAX atteind
      digitalWrite(pinOUT_relais_osmolation, LOW);
      // alerte
    }
  }
  else { // quand floteur en position haute
    osmolation_ON = 0;
  }
}


Et un mode tempête aléatoire :

Code: [Select]
void TEMPETTE_ALEATOIR(){
  if (tempette_du_jour == true){
  H_tempette_aleatoir = random(fin_LEVER_blanc2, debut_COUCHER_blanc1);
  duree_tempette_aleatoir = random((millis()+30000), (millis()+duree_tempette_millis));
  tempette_du_jour = !tempette_du_jour;
}
  if (H_tempette_aleatoir == Time){
  temps_precedent_tempette_aleatoir = millis();
}
}
************
if (millis() - temps_precedent_tempette_aleatoir <= duree_tempette_aleatoir) {
    pwm_jebao1,pwm_jebao2,pwm_jebao3 = puissance_tempette;
    analogWrite(pinOUT_jebao1, pwm_jebao1);
    analogWrite(pinOUT_jebao2, pwm_jebao2);
    analogWrite(pinOUT_jebao3, pwm_jebao3);
  }

J-M-L

#336
Nov 24, 2017, 10:47 pm Last Edit: Nov 24, 2017, 10:50 pm by J-M-L
Sans doute un bug ici et une petite simplification
if (digitalRead(pinIN_floteur_osmolation) == LOW) { // si floteur en position basse
    if (compteur_osmolation == true) { 
      temps_precedent_osmolation = millis(); // activation de la duree d'osmolation
      compteur_osmolation = false;
    }


(Et un booléen c'est rarement un compteur :) autant appeler compteur_osmolation avec un autre nom )


Ps: on écrit tempête et aléatoire :)
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

J-M-L

a oui, c'est pas l'histoire que ssid fix un pointeur dans lecture et que lecture varie du cout sa pointe plus sur ce que l'on veut ?
Non c'est qu'il n'y a pas de cases mémoires associées à SSID ! Vous ne pouvez pas faire un strcpy() dedans... (attention quand on fait un strncpy() il faut mettre à la main un zéro dans la dernière case au cas où)
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

djbouns

Les bouton et flotteur son relier au pin analogique.

Avant j'aurais écrit "autant écrire compteur_osmolation = false;" mais ça, c'était avant ...
Y a t'il une raison a passer par l'un plutot que l'autre ? peut être pars-qu'avant j'ai utilisé "compteur_osmolation == true"

Je ne vois pas comment l'appeler ce boolean ...

djbouns

Non c'est qu'il n'y a pas de cases mémoires associées à SSID ! Vous ne pouvez pas faire un strcpy() dedans... (attention quand on fait un strncpy() il faut mettre à la main un zéro dans la dernière case au cas où)
Non c'est qu'il n'y a pas de cases mémoires associées à SSID !  ??? je ne comprend pas, je n'est rien vu de différent par rapport au code gsm.
A part que char * ssid est vide avant d'être dans strcpy. c'est ça ?

Pour le '\0' je l'avais bien mis. :)

J-M-L

#340
Nov 24, 2017, 11:19 pm Last Edit: Nov 24, 2017, 11:21 pm by J-M-L
Pour le strncpy(ssid, lecture,lectureMAX);

char * ssid; ça veut dire réserver de la place pour un pointeur (2 octets, une adresse) vers quelque part sur la mémoire, qui s'appelle ssid. mais ça ne réserve aucun espace mémoire.

char lecture[50]; ça veut dire réserver 50 cases mémoires pour y mettre des caractères, l'adresse de la première case étant connue sous le nom de lecture

Quand vous faites le strncpy(ssid, lecture,lectureMAX); vous prenez au plus lectureMAX caractères qui sont rangés consécutivement à partir de l'adresse mémoire  lecture (en s'arretant au premier 0 rencontré) et vous les dupliquez (copiez) les uns derrières les autres à partir de l'adresse pointée par ssid. Comme vous n'avez pas réservé de cases pour cette copie vous allez faire n'importe quoi (et si ssid pointe au milieu de lecture alors la fonction strcpy() est interdite)

OK?
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

J-M-L

Les bouton et flotteur son relier au pin analogique.

Avant j'aurais écrit "autant écrire compteur_osmolation = false;" mais ça, c'était avant ...
Y a t'il une raison a passer par l'un plutot que l'autre ? peut être pars-qu'avant j'ai utilisé "compteur_osmolation == true"
Pas compris la question ou l'explication.


Pour le nom du booléen, un truc du genre declencherOsmolation par exemple

Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

djbouns

OK?
Ok mais quel est l'intérêt dans mon cas d'avoir ce pointeur autent directement avoir char ssid [50] ?

J-M-L

C'est votre idée :)

Dans le code gsm on avait d'ailleurs fait un tableau pour l'extraire et le copier...

Un pointeur c'est juste si vous n'avez pas besoin de le conserver
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

djbouns

et donc j'aurais :

Code: [Select]

strncpy(_SSID, GSM_MessageLine + 5,max_SSID);
_SSID[max_SSID] = '\0';


au lieu de
Code: [Select]
SSID = GSM_MessageLine + 5; // on extrait le Ssid du message
strncpy(copie_SSID, _SSID,max_SSID);
copie_SSID[max_SSID] = '\0';
_SSID = copie_SSID;

Go Up