А почему бы тебе не воспользовтся функцией switch...case
Код трудно читаем из-за большого количества IF()
Ошибки в коде не увидел.
Вид для печати
А почему бы тебе не воспользовтся функцией switch...case
Код трудно читаем из-за большого количества IF()
Ошибки в коде не увидел.
Попробую.
Здравствуйте подскажите пожалуйста можно ли в этом проекте использовать телефон NOKIA E65-1
Если у телефона есть UART , то можно его использовать, только АТ команды нужно использовать для нокии
Посмотри : http://pinouts.ru/all/nokia_pop.shtml
Спасибо это видел но смущает FBus Rx/USB D+ и FBus Tx/USB D- или я так понимаю на 6 и 7 выводах uart и usb находятся и они сами переключаются
Читаем внимательно, написано что "USB используется в некоторых моделях"
Пробуем уже делаю кабель я так пологаю тут достаточно 3 проводов уже или я ошибаюсь
RX, TX. GND
Спасибо ,будем пробовать
Chip, попробовал переделать скетч с использованием switch.. case.., посмотрел синтаксис,не согу понять, что куда менять. Если не сложно, напиши как его переделать. (Для удобства, уменьшил до 1 устройства) :
PHP код:
char inchar;
int led1 = 10;
void setup()
{
pinMode(led1, OUTPUT);
digitalWrite(led1, LOW);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
}
void loop()
{
if(Serial1.available() >0)
{
inchar=Serial1.read();
if (inchar=='#')
{
delay(10);
inchar=Serial1.read();
if (inchar=='a')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led1, LOW);
}
else if (inchar=='1')
{
digitalWrite(led1, HIGH);
}
delay(10);
Serial1.println("AT+CMGD=1,4\r");
}
}
}
}
Пример
PHP код:
char inchar='1';
void setup()
{
Serial.begin(115200);
}
void loop()
{
switch (inchar)
{
case '1':Serial.println("one");
break;
case '2':Serial.println("two");
break;
case '3':Serial.println("three");
break;
default:Serial.println("nothing");
}
delay(1000);
}
Chip, ни чего у меня не получилось со switch... case... :(
В принципе все понятно, но на моем скетче, запутался в край, тем более, если управлять несколькими устройствами...
Ну да ладно, с трудночитаемостью кода, буду позже разбираться.
Сечас, возникла проблема.
В данном - в скетче:
можно управлять 4-мя устройствами, но синтаксис СМС должен быть - #abcd, т.е. что бы ОДНО устройство включить или выключить, нужно писать всю строку (#a0b0c1d0), что не очень удобно. Решил сделать скетч, чтобы можно было писать просто - #d1 например и все (минуя a,b,c)PHP код:
char inchar;
int led1 = 10;
int led2 = 11;
int led3 = 12;
int led4 = 13;
void setup()
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
}
void loop()
{
if(Serial1.available() >0)
{
inchar=Serial1.read();
if (inchar=='#')
{
delay(10);
inchar=Serial1.read();
if (inchar=='a')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led1, LOW);
}
else if (inchar=='1')
{
digitalWrite(led1, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='b')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led2, LOW);
}
else if (inchar=='1')
{
digitalWrite(led2, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='c')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led3, LOW);
}
else if (inchar=='1')
{
digitalWrite(led3, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='d')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led4, LOW);
}
else if (inchar=='1')
{
digitalWrite(led4, HIGH);
}
delay(10);
}
}
Serial1.println("AT+CMGD=1,4\r");
}
}
}
}
}
Однако не получилось. Решил сделать так :
Вроде бы должно все работать, но включается-выключается только 1 устройство. Т.е. - отправляю #a1 - led1 включается, потом отправляю #b1 - никакой реакции, пока не отключу #a0. В чем может быть проблема?PHP код:
char inchar;
int led1 = 10;
int led2 = 11;
void setup()
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
}
void loop()
{
device_1();
device_2();
}
void device_1()
{
if(Serial1.available() >0)
{
inchar=Serial1.read();
if (inchar=='#')
{
delay(10);
inchar=Serial1.read();
if (inchar=='a')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led1, LOW);
}
else if (inchar=='1')
{
digitalWrite(led1, HIGH);
}
delay(10);
Serial1.println("AT+CMGD=1,4\r");
}
}
}
}
void device_2()
{
if(Serial1.available() >0)
{
inchar=Serial1.read();
if (inchar=='#')
{
delay(10);
inchar=Serial1.read();
if (inchar=='b')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led2, LOW);
}
else if (inchar=='1')
{
digitalWrite(led2, HIGH);
}
delay(10);
Serial1.println("AT+CMGD=1,4\r");
}
}
}
}
Сначала исправь ошибку
if(Serial1.available() >0)
1 байт это тоже больше нуля, нужно указывать конкретное значение , а например если в буфер пришло только 2 байта , а ты берешь из буфера 4 байта
если пакет из 4-х байт то и указывать нужно if(Serial1.available() >3)
Мне приходит 3 байта (#a1), значит указывать >2? А как же тогда - #a1b1c1d1 - 11 байт и работает с ">0"? Или мне на каждом void device_N указывать по +1?
значит указывать >2
А про +1 я не понял
Я имел ввиду, для void device_1 (>2), для void device_2 (>3) и т.д.
Почему >3 ? Там тоже 3 байта
С >2 вообще не работает. Ведь мой скетч принимает по 1 байту, т.е. вначале ждет 1 байт #, потом 1 байт а или b, затем 1 байт 0 или 1
Работает с моим скетчем и при >0, НО!!! Первую СМС воспринимает нормально (включает led2). Отправляю 2-ю СМС на включение led1 - не включает. Отправляю еще раз - включает. Отправляю СМС на отключение led2 - не отключает. Дублирую, - отключает. Последняя СМС на отключение led1 - работает сразу.
Судя по скетчу он у тебя принимает если не #a то #b
Либо наооборот... И приходится дублировать СМС. А скетч на 4-ре устройства, принимает только длинную строку (#a1b1c1d1) или только #a1 (#b1,#c1,#d1 уже не воспринимает). Может быть нужно где-то еще поставить Serial1.println("AT+CMGD=1,4\r"); чтобы не пришлось дублировать? Не вижу вариантов...
Доброго времени суток всем отзовитесь пожалуйста те у кого получилось принимать смс на СИМЕНСЕ ,есть идея попробовать по сути дела я так пологаю разное напряжение логических уровней с телефона до 3.3в с ардуино 5в. в этом я так пологаю идет загвоздка. Для того чтоб номер набрать работает по 2 проводам ардуино передача телефон прием, а на прием смс уже 3 проводанужно телефон передача ардуино прием и вот тут загвоздка уровнях выподает
Для адуино логический уровень это от 2в до 5в
NewSoftSerial phone(4, 3);
void setup()
{
phone.begin(9600);
}
void loop()
{
phone.println("ATD+712345678;");
}
пожалуйста скетч звонка и почему же тогда на команду ат в гипертерминале молчание проходит а на команду звонка ответ прошел выходит тогда что порт неисправен
Поищи в этой теме писали про NewSoftSerial , с этой либой не получается вытащить СМС
только вместо >0 ставлю >2PHP код:
char inchar;
int led1 = 10;
int led2 = 11;
void setup()
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
}
void loop()
{
device_1();
device_2();
}
void device_1()
{
if(Serial1.available() >0)
{
inchar=Serial1.read();
if (inchar=='#')
{
delay(10);
inchar=Serial1.read();
if (inchar=='a')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led1, LOW);
}
else if (inchar=='1')
{
digitalWrite(led1, HIGH);
}
delay(10);
Serial1.println("AT+CMGD=1,4\r");
}
}
}
}
void device_2()
{
if(Serial1.available() >0)
{
inchar=Serial1.read();
if (inchar=='#')
{
delay(10);
inchar=Serial1.read();
if (inchar=='b')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led2, LOW);
}
else if (inchar=='1')
{
digitalWrite(led2, HIGH);
}
delay(10);
Serial1.println("AT+CMGD=1,4\r");
}
}
}
}
Этот скетч я видел, имел ввиду подправленный где принимаешь по 3 байта
Да это он и есть, просто я думал, что по 3 байта принимаю (#a1), а потом понял, что все таки по 1 байту.
Попробуй вот так
PHP код:
char inchar;
int led1 = 10;
int led2 = 11;
void setup()
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
}
void loop()
{
device_1();
device_2();
}
void device_1()
{
if(Serial1.available() >2)
{
inchar=Serial1.read();
if (inchar=='#')
{
inchar=Serial1.read();
if (inchar=='a')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led1, LOW);
}
else if (inchar=='1')
{
digitalWrite(led1, HIGH);
}
}
}
Serial1.flush();
Serial1.println("AT+CMGD=1,4\r");
}
}
void device_2()
{
if(Serial1.available() >2)
{
inchar=Serial1.read();
if (inchar=='#')
{
inchar=Serial1.read();
if (inchar=='b')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(led2, LOW);
}
else if (inchar=='1')
{
digitalWrite(led2, HIGH);
}
}
}
Serial1.flush();
Serial1.println("AT+CMGD=1,4\r");
}
}
Как-то непонятно... Отправляю #b1-работает. Потом #a1-не работает. Потом #b0 - опять не работает. Ставлю >0 - вооюще не работает.
Вот еще вариант кода на 4 устройства только я его не проверял на ошибки
PHP код:
#define led1 10
#define led2 11
#define led3 12
#define led4 13
char instring[3];
void setup()
{
for(byte i=10; i<14; i++) pinMode(i, OUTPUT);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
}
void loop()
{
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
device();
delay(1000);
}
void device()
{
if(Serial1.available() >2)
{
for(byte i=0; i<3; i++) instring[i]=Serial1.read();
if (instring[1]=='a') digitalWrite(led1, (instring[2]-48));
if (instring[1]=='b') digitalWrite(led2, (instring[2]-48));
if (instring[1]=='c') digitalWrite(led3, (instring[2]-48));
if (instring[1]=='d') digitalWrite(led4, (instring[2]-48));
Serial1.flush();
Serial1.println("AT+CMGD=1,4\r");
}
}
Вообще не подает признаков жизни...
А что делает команда AT+CMGD=1,4\r
Я не исключаю что мог допустить ошибку , проверить мне не начем, но логика должна быть как в моем примере. Возможно что модем больше данных отправляет чем 3 байта
AT+CMGD=1,4\r удаляет все полученные СМС. Ее можно и по иному написать, но так работает более корректно.
А какой командой делать запрос СМС?
Этой AT+CNMI=3,0,0,0\r ?
Если да, то попробуй подправленный код
Да, как раз эта команда, сразу (при поступлении) открываес СМС.
Чуть позже, попробую, только напиши, в каком виде отпрвлять СМС. Я пробовал: (а1), (#а1) и (а).
в таком #а1 где 1 или 0 это значение для цифрового выхода