Первая работа новичка. Вопрос: Как записать в EEPROM один раз ?

gince
Offline
Зарегистрирован: 14.12.2017

Привет знатокам профам и любителям. Первая моя работа с Ардуино и первая проблема.

Описание проблемы.

Есть данные которые надо в цикле 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);
}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Поставить флаг о том, что уже записали. Снять флаг при нажатии тумблера.

Да, еще, использовать EEPROM.put() - если данные не изменились - писать не будет. Увеличивает ресурс EEPROM

b707
Онлайн
Зарегистрирован: 26.05.2017

подсказываю - в строке 43 вместо else пропишите четкое условие, при каких значениях переменных rcCH10 и swD флаг нужно менять на true

gince
Offline
Зарегистрирован: 14.12.2017

Спасибо. Зделал 

  else {
    if (!rcCH10 )
    swD = true;
  }

и ве как надо.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

В полку RC шников прибыло

Rumata
Rumata аватар
Онлайн
Зарегистрирован: 29.03.2019

mykaida пишет:

EEPROM.put() - если данные не изменились - писать не будет. Увеличивает ресурс EEPROM

.update() //:)

Топикстартер! Запомни! Сделать, сделал и т.д.

gince
Offline
Зарегистрирован: 14.12.2017

Спасибо. Данные у меня постоянно меняютса, так что put() update() мне не помогут. Запись происходит только по команде.

 

vde69
Offline
Зарегистрирован: 10.01.2016

в первые 4 байта пиши число. (глобальная переменаная, типа flag_pzu)

при старте его читаешь и в цикле сравниваешь с тем, что записано во флеше, если совпадают - ничего не пишешь.

по нажатию на кнопку в оперативке делаешь 

flag_pzu = flag_pzu + 1