Besoin d'aide pour optimiser du code

Salut à tous,

J’essaye tant bien que mal d’optimiser mon code pour la gestion de la température et de la durée d’éclairage en fonction d’un facteur saisonnier choisi arbitrairement et de la journée sans y arriver. Soit des portions ne fonctionnent pas, soit j’ai des erreurs dans les calculs. Et avant d’aller plus loin avec un clavier PS2, je voudrais déjà m’assurer que cette première partie soit propre. Surtout qu’il n’a rien de compliqué, mais là je sèche après avoir essayé pleins de choses différentes.

Je travaille avec les jours juliens annuels, en minutes, et j’ai choisi de mettre tout ça en photopériode inversée pour utiliser au mieux les heures creuses.

Bref je m’arraches les quelques derniers cheveux qu’il me reste et ça commence sérieusement à m’agacer, aussi de l’aide serait la bienvenue !

Merci beaucoup à tous
Frk

MonProjet_VersionRetenue_092015.ino (13.8 KB)

Salut,

Si tu ne nous dis pas quelles sont les erreurs on ne va pas pouvoir t'aider ... Il faudrait reproduire ton montage avec les mêmes composants, deviner ce que tu veux faire et trouver une erreur ... Qui peut arriver "tardivement" sur une erreur de lecture de l'heure ou autre chose ... Bref ...

A première vue, tu calcules une température moyenne sur 5 points ... Et tu n'affiches cette valeur qu'une fois avoir pris 5 mesures ...
Je trouve que tu utilises bcp de variables intermédiaires ... Une seule peut suffire (tu cumules directement la température calculée à partir d'une lecture analogique dans un float)

Tcumul += analogRead * 500.0 / 1024.0 (si je ne me trompe pas)

Bonjour
Effectivement tu as raison. Déjà le matos : ATmega2560, un shield de chez Keyes, une platine 8 relais, un écran TFT sainsmart, une DS1307 et des LM35.
Pour les erreurs, soit il traite bien les "saisons" mais s'arrête à ce niveau, soit le nombre d'heures de jour est largement au dessus ou dessous de ce qui est donné en consignes (plus de 17h ou valeurs négatives), soit les températures sont carrément dans les choux (je peux monter à plus de 40 comme aller dans des négatives).
Si je traite le calcul des températures dans un fonction appelée à partir des périodes, mêmes remarques.
Effectivement je moyenne les températures avant l'affichage.
Pendant un moment j'avais imaginer l'utilisation de "switch...case" mais je n'ai pas réussi à le mettre en œuvre car toutes les valeurs affichées étaient erronées (comme ci-dessus).
Donc là... surtout que si je reprends tous les calculs à la main, ils sont corrects. :confused:
Voilà, si ça peut éclairer un peu.
Et merci encore
Bon dimanche

essaie déjà de lire des valeurs de températures correctes …

après tu essaies de lire ton horloge et de faire tes bidouilles …

après quand les deux fonctionnent tu ajoutes ton ecran LCD

… enfin quand tout fonctionne … tu assembles le tout

je ne peux pas t’aider plus, je n’ai aucun des éléments que tu as sous la main

Bonjour B83s,
Le code dans la version retenue pour le moment fonctionne bien les valeurs sont correctes et le système régule parfaitement avec une gestion saisonnière sans souci non plus. L'affichage simple qui est fait pour le moment sur le TFT ne pose pas de souci non plus.
Plutôt que de faire des redites sur des lignes de code, je souhaite regrouper. Pour les températures par exemple, une boucle pourrait faire l'affaire je pense et je planche dessus. Ce que je ne m'explique pas c'est pourquoi quand j'ai modifié, toujours en code très basic, j'ai des erreurs ; aurais-je fait des erreurs dans le code actuel qui passeraient mais ne passeraient plus autrement ??? Pourtant je n'ai pas de problème quand je valide le code, et ce que je vise n'est franchement pas compliqué.
Bon, je retourne donc à ma cuisine et vais essayer de tirer tout ça au clair, mais une des réponses tient déjà dans l'alim du module, l'USB n'est pas suffisant et génère des dérives qui sont absentes avec l'alim secteur. A voir maintenant si je reformule mes fonctions si c'est toujours bon ??!!
Merci quand même
Frk

Pour améliorer ton code, tu peux utiliser des tableaux ou des structures au lieu de faire autant de variables et initialiser celles-ci.

Par exemple

float Temp01 ; //pour calculs temperatures LM35
float Temp02;
float Temp03;

devient

float Temp[3] = {0},

idem pour Accm_Temp01 02 03 voltage1 2 3 TemperatureC01 02 03…

Ca te permettra par la même occasion de faire des boucles lorsque tu changes les valeurs plus tard dans ton programme.

Accm_Temp01=0;
Accm_Temp02=0;
Accm_Temp03=0;

Nbcl=0; 

float voltage1 = TempMoy01*5.0; // Converti la lecture du voltage...
float voltage2 = TempMoy02*5.0;
float voltage3 = TempMoy03*5.0;

voltage1 /= 1024.0;
voltage2 /= 1024.0;
voltage3 /= 1024.0;

TemperatureC_01 = voltage1 * 100; // ... en °C
TemperatureC_02 = voltage2 * 100;
TemperatureC_03 = voltage3 * 100;

deviendrai un truc du genre :

Nbcl=0;
for(int c = 0; c < 3; c++)
{
    Accm_Temp[c]=0;
    float voltage[c] = TempMoy[c]*5.0; // Converti la lecture du voltage...
    voltage[c] /= 1024.0;
    TemperatureC[c] = [c] * 100; // ... en °C
}

Au début du programme tu écris :

uint8_t DsDay, DsMont, DsYear, DsHour, DsMin, DsSec;

Tu appelles la fonction GetTimeFromRTC() dans le setup. Mais tu n’utilises jamais ces variables.
Utiliser DsMont à la place de now.month() par exemple n’est pas vraiment utile de toute façon, et ça utilise de la mémoire pour rien. Un arduino n’en a pas beaucoup.