Управление Ардуиной из теринала.

Leon11t
Offline
Зарегистрирован: 27.01.2013

Всем привет. Читал на форуме про то как управляли роботами и прочими устройствами из компа ардуиной. 
У меня задача похожая, нужно управлять к примеру одним светодиодом. Например пишу в терминале ledon- светодиод включился, ledoff- выключился. Вроде все просто но не работает. Помогите плиз. Вот мой кусок кода:

int led = 13;
int ledon;
int ledoff;


void setup()
{
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}


void loop()
{
if (Serial.available() > 0)
  {
                // read the incoming byte:
                ledon = Serial.read();
                digitalWrite(led, HIGH);

                // say what you got:
                Serial.print("I received: ");
                Serial.println(ledon);
  }
                
  if (Serial.available() > 0) 
  {
                // read the incoming byte:
                ledoff = Serial.read();
                digitalWrite(led, LOW);

                // say what you got:
                Serial.print("I received: ");
                Serial.println(ledoff);
  }

}

Светодиод зажигается и выключается не важно что я шлю в терминал. Как мне привезать  "ledon" и "ledoff" к определенному светодиоду и ими управлять???

leshak
Offline
Зарегистрирован: 29.09.2011

не важно что я шлю в терминал.

Ну, логично. Вот вы прочитали ledoff = Serial.read(); что-то из терминала, а где-то потом сравнили "что же вы прочитали"? Решение какое-то приняли? Нет. вы

Прочитали.
Включили диод (без каких-либо условий).
Вывели обратно в Serial что вы прочитали.

Это не говоря уже про что в какую ветку вы попадете 15 или 26 - чисто как повезет. Поиска ли бы по форуму. да и в гугле. Примеров "включаем LED" по командам из Serial - масса.

1 - включает, 2 - выключает, 3 - меняет состояние на противоположное. Все остальное - кричит "неизвестная комманда".

int led = 13;

void setup()
{
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}


void loop()
{
  if (Serial.available() > 0)
  {
    char ch=Serial.read();
    Serial.print("I received: ");
    Serial.println(ch);

    switch(ch){
      case '1':  
        digitalWrite(led, HIGH);
        break;
      case '0':  
        digitalWrite(led, LOW);
        break;
      case '3':
         digitalWrite(led, !digitalRead(led));
         break
       
      default:
        Serial.println("Unknow command");
    }
  }


}

 

Leon11t
Offline
Зарегистрирован: 27.01.2013

Спасибо, заработало! Но тут у меня эсть одно НО. Мне нужно дать кейсам читаемие имена. Такие Led1On, Led1Off... А компилятор ругается на то что там многострочная константа и происходит переполнение переменной, переменная не соответствует данным. Это все можно организовать как небуть через "if" ? Ишр еще как небуть?

leshak
Offline
Зарегистрирован: 29.09.2011

Решение зависит от того что же именно вы хотите. Сделать сами команды многобуквенными, и в Serial писать "led1on" или "просто что-бы в коде видно было".

Первый вариант "так просто" уже не сделаешь. Нужно будет будет разобратся со строками, научится вычитывать из Serial строку, научится сравнивать строки, заморочится с определением "начало и конец строки" при чтении.

Во втором варианте, когда нужно просто в коде дать читаемые имена - тут все просто.

http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/10/1002.htm

#define LED_1_ON '1'

loop(){
....
  switch(ch){
     case LED_1_ON: ....
                               break;
     .....
  }
}

 

Leon11t
Offline
Зарегистрирован: 27.01.2013

Нужно в сериал писать Led1On :)

leshak
Offline
Зарегистрирован: 29.09.2011

Ну тогда айда в раздел программирование в шапке сайта, читать про массивы и строки (желательно C-шные, который string, а не String). Вначале просто учится их читать и выводить. Какая-нибудь книжка/учебник по C - тоже в этом помогут (в документации скупо это освещено).

Можно поиском по форуму поискать - задача не раз поднималась. Что-то типа "чтение строки из Serial", чтение массива из ком-порта, strcmp и т.п. и т.д.

Вообщем для начала - решите две задачи:

1. Как прочитать строку из сериал и запихнуть в какой-то массив
2. Как сравнивать две C-шный строки.

Ну а после этого - решение уже будет тривиальным. Как вы и говорили - через if.

Leon11t
Offline
Зарегистрирован: 27.01.2013

Ок, спасибо!