Управление нагрузкой по звонку Arduino Nano + M590

None
Offline
Зарегистрирован: 15.01.2016

Выкладывайте код. Скорее всего проблема в изменениях.

pasha413
Offline
Зарегистрирован: 27.11.2016


все процедуры в монитор порта, но номер вроде как не сохраняется...

#include <EEPROM.h>

uint8_t ch = 0;
String val = "";                            // переменная для хранения приходящих строк из модема.
byte NumT = 0;      //номер ячейки массива
byte KolMas = 10;   //количество ячеек массива
byte Adress[10] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90}; //занимаем сотню ячеек для десяти номеров

char Temp[11] = ""; //массив на один символ больше из-за проблемы с нулем в конце строки при команде readBytes
char TelE[11] = ""; //номер из ЕЕПРОМ
char TelZero[11] = "0000000000";  //для обнуления номера

void setup() {
  Serial.begin(9600);

}

void loop() {
  if (Serial.available()) { 
    while (Serial.available()) { 
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
    Serial.println(val);
    ConsolePrint();
    val = "";  
  }
}

void ConsolePrint() {
   if(val.indexOf(F("ring:")) > -1) {
   ring(val.substring(5, 16));
    
   }
   if(val.indexOf(F("nomera:")) > -1) {
          for (byte i=0; i<10; i++) {
            TelE[i] = EEPROM.read(Adress[NumT]+i);  //считываем побайтово номер телефона
 Serial.println(TelE[i] + i);
// Serial.println(Adress[NumT]+i);
          }                                         //во временную переменную

   }
   if(val.indexOf(F("dellnomer:")) > -1) {
    
   }
   if(val.indexOf(F("change:")) > -1) {
    
   }
   if(val.indexOf(F("clear:")) > -1) {
  for (int i = 0 ; i < EEPROM.length() ; i++) {
    EEPROM.write(i, 0);
      }
   }

 

}

int ring (String num) {
Serial.println(num);
   num.toCharArray(Temp, 11);
        while (NumT <= KolMas) {            //ищем телефон в массиве
          for (byte i=0; i<10; i++) {
            TelE[i] = EEPROM.read(Adress[NumT]+i);  //считываем побайтово номер телефона
          }                                         //во временную переменную

          if (strstr(TelE, Temp)) {         //если находим
              for (byte i=0; i<10; i++) {   //очищаем телефон в ЕЕПРОМ
                EEPROM.write(Adress[NumT]+i, TelZero[i]);
              }
              
              NumT=0;                       //сбрасываем счетчик
              break;                        //выходим из цикла
          }  else {                         //если не находим телефон
            NumT++;                         //переходим к следующему телефону
            //пока не дойдем до конца списков номеров
            if (NumT == KolMas) {           //дошли до конца списков номеров
              NumT = 0;                     //сбрасываем счетчик
                while (NumT < KolMas) {       //начинаем искать пустую ячейку
                  if (strstr(TelE, TelZero)) {//если находим
                    for (byte i=0; i<10; i++) {   //записываем телефон в ЕЕПРОМ
                      EEPROM.write(Adress[NumT]+i, Temp[i]);
                    }
                    break;                    //выходим из цикла
                  }
                  else {                      //если не находим
                    NumT++;                   //следующий номер
                  }
                }
              NumT = 0;                     //сбрасываем счетчик
              Temp[0] = 0;                  //очистить переменную Temp
              TelE[0] = 0;                  //очистить переменную TelE
              break;                        //выходим из цикла
            }
          }
        }
}

 

в мониторе порта пишет

команда ring:

ring:9111234567

9111234567

команда nomera:

nomera:

48
49
50
51
52
53
54
55
56
57

как:

1. прочитать номера всех ячеек, "nomera:"

2. удалить номер по адресу 2, "dellnomer:"

3. заменить номер по адресу 3, "change:'

 

 

pasha413
Offline
Зарегистрирован: 27.11.2016

вообщем сделал по своему, ссылка: http://arduino.ru/forum/proekty/gsm-signalizatsiya-m590arduino?page=2#comment-278852

None
Offline
Зарегистрирован: 15.01.2016

Извини, занят был.

Это хорошо, что сам нашел свой подход. Так держать!

Почитал твой код. Проблема тут:

if (strstr(TelE, Temp)) {         //если находим
  for (byte i=0; i<10; i++) {   //очищаем телефон в ЕЕПРОМ
  EEPROM.write(Adress[NumT]+i, TelZero[i]);
}

У тебя получается, при входящем, если номер есть уже в памяти, стирается из памяти.

А у меня он стирал только при нажатой кнопке.

pasha413
Offline
Зарегистрирован: 27.11.2016

None пишет:

Извини, занят был.

Это хорошо, что сам нашел свой подход. Так держать!

Почитал твой код. Проблема тут:

if (strstr(TelE, Temp)) {         //если находим
  for (byte i=0; i<10; i++) {   //очищаем телефон в ЕЕПРОМ
  EEPROM.write(Adress[NumT]+i, TelZero[i]);
}

У тебя получается, при входящем, если номер есть уже в памяти, стирается из памяти.

А у меня он стирал только при нажатой кнопке.

да, спасибо.