Почему фиксация EEPROM не регистрирует значения int?

esp8266 eeprom esp8266webserver
       if(jsonDoc["delayOn"].as<int>() <= 255 && jsonDoc["delayOff"].as<int>() <= 255 && jsonDoc["delayUnitOn"].as<int>() <= 2 && jsonDoc["delayUnitOff"].as<int>() <= 2 && 
         jsonDoc["mode"].as<int>() <= 1 && jsonDoc["blink"].as<int>() <= 1 && 
         jsonDoc["timeOnHour"].as<int>() <= 23 && jsonDoc["timeOnMinute"].as<int>() <= 59 && 
         jsonDoc["timeOffHour"].as<int>() <= 23 && jsonDoc["timeOffMinute"].as<int>() <= 59) {

        int val;
        int addr_init = (relay*eepromSlotsPerRelayPin)*sizeof(int);
        
        val = jsonDoc["blink"].as<int>();
        EEPROM.put(addr_init,val);
        if(jsonDoc["blink"].as<int>()==1){ //0= выкл., 1= вкл.        

          val = jsonDoc["mode"].as<int>();
          EEPROM.put(addr_init+(5*sizeof(int)),val);
          
          
          if (jsonDoc["mode"].as<int>()==0){ // режим мигания

            val = jsonDoc["delayOn"].as<int>();
            EEPROM.put(addr_init+(1*sizeof(int)),val);
            val = jsonDoc["delayOff"].as<int>();
            EEPROM.put(addr_init+(3*sizeof(int)),val);
            //1 = минута, 0 = секунда, 2= час
            val = jsonDoc["delayUnitOn"].as<int>();
            EEPROM.put(addr_init+(2*sizeof(int)),val);
            val = jsonDoc["delayUnitOff"].as<int>();
            EEPROM.put(addr_init+(4*sizeof(int)),val);
            EEPROM.end();
                            
          }else if(jsonDoc["mode"].as<int>()==1){ // режим переключения времени

            val = jsonDoc["timeOnHour"].as<int>();
            EEPROM.put(addr_init+(6*sizeof(int)),val);
            val = jsonDoc["timeOnMinute"].as<int>();
            EEPROM.put(addr_init+(7*sizeof(int)),val);
            val = jsonDoc["timeOffHour"].as<int>();
            EEPROM.put(addr_init+(8*sizeof(int)),val);
            val = jsonDoc["timeOffMinute"].as<int>();
            EEPROM.put(addr_init+(9*sizeof(int)),val);
            EEPROM.end();
          }
          else {
            request->send(412, "text/plain", "unknown mode");
            return;
          }
        }
      }
      else {
        request->send(412, "text/plain", "a parameter is not within limits");            
        return;
      }        
      
      //initBlinkPinObjs инициализировать
      int addr_init;
      int val,uom;
      for(int i = 0; i<maxRelayPins; i++) {
        bPinObjs[i].pin = relayPins[i];
        //Слот EEPROM для каждой структуры данных реле
        //0=> включить, 1=> Длительность включения, 2=> Длительность временного измерения,
        //3=> Длительность выключения, 4=> Длительность временного измерения
        //5=> режим, 6 => Время в час, 7 => Время в минуту,
        // 8=> Время в час, 9 => Время в минуту

        addr_init = (i*eepromSlotsPerRelayPin)*sizeof(int);
        
        val = 0;
        EEPROM.get(addr_init,val);
       bPinObjs[i].enable = val;

        val = 0;
        EEPROM.get(addr_init+(5*sizeof(int)),val);
        bPinObjs[i].mode = val;

        val = 0;
        EEPROM.get(addr_init+(6*sizeof(int)),val);
        bPinObjs[i].timeOnHour=val;

        val = 0;
        EEPROM.get(addr_init+(7*sizeof(int)),val);
        bPinObjs[i].timeOnMinute=val;

        val = 0;
        EEPROM.get(addr_init+(8*sizeof(int)),val);
        bPinObjs[i].timeOffHour = val;

        val = 0;
        EEPROM.get(addr_init+(9*sizeof(int)),val);
        bPinObjs[i].timeOffMinute = val;
        
        //делайОн
        //преобразовать в
        uom = 0;
        EEPROM.get(addr_init+(2*sizeof(int)),uom);
        switch(uom){
          case 0:
            bPinObjs[i].durationOn=0;
            val = 0;
            EEPROM.get(addr_init+(1*sizeof(int)),val);
            bPinObjs[i].durationOn = val*1000;
          break;
          case 1:
            bPinObjs[i].durationOn=0;
            val = 0;
            EEPROM.get(addr_init+(1*sizeof(int)),val);
            bPinObjs[i].durationOn = val*60000;
          break;
          case 2:
            bPinObjs[i].durationOn=0;
            val = 0;
            EEPROM.get(addr_init+(1*sizeof(int)),val);
            bPinObjs[i].durationOn = val*3600000;
          break;
          default:
          break;
        }       
        //Отсрочка
        // преобразовать в миллисекунду
        uom = 0;
        EEPROM.get(addr_init+(4*sizeof(int)),uom);
        switch(uom){
          case 0:
            bPinObjs[i].durationOff = 0;
            val = 0;
            EEPROM.get(addr_init+(3*sizeof(int)),val);
            bPinObjs[i].durationOff = val*1000;
          break;
          case 1:
            bPinObjs[i].durationOff = 0;
            val = 0;
            EEPROM.get(addr_init+(3*sizeof(int)),val);
            bPinObjs[i].durationOff = val*60000;
          break;
          case 2:
            bPinObjs[i].durationOff = 0;
            val = 0;
            EEPROM.get(addr_init+(3*sizeof(int)),val);
            bPinObjs[i].durationOff = val*3600000;
          break;
          default:
          break;
        }    
      }
--ВВОД JSON, распечатанный с сервера--

relay:0
blink:1
mode:1
delayOn:56
delayOff:2
delayUnitOn:0
delayUnitOff:0
timeOnHour:5
timeOnMinute:56
timeOffHour:7
timeOffMinute:48
ВЫХОДНЫЕ ДАННЫЕ, распечатанные с сервера:
--Objects content--
Size of INT:4
---------0--------- init addr: 0
[0]enable: 0
[1]durationOn: 0
[2]durationOnUom: 0
[3]durationOff: 0
[4]durationOffUom: 0
[5]mode: 0
[6]onHr: 0
[7]onMin: 0
[8]offHr: 0
[9]offMin: 0
---------1--------- init addr: 40
[0]enable: 0
[1]durationOn: 0
[2]durationOnUom: 0
[3]durationOff: 0
[4]durationOffUom: 0
[5]mode: 0
[6]onHr: 0
[7]onMin: 0
[8]offHr: 0
[9]offMin: 0
---------2--------- init addr: 80
[0]enable: 0
[1]durationOn: 0
[2]durationOnUom: 0
[3]durationOff: 0
[4]durationOffUom: 0
[5]mode: 0
[6]onHr: 0
[7]onMin: 0
[8]offHr: 0
[9]offMin: 0
---------3--------- init addr: 120
[0]enable: 0
[1]durationOn: 0
[2]durationOnUom: 0
[3]durationOff: 0
[4]durationOffUom: 0
[5]mode: 0
[6]onHr: 0
[7]onMin: 0
[8]offHr: 0
[9]offMin: 0
---------4--------- init addr: 160
[0]enable: 0
[1]durationOn: 0
[2]durationOnUom: 0
[3]durationOff: 0
[4]durationOffUom: 0
[5]mode: 0
[6]onHr: 0
[7]onMin: 0
[8]offHr: 0
[9]offMin: 0
---------5--------- init addr: 200
[0]enable: 0
[1]durationOn: 0
[2]durationOnUom: 0
[3]durationOff: 0
[4]durationOffUom: 0
[5]mode: 0
[6]onHr: 0
[7]onMin: 0
[8]offHr: 0
[9]offMin: 0
---------6--------- init addr: 240
[0]enable: 0
[1]durationOn: 0
[2]durationOnUom: 0
[3]durationOff: 0
[4]durationOffUom: 0
[5]mode: 0
[6]onHr: 0
[7]onMin: 0
[8]offHr: 0
[9]offMin: 0
---------7--------- init addr: 280
[0]enable: 0
[1]durationOn: 0
[2]durationOnUom: 0
[3]durationOff: 0
[4]durationOffUom: 0
[5]mode: 0
[6]onHr: 0
[7]onMin: 0
[8]offHr: 0
[9]offMin: 0
---------8--------- init addr: 320
[0]enable: 0
[1]durationOn: 0
[2]durationOnUom: 0
[3]durationOff: 0
[4]durationOffUom: 0
[5]mode: 0
[6]onHr: 0
[7]onMin: 0
[8]offHr: 0
[9]offMin: 0

Это находится внутри метода esp8266 async webserver server.on. Мой EEPROM.begin находится в функции настройки. Первоначально фиксируется только первое сообщение, помещенное в блок. Теперь ничего не регистрируется после того, как я внедрил sizeof(int) внутри адресов.

Намерение состоит в том, чтобы хранить данные int, передаваемые через http post, на каждый вывод реле [всего 9 выводов]. Затем программа использует эти данные для выполнения на ретрансляторе:

  • моргнуть
  • включение/выключение в зависимости от времени (час, минута) ...

Я перепробовал все способы исправления:

  • фиксация,завершение после каждого ввода
  • EEPROM.begin(512) затем фиксирует и завершает при каждом вводе
  • добавить задержку задержки
  • используйте только end вместо commit
  • добавить диапазон адресов для sizeof(int)

, 👍0

Обсуждение

попробуйте пример кода arduino, @jsotola

откуда вы знаете, что фиксация применяется только к первому put?, @jsotola

Я печатаю его серийно. Я попробовал write и read из образца, но это не соответствует моему требованию хранить int., @Tinker Ben

(relay * eepromSlotsPerRelayPin)+(relayDataIndex * sizeOf(int)) опробует это как значения адреса на основе предложений @VictorTiamson и @RollyAvecilla., @Tinker Ben

редактировать: ((relay*eepromSlotsPerRelayPin)*sizeof(int))+(relayDataIndex * sizeof(int)), @Tinker Ben

Новый вызов, теперь ничего не регистрируется. Отредактировал код, отображаемый в сообщении с моими обновлениями., @Tinker Ben


1 ответ


Лучший ответ:

0

Странно, я закомментировал значение val=0; перед EEPROM.gets также заменил EEPROM.end на EEPROM.commit.

Теперь это результат:

--Objects content--
Size of INT:4
---------0--------- init addr: 0
[0]enable: 1
[4]durationOn: 3000
[8]durationOnUom: 0
[12]durationOff: 2000
[16]durationOffUom: 0
[20]mode: 1
[24]onHr: 9
[28]onMin: 11
[32]offHr: 9
[36]offMin: 12
---------1--------- init addr: 40
[40]enable: 1
[44]durationOn: 0
[48]durationOnUom: -1
[52]durationOff: 0
[56]durationOffUom: -1
[60]mode: -1
[64]onHr: -1
[68]onMin: -1
[72]offHr: -1
[76]offMin: -1
---------2--------- init addr: 80
[80]enable: 1
[84]durationOn: 0
[88]durationOnUom: -1
[92]durationOff: 0
[96]durationOffUom: -1
[100]mode: -1
[104]onHr: -1
[108]onMin: -1
[112]offHr: -1
[116]offMin: -1
---------3--------- init addr: 120
[120]enable: 1
[124]durationOn: 0
[128]durationOnUom: -1
[132]durationOff: 0
[136]durationOffUom: -1
[140]mode: 1
[144]onHr: 5
[148]onMin: 56
[152]offHr: 7
[156]offMin: 48
---------4--------- init addr: 160
[160]enable: 1
[164]durationOn: 0
[168]durationOnUom: -1
[172]durationOff: 0
[176]durationOffUom: -1
[180]mode: -1
[184]onHr: -1
[188]onMin: -1
[192]offHr: -1
[196]offMin: -1
---------5--------- init addr: 200
[200]enable: 1
[204]durationOn: 0
[208]durationOnUom: -1
[212]durationOff: 0
[216]durationOffUom: -1
[220]mode: -1
[224]onHr: -1
[228]onMin: -1
[232]offHr: -1
[236]offMin: -1
---------6--------- init addr: 240
[240]enable: 1
[244]durationOn: 0
[248]durationOnUom: -1
[252]durationOff: 0
[256]durationOffUom: -1
[260]mode: -1
[264]onHr: -1
[268]onMin: -1
[272]offHr: -1
[276]offMin: -1
---------7--------- init addr: 280
[280]enable: 1
[284]durationOn: 0
[288]durationOnUom: -1
[292]durationOff: 0
[296]durationOffUom: -1
[300]mode: -1
[304]onHr: -1
[308]onMin: -1
[312]offHr: -1
[316]offMin: -1
---------8--------- init addr: 320
[320]enable: 1
[324]durationOn: 0
[328]durationOnUom: -1
[332]durationOff: 0
[336]durationOffUom: -1
[340]mode: -1
[344]onHr: -1
[348]onMin: -1
[352]offHr: -1
[356]offMin: -1


--JSON inputs--

relay:0
blink:1
mode:1
delayOn:3
delayOff:2
delayUnitOn:0
delayUnitOff:0
timeOnHour:9
timeOnMinute:11
timeOffHour:9
timeOffMinute:12
,