Re: Управление внешними устройствами с Arduino при помощи СМС
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");
}
}
}
}
Re: Управление внешними устройствами с Arduino при помощи СМС
Пример
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);
}
Re: Управление внешними устройствами с Arduino при помощи СМС
Chip, ни чего у меня не получилось со switch... case... :(
В принципе все понятно, но на моем скетче, запутался в край, тем более, если управлять несколькими устройствами...
Ну да ладно, с трудночитаемостью кода, буду позже разбираться.
Сечас, возникла проблема.
В данном - в скетче:
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");
}
}
}
}
}
можно управлять 4-мя устройствами, но синтаксис СМС должен быть - #abcd, т.е. что бы ОДНО устройство включить или выключить, нужно писать всю строку (#a0b0c1d0), что не очень удобно. Решил сделать скетч, чтобы можно было писать просто - #d1 например и все (минуя a,b,c)
Однако не получилось. Решил сделать так :
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");
}
}
}
}
Вроде бы должно все работать, но включается-выключается только 1 устройство. Т.е. - отправляю #a1 - led1 включается, потом отправляю #b1 - никакой реакции, пока не отключу #a0. В чем может быть проблема?
Re: Управление внешними устройствами с Arduino при помощи СМС
Сначала исправь ошибку
if(Serial1.available() >0)
1 байт это тоже больше нуля, нужно указывать конкретное значение , а например если в буфер пришло только 2 байта , а ты берешь из буфера 4 байта
если пакет из 4-х байт то и указывать нужно if(Serial1.available() >3)
Re: Управление внешними устройствами с Arduino при помощи СМС
Мне приходит 3 байта (#a1), значит указывать >2? А как же тогда - #a1b1c1d1 - 11 байт и работает с ">0"? Или мне на каждом void device_N указывать по +1?
Re: Управление внешними устройствами с Arduino при помощи СМС
значит указывать >2
А про +1 я не понял
Re: Управление внешними устройствами с Arduino при помощи СМС
Я имел ввиду, для void device_1 (>2), для void device_2 (>3) и т.д.
Re: Управление внешними устройствами с Arduino при помощи СМС
Почему >3 ? Там тоже 3 байта
Re: Управление внешними устройствами с Arduino при помощи СМС
С >2 вообще не работает. Ведь мой скетч принимает по 1 байту, т.е. вначале ждет 1 байт #, потом 1 байт а или b, затем 1 байт 0 или 1
Re: Управление внешними устройствами с Arduino при помощи СМС
Работает с моим скетчем и при >0, НО!!! Первую СМС воспринимает нормально (включает led2). Отправляю 2-ю СМС на включение led1 - не включает. Отправляю еще раз - включает. Отправляю СМС на отключение led2 - не отключает. Дублирую, - отключает. Последняя СМС на отключение led1 - работает сразу.