Простой счетчик включений на Arduino

Я из Аргентины.

Я делаю своего рода проект для своего автомобиля, и одна из многих функций, которые я планирую, — это проверка того, сколько раз Arudino был включен.

Я думал о простом счетчике и сохранении его в EEPROM (внутри setup()).

Мне удалось сохранить значение и прочитать его, но я не могу прибавить +1 к этому значению, сохранённому в EEPROM.

#include <EEPROM.h>

char buffer[15]; // длина переменной, количество символов
int cant;

void setup()
{
   Serial.begin(9600);
   Serial.println("Write to EEPROM: ");
   EEPROM.put(0, "12345678901234");

   Serial.print("Read from EEPROM1: ");
   Serial.println(EEPROM.get(0, buffer));

   Serial.print("Read from EEPROM2: ");
   Serial.println(buffer);

   Serial.print("Read from EEPROM3: ");
   cant=(EEPROM.get(0, buffer));
   Serial.println(cant);
}

void loop()
{
}

И я получаю на выходе:

Write to EEPROM: 
Read from EEPROM1: 12345678901234
Read from EEPROM2: 12345678901234
Read from EEPROM3: 370

Переменная cant показывает другое значение.

, 👍0

Обсуждение

используйте внешнее запоминающее устройство ... https://arduinoprosto.ru/q/226/what-is-the-real-lifetime-of-eeprom ... устройство FRAM имеет более длительный срок службы ... https://duckduckgo.com/?q=memory+fram+i2c&ia=web, @jsotola


1 ответ


Лучший ответ:

0

Вызов EEPROM.get(0, буфер) корректно считывает данные EEPROM в предоставленный буфер. Для удобства он возвращает ссылку на него. Буфер. Это ссылка на массив, поэтому она преобразуется в указатель на Его первый элемент — указатель типа char *. Строка

cant=(EEPROM.get(0, buffer));

Таким образом, неявно преобразует этот указатель в целое число. Значение, которое вы get — это адрес памяти массива buffer. Вероятно, это не то, что вы интересуетесь.

Если вы хотите сохранить счетчик в EEPROM, нет смысла Сохраняя его как текст. Сохраняйте его как обычное двоичное число. Я предлагаю использовать тип long (или unsigned long), на случай, если вы заведете машину более 65 535 раз:

void setup()
{
   Serial.begin(9600);

   long power_up_count;

   // Получить счетчик включений из EEPROM.
   EEPROM.get(0, power_up_count);
   Serial.print("Old power up count = ");
   Serial.println(power_up_count);

   // Увеличиваем его.
   EEPROM.put(0, power_up_count + 1);

   // Проверка: перечитайте.
   EEPROM.get(0, power_up_count);
   Serial.print("New power up count = ");
   Serial.println(power_up_count);
}
,

Ты гений!!!!!!! Большое спасибо, Эдгар! Итак, если я использую буфер символов[15]; я пишу строку, то есть текст?, @Diego Nunez

@DiegoNunez: Хотя массив char обычно используется для хранения текста, в принципе, в него можно поместить всё, что угодно. Текстом его делает то, что вы в него помещаете. Например, "12345678901234" — это текст., @Edgar Bonet