Re: Управление внешними устройствами с Arduino при помощи СМС
metaforos Если не трудно погляди что у меня неправильно
пробовал разные варианты. По экрану телефона вижу что ардуина считывает смс из памяти, но обработать и включить пин 5 не выходит, ну и соответственно стирать тоже не хочет смс из памяти. Скорее всего адреса строк пишу неправильно, но как правильно то???
PHP код:
#include <NewSoftSerial.h> //////////// поставить библиотеку сериал
NewSoftSerial mySerial(2,3);
int i=1;
char strok[61]="";
int ledpin = 5; //////////// изменить ледпин на другой
long previousMillis = 0;
long interval = 5000;
void setup()
{
pinMode(ledpin, OUTPUT);
//Serial1.begin(9600); /////// изменить на другой сериал
mySerial.begin(9600);
Serial.begin(9600);
//Serial1.flush(); /////// изменить ?????????
mySerial.flush();
delay(5000);
//Serial1.println("AT+CPMS ='MT'\r" ); /////// ИЗМЕНИТЬ
mySerial.println("AT+CPMS ='MT'\r" );
delay(1000);
//Serial1.println("AT+CNMI=1,1\r"); ////// изменить
mySerial.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"); ///////// изменить
mySerial.println("AT+CMGL=4\r");
delay(100);
}
//if(Serial1.read()=='0' &&Serial1.read()=='7' &&Serial1.read()=='9') /////ИЗМЕНИТЬ .....только, если в Serial1 есть СМС, а то он начинает читать с АТ+ и т.д.
if(mySerial.read()=='0' &&mySerial.read()=='7' &&mySerial.read()=='9')
{
//for (i=1; i<58; i++) strok[i] = Serial1.read(); ////// ИЗМЕНИТЬ
//for (i=1; i<58; i++) strok[i] = mySerial.read();
for (i=1; i<60; i++) strok[i] = mySerial.read();
// ВКЛЮЧЕНИЕ - отправляю СМС - #a1
//if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
//if(strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
if(strok[52] == '1' &&strok[53] == '0' &&strok[54] == '3' &&strok[55] == 'A' &&strok[56] == '3' &&strok[57] == '7' &&strok[58] == '0')
{
digitalWrite (ledpin, HIGH);
delay(1000);
//Serial1.println("AT+CMGD=1"); /////// ИЗМЕНИТЬ
mySerial.println("AT+CMGD=1");
}
// ВЫКЛЮЧЕНИЕ - отправляю СМС - #a0
//if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '3' &&strok[55] == '0')
//if(strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '3' &&strok[55] == '0')
if(strok[52] == '1' &&strok[53] == '0' &&strok[54] == '3' &&strok[55] == 'A' &&strok[56] == '3' &&strok[57] == '3' &&strok[58] == '0')
{
digitalWrite (ledpin, LOW);
delay(1000);
//Serial1.println("AT+CMGD=1"); /////// ИЗМЕНИТЬ
mySerial.println("AT+CMGD=1");
}
}
delay(100);
}
//0 7 9 1 9 7 6 1 9 8 9 9 0 1 F 0 2 4 0 B 9 1 9 7 6 1 4 6 4 3 3 9 F 2 0 0 0 0 2 1 4 0 5 0 7 1 9 4 6 1 6 1 0 3 A 3 7 0 0 C - #a1
//1 2 3 4 5 6 7 8 9 10 15 20 25 30 35 40 45 50 55 60
//0 7 9 1 9 7 6 1 9 8 9 9 0 1 F 0 2 4 0 B 9 1 9 7 6 1 4 6 4 3 3 9 F 2 0 0 0 0 2 1 4 0 5 0 8 1 0 2 4 1 6 1 0 3 A 3 3 0 0 C - #a0
// - - - - -
Поставил строку Serial.println(strok[52]); чтоб понять значение strok[52] ...но значение выводится закорючкой!!!!
Re: Управление внешними устройствами с Arduino при помощи СМС
Я не пойму, зачем ты менял мои
PHP код:
for (i=1; i<60; i++) strok[i] = mySerial.read();
и
PHP код:
if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
Они одинаково будут работать для любого оператора и номера телефона. Я ведь присваиваю не с 1-го символа (0), а с 4-го (1), а ты все перепутал.
Здесь -
PHP код:
char strok[61]="";
- я взял 61 для "надежности", т.к. приходит 60 символов.
Re: Управление внешними устройствами с Arduino при помощи СМС
У меня в конце скетча примеры приходящих смс, там так
6 1 0 3 A 3 7 0 ... единица по счету 52-я и начало не на 2 а на 6!
Сейчас еще раз проверю все сначала.
Re: Управление внешними устройствами с Arduino при помощи СМС
Попробовал по всякому ...ни выходит
for (i=1; i<58; i++) strok[i] = mySerial.read();
if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
и
if(strok[48] == '6' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
и
if(strok[51] == '6' &&strok[52] == '1' &&strok[53] == '0' &&strok[54] == '3' &&strok[55] == 'A' &&strok[56] == '3' &&strok[57] == '7' &&strok[58] == '0')
Посмотри мою строчку #a1 приходящую
//0 7 9 1 9 7 6 1 9 8 9 9 0 1 F 0 2 4 0 B 9 1 9 7 6 1 4 6 4 3 3 9 F 2 0 0 0 0 2 1 4 0 5 0 7 1 9 4 6 1 6 1 0 3 A 3 7 0 0 C
Цитата:
Сообщение от
metaforos
PHP код:
if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
Они одинаково будут работать для любого оператора и номера телефона. Я ведь присваиваю не с 1-го символа (0), а с 4-го (1), а ты все перепутал.
Я не врублюсь где в скетче сдвиг на 4 происходит :confused: ... я уже и со сдвигом попробовал и без, даже и не знаю что теперь делать :(:(:(
metaforos попробуй скетч с библиотекой NewSoftSerial может это уже действительно из-за неё
Re: Управление внешними устройствами с Arduino при помощи СМС
Тогда вместо 2 в :
PHP код:
if(strok[48] == [COLOR="red"]'2'[/COLOR] &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
поставь свою 6
PHP код:
if(strok[48] == [COLOR="Red"]'6'[/COLOR] &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
А здвиг вот как происходит - Нам приходит 60 символов:
07919761989901F0240B919761464339F20000214050714616103A 3700C
В таком виде, твоя 6-ка, будет strok[51]. Но! Первые 3 символа (079), мы используем в
PHP код:
if(Serial1.read()=='0' &&Serial1.read()=='7' &&Serial1.read()=='9') // только, если в Serial1 есть СМС, а то он начинает читать с АТ+ и т.д.
Теперь у нас для чтения, остается только 57 символов и 1-м символом идет 1, тогда твоя 6-ка, это уже 51-3=48 и т.д. до 55 символа.
А по поводу NewSoftSerial, пробовать даже не буду. Она у меня не работает. Попробуй подключи на 0 и 1 и просто напиши Serial.
Re: Управление внешними устройствами с Arduino при помощи СМС
я уже пробовал так, выше постом писал!
if(strok[48] == '6' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
Поправь свой предыдущий скетч пожалуйста там где фигурные скобки надо было подправить... я сейчас с ним играюсь
PHP код:
#include <NewSoftSerial.h>
NewSoftSerial mySerial(2,3);
int i=1;
char strok[61]="";
int ledpin = 5;
long previousMillis = 0;
long interval = 5000;
void setup()
{
pinMode(ledpin, OUTPUT);
mySerial.begin(9600);
Serial.begin(9600);
mySerial.flush();
delay(5000);
mySerial.println("AT+CPMS ='MT'\r" );
delay(1000);
mySerial.println("AT+CNMI=1,1\r");
delay(1000);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
mySerial.println("AT+CMGL=4\r");
delay(100);
}
// отправляю СМС - #a1
if(mySerial.read()=='0' &&mySerial.read()=='7'&&mySerial.read()=='9') //только, если в Serial1 есть СМС, а то он начинает читать с АТ+ и т.д.
{
for (i=1; i<58; i++) strok [i] = mySerial.read();
Serial.print(strok[48]); // 2
Serial.println(strok[49]); // 1
//Serial.println(strok[50]); // 0
//Serial.print(strok[51]); // 3
//Serial.print(strok[52]); // A
//Serial.print(strok[53]); // 3
//Serial.print(strok[54]); // 7
//Serial.print(strok[55]); // 0
digitalWrite (ledpin, HIGH);
delay(3000);
digitalWrite (ledpin, LOW);
delay(10000);
}
}
Выходат так:
A3
**
**
**
A3
**
*
**
Вместо * закарючка
Цитата:
Сообщение от
metaforos
Попробуй подключи на 0 и 1 и просто напиши Serial.
У меня к сожалению через Serial на 0 и 1 не пошло ничего, телефон теряет сеть и все(ПРАВДА СМСку успевает прочесть-в прочитанные в телефоне уходит) ... если так не разберусь то тогда буду пробовать.
Завтра LCD экран подключу ...посмотрю что strok[48] - [55] у меня выводит.
Re: Управление внешними устройствами с Arduino при помощи СМС
Перепроверил скетч - http://www.compcar.ru/forum/showpost...&postcount=329
Пробовал на разных операторах. Все исправно работает. В твоем случае, нужно только поменять 2 на 6. В чем может быть проблема, не понимаю. Попробуй
PHP код:
Serial.print(strok[48]);
Serial.print(strok[49]);
Serial.print(strok[50]);
Serial.print(strok[51]);
Serial.print(strok[52]);
Serial.print(strok[53]);
Serial.print(strok[54]);
Serial.print(strok[55]);
и посмотри, что приходит. Потом, просто впиши в
PHP код:
if(strok[48] == '2' &&strok[49] == '1' &&strok[50] == '0' &&strok[51] == '3' &&strok[52] == 'A' &&strok[53] == '3' &&strok[54] == '7' &&strok[55] == '0')
Но вот если тебе придут иероглифы, квадратики и т.д., то как победить это, я не знаю. Я просто переставил скобки и все заработало. Причем расставлял, практически "наугад", пока не заработало.
Re: Управление внешними устройствами с Arduino при помощи СМС
Проблема из-за закорючек
попробовал вывести на LCD 16х2
lcd.setCursor(0, 1);
lcd.print(strok[48]); закорючка
lcd.print(strok[49]); закорючка
lcd.print(strok[50]); закорючка
lcd.print(strok[51]); закорючка
lcd.print(strok[52]); закорючка
lcd.print(strok[53]); закорючка
lcd.print(strok[54]); закорючка
lcd.print(strok[55]); закорючка
что дальше делать пока не знаю.
Re: Управление внешними устройствами с Arduino при помощи СМС
Вот-вот... Я тоже не пойму в чем дело. Хотя тут, возможно из-за телефона. Может действительно с делителем напряжения эксперементировать?
Re: Управление внешними устройствами с Arduino при помощи СМС
делитель напряжения не стоит трогать через терминал все знаки приходят как надо или нет и скорость порта на телефоне точно 9600 и как вариант попробуй 19200 из моих сименсов на 9600 никто не работал по умолчанию обычно 19200 идет скорость порта и еще попробуй паузу вствить при чтении в массив были подобные случаи что без паузы плохо читало
for (i=1; i<58; i++) :strok [i] = mySerial.read();delay(100);} примерно так