Ce que vous dit le compilateur c'est qu'il n'a pas de fonction qui sait lire le jour de la semaine sous forme d'un objet String (avec un grand S, une instance de la classe String). Dans le monde arduino c'est généralement une mauvaise idée d'utiliser cette classe car elle est gourmande en mémoire et vous n'en avez pas bcp
en général on n'utilise pas un objet String mais un tableau de caractères. essayez avec
Bon je commence a y arriver !!! mais ce n'est pas encore totalement gagne.
Je m'explique :
Je peut dans ma librairie remplacer Monday par 1 ce qui revien au meme !
donc sa me donne ceci !
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
String Variable ="";
byte jour;
void setup() {
// put your setup code here, to run once:
Variable = "1";
jour = Variable.toInt();
rtc.begin();
}
void loop() {
rtc.setDOW(jour);
}
Cela fonctionne pour jour, jour_calendrier, mois, heure, minute, seconde.
Mais "annee" par exemple "2016" et trop long pour rentrer dans byte limite à 255!
je vous ai mis plus haut un code simplifié car en réalité chaque variable String est remplis via une chaîne de caractère venant de L'uart!
donc je bute plus que sur une seul chose qui est l'annee car tous est inferieur a 255 sauf l'anee qui elle doit etre sur 2 byte !
Merci de m'avoir lu et eventuelement d'une reponse !!
C'est pas normal de mettre "1" - ça doit être juste un entier 1..; sérieusement même si vous avez appris PYTHON ou Java, laissez tomber les String avec un grand S sur arduino avec sa petite mémoire. Lisez ce qui vient sur le port série dans un buffer de caractère et décodez avec les fonctions cstring de base + les fonctions de conversion
Si vous lisez l'anglais, aller regarder ce qui est dit dans cet article sur les Strings. Vous comprendrez pourquoi il ne faut pas les utiliser à tout bout de champ...
Utilisez des int a lieu de byte pour stocker vos nombres. Vous pouvez voir ici ce qu'est un int et les autres types possibles comme long, unsigned int, ...
int jour=15;
int mois=11;
int annee=2016;
rtc.setDate(jour,mois,annee);
setDate(date, mon, year); Set the date. Parameters: date: Date of the month to store in the DS3231 (1-31) *1 mon: Month to store in the DS3231 (1-12) year: Year to store in the DS3231 (2000-2099) Returns: Nothing Usage: rtc.setDate(4, 7, 2014); // Set the date to July 4th 2014. Notes: *1: No checking for illegal dates so Feb 31th is possible to input. The effect of doing this is unknown.
Je comprend le problème de String qu'a moitié, je suis déjà un vieux lolll.
J'ai 46 ans et j'ai commencé la programmation à 13 ans avec des commandes simple le basic du zx81 sa date!!!!!
Je ne suis donc pas informaticien programmeur mais un simple technicien en électronique.
En bref oui je comprend que String occupe une grande place en mémoire mais je ne voie pas dans mon code, comment remplacer String par autre chose pour enfin le convertir en un entier !!!
Attention tenir compte du second code mis plus haut car le premier n’étais qu'un jet qui ne fonctionnais pas !
Aussi vus que la mise a jour de l'heure viens via un Nextion HMI par l'RS232 et donc un:
serial available
char c = serial.read
variable += c
Comment entrer c dans autre chose qu'une variable String ????
Aussi la mémoire qui est occuper par String dépend du contenus de la variable ou par un espace allouer au fait que se soit un String ???
il faut faire la différence entre string et String. avec un s minuscule, on fait simplement référence à un tableau de caractères. par exemple déclaré comme celachar tableau[20]; // un buffer de 20 caractères, prévoir assez grand mais pas tropalors qu'avec un S majuscule on parle de la classe String. cf les précision dans cette page Arduino.
Comme mentionné plus haut la classe String prend bcp de mémoire et risque de morceler votre mémoire et donc on évite son emploi sur des petits micro-processeurs pour éviter des bugs mémoires très difficiles à résoudre ensuite.
En pratique, on écoute généralement sur le port série les données qui arrivent, on les lit effectivement caractère par caractère et on les mémorise dans le tableau les uns à la suite des autres. (cf les chaînes de caractères en C).
On le fait jusqu'à ce que le tableau soit plein ou que l'on ait reçu un caractère spécial qui annonce la fin du message, comme par exemple le passage à la ligne '\r' et/ou '\n'. Généralement on rajoute (sans déborder du tableau!) un caractère nul '\0' à la fin de ce que l'on a reçu pour former une chaîne de caractère correcte pour le langage C (ou C++).
Par exemple si vous voulez tester à la main et pouvoir taper sur la liaison Série 15/10/2016 et envoyer l'info sur le port série de votre Arduino
assurez vous d'avoir d'abord bien réglé la console pour envoyer un ou plusieurs caractères de fin de ligne (ici j'envoie '\r' et '\n' à la fin du texte donc le port série Arduino verra arriver à la vitesse de 115200 bauds "15/10/2016\r\n"
Vous allez lire cela caractère par caractère et stocker dans le tableau et quand vous avez reçu le '\n' remplacez le '\r' d'avant par '\0' par exemple pour marquer la fin du message.
Vous pouvez faire un Serial.println(tableau); par exemple pour l'afficher puisque c'est une chaîne de caractère correctement terminée et vous pouvez analyser son contenu avec les fonctions d'analyse de chaîne que j'ai mentionné plus haut pour extraire chaque nombre (ou en mode "brute force" dire que vous aurez toujours 2 digits par élément et qu'ils sont en 0,1 puis 3,4 et 6,7,8,9 et faire un atoi() à partir de ces adresses.
Du genre
int jour = atoi((const char *) &tableau[0]);
int mois = atoi((const char *) &tableau[3]);
int annee = atoi((const char *) &tableau[6]);
(C'est pas très robuste mais si vous êtes sûr du format de la chaîne de caractère avec les séparateurs et bien deux chiffres - même si le mois c'est mars, écrit 03 alors or espace et 3 - alors ça fonctionnera )
Allez lire le tutorial et regardez les exemples de Serial Basics, c'est assez complet.
PS: j'ai commencé à peu près au même âge et je suis plus vieux que vous - l'âge n'est pas une excuse quand on veut on peut
Super Merci l'explication est Top et en plus a la compilation je n'en reviens pas sur une tel différence d'espace mémoire !!!
Pfff Maintenant vas falloir que je revois l'ensemble de mon code actuellement il dois faire dans les 10Ko.
Mais après toute les correction de ce genre je gagnerai peut-être un tiers et en plus il devrais être plus rapide a tourner !!
enfin pour illustrer ce que dit J-M-L voici la difference:
Ceci étais ma solution :
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
String Variable ="";
byte jour;
void setup() {
// put your setup code here, to run once:
rtc.begin();
}
void loop() {
Variable = "1";
jour = Variable.toInt();
rtc.setDOW(jour);
}
resultat :
Sketch uses 3,328 bytes (10%) of program storage space. Maximum is 30,720 bytes.
Global variables use 38 bytes (1%) of dynamic memory, leaving 2,010 bytes for local variables. Maximum is 2,048 bytes.
resultat :
Sketch uses 1,770 bytes (5%) of program storage space. Maximum is 30,720 bytes.
Global variables use 19 bytes (0%) of dynamic memory, leaving 2,029 bytes for local variables. Maximum is 2,048 bytes.
Il n'y a pas photo !!!
et on fait la même chose !!!!
Attention vous avez un bug - souvenez vous qu'une chaîne doit toujours se terminer of '\0'
Donc il faut au moins 2 caractères dans tableau, une case pour le '1' et une case pour le '\0' que vous devez aussi initialiser
Et aussi la différence entre les 2 approches vous ne la verrez pas vraiment à la compilation Mais si votre app tourne longtemps avec des Strings de tailles différentes elle va morceler la mémoire et avoir des effets secondaires difficilement visibles