Oui c'est ça, chaque périphérique a une adresse propre. Bonne soirée...
Coucou, me revoilà avec mes interrogations
Le message est parti avant que j'expose mes doutes
Avec ce programmateur, nous pouvons modifier les plages horaires à partir du Shield, cela fonctionne, mais quand j'actionne le bouton Reset ou quand il y a une coupure d'alimentation, ce sont les éléments contenus dans la TabEvt du programme téléverser qui sont opérationnels => ce qui voudrait dire que la saisie à partir des boutons ne modifient pas les informations contenus dans la TabEvt ?
Si tel est le cas, je n'aurai pas la possibilité d'afficher les différents plages horaires si elles ont été saisies avec les boutons du Shield ?
Merci de tes lumières car je commence à me perdre
Il faut alors ajouter la possibilité de stocker les nouvelles valeurs des plages horaires en EEPROM. Au démarrage du code, on vérifie s'il y a ou non des valeurs stockées et si oui on les met dans le tableau à la place de celles qui sont en dur dans le code.
Ah je comprends mieux, c'est seulement stocké mais pas sauvegarder => mais quelle est l'utilité de ne pas actualisé systématiquement la TabEvt dès que l'on modifie une plage horaire de fonctionnement
Par contre c'est encore une marche de plus à gravir pour modifier le programme,
Je vais encore te solliciter pour que je puisse comprendre sans passer des jours à essayer et peut-être me retrouver dans une voie sans issue
Ton aide m'a permis de mieux assimiler les données du langage C me permettant de décortiquer le contenu de certains projets mis sur la toile
Merci
Je ne fais pas vraiment de différence entre stocker et sauvegarder... L'EEPROM permet de stocker des valeurs en mémoire et les retrouver après que l'Arduino a été débranché.
Il faut utiliser la bibliothèque EEPROM :
#include <EEPROM.h>
Je ne suis pas un expert, j'ai appris à m'en servir en lisant des messages sur le forum (souvent de J-M-L ). Tu as un tuto ici qui explique comment utiliser les principales commandes
Exemple pour stocker un int à une adresse :
//Write data into eeprom
int address = 0;
int boardId = 18;
EEPROM.put(address, boardId);
et pour stocker un float :
float param = 26.5;
EEPROM.put(address, param);
L'EEPROM est une mémoire qui fatigue à la longue, donc il vaut mieux éviter d'y écrire trop souvent. La méthode update permet de n'écrire que si le contenu est différent
Pour lire un int au début de l'EEPROM :
//Read data from eeprom
address = 0;
int readId;
EEPROM.get(address, readId);
Le problème pour toi est de lire les paramètres des plages horaires, mais il faut d'abord savoir si elles sont déjà stockées, et de les mettre à jour lorsqu'elles sont modifiées.
Mettre à jour : tu sais faire avec update.
Mais lire si elles sont déjà là ?
Une méthode que j'ai apprise ici est d'ajouter au début de l'EEPROM un nombre (magique) : le programme lit la première adresse. Si le nombre lu correspond au nombre magique, c'est que les données sont déjà là et on peut les lire à la suite. Sinon, il faut les y mettre, après avoir écrit le nombre magique au début.
Je te laisse réfléchir et commencer à mettre quelques lignes de code...
Le piège est de savoir comment incrémenter les adresses. Si tu commences par stocker un byte (un octet), l'adresse suivante sera la précédente plus 1. Si tu as stocké un int (qui tient sur 2 octets), il faut ajouter 2 à l'adresse, sinon tu vas écrire dans ton int. Pour un float, c'est 4.
Ceci est vrai pour un arduino mais peut varier pour un ESPxx.
Bonsoir
Merci de tous ces commentaires, que je dois digérer, comprendre et expérimenter
Mais je pense que cela risque "pour l'instant " de m'emmener au delà de mon premier projet Arduino
J'ai lu et relu le code de Sweethome , et je n'ai pas trouvé où était stocké les plages horaires définies avec les boutons du Shield => si c'est dans l'Eeprom, cela se fait naturellement sans cela soit mentionné dans le code ?
Alors pourquoi ne pas faire que cela s'inscrive directement dans le code ! (je dois être trop naïf ...? )
Ps : après 3 jours de fonctionnement, ton code de recherche des plages horaires est très efficace => MERCI
oups, je viens de comprendre (ou plutôt je crois avoir compris) que les données étaient stockées dans la mémoire Sram
Je vais encore réfléchir pour savoir comment faire afficher les plages horaires prises en compte par ce programmateur, plutôt que d'attendre l'affichage du N° des voies quand elles sont pilotées
Merci encore de ta disponibilité
J'ai parcouru le code rapidement. Je pense que les plages sont stockées dans le tableau TabEvt. Le code qui est dans le setup sert à les modifier. Mais je ne vois aucune instruction pour les sauvegarder nulle part.
Il faudrait créer 2 fonctions :
- lecturePlages qui vérifie que des plages sont sauvées dans l'EEPROM et le cas échéant, les lis et les stocke dans TabEvt
- sauvePlages qui sauve les plages dans l'EEPROM en cas de modification
A la ligne 101, on voit ça :
// Saisie Plages Horaires ?
Avant, c'est la mise à jour de l'horloge si je comprends bien.
C'est donc là qu'il faut travailler. Je verrais bien ceci :
// Saisie Plages Horaires ?
lecturePlages ();
Il faut écrire la fonction:
void lecturePlages () {
// D'abord lecture du nombre magique
int address = 0;
int magic;
EEPROM.get(address, magic);
if (magic != 42) { // J'ai choisi 42
// Le nombre n'y est pas : on sauvegarde les données du TabEvt
sauvePlages();
} else {
// Le nombre y est : on lit les données EEPROM et on les met dans TabEvt
address += 2;
for (int i = 0; i<6; i++) {
for (int j = 0; j<4; j++) {
int nombre;
EEPROM.get(address, nombre);
TabEvt[i][j] = nombre;
address += 2;
}
}
}
}
Et il faut écrire l'autre fonction :
void sauvePlages() {
// D'abord écriture du nombre magique
int address = 0;
int magic = 42;
EEPROM.update(address, magic);
// Ensuite écriture du tableau
address += 2;
for (int i = 0; i<6; i++) {
for (int j = 0; j<4; j++) {
int nombre = TabEvt[i][j];
EEPROM.update(address, nombre);
address += 2;
}
}
}
Il reste à savoir où et comment appeler cette fonction après la modification des plages dans le setup. Le plus simple c'est au niveau de la ligne 180 :
}// Fin While Maj Plages Horaires
sauvePlages();
}// Fin Setup
Les fonctions, tu les mets juste avant le setup.
A tester...
Bonsoir ,
Merci pour ces différents codes que j'ai ajouté , puis téléverser sans problème
Par contre cela ne change rien au fonctionnement d'avant c.a.d après changement des plages, puis coupure de l'alimentation, c'est toujours les plages paramétrer dans le code qui sont actives
Deux questions
- " le nombre magique 42 est dans certaines minutes des plages => est-ce une interférence ou pas ?
- tu m'indiques de saisir les fonctions avant la fin du Setup => tu veux parler des " lecturePlages(); " et "sauvePlages(); " ?
Petit à petit, j'avance grâce à toi
Première question, je ne sais pas.
Seconde question, oui.
Poste ton code en l'état actuel, ça m'aidera, car je ne connais que la version initiale...
Je ne sais pas poster mon code
Dans l'IDE tu fais CTRL A pour tout sélectionner et CTRL C, puis CTRL shift V dans ton message. Tu sélectionnes le code ou CTRL A s'il n'y a rien d'autre et tu cliques sur le bouton </> pour ajouter les balises code. Et hop !
Bonsoir
Hier soir, je devais être fatigué pour te répondre sans avoir pris le temps de chercher pour joindre le fichier ino
Je te le joins, en espérant que tu puisses l'ouvrir sans problème
Par contre j'ai remplacer le chiffre magique " 42 " par " 100 " et ainsi voir s'il n'y avait pas d'interférences avec les minutes des plages => cela n'a rien changer à la sauvegarde dans l'EEPROM
Sinon pour le reste tout est OK
Bon courage
ProgrammateurHoraireV4essai.ino (15.4 KB)
OK, je vais regarder.
Tant qu'on est dans l'IDE, tu peux indenter ton code de manière plus lisible grâce à la commande CTRL T.
Voici une version que j'ai un peu simplifiée. J'ai mis le nombre magique en constante au début du code, ce sera plus simple à modifier le cas échéant :
#define MAGIC 100
J'ai ajouté des lignes de débug dans les fonctions qui jouent avec l'EEPROM : compile le code et s'il n'y a pas d'erreur, lance le et copie dans ta réponse le contenu de la console.
En fonction du contenu, je te donnerai d'autres instructions...
ProgrammateurHoraireV4essai.ino (14.2 KB)
Bonjour
Merci pour toutes ces modifs et améliorations
J'ai vérifier et téléverser le code, puis après avoir modifié l'heure de la première plage en passant de 20h à 21h, puis fait une coupure d'alimentation, apparemment cela n'a rien changé sauf que je dois faire deux actions sur le Bp "Right" du shield quand on me demande de modifier ou non l'heure de l'horloge. Là je me suis dit qu'un enregistrement devait bien se faire
Alors j'ai décidé de couper toute l'alimentation, puis de mettre en action le moniteur série pour voir ce qu'il se passait.
J'ai copié l'ensemble des données affichées sur l'écran, puis j'ai ajouté les commentaires en face des actions que j'ai fait sur les différents boutons du Shield.....et là on voit bien que ma modification est bien notifiée
Reste à savoir pourquoi elle n'est pas sauvegardée ?
J'avance, j'avance, mais toujours très loin de la cible pour comprendre tout seul ce qui ne va pas
Merci encore de ton aide, et petit à petit j'assimile les subtilités du langage C
Moniteur Série.doc (27 KB)
OK, il semble que le nombre magique ne se sauve pas.
On lui donne 100 et il obtient -156, or 100 - (-156) = 256 = 2 ** 8. Il doit y avoir un problème de type de donnée.
Un café va m'aider à comprendre...
En effet, update marche avec des bytes, or j'ai déclaré magic comme un int, codé sur 2 octets. Donc le update ne marche pas.
Change
int magic;
en
byte magic;
Ca devrait aller mieux, mais ce n'est pas suffisant car j'utilise update ailleurs. Je continue à chercher...
La solution la plus simple est d'utiliser des bytes pour TabEvt et non des int. Un byte va de 0 à 255, et les heures et minutes dépassent rarement ces limites **, donc c'est sans problème.
Le code modifié est attaché (il dépasse la limite de 9000 caractères).
J'espère n'avoir rien oublié...
** : sauf quelques fois lors des années trisextiles...
ProgrammateurHoraireV4essai.ino (11.3 KB)
Hello,
Je te remercie d'avoir étudié une nouvelle codification un Dimanche (ça va me couter cher !!!)
Bon j'ai installé la nouvelle version, mais j'ai un blême sur les plages, le 255 apparaît toujours sur les heures et les minutes .
Je te joins une copie du moniteur série qui enregistre les infos
J'ai bien essayé de comprendre, mais cela dépasse mes compétences
Merci par avance
Moniteur Série V6.doc (33.5 KB)