Bonjour à tous
Je commence à prendre racine parmi vous, où finalement, je me sens bien.
Pourtant, cela ne veut pas dire que tout roule comme sur des roulettes. Mon dernier souci est pour moi inexplicable et me complique bien la vie, au point que je patauge depuis quarante huit heures, et mes tentatives n'aboutissent qu'à des impasses.
J'ai besoin, pour mon application, d'un tout petit peu de RAM sauvegardée, que le shield ds1307 me donne. Il y a 56 octets dispo.
Ma rtc était la ds3231 et ma eeprom ne convient pas pour ce cas, du fait de la limitation dans le nombre d'écritures.
J'ai donc approvisionné le shield et je m'occupe à créer les procédures à implanter dans mon application. Je les développe à part, sur un arduino qui ne fait que ça.
J'ai trouvé des exemples où seule une des deux fonctions (rtc ou RAM) sont testées. Je les ai testées et fait mes choix, pour les faire cohabiter, d'abord dans un sketch "commun" pour les éprouver, et ensuite les recopier dans l'application finale.
C'est là que ça coince et même pour de bon.
Ayant isolé et modifié la RTC pour traiter les octets "à ma façon", j'ai ajouté les lignes de programme "volées" dans l'application RAM, et, pour ne pas me faire piéger par des erreurs de syntaxe, j'ai pris l'habitude de vérifier/compiler au fur et à mesure de mes ajouts.
Là, surprise: un message pas vraiment nouveau, car j'avais déjà rencontré, sans vraiment savoir ce qu'il cache au juste, "ce sketch n'est pas fait pour arduino UNO".
Je corrige en supprimant mon ajout, mais le compilateur est têtu: le message reste toujours le même.
Je reteste une série de sketches qui fonctionnaient sur/avec 1307, mais rien à faire. Ils ne veulent plus jouer.
J'ai supposé que c'était mon UNO qui était en cause. Je l'ai remplacé par MEGA mais c'est tout pareil.
Après un jour et demi de galères, j'ai supposé que le PC avait été "touché", mais avant de tout supprimer et réinstaller, j'ai préféré tester sur mac sur lequel ce n'était pas installé. Après la galère de l'installation et la domestication sur mac, le comportement est strictement le même.
Comme c'est pour moi plus facile de manœuvrer sur PC, je suis revenu et le seul sketch par lequel mes problèmes sont arrivés est recopié ici:
Et voici le raccourci du message final:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 // Test_01_1307.ino 2 mai 2021 Lecture date/heure sur SD1307 #include<Wire.h> #include "RTClib.h" // les guillemets pour placer la .lib dans le dossier .ino RTC_DS1307 RTC ; void printDateTime ( DateTime dateTime ) ; void setup () { // put your setup code here, to run once: Serial.begin( 115200 ) ; Wire.begin () ; RTC.begin () ; } void loop () { // put your main code here, to run repeatedly: if ( Serial.available () > 0 ) { int instruct = Serial.read () ; switch (instruct) { case'D': { DateTime now = RTC.now () ; printDateTime(now); break; } // case'S': // { // RTC.set ( RTC_MONTH , 6 ) ; // RTC.set ( RTC_HOUR , 16 ) ; // break; // } } } // delay ( 5000 ) ; } void printDateTime ( DateTime dateTime ) { Serial.print(dateTime.year(), DEC); Serial.print('/'); Serial.print(dateTime.month(), DEC); Serial.print('/'); Serial.print(dateTime.day(), DEC); Serial.print(' '); Serial.print(dateTime.hour(), DEC); Serial.print(':'); Serial.print(dateTime.minute(), DEC); Serial.print(':'); Serial.print(dateTime.second(), DEC); Serial.println(); }
A tout hasard, je donne le rtclib.h qui est inclus dans le dossier du .ino, qui est celui nécessaire pour faire fonctionner.Arduino : 1.8.13 (Windows Store 1.8.42.0) (Windows 10), Carte : "Arduino Uno"
C:\Users\Guy\AppData\Local\Temp\ccilr3fg.ltrans0.ltrans.o: In function `loop':
B:\__Arduino_tests\Tests_ds1307\Test_01_1307/Test_01_1307.ino:28: undefined reference to `RTC_DS1307::now()'
collect2.exe: error: ld returned 1 exit status
exit status 1
Erreur de compilation pour la carte Arduino Uno
J'insiste bien sur le fait que ce sketch a tourné sur la machine. Il fallait entrer un D dans la consosole pour afficher l'heure et la date.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 // A library for handling real-time clocks, dates, etc. // 2010-02-04 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php // 2012-11-08 RAM methods - idreammicro.com // 2012-11-14 SQW/OUT methods - idreammicro.com // Simple general-purpose date/time class (no TZ / DST / leap second handling!) class DateTime { public: DateTime (long t =0); DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour =0, uint8_t min =0, uint8_t sec =0); DateTime (const char* date, const char* time); uint16_t year() const { return 2000 + yOff; } uint8_t month() const { return m; } uint8_t day() const { return d; } uint8_t hour() const { return hh; } uint8_t minute() const { return mm; } uint8_t second() const { return ss; } uint8_t dayOfWeek() const; // 32-bit times as seconds since 1/1/2000 long get() const; protected: uint8_t yOff, m, d, hh, mm, ss; }; // RTC based on the DS1307 chip connected via I2C and the Wire library class RTC_DS1307 { public: // SQW/OUT frequencies. enum Frequencies { Frequency_1Hz, Frequency_4096Hz, Frequency_8192Hz, Frequency_32768Hz }; static void begin() {} static void adjust(const DateTime& dt); static DateTime now(); // SQW/OUT functions. void setSqwOutLevel(uint8_t level); void setSqwOutSignal(Frequencies frequency); // RAM registers read/write functions. Address locations 08h to 3Fh. // Max length = 56 bytes. static uint8_t readByteInRam(uint8_t address); static void readBytesInRam(uint8_t address, uint8_t length, uint8_t* p_data); static void writeByteInRam(uint8_t address, uint8_t data); static void writeBytesInRam(uint8_t address, uint8_t length, uint8_t* p_data); // utility functions static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); } static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); } }; // RTC based on the PCF8563 chip connected via I2C and the Wire library // contributed by @mariusster, see http://forum.jeelabs.net/comment/1902 class RTC_PCF8563 { public: static void begin() {} static void adjust(const DateTime& dt); static DateTime now(); // utility functions static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); } static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); } }; // RTC using the internal millis() clock, has to be initialized before use // NOTE: this clock won't be correct once the millis() timer rolls over (>49d?) class RTC_Millis { public: static void begin(const DateTime& dt) { adjust(dt); } static void adjust(const DateTime& dt); static DateTime now(); protected: static long offset; };
La fonction S n'a jamais fonctionné, je l'ai donc supprimée.
Je suis à présent à votre écoute. Merci d'avance.
Partager