Проблема с чтением из EEPROM

rapidshe
Offline
Зарегистрирован: 31.12.2015

такая проблемка... в EEPROM храню число (мастер номера для смс розетки) и состоние пинов(для восстановления состояния после перезагрузки).

если цикл считывания номера стоит первым, то номер восстанавливается... но после цикла считывания состояния пинов стирается. 

если первым поставить цикл считывания состояния пинов, то номер уже не считывается...

в любом случае строка с мастер номером ставится пустой

из кода вообще всё убрал, оставил только считывание этих значений, всё равно...

#include <SoftwareSerial.h>
#include <EEPROM.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int ch = 0;
int che = 0;

String val = "";
String num = "";
String num_vh = "";
String master = "";
int Pins[] = {4, 5, 6, 7, 8, 9, 10}; // Массив задействованных номеров Pins Arduino, для управления реле. 
int PinStatus[3]; // Массив для фиксации изменений. с 0 до 3.
int numPins = 7; // количество выходов
 

void setup() {
  delay(5000);  //время на инициализацию модуля

  Serial.begin(9600);  //скорость порта
//  Serial.println("GSM rozetka");
  for (int i = 0; i <= 8; i++)
      {     
      che = EEPROM.read(i);
      master += char(che);
      delay(10);
  }
  Serial.println("Master is 89" + master);
  Serial.println(master);
  for(int i = 0; i <= numPins -1; i++)
    {
    pinMode(Pins[i],OUTPUT); 
    PinStatus[i]=EEPROM.read( i + 10 ); 
    digitalWrite(Pins[i],PinStatus[i]);  
    delay(10); 
    } 
  Serial.println("Master is 89" + master);
}

и вот что в мониторе:

Master is 89161112219
161112219
Master is 89

 

rapidshe
Offline
Зарегистрирован: 31.12.2015

в мониторе сразу видно после чего пропадает значение мастера..

пробовал на UNO и на MEGA2560

pastry777
Offline
Зарегистрирован: 16.01.2014

у вас int PinStatus[3]; // Массив для фиксации изменений. с 0 до 3

во первых с 0 до 2...ну,это такое)

массив из трех int,а в цикле

for(int i = 0; i <= numPins -1; i++)
30     {
31     pinMode(Pins[i],OUTPUT);
32     PinStatus[i]=EEPROM.read( i + 10 );
33     digitalWrite(Pins[i],PinStatus[i]); 
34     delay(10);
35     }

вы проганяете его аж до значения 6,а можно только до значения 2..так нельзя,вы вылазите за рамки обьявленного массива,в память ему не принадлежащую

pastry777
Offline
Зарегистрирован: 16.01.2014

если не поняли,то обьявите 

int PinStatus[7];

и все пройдет=)

rapidshe
Offline
Зарегистрирован: 31.12.2015

да, понял, почему то не замечал этого...

сначала поставил 6 - не заработало, потом 7 и всё ок.

только не пойму почему 7 а не 6. счет начинается ведь с 0?

 

Спасибо))

vvadim
Offline
Зарегистрирован: 23.05.2012
pastry777
Offline
Зарегистрирован: 16.01.2014

Индексация массива начинается с 0. Это значит, что для массива с 10-тью элементами, индекс 9 будет последним:

int myArray[10]={9,3,2,4,3,2,7,8,9,11};
     // myArray[0]    первый элемент, содержит 9
     // myArray[9]    последний элемент, содержит 11

     // myArray[10]   это неверно возможно возвращение произвольного значения из области памяти не относящийся к массиву

http://arduino.ru/Reference/Array

 

rapidshe
Offline
Зарегистрирован: 31.12.2015

спасибо!

pastry777
Offline
Зарегистрирован: 16.01.2014

пожалуйста=)