#include <SPI.h> #include <Ethernet.h> #include <DS1302.h> #include <EEPROM.h> #include <String.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 177); EthernetServer server(80); DS1302 rtc(2, 3, 4); int inPin = 8; int analogPin = 0; int val = 0; int address = 0; String string = ""; String data = ""; String chas = ""; void setup() { Ethernet.begin(mac, ip); server.begin(); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(inPin, INPUT); digitalWrite(5,LOW); digitalWrite(6, HIGH); Serial.begin(9600); } void loop() { data = rtc.getDateStr({FORMAT_SHORT}); chas = rtc.getTimeStr(); data.concat(" "); data.concat(chas); if (val == 1) { EEPROM.put(address, data); address = address + 14; if (address > 1023) address = 0; } EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println("Refresh: 5"); // refresh the page automatically every 5 sec client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); for (int i=0; i<10; i++) { string = EEPROM.get(i,data); Serial.println(string); client.println("<br />"); } client.println("</html>"); break; } } delay(1); client.stop(); } delay(1000); } пишет в EEPROM , но не читает из него и следовательно не отправляет дату на браузер !! помогите пожалуйста
Со строками так нельзя, у вас в EEPROM записывается не строка, а только поля класса String, в которых содержится не сама строка, а только указатель на нее. Посмотрите как работают методы get() и put() - они просто копируют переменную, не глядя на ее структуру.
Во-первых, лучше храните дату в переменной (структуре) фиксированной длины, а не в тексте. Т.е. в часах, минутах и т.п., так с ней удобнее будет работать. Для работы с EEPROM это не принципиально, но важно знать сколько байт будет занимать каждая запись, чтобы карта EEPROM (адреса хранимых данных) оставалась постоянной. Перенос данных строки в EEPROM и можно делать так: Код (C++): const int eeprom_base = 0; int a = eeprom_base; // eeprom address String s; // string data int n = s.length(); EEPROM[a++] = n&0xff; EEPROM[a++] = n>>8; for (int i = 0; i < n; i++) { EEPROM[a+i] = s[i]; } Код (C++): const int eeprom_base = 0; int a = eeprom_base; // eeprom address String s; // string data int n = EEPROM[a] + (EEPROM[a+1]<<8); a+=2; s.reserve(n); for (int i = 0; i < n; i++) { s[i] = EEPROM[a+i]; } Со структурами все примерно так же, размер получается через sizeof() а побайтный доступ через приведение типа указателя.
Код (C++): struct datetime_t { uint16_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t minute; uint8_t second; }; datetime_t dt; const int eeprom_base = 0; int a = eeprom_base; for(int i = 0; i < sizeof(dt); i++) EEPROM[a++] = (uint8_t*)&dt[i]; int a = eeprom_base; for(int i = 0; i < sizeof(dt); i++) (uint8_t*)&dt[i] = EEPROM[a++];