Désolé, je ne vous comprends pas.
Mon traitement est dans une boucle, mais qui ne reviendra qu'après avoir fait d'autres choses. Je vais essayer d'être bref et précis.
Je mesure l'intensité solaire avec une cellule qui suit son mouvement en élévation et en azimut. Je fais une mesure toutes les quatre minutes. Ce processus est géré par un Mega2560.
Une fois la cellule positionnée, je lance l'ordre de mesure (via une liaison série) à un Pro mini qui lui, est chargé de faire la mesure. Celle-ci peut prendre du temps, mais inférieur à 3 secondes.
J'attends donc que le pro Mini me retourne ses mesures (via la liaison série). S'il y a défaillance, donc pas de softSerial.available()
, je passe à la suite au bout de trois secondes.
Cela terminé, je mets à jour mes affichages dans le Mega, j'enregistre les valeurs dans une carte SD et j'attends les 4 minutes suivantes.
Voilà le morceau de code utilisé :
void DelaiSurNouvPoint(unsigned long t) { // Placer ici les instructions qui permettent de lire les capteurs
/* orientePanneau(true); // Orientation au Sud et à 35° en élévation
delay(500); // stabilisation après la rotation vers le Sud
mesurePmax(&ptEnrg[0], &ptEnrg[1]);
mesCourbes.ptCour[0] = ptEnrg[0]; // Affichage de la tension en mode Sud*/
orientePanneau(false); // Orientation à l'Azimut et à la hauteur du soleil
delay(500); // stabilisation après la rotation vers l'Azimut
mesurePmax(&ptEnrg[2], &ptEnrg[3]);
mesCourbes.ptCour[1] = ptEnrg[2]; // Affichage de la tension en mode Azimut
edHauteur.affiche(dtostrf(ha, 4, 1, str)); // Affichage de la Hauteur
edAzimut.affiche(dtostrf(az, 4, 1, str)); // Affichage de l'Azimut
tPrec = t;
if (uint32_t(t / dTemps) % DIV_AFF == 0)
mesCourbes.majAff(); // déclenche la mise à jour de l'affichage
if (enrgData.appuye) { // Si un enregistrement est demandé
maSD.ouvreFichier(nomFch.texte + ".txt", 'E'); // ouvre la carte SD en mode Ecriture
maSD.ecrit_DT_Data(&ptEnrg[0], dimPtEnrg); // affichage et enregistrement sur la SD de la date, de l'heure et des valeurs de ptEnrg
maSD.fermeFichier(); // termine l'enregistrement sur la carte SD
}
}
void mesurePmax(float *vMax, float *iMax) {
Serial3.setTimeout(1000);
char buff[4];
Serial3.write('M'); // Demande de mesure
uint32_t t0 = millis();
while(!Serial3.available() && millis()-t0 < 3000) {} // On attend d'avoir un retour ... ou pas
if (Serial3.available()) { // si le pro mini répond
String strVI = Serial3.readStringUntil('#'); // Lecture du retour de mesure
Serial3.setTimeout(10);
Serial.println(Serial3.readBytes(buff, 4)); // pour supprimer les octets qui trainent !
*vMax = strVI.substring(1, 13).toFloat();
*iMax = strVI.substring(15, 27).toFloat();
}
}
Si vous voyez comment se passer de la boucle while, je suis preneur.
Cordialement.
Pierre.