Как-то странно ардуино работает с eeprom или я дурак

Начал осваивать ардуино - припаял к уно реле, вставил в него провод от колонки старой, включил музыку на телефоне и написал программку, которая ждёт заданное число минут и включает колонку. Такой вот “будильник”. И что получилось - для маленького числа минут работает нормально, но я сплю дольше, а она для шести часов уже не работает.

// в этом файлике задаю время
#include <EEPROM.h>
void setup () {
  EEPROM.put(0, 3); // 3 это минуты 
}
void loop (){}
// а вот будильник, его загружаю отдельно:
int wakeupcounter;
void setup (){
  pinMode(2, OUTPUT);
}
void loop (){
  delay(60000);
  EEPROM.get(0, wakeupcounter);
  wakeupcounter--;
  EEPROM.put(0, wakeupcounter);
  if (wakeupcounter <= 0) {
   digitalWrite(2, HIGH);
  }
}

И почему-то с семью часами это не работает, а с тремя или пятью минутами - работает.

Удивительно, правда? Не, удивительно не это, а то, что оно вапще компилируется, ну или Выфсёврёти!!!

1 лайк

А что такое типы данных и их размерность в ардуино уже выучили?

Так написано, что EEPROM.put сама считает длину сохраняемых данных

У тя wakeupcounter локален для setup(). В loop() его вапще не видно должно быть

Это я тут так написал, а так она в начале написана, перед сетупом. Тут я исправил как у себя

А почему задаётся время не так, как читается?

Сделайте так “int wakeupcounter = 3;” а потом " EEPROM.put(0, wakeupcounter);"

Вы уж будьте добры - копипастите как есть. Люди тратят своё время, а оказывается, что это Вы пошутили.

У меня там ещё мигалочки всякие на светодиоде. Я вписал сюда толькото что не работает.

Я не понимаю зачем так нужно насиловать ячейку EEPROM? Зачем вы вычитываете из нее данные, декрементируете и снова суете в туже ячейку? Для чего?

1 лайк

И ведь в первом коротком скетче все правильно сделано, один раз. Почему не применяете тот же подход во втором скетче?

Это не отменяет аккуратности. Ваш код начали обсуждать, а оказалось, что он - не тот.

И параллельный вопрос - а что вернет EEPROM.get() при первом вызове? Откуда в нем берется нужное число (да хоть те же 7 часов)?

Кошак один раз уронил всю конструкцию и счётчик сбросился вот я его теперь сохраняю

Ну, так правильно. Укорачиваете код, запускаете, убеждаетесь, что проблема видна и тогда копипастите. Мало что так сильно бесит, как “левый” код.

Ну я в одном скетче задаю значение, а в другом будильник. Если я правильно понял, то это возможно так делать, в одном файле менять память, а в другом видеть изменения. Ну и с маленьким числом минут ведь работает же

Так что, попробовали, как я сказал? Помогло?

Надо теперь ждать семь часов

Можно, при условии, что Вы не стираете EEPROM при записи нового скетча. По умолчанию он по идее стирается.

Три и пять минут сохраняются и музыка включается. Только с большим временем не работает.

@allforall
А точно тут тип переменной int? Может byte?

1 лайк