Первая работа новичка. Вопрос: Как записать в 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
Спасибо. Зделал
и ве как надо.
В полку RC шников прибыло
EEPROM.put() - если данные не изменились - писать не будет. Увеличивает ресурс EEPROM
.update() //:)
Топикстартер! Запомни! Сделать, сделал и т.д.
Спасибо. Данные у меня постоянно меняютса, так что put() update() мне не помогут. Запись происходит только по команде.
в первые 4 байта пиши число. (глобальная переменаная, типа flag_pzu)
при старте его читаешь и в цикле сравниваешь с тем, что записано во флеше, если совпадают - ничего не пишешь.
по нажатию на кнопку в оперативке делаешь
flag_pzu = flag_pzu + 1