Ок. Завтра буду пробовать.
Ок. Завтра буду пробовать.
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
Chip, с подправленным кодом тоже никакой реакции. Я все смотрю на этот скетч - http://www.compcar.ru/forum/showpost...&postcount=173 (где управление на 4 устройства) и не пойму, почему он воспринимает только #a1b1c1d1 и никак не получается его разделить на #a1 или #b1 или #c1 или #d1... Вроде бы как "на вид" все прсто, но ничего не работает...
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
Все просто , в этом скетче да и во всех остальных, СМС попадает в сериал буфер всего один раз и при чтении из буфера с помощью serial.read данные из этого буфера удаляются. Ты сначала читаешь и удаляешь а1 потом b1
и так далее. После удаления обработки пришедшей СМС, новая СМС в буфер не попадет ни как, потому что в цикле она нигде не читается
Последний раз редактировалось Chip; 08.03.2012 в 11:19.
Попробуй еще 1 вариант кода посылать СМС нужно двумя байтами а1 или с0, тоесть без знака #
Я так понимаю что ты в курсе что СМС посылать нужно не раньше чем через 30сек. после запуска скетча?
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(300);
sms_read();
delay(1000);
}
void sms_read()
{
if(Serial1.available() >1)
{
for(byte i=0; i<2; i++) instring[i]=Serial1.read();
switch (instring[0])
{
case 'a': digitalWrite(led1, (instring[1]-48));
break;
case 'b': digitalWrite(led2, (instring[1]-48));
break;
case 'c': digitalWrite(led3, (instring[1]-48));
break;
case 'd': digitalWrite(led4, (instring[1]-48));
break;
default: Serial1.flush();
}
Serial1.println("AT+CMGD=1,4\r");
}
}
Последний раз редактировалось Chip; 08.03.2012 в 12:07.
Не работает. Почему (instring[1]-48), т.е. что означает -48?
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
Возможно что то ты делаешь не так.
А для чего ты сделал пауза 30сек?
Можно попробовать убрать строку с обнулением всех СМС
Последний раз редактировалось Chip; 08.03.2012 в 15:52.
Пауза в 30 секунд, для того, чтобы шилд успел зарегистрироваться в сети. Когда эксперементирую, я ее вообще убираю и ориентируюсь по светодиоду на шилде. А если не удалять СМС, они сохраняются и Ардуина обрабатывает самое первое СМС, а остальные игнорирует.
Т.е с командой "AT+CNMI=3,0,0,0\r" сообщения видны в таком формате:
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
Если не удалять, получается:
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
+СMT: "номер телефона отправителя","номер центра СМС","дата, время", длина СМС
Текст СМС
и т.д.
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
Ну так если в таком формате СМС получаем, то их нужно принимать совсем по другому
Попробуй вот такой код
Формат СМС #a1
PHP код:
#define led1 10
#define led2 11
#define led3 12
#define led4 13
char device,on_off;
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);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
}
void loop()
{
sms_read();
}
void sms_read()
{
if(Serial1.available()>2)
{
if(Serial1.read()=='#')
{
device=Serial1.read();
on_off=Serial1.read();
switch (device)
{
case 'a': digitalWrite(led1, on_off-48);
break;
case 'b': digitalWrite(led2, on_off-48);
break;
case 'c': digitalWrite(led3, on_off-48);
break;
case 'd': digitalWrite(led4, on_off-48);
break;
}
Serial1.println("AT+CMGD=1,4\r");
Serial1.flush();
}
}
}
Последний раз редактировалось Chip; 08.03.2012 в 16:46.
Теперь все работает отлично. Только объясни пожалуйста, почему вместо int led, ты используешь #define led1 и что такое -48. Также, мне не совсем понятна Serial1.flush();
Liliput 629 GL, Intel Atom N230 1.6, HDD 200 GB, ОЗУ 2GB, Globalsat GT-100.
int led занимает в оперативной памяти место 2 байта
#define led1 это указание компилятору чтобы он везде где встретит led1 заменит его на 10
-48 это преобразование из типа Char в тип Byte
Serial1.flush() очищает сериал буфер
Последний раз редактировалось Chip; 09.03.2012 в 12:12.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)