Первая работа новичка. Вопрос: Как записать в EEPROM один раз ?
- Войдите на сайт для отправки комментариев
Ср, 13/10/2021 - 19:27
Привет знатокам профам и любителям. Первая моя работа с Ардуино и первая проблема.
Описание проблемы.
Есть данные которые надо в цикле void loop() записать один раз в EEPROM при вкючений тумблера rcCH10. Следующая запись только после повторного включения тумблера rcCH10(т.е. надо выключить и повторно включить). Зделал дополнительную переменную swD. Как бы хорошо получулось, но только в первом цикле loop() после записи в EEPROM . А уже в следующем цикле билибирда получилась, так как в этом цикле swD = true;
Помогите с советом или поправте код.
код
// Include Library
#include <IBusBM.h>
#include <EEPROM.h>
// Create iBus Object
IBusBM ibus;
int rcCH5 = 0;
int rcCH6 = 0;
bool rcCH10 = 0;
static bool swD = true;
//-------------------------------------------------
void setup()
{
// Start serial monitor for debugging
Serial.begin(115200);
// Attach iBus object to serial port
ibus.begin(Serial);
}
//-------------------------------------------------
void loop()
{
rcCH5 = readChannel(4, 0, 9, 0); //potencas A
rcCH6 = readChannel(5, 0, 9, 0); //potencas B
rcCH10 = readSwitch(9, false); //Sw D
Serial.print(F(" rcCH10 = ")); Serial.println(rcCH10); Serial.print(F(" swD = ")); Serial.println(swD);
if (rcCH10 && swD)
{
int addEEPROMlat = (rcCH5 * 10 + rcCH6) * 4; //pagal potencu padeti suskaiciuojam add EEPROMo kas 4 baitus
int addEEPROMlng = addEEPROMlat + 4; //pagal potencu padeti suskaiciuojam add EEPROMo kas 4 baitus
// EEPROM.put(addEEPROMlat, lat1); //Siunciam lat duomenis adresu addEEPROMlat
// EEPROM.put(addEEPROMlng, lng1); //Siunciam lng duomenis adresu addEEPROMlng
Serial.print(F("addEEPROMlat = ")); Serial.print(addEEPROMlat);
Serial.print(F(" addEEPROMlng = ")); Serial.println(addEEPROMlng);
//delay(2000);
swD = false;
Serial.print(F(" swD____ = ")); Serial.println(swD);
}
else {
swD = true;
}
}
//-------------------------------------------------
int readChannel(byte channelInput, int minLimit, int maxLimit, int defaultValue)
{
uint16_t ch = ibus.readChannel(channelInput);
if (ch < 100) return defaultValue;
return map(ch, 1000, 2000, minLimit, maxLimit);
}
//-------------------------------------------------
// Read the channel and return a boolean value
bool readSwitch(byte channelInput, bool defaultValue)
{
int intDefaultValue = (defaultValue) ? 100 : 0;
int ch = readChannel(channelInput, 0, 100, intDefaultValue);
return (ch > 50);
}
Поставить флаг о том, что уже записали. Снять флаг при нажатии тумблера.
Да, еще, использовать EEPROM.put() - если данные не изменились - писать не будет. Увеличивает ресурс EEPROM
подсказываю - в строке 43 вместо else пропишите четкое условие, при каких значениях переменных rcCH10 и swD флаг нужно менять на true
Спасибо. Зделал
else { if (!rcCH10 ) swD = true; }и ве как надо.
В полку RC шников прибыло
EEPROM.put() - если данные не изменились - писать не будет. Увеличивает ресурс EEPROM
.update() //:)
Топикстартер! Запомни! Сделать, сделал и т.д.
Спасибо. Данные у меня постоянно меняютса, так что put() update() мне не помогут. Запись происходит только по команде.
в первые 4 байта пиши число. (глобальная переменаная, типа flag_pzu)
при старте его читаешь и в цикле сравниваешь с тем, что записано во флеше, если совпадают - ничего не пишешь.
по нажатию на кнопку в оперативке делаешь
flag_pzu = flag_pzu + 1