ergonomie et bonne pratique pour coder

Bonjour à tous.

Je me suis mis a arduino depuis 15 jours, avec le projet de réaliser un thermostat programmable pour piloter 2 pompes à chaleurs qui chauffent ma maison (ou la rafraichissent en été). Je me sui donc équipé pour cela d'une méga, un afficheur led 1602 (que je vais changer par un 2004) un module rtc ds3231 et 2 dht22 (un interieur et un extérieur). 4 boutons poussoirs pour naviguer dans mon menu, une diode ir pour piloter chaque clim et voilà pour l'essentiel.

En piece jointe vous trouverez une version de la hierarchie du menu (non complete mais suffisante pour comprendre le fonctionnement général) et une vue de mon montage.

Mon thermostat devra en fonctionnement normal pouvoir donner 3 températures de consigne :

  • une de nuit / absence
  • une de présence (lorsqu'on est actif a la maison)
  • et une de grand confort (lorsqu'on larve dans le canapé par exemple)

Je dois avoir plusieurs programmes (numérotés de 1 à 5) qui seront affectés aux différents jours de la semaine : par exemple lundi P1, mardi P1, mercredi P2, jeudi P1, vendredi P3, samedi P4, dimanche P5

Voilà mes problèmes :
1- Au niveau ergonomie dans le menu, comment présenteriez vous la saisie de ces différents programmes ?
Pour le moment je n'ai trouvé que la solution suivante : pour chaque programme donner 3 heures différentes de début pour chaque température de consigne (cf code ci dessous) mais je trouve pas ça super fluide.

2 -J'ai besoin d'un certains nombre de variables en paramètres que je vais enregistrer en eeprom via saisie dans mon menu. Ces variables vont devoir être manipulées par plusieurs fonctions pour le traitement de mes instructions.

int tempConfort;//valeur par défaut :	20	adress :0
int tempGdConfort;//				22		10
int tempNuit;//					17		20
int tempHorsGel;//				10		30

//mode presence
int prog1GdConfort1;//				0700		100
int prog1GdConfort2;//				1900		110
int prog1GdConfort3;//				0000		120
int prog1Confort1;//				0830		130
int prog1Confort2;//				0000		140
int prog1Confort3;//				0000		150	
int prog1Nuit1;//					2100		160
int prog1Nuit2;//					0000		170
int prog1Nuit3;//					0000		180
//mode absence
int prog2GdConfort1;//				0000		200
int prog2GdConfort2;//				0000		210
int prog2GdConfort3;//				0000		220
int prog2Confort1;//				0700  	230
int prog2Confort2;//				2000  	240
int prog2Confort3;//				0000  	250
int prog2Nuit1;//					0800     	260
int prog2Nuit2;//					2100     	270
int prog2Nuit3;//					0000     	280

// etc ....

int lundi;//                                          3		700
int mardi;//                                         3		710
int mercredi;//                                     4		720
int jeudi;//                                          3		730
int vendredi;//                                     3	        740
int samedi;//                                       4		750
int dimanche;//                                    5		760

int modePresence;//200918					800
int modeAbsence;//150918					810
int modeSaison;//0							820

Mon idée première était d'appeler ces variables dynamiquement en fonction du programme sélectionné mais voilà en C impossible(je programme en php et je découvre la puissance mais aussi les limitations du C). Comment chargeriez vous ces variables afin de pouvoir les manipuler facilement ?

J'espère avoir été clair et pas trop long.

Bonne journée à tous.

Mathieu

Vos images pour qu’on n’ait pas à télécharger

Structure:

Montage:

Sur votre point:

je découvre la puissance mais aussi les limitations du C

allons allons, vous découvrez juste que vous ne savez pas programmer en C ou C++ :slight_smile: et en langage compilé pour micro-processeur sans OS.

À chaque « programme » pourrait être associé une structure de données définissant ses paramèters fonctionnels uniques. cette structure peut simplement être stockée en EEPROM et relue à l’activation du programme.

si tous les programmes partagent un même ensemble de paramètres c’est encore plus simple bien sûr.

Ensuite le programme pour faire ce que vous voulez n’est pas gigantesque, et les variables dont vous parlez relativement limitées en taille - vous aurez sans doute tout à fait la place d’avoir tout en mémoire dans les 8k de votre mega.

Déjà merci pour votre réponse.

Non, je découvre pas que je ne sais pas programmer en C mais j'ai des habitudes en php qui sont bien différentes que ce que je peux actuellement faire en découvrant le C.
Pour ce qui est de la carte mega, je me suis fait plaisir en me disant que qui peut le plus peut le moins... Je suis pour l'instant à état de prototypage, mais je pense prendre une carte plus petite pour la mise en service de mon projet une fois aboutie.

Bref pour en revenir à mon problème de variables, plutôt que d'abuser de structures de contrôle if et swich(pour des problèmes de lisibilité du code et de maintenance pour les futures évolutions), je souhaiterai plutot charger mes variables dans un tableau ou dans une structure afin de pouvoir les parcourir plus simplement. Je ne sais pas si c'est une bonne idée, c'est pour ça que je viens demander de l'aide d'experts qui pourront éclairer ma lanterne. Je connaissait pas les structures et leur manipulations mais je me dis que c'est peut être la solution.

Vous parlez de mettre des structures en eeprom je ne pensais pas cela possible. Je vais chercher dans cette direction.

Merci encore

'ai des habitudes en php qui sont bien différentes que ce que je peux actuellement faire en découvrant le C.

Oui. vous avez l'habitude d'un langage interprété, tournant sur un OS offrant des fonctions avancées et du multitâche, tournant à plusieurs gigahertz sur une machine qui a des gigas octets de mémoire... là faut faire un peu plus attention aux ressources :slight_smile:

pere_et_fils:
Vous parlez de mettre des structures en eeprom je ne pensais pas cela possible. Je vais chercher dans cette direction.

l'EEPROM c'est juste une suite d'octets. vous mettez dedans ce que vous voulez. Regardez les exemples pour get() et put() pour voir comment charger/stocker une structure

plutôt que d'abuser de structures de contrôle if et swich(pour des problèmes de lisibilité du code et de maintenance pour les futures évolutions), je souhaiterai plutot charger mes variables dans un tableau ou dans une structure afin de pouvoir les parcourir plus simplement

un switch qui appelle des fonctions dédiées associées à un scénario/programme donné reste lisible.

jetez un oeil sur la notion de structure et union en C/C++ éventuellement

Oui, j'ai bien compris pour le php :grinning:

je viens de jeter un oeil aux structure et union ... ça correspond bien a mes attentes. merci encore pour votre aide. Je vous solliciterai encore je pense et dans tous les cas je partagerai mon projet une fois un peu plus avancé.

bonne journée :wink:

bonne journée et bonnes bidouilles !

Juste un commentaire : pourquoi des DHT22 ? Tu as vraiment besoin de l'humidité ?
Sinon, des DS18B20 sont nettement plus indiqués.

Bonjour

Ben pour ma part j'ai fait le contraire.
Je suis arrivé au PHP après le C/C++

Et c'est vrai que quand on expérimente la facilité de manipulation de structures de données en PHP grâce aux tableaux associatifs, c'est un vrai bonheur.

Pour faire le chemin dans l'autre sens, je ne suis pas certain que la voie la plus simple soit d'essayer de transposer des principes "évolués à la PHP" vers le C/C++, surtout dans le contexte arduino.

Y en a qui ont essayé, sur le simple cas des chaînes de caractères.
Cela donne une class string, à fuir comme la peste pour cause d'allocations/libérations dynamiques de mémoire dans le contexte plus qu'exigu de la ram d'un arduino, avec souvent à la clé des débordements mémoire aux conséquences fâcheuses.

Le plus sage est toujours de respecter les principes de base du langage utilisé, plutôt que de lui tordre le cou pour qu'il ressemble à un "standard".

Gérer une collection de données paramètres ?

en C de base : on passe par un struct
en C++ : une simple classe, avec une seule instance en variable globale, permet de porter les valeurs des paramètres et les méthodes associées (lireDepuisEEprom(), EcrireSurEeprom(), etc.)

Les deux sont possibles sans problème avec arduino.

Merci pour vos commentaires.

pour le dht22, effectivement, je vais avoir besoin de l'humidité pour la suite de mon projet....

bricoleau : c'etait tout a fait le sens de mon sujet de départ, je cherche à coder propre dans le standard du langage. je suis parti sur une (des) structures. pour ce qui est des debordements de mémoire, je suis conscient de tout ça et j'y veille.

comme je l'ai dit plus haut, je partagerai mon code et j'espère à cette occasion recevoir les critiques de mon code afin de m'améliorer.

ok super

Je te suggère de regarder aussi du côté des classes en C++

struct ne gère que de la donnée, alors qu'une classe permet plus proprement de gérer les données ET les primitives de manipulation associées, au sein d'un même container de code.