Re: Управление внешними устройствами с Arduino при помощи СМС
В принципе, скетч рабочий, но как-то не так. Прикол вот в чем:
Я сохраняю сообщения в памяти телефона gsm.println("AT+CPMS ='MT'\r" );
При @a1 мне приходит - 0791836027201111040C918360577638660000213022911575 800380700C
Я так понимаю, что текст сообщения это - 00380700?
Но, gsm.read туда не добирается. Он читает с самого начала. Т.е. если я указываю в скетче 07918360 - светодиод нормально включается, после чего, включается AT+CMGD=1 и сообщение успешно удаляется. Каким образом он у тебя доходит до текста сообщения? Сейчас смотрю тему о String (http://arduino.cc/en/Tutorial/StringSubstring) Я где-то там встречал, как из текста выдернуть именно то, что нужно.
Re: Управление внешними устройствами с Arduino при помощи СМС
Что-то типо такого (судя по инструкции):
PHP код:
#include <string.h>
int ledpin = 13;
long previousMillis = 0;
long interval = 30000;
void setup()
{
pinMode(ledpin, OUTPUT);
Serial1.begin(9600);
Serial.begin(9600);
Serial1.flush();
delay(5000);
Serial1.println("AT+CPMS ='MT'\r" );
delay(1000);
Serial1.println("AT+CNMI=1,1\r");
delay(1000);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{ previousMillis = currentMillis;
Serial1.println("AT+CMGL=4\r");
delay(100); }
String text=Serial1.read();
if(text.substring(51,60) == "00380700")
{digitalWrite(ledpin,HIGH);
delay(1000);
Serial1.println("AT+CMGD=1\r");
delay(1000);
}
}
Но не работает....
Re: Управление внешними устройствами с Arduino при помощи СМС
возможно как вариант все значение не влезает в буфер и где то нужно его слить(буфер) я тоже с этим долго боролся и число нужно ловить по байтам так как указано в моем скетче
Re: Управление внешними устройствами с Arduino при помощи СМС
То что по байтам, это понятно. Вот только как добраться до нужных нам. Может все таки попробовать с массивом? Я думаю все 60 байт загнать в массив (по одному байту в каждую ячейку), потом открыть ячейки с 52 по 59, присвоить им имя и сравнить его с нужным нам. Сейчас мучаюсь над этим.
Re: Управление внешними устройствами с Arduino при помощи СМС
тоже так по началу пробовал но если он не читает эти байты то и в массив не внесет их хотя работа с массивом и распечатка данных массива мне помогла понять в какой момент слить флеш надо
Re: Управление внешними устройствами с Arduino при помощи СМС
Вот этот код читает побайтно пока не найдет знак '#'
Re: Управление внешними устройствами с Arduino при помощи СМС
Чип скажи пожалуйста в буфер информация заносится только после команды Serial.read() или информация сразу приходит в буфер и читается из буфера
Re: Управление внешними устройствами с Arduino при помощи СМС
Информация в буфер попадает не зависимо от пользовательского кода по прерыванию.
Serial.read() это функция которая читает первый из буфера и удаляет его, продвинув на его место следующий байт
Serial.available() указывает сколько принятых байт в буфере
Re: Управление внешними устройствами с Arduino при помощи СМС
Цитата:
Сообщение от
Chip
Вот
этот код читает побайтно пока не найдет знак '#'
Chip, этот код не подойдет. В этом коде, мы уже прописываем то, что должно прийти. Это для текстового формата. А нам нужно PDU побороть и вытащить - 00380700 из этого 0791836027201111040C918360577638660000213022025201 800380700C.
Можно было бы всю строку перебрать и дойти до 52 байта, но середина строки постоянно меняется (дата и время).
Я вот только не пойму, почему в моем коде substring не работает. А эта функция решила бы нашу проблему...
Re: Управление внешними устройствами с Arduino при помощи СМС
Принимайте еще одного сумасшедшего ;)
Тестирую на сименсе ME45 c freeduino2009 через резист делитель
нормально выходит только позвонить с ардуины :)
Вот по этому скетчу Светодиод редко поморгает и все! что на 19200 что на 9600
СМСки не стираются... но уже что-то!
#include <NewSoftSerial.h>
char inchar[100];
NewSoftSerial gsm(2,3);
int ledpin = 13;
void setup()
{
pinMode(ledpin, OUTPUT);
gsm.begin(19200);
Serial.begin(19200);
gsm.flush();
delay(5000);
gsm.println("AT+CNMI=1,1");
delay(2000);
}
void loop()
{
//gsm.println(" ATD+12345678;");
//delay(3000);
if(gsm.available() >0 && gsm.read()=='1'){gsm.println(" AT+CMGL=0 ");
digitalWrite(ledpin, HIGH);delay(1000);digitalWrite(ledpin, LOW);delay(1000);
for(int i=0;i<98;i++){inchar[i]=gsm.read();delay(100);}
//gsm.flush();
digitalWrite(ledpin, HIGH);delay(1000);digitalWrite(ledpin, LOW);delay(1000);
for(int i=0;i<98;i++){Serial.print(inchar[i]);}
digitalWrite(ledpin, HIGH);delay(1000);digitalWrite(ledpin, LOW);delay(1000);
gsm.println("AT+CMGD=1");
digitalWrite(ledpin, HIGH);delay(1000);digitalWrite(ledpin, LOW);delay(1000);
gsm.flush();
}
}
А вот в этом сообщении #256 скетч... ничего не происходит.
И еще есть вопрос!? в скетчах с Serial1 на какие пины мне сажать tx rx ??? На пин0 и пин1 для платки freeduino2009 ???
Пока только 3-й день этим как занялся...