"захватить" значение и переопределить константу

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

Доброго времени суток! помогите пожалуйста нубу реализовать мысль.

только камнями не бросайтесь)

сначала считываем информацию с порта и сохраняем строку в переменную val. Далее если в строке находим #123, то переопределяем константу ST1 некоторым количеством символов, идущими после #1, т.е. 23%c%c%c%c

(Вроде как %c обозначение наличия символа)

#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8);
int ch = 0;
String val = "";
#define ST1 "234567" 

void setup() {
  mySerial.begin(9600);
 }
  
 void loop() {
  if (mySerial.available()) {  
     while (mySerial.available()) {  
      ch = mySerial.read();
      val += char(ch);
      delay(10);
      }
      if (val.indexOf("#123") > -1) {
то 'захватить' несколько символов(включая 23) , следующих за символами #123
и переопределить значение константы определенной в #define
      }
      }
      }

 

Или это реализовать через EEPROM ?

что-типо:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8);
int ch = 0;
int st = 234567
String val = "";


void setup() {
  mySerial.begin(9600);
  st = EEPROM.read(1); //считываем значение из 1й ячейки
 }
  
 void loop() {
  if (mySerial.available()) {  
     while (mySerial.available()) {  
      ch = mySerial.read();
      val += char(ch);
      delay(10);
      }
      if (val.indexOf("#123") > -1) {
то 'захватить' несколько символов(включая 23) , следующих за символами #123;
      EEPROM.write(1,значение); //записываем новое значение в 1ю ячейку EEPROM
      }
      }
      }
      

 

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

во втором случае забыл 

#include <EEPROM.h>

 

okta
Offline
Зарегистрирован: 10.01.2015

Конечная цель и, собственно, проблема какие? 

Если проблема "захватить" часть полученной строки, то курите (для начала) фукцию substring

Если изменить #define ST1 "234567" в процеесе выполнения программы - то ни как.

Если экономить оперативку, и сохранять множество полученных значений в EEPROM через одну переменную, то второй вариант. Но тут нужно полностью описать что хотите получить.

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

в общем цель: возможность изменить номер телефона "хозяина"  СМСкой при присылании спецкода. и что б этот номер не стирался при потере питания/перезагрузке.

как управлять чем либо по смс разобрался. как найти спецкод, дающий команду поменять номер "хозяина", я разобрался.

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

сейчас еще появилась идея. что начиная с Nного символа по Mный символа считать и присвоить переменной. переменную пишем в еепром.

сначала substring покурю...

пс: я правильно расшифровываю? (за топорность извините, про c++ только на башорге читал)

while (mySerial.available()) {  //  пока получаем данные в порт

 ch = mySerial.read();  // записываем полученные данные в переменную ch

 val += char(ch); // "дописываем"(т.к. цикл) вновь полученные данные ch к val

 delay(10);  // ждем и заново присваиваем ch очередную порцию данных, и потом дописываем в продолжение val

 }  

 

okta
Offline
Зарегистрирован: 10.01.2015

Да, расшифровка верна.

Лучше всетаки с форматом запроса разобраться, дабы не было сюрприза когда с N по M пришло что-то левое.

Ну и в описанном случае, как научитесь выделять номер, то надо будет добавить один цикл для записи номера (побайтово) в EEPROM (это единственный энергонезависимый метотд хранения в пределах микроконтроллера). В простейшем случае, каждая цифра номера будет отдельным char (=байт), и, соответственно, будет храниться в отдельной ячейке EEPROM.

 

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

спасибо!

 

okta
Offline
Зарегистрирован: 10.01.2015

Чуть подправил :)

okta
Offline
Зарегистрирован: 10.01.2015

Не знаю какой GSM модуль используете. С библиотекой или без. В общем, тут уже надо читать конкретную документацию на конкретно ваш модуль и методы работы с ним. 

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

Номер выделил :) но вроде как вы написали что посчетом символов не есть гуд...

добавил

String st = "";



st = val.substring(10, 21);

Serial.println(st);
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8); // RX, TX
int ch = 0;

String val = "";
String st = "";


void loop() {
  if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
    delay(200);
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
      }
     if (val.indexOf("+CMT") > -1) {  //если смс обнаружена, то проверяем номер
     
      st = val.substring(10, 21);
      Serial.println(st);
      
    }
    else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }
   }

Модуль M590... точно! наверняка можно запросить отдельно номер абонента! 

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

а можно производить сравнение  с заранее записанными номерами телефона на сим карту!

наверное надежнее сравнивать с номерами из EEPROM? или с симкарты? с точки зрения удаленного внесения изменений наверное лчше двигаться в сторону EEPROM..

как в анегдоте "столько идей, столько идей"....

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

подкорректируйте  направление плз...

очень хотелось бы что бы цикл FOR работал, но ксожалению я допускаю какие то грубейшие ошибки :(

в цикле пытаюсь изобразить посимвольную запись в ячейки EEPROM

 if (val.indexOf("+CMT") > -1) {  //если смс обнаружена
     
      st = val.substring(10, 21); // захватываем из неё номер (начиная с 10 и кончая 21м(не включая) символом)
      Serial.println(st); //выводим номер
      for (int i = 0; i <= 11; i++) 
      {
    che[i] = st.substring([i], [i]+1);
    Serial.println(che[i]);
    EEPROM.write(i,che[i])
       }
      }

 

okta
Offline
Зарегистрирован: 10.01.2015

1.Вырезать один символ через субстринг не обязательно читать

2. в 09 точка с запятой.

А вообще, не плохо показывать на что ругается компилятор...

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

попробывал несколько вариантов...

1)

int myInts[11];
 if (val.indexOf("+CMT") > -1) {  //если смс обнаружена,
     
      st = val.substring(10, 21);
      Serial.println(st); 
      char st[12]; //показываем что строка состоит из символов...? хотя это навернео само собой. как это расшифровать? вроде бы st уже до этого (в 03) определена как строка....
     
     for (int i = 0; i <= 11; i++)
      {     
      myInts[i] = st.char{i};
    Serial.println(myInts[i]);
    EEPROM.write(i,myInts[i]);
       }
      }

ошибка (выделена  09) exit status 1

expected unqualified-id before 'char'

2) 

  if (val.indexOf("+CMT") > -1) {  //если смс обнаружена, то проверяем номер
     
      st = val.substring(10, 21);
      Serial.println(st); 
      char st[12];
     
     for (int i = 0; i <= 11; i++)
      {     
      myInts[i] = st.strchr[i];
    Serial.println(myInts[i]);
    EEPROM.write(i,myInts[i]);
       }
      }

ошибка (выделена  09) exit status 1

request for member 'strchr' in 'st', which is of non-class type 'char [12]

пс: ошибки я гуглю и гуглопереводю, но толку мало :(

Jatixo
Offline
Зарегистрирован: 13.01.2016

Попробуйте вместо всего этого вот так:  EEPROM.put(0, st);

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

Jatixo пишет:

Попробуйте вместо всего этого вот так:  EEPROM.put(0, st);

ошибок не выдало) уже радует)

но всеравно непонятно

из еепрома что то не то возвращается.... или может не в той кодировке... 

GSM tester v1.0
AT+CSQ

+CSQ: 16,3

OK
AT+CLIP=1

OK
AT+CMGF=1

OK
AT+C
7916ХХХ2219
243


#include <SoftwareSerial.h>
#include <EEPROM.h>
char inchar;
SoftwareSerial mySerial(7, 8); // RX, TX
int ch = 0;
int che = 0;

String val = "";
String st = "";
String sta = "";
 

void setup() {
  delay(2000);  //время на инициализацию модуля
  Serial.begin(9600);  //скорость порта
  Serial.println("GSM tester v1.0");
  mySerial.begin(9600);
  mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
  delay(200);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(200);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(200);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(200);
  mySerial.println("AT+CNMI=2,2");
  delay(400);
}

void loop() {
  if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
    delay(200);
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
      }
     if (val.indexOf("+CMT") > -1) {  //если смс обнаружена, то проверяем номер
     
      st = val.substring(10, 21);
      Serial.println(st);
      delay(200);
      EEPROM.put(0, st);
      delay(200);
      sta = EEPROM.read(0);
      delay(200);
      Serial.println(sta);
      
      
    }
    else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }
  
}

 

okta
Offline
Зарегистрирован: 10.01.2015

Сорри, не туда ссылку дал, с этим будет проще

  String st;
if (val.indexOf("+CMT") > -1) {  //если смс обнаружена, то проверяем номер
   
    st = val.substring(10, 21);
    Serial.println(st); 
   
   for (int i = 0; i <= 11; i++)
    {     
  Serial.println(st.charAt(i));
  EEPROM.write(i,st.charAt(i));
     }
    }

 

Jatixo
Offline
Зарегистрирован: 13.01.2016

Да, похоже так нельзя строки записывать, извините, но на будущее пригодится может, другие фиксированные типы данных, как я понял, можно. И считывать их тоже удобнее. Так-то вот способ записи строки: http://forum.arduino.cc/index.php?topic=347297.0 Но что-то мне кажется не очень удобно в этом случае. Сейчас напишу другой способ.

Jatixo
Offline
Зарегистрирован: 13.01.2016

Выше неплохой способ написали, но все же вот еще один:

Так как в этом способе используется тип unsigned long, то полностью номер не помещается в одну переменную, если номера всегда будут начинаться с 89, то можно сделать так, считывать 9 чисел, а не 11, то есть с 12 до 21,

потом писать так:

unsigned long num = st.toInt();
EEPROM.put(0, num);

А считывать так:

unsigned long test;
EEPROM.get(0, test);

И где нужно использовать писать "89"+test или "+79"+test

Так то можно не создавать новую переменную test, а использовать ту же самую переменную  num если она будет в зоне видимости, то есть EEPROM.get(0, num);

Оказалось тут еще не учитывается если вдруг будет первая цифра 0, то есть 890, то не будет работать =) В общем ерунда, если только проверять количество цифр, и если не 9, то дополнять слева нулями... =)

 

Всё-таки добился нормальной работы так:

char num[12];
st.toCharArray(num, 12) ;
EEPROM.put(0, num);

 

char test[12];
EEPROM.get(0, test);

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

Jatixo, okta Спасибо огромное! девушка вернулась с работы... придется оттягивать себя за уши от ардуины. вчера хорошо было, все сутки на смене ковырялся...)

okta, Я всё искал эту функцию, но что то она мимо обходила. нашел strchr и пытался импровизацией st.strchr[i] выудить iтый символ строки. А в справочнике языка(http://arduino.ru/Referenceвсе время жмакал на первый String и даже не замечал что прям сразу под ним еще ссылка с таким же названием :/

Jatixo, На будущее учту твой вариант. да и вообще я билайном не пользуюсь) а, наверное в других в регионах есть 0 в коде оператора...  но врятли мне надо будет включить обогреватель на даче (в подмосковье) из например, Владивостока)

 

 

 

Jatixo
Offline
Зарегистрирован: 13.01.2016

Всё подправил, теперь работает на всех операторах =) все-таки так правильнее и универсальнее=)

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

а, просто значиение более длинное стал фиксировать) не с 8-9Хn-, а с более ранней цифры

блин, а я с самого начала приметил уже как в конце буду восстанавливать посимвольно из eeprom

Jatixo
Offline
Зарегистрирован: 13.01.2016

Так не поместится в unsigned long 429 496 7295, в общем будет работать неправильно так.

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

okta пишет:

Сорри, не туда ссылку дал, с этим будет проще

  String st;
if (val.indexOf("+CMT") > -1) {  //если смс обнаружена, то проверяем номер
   
    st = val.substring(10, 21);
    Serial.println(st); 
   
   for (int i = 0; i <= 11; i++)
    {     
  Serial.println(st.charAt(i));
  EEPROM.write(i,st.charAt(i));
     }
    }

 

сделал так как и написали вы. после заливки скетча в монитор вылетает(как обычно) строка GSM tester v1.0, потом пропадает и всё. а на плате непрерывно светится RX

if (val.indexOf("+CMT") > -1) 
    {  
    st = val.substring(10, 21);
    Serial.println(st); 
       for (int i = 0; i <= 11; i++)
       {     
       Serial.println(st.charAt(i));
       EEPROM.write(i,st.charAt(i));
       }
    }

А, не, не пропадает. просто в порт начинает сталься много пустых строк, видимо. только не пойму, почему команды из loop не выводятся

#include <SoftwareSerial.h>
#include <EEPROM.h>

SoftwareSerial mySerial(7, 8); // RX, TX
int ch = 0;
int che = 0;

String val = "";
String st = "";
String test = "";
 

void setup() {
  delay(2000);  //время на инициализацию модуля
  Serial.begin(9600);  //скорость порта
  Serial.println("GSM tester v1.0");
  mySerial.begin(9600);
  mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
  delay(200);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(200);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(200);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(200);
  mySerial.println("AT+CNMI=2,2");
  delay(400);
}

void loop() {
  if (mySerial.available()) 
  {  //если GSM модуль что-то послал нам, то
    delay(200);
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
      }
     if (val.indexOf("+CMT") > -1) 
    {  
    st = val.substring(10, 21);
    Serial.println(st); 
       for (int i = 0; i <= 11; i++)
       {     
       Serial.println(st.charAt(i));
       EEPROM.write(i,st.charAt(i));
       }
    }
  }
    else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }

 

okta
Offline
Зарегистрирован: 10.01.2015

скобки фигурные неправильно расставлены, проверяйте.

else должен относиться ко второму if, а не к первому, как у вас сейчас

сами объясните почему?

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

потомучто val получало значение внутри if, а не снаружи. и очизается оно в конце внутри if. а поскольку модуль ничего не передавал, перескакивали на else, а там Serial.println(val); 

а val пустой, вот и печаталось много много строг...  как то так

 

вся прога:

если ГСМ нам шлет данные 
(
    пока (данные передаются, записываем их в val)
  
    если в строке val находим интересующие нас символы
             (проводим манипуляции с номером)
    иначе выводим в монитор полученные данные и ощичаем строку //для следующего цикла, а то строка просто увеличиваться при следующем приеме данных от гсм)
)

верно?

пс: скобки убежали пока мучал код...

okta
Offline
Зарегистрирован: 10.01.2015

:) ага

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

решил не создавать новую тему...

сначала набросал для одной релюшки. всё отлично работало.. потом дописал еще на 3 реле и непонятки.

если раскоментировать нижний кусок, то перестает реагировать на смски. если нет, то нормально работает. не понимаю почему.

пробовал еще через else if (начиная с четвортого if)

    if (val.indexOf("+CMT") > -1) 
       {  
       if (val.indexOf(master) > -1) 
          { 
          Serial.println("--- MASTER SMS DETECTED ---");
          if (val.indexOf("#a1") > -1)
             {  
             PinStatus[0] = LOW; 
             digitalWrite(Pins[0],PinStatus[0]); 
             EEPROM.write(0 + 12,PinStatus[0]);  
             Serial.println("1 ON");
             }
          if (val.indexOf("#a0") > -1) 
             {
             PinStatus[0] = HIGH; 
             digitalWrite(Pins[0],PinStatus[0]); 
             EEPROM.write(0 + 12,PinStatus[0]);   
             Serial.println("1 OFF");
             }
         /* if (val.indexOf("#b1") > -1)
              {  
              PinStatus[1] = LOW; 
              digitalWrite(Pins[1],PinStatus[1]); 
              EEPROM.write(1 + 12,PinStatus[1]);  
              Serial.println("2 ON");
              }
           if (val.indexOf("#b0") > -1) 
              {
              PinStatus[1] = HIGH; 
              digitalWrite(Pins[1],PinStatus[1]); 
              EEPROM.write(1 + 12,PinStatus[1]);   
              Serial.println("2 OFF");
              }
           if (val.indexOf("#c1") > -1)
              {  
              PinStatus[2] = LOW; 
              digitalWrite(Pins[2],PinStatus[2]); 
              EEPROM.write(2 + 12,PinStatus[2]);  
              Serial.println("3 ON");
              }
           if (val.indexOf("#c0") > -1) 
              {
              PinStatus[2] = HIGH; 
              digitalWrite(Pins[2],PinStatus[2]); 
              EEPROM.write(2 + 12,PinStatus[2]);   
              Serial.println("3 OFF");
              }
           if (val.indexOf("#d1") > -1)
              {  
              PinStatus[3] = LOW; 
              digitalWrite(Pins[3],PinStatus[3]); 
              EEPROM.write(3 + 12,PinStatus[3]);  
              Serial.println("4 ON");
              }
           if (val.indexOf("#d0") > -1) 
              {
              PinStatus[3] = HIGH; 
              digitalWrite(Pins[3],PinStatus[3]); 
              EEPROM.write(3 + 12,PinStatus[3]);   
              Serial.println("4 OFF");
              } */  
          //   else Serial.println("uncnown"); 
             delay(3000);
              
        }
        
        else if (val.indexOf("*#*#*") > -1)
        {
        master = "";
        num = val.substring(10, 21);
 //       Serial.println(num); 
          for (int i = 0; i <= 11; i++)
          {     
 //         Serial.println(num.charAt(i));
          master += num.charAt(i);
          EEPROM.write(i,num.charAt(i));
          }
          Serial.println('\n');
          Serial.println("New master is " + master);
          Serial.println('\n');
         /* for (int i = 0; i <= 11; i++)
          {     
          che = EEPROM.read(i);
          master += char(che);
          delay(100);
          } */
        }    
      }

 

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

и если раскомментировать 62, та же фигня...

 

okta
Offline
Зарегистрирован: 10.01.2015

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

rapidshe
Offline
Зарегистрирован: 31.12.2015
Со скобками вроде бы порядок...
#include <SoftwareSerial.h>
#include <EEPROM.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int ch = 0;
int che = 0;

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

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

  Serial.begin(9600);  //скорость порта
  for (int i = 0; i <= 11; i++)
  {     
  che = EEPROM.read(i);
  master += char(che);
  delay(10);
  }
  Serial.println("Master is " + master);
  Serial.println('\n');
  for(int i = 0; i <= numPins -1; i++)
  {
    pinMode(Pins[i],OUTPUT); 
    PinStatus[i]=EEPROM.read( i + 12 ); 
    digitalWrite(Pins[i],PinStatus[i]);  
    delay(10); 
  }
  Serial.println("GSM tester v1.0");
  mySerial.begin(9600);
  mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
  delay(200);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(200);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(200);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(200);
  mySerial.println("AT+CNMI=2,2");
  delay(400);
}

void loop() {
  if (mySerial.available()) 
  {  //если GSM модуль что-то послал нам, то
    delay(200);
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
      }
    if (val.indexOf("+CMT") > -1) 
       {  
       if (val.indexOf(master) > -1) 
          { 
          Serial.println("--- MASTER SMS DETECTED ---");
          if (val.indexOf("#a1") > -1)
             {  
             PinStatus[0] = LOW; 
             digitalWrite(Pins[0],PinStatus[0]); 
             EEPROM.write(0 + 12,PinStatus[0]);  
             Serial.println("1 ON");
             }
             if (val.indexOf("#a0") > -1) 
             {
             PinStatus[0] = HIGH; 
             digitalWrite(Pins[0],PinStatus[0]); 
             EEPROM.write(0 + 12,PinStatus[0]);   
             Serial.println("1 OFF");
             }
     /*    if (val.indexOf("#b1") > -1)
              {  
              PinStatus[1] = LOW; 
              digitalWrite(Pins[1],PinStatus[1]); 
              EEPROM.write(1 + 12,PinStatus[1]);  
              Serial.println("2 ON");
              }
           if (val.indexOf("#b0") > -1) 
              {
              PinStatus[1] = HIGH; 
              digitalWrite(Pins[1],PinStatus[1]); 
              EEPROM.write(1 + 12,PinStatus[1]);   
              Serial.println("2 OFF");
              }
           if (val.indexOf("#c1") > -1)
              {  
              PinStatus[2] = LOW; 
              digitalWrite(Pins[2],PinStatus[2]); 
              EEPROM.write(2 + 12,PinStatus[2]);  
              Serial.println("3 ON");
              }
           if (val.indexOf("#c0") > -1) 
              {
              PinStatus[2] = HIGH; 
              digitalWrite(Pins[2],PinStatus[2]); 
              EEPROM.write(2 + 12,PinStatus[2]);   
              Serial.println("3 OFF");
              }
           if (val.indexOf("#d1") > -1)
              {  
              PinStatus[3] = LOW; 
              digitalWrite(Pins[3],PinStatus[3]); 
              EEPROM.write(3 + 12,PinStatus[3]);  
              Serial.println("4 ON");
              }
           if (val.indexOf("#d0") > -1) 
              {
              PinStatus[3] = HIGH; 
              digitalWrite(Pins[3],PinStatus[3]); 
              EEPROM.write(3 + 12,PinStatus[3]);   
              Serial.println("4 OFF");
              } */  
          //   else Serial.println("uncnown"); 
             delay(3000);
              
           }   
      }
    else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }
  
}
  

 

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

если  раскомментировать 199, то не реагирует (в монитор порта даже --- MASTER SMS DETECTED --- не прилетает) на #a1, а если закомментировать кусок начиная с 70, а не с 77, и раскомментировать 199, то на #а1 есть реакция.

 

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

и вот вообще за гранью понимания

если 062 (из 29 поста) заменить на Serial.println("AAAAAAAAAAA"); (пробовал еще например Serial.println("Prishlo SMS");), то та же шляпа. в монитор не прилетает AAAAAAAAAAA и реле не срабатывает...

а с Serial.println("MASTER SMS DETECTED"); срабатывает.... может дело не в коде?

okta
Offline
Зарегистрирован: 10.01.2015

не порядок со скобками. 119 Else относится только к последнему If. если расскоментить 119, то если в смс будет #a1 сработает 063 if и с 070го if уйдет на 119 else. Такую конструкцию лучше строить через SwitchCase

В остальном ХЗ - не должно изменение выводимого текста так влиять на код.

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

Если закомментировать проверку свой/чужой, то все 4 канала управляются, и на выводимую надпись нормальная реакция.

намекните как еще можно сделать проверку на номер хозяина?

ПС: до этого эксперементировал на UNO, сейчасас пробую на MEGE. все глюки повторяются.

 вопрос по switch... что то типо такой конструкции?

 

switch (val.indexOf(var)) {
    case "#a1":
      //выполняется, когда var равно 1
      break;
    case "#a0":
      //выполняется когда  var равно 2
      break;
    default:
    break;
}

 

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

Добился максимума.... срабатывает 3канала

сначала выяснил, что цикл  востановления статусов пинов из EEPROM изменяет строку мастер (каждый раз поразному), хотя непонимаю как.

заменил цикл на построчную запись. 

потом стал по одному раскомментировать куски кода относящиеся к каждому каналу.

в итоге кусок кода относящийся к 4му каналу дает сбой... 

сохратил длину сохраняемой в епром части номера мастера, изменил порядковый номера ячеек еепрома относящиеся к записи статусов каналов. всеравно 4й канал гробит всё.

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

012 поменял на int PinStatus[3];, вроде всё работает.... 

можете объяснить такой эффект?

мой моск...

maxnnovik
Offline
Зарегистрирован: 17.12.2016

 Напишу по проблеме озвученой в начале. Не обязательно всю полученную информацию сразу формировать в  строку String. Можно её отобразить сначала через:

char rtB1 = Serial.read();

char rtB2 = Serial.read();
char rtB3 = Serial.read();
char rtB4 = Serial.read();
 
 И в дальнейшем, если найдено нужное значение, сформировать из понравившихся char rtB новое значение
 Но может появиться проблема с буфером загрузки, для его очистки в конце функции пишем
rtB1 = Serial.read();
rtB2 = Serial.read();
rtB3 = Serial.read();
rtB4 = Serial.read();
 
Рабочий кусок:
 
      // Если мы посылаем значение в Arduino, строка есть что то или нет:
      if(Serial.available() > 0)
       {
       char rtD = Serial.read();
       // Выводим в терминальное окно присланное значение:
       // Количество выводимых и считываемых переменных char зависит от колличества высылаемой информации:
       Serial.println(rtD);
        if(rtD >1)
         {
          digitalWrite(3, HIGH);
         }
        delay(20000);
        digitalWrite(3, LOW);
        // Я подготовил под приём двух знаков rtD и rtB:
        char rtB = Serial.read();
        Serial.println(rtB);
        // Очищаем буфер ардуины- без этой строчки появляются паразитные значение в aviable:
        rtD = Serial.read();
        rtB = Serial.read();
       }