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 ?
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++ 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.
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.
'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
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
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é.
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.
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.
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.