Проблемы с EEPROM
- Войдите на сайт для отправки комментариев
Вс, 15/03/2020 - 20:36
Добрый день форумчане!
Пытаюсь освоить работу с EEPROM, но что то делаю не так. Помогите пожалуйста разобраться со скетчем.
#include <EEPROM.h>
int address = 0;
int relayPin1 = A0;
int relayPin2 = A1;
int relayPin3 = A2;
//int switchPin = 7;
byte val;
byte state;
byte c;
void setup()
{
pinMode(relayPin1, OUTPUT);
pinMode(relayPin2, OUTPUT);
pinMode(relayPin3, OUTPUT);
// pinMode(switchPin, INPUT);
digitalWrite(relayPin1, LOW);
digitalWrite(relayPin2, LOW);
digitalWrite(relayPin3, LOW);
}
void loop()
{
state = EEPROM.read(0);
if (state == HIGH && c == 0) // нажали кнопку
{
c = 1;
EEPROM.write(0,1);
}
if (state == LOW && c == 1) // отпустили кнопку
{
val = ++val;
if (val == 4)
{
val = 0;
}
c = 0;
EEPROM.update(0,0);
}
if (val == 0) // выключаем светодиоды
{
digitalWrite(relayPin1, LOW);
digitalWrite(relayPin2, LOW);
digitalWrite(relayPin3, LOW);
}
if (val == 1) // Если мы кнопку 1 раз нажали и отпустили
{
digitalWrite(relayPin1, LOW);
digitalWrite(relayPin2, HIGH);
digitalWrite(relayPin3, HIGH);
}
if (val == 2) // Если мы кнопку 2 раз нажали и отпустили
{
digitalWrite(relayPin1, HIGH);
digitalWrite(relayPin2, LOW);
digitalWrite(relayPin3, HIGH);
}
if (val == 3) // Если мы кнопку 3 раз нажали и отпустили
{
digitalWrite(relayPin1, HIGH);
digitalWrite(relayPin2, HIGH);
digitalWrite(relayPin3, LOW);
}
if (val == 4) // Если мы кнопку 4 раз нажали и отпустили
{
digitalWrite(relayPin1, HIGH);
digitalWrite(relayPin2, HIGH);
digitalWrite(relayPin3, HIGH);
}
delay(10);
}
Суть устройства в том, чтобы при нажатии кнопки включалось одно реле, при повторном нажатии на туже кнопу первое реле отключалось, а второе реле включалось, при нажатии на кнопку еще раз, отключается второе реле, и включается реле 3, при еще одном нажатии кнопки отключается все реле. И так по кругу.
Где опрос кнопки ?
Там у кнопки всего одно положение. Так что нет смысла опрашивать кнопки.
Так что нет смысла опрашивать кнопки.
Датычо? А накой ляд тогда нужна кнопка???
Накой нужен EEPROM ???
Кнопки нет, как я понял, а опрашивается состояние EEPROM. При этом при первом запуске оно не обязательно будет равно 0 или 1. И программа просто не будет работать. И все.
Кроме того таким методом засадить EEPROM проще некуда - у него конечное число перезаписей, а с delay(10) вы быстро его наберете.
Да и 36 строку напишите по человечески: val++;
И еще - из-за 37 строки val никогда не будет ровна 4, условие там должно быть "больше 4"
В итоге - проблема не с EEPROM, а со знанием языка и составлением алгоритмов.
Там у кнопки всего одно положение.
Это как? Это такая намертво нажатая (хрен отожмёшь) кнопка? Или наоборот - сколько не нажимай ничего не происходит? Обычно у кнопок как минимум два положения.
Суть устройства в том, чтобы при нажатии кнопки ...
....
нет смысла опрашивать кнопки.
Как-то так :-)
Кроме того таким методом засадить EEPROM проще некуда - у него конечное число перезаписей, а с delay(10) вы быстро его наберете.
Есть EEPROM - есть проблема, нет EEPROM - нет проблемы.
ТС, смысл EEPROM сохранить данные на выключенном устройстве.
Вопрос, нахрена их постоянно оттуда читать, когда устройство включено ?
Мы же и после первого раза уже узнали , что там было записано.
У ТС - весенняя паранойя "а вдруг напряжение пропадет и данные потеряются". Хотя по мне имело бы смысл хранить val