помогите, проблема с EEPROM

Тема в разделе "Arduino & Shields", создана пользователем Tigran, 26 авг 2015.

  1. Tigran

    Tigran Нуб

    #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 , но не читает из него и следовательно не отправляет дату на браузер !! помогите пожалуйста
     
  2. Максим B

    Максим B Гуру

    А в переменную data заноситься вообще значение ? data = rtc.getDateStr({FORMAT_SHORT});
     
  3. Unixon

    Unixon Оракул Модератор

    Со строками так нельзя, у вас в EEPROM записывается не строка, а только поля класса String, в которых содержится не сама строка, а только указатель на нее. Посмотрите как работают методы get() и put() - они просто копируют переменную, не глядя на ее структуру.
     
  4. Tigran

    Tigran Нуб

    а как могу правильно писать дату в EEPROM???
     
  5. Unixon

    Unixon Оракул Модератор

    Во-первых, лучше храните дату в переменной (структуре) фиксированной длины, а не в тексте. Т.е. в часах, минутах и т.п., так с ней удобнее будет работать. Для работы с 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() а побайтный доступ через приведение типа указателя.
     
  6. Unixon

    Unixon Оракул Модератор

    Код (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++];