Помогите разобраться с управлением Arduino через RC-05

Soichi
Soichi аватар
Offline
Зарегистрирован: 02.11.2015

Всем привет. Я новичок в работе с ардуино, прошу помощи :)

Скетч взял и переделал вот отсюда

http://robocraft.ru/blog/electronics/587.html

Вот сам скетч

enum LedState { allOff, livingRoom, livingRoomOff, livingRoom1, livingRoom1Off, livingRoom2, livingRoom2Off, hillway, hillwayOff, lumberRoom, lumberRoomOff, bathroom, bathroomOff, kitchen, kitchenOff };

LedState led_state;

void setup()
{
  led_state = allOff; // При запуске программы все реле выключены.
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(13, OUTPUT);
  
  Serial.begin(9600);
}

void loop()
{  
  if (Serial.available())
  {
    char command = Serial.read();
    
    switch (command)
    {
      case '0': led_state = allOff; break;
      case '8': led_state = livingRoom; break;
      case '*': led_state = livingRoomOff; break;
      case '2': led_state = livingRoom1; break;
      case '@': led_state = livingRoom1Off; break;
      case '3': led_state = livingRoom2; break;
      case '#': led_state = livingRoom2Off; break;
      case '4': led_state = hillway; break;
      case '$': led_state = hillwayOff; break;
      case '5': led_state = lumberRoom; break;
      case '%': led_state = lumberRoomOff; break;
      case '6': led_state = bathroom; break;
      case '^': led_state = bathroomOff; break;
      case '7': led_state = kitchen; break;
      case '&': led_state = kitchenOff; break;
      
      
      default:
      {
        for (int i = 0; i < 5; ++i)
        {
          digitalWrite(13, HIGH);
          delay(50);
          digitalWrite(13, LOW);
          delay(50);
        }
      }
    }
  }
  
  switch (led_state)
  {
  case allOff:  // Выключаем все реле.
  {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    break;
  }
    case livingRoom: // Инвертируем реле обоих реле освещения люстры в гостиной.
    {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    break;
    }
  case livingRoomOff: // Инвертируем реле обоих реле освещения люстры в гостиной.
    {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    break;
    }
    case livingRoom1: digitalWrite(2, !digitalRead(2)); break; // Инвертируем реле освещения люстры в гостиной. (Одна лампа)
    case livingRoom2: digitalWrite(3, !digitalRead(3)); break; // Инвертируем реле освещения люстры в гостиной. (Две лампы)
    case hillway: digitalWrite(4, !digitalRead(4)); break; // Инвертируем реле освещения в коридоре.
  case lumberRoom: digitalWrite(5, !digitalRead(5)); break; // Инвертируем реле освещения в чулане.
  case bathroom: digitalWrite(6, !digitalRead(6)); break; // Инвертируем реле освещения в ванной.
  case kitchen: digitalWrite(7, !digitalRead(7)); break; // Инвертируем реле освещения в кухне.
    
    /*case LED_BLINK:
    {
      static unsigned long start_millis = 0;
      
      if (millis() - start_millis >= 300)
      {
        start_millis = millis();
        digitalWrite(LED_PIN, !digitalRead(LED_PIN));
      }
    }*/
  }
}

Проблема в том, что символы не воспринимаются при отправке, только цифры (те что в case). Не работает инверсия состояния пина. Отправляешь 2, загорается светодиод на пине 2, отправляешь 2 повторно - ничего не происходит. Так же не выходит добавить в case числа больше диапазона 0-9. Ах да, еще время от времени когда включаешь светодиоды из под Windows с Termite, те что уже были включены, выключаются..

Подскажите пожалуйста в где искать информацию, чтобы всё это исправить.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Soichi пишет:

Подскажите пожалуйста в где искать информацию,

В Вашем скетче!

1. После строки 23 вставляем Serial.print("command="); Serial.println(command);

2. После строки 55 вставляем Serial.print("led_state="); Serial.println(led_state);

3. После строки 60 вставляем Serial.println("POPALI v CASE allOff");

4. делаем как в п.3 для всех case.

После этого смотрим на то, что печатается, чешем репу, ещё раз смотрим, ещё раз чешем и ... бьём себя по лбу и кричим: "блин, так всё ж понятно!"

Примерно так все программы и отлаживаются. А Вы что думали, есть какие-то дядьки, которые не ошибаются и чьи программы в отладке не нуждаются?

Да, и ещё, Вы уж в строке 3 присвойте led_State какое-нибудь значение, а то она у Вас запросто может быть использована ДО инициализации.

Soichi
Soichi аватар
Offline
Зарегистрирован: 02.11.2015

Вставил, но.. подскажите чем мониторить то что должно печататься? Пробовал Terra Term VT (на входящем COM3). Но ничего не отображается.

А насчет дядек. Вдруг кто то уже собаку в этом съел в этом вопросе и знает всё от и до :)

enum LedState { allOff, livingRoom, livingRoomOff, livingRoom1, livingRoom1Off, livingRoom2, livingRoom2Off, hillway, hillwayOff, lumberRoom, lumberRoomOff, bathroom, bathroomOff, kitchen, kitchenOff };

LedState led_state;

void setup()
{
  led_state = allOff; // При запуске программы все реле выключены.
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(13, OUTPUT);
  
  Serial.begin(9600);
}

void loop()
{  
  if (Serial.available())
  {
    char command = Serial.read();
	Serial.print("command="); Serial.println(command);
    
    switch (command)
    {
      case '0': led_state = allOff; break;
      case '8': led_state = livingRoom; break;
      case '*': led_state = livingRoomOff; break;
      case '2': led_state = livingRoom1; break;
      case '@': led_state = livingRoom1Off; break;
      case '3': led_state = livingRoom2; break;
      case '#': led_state = livingRoom2Off; break;
      case '4': led_state = hillway; break;
      case '$': led_state = hillwayOff; break;
      case '5': led_state = lumberRoom; break;
      case '%': led_state = lumberRoomOff; break;
      case '6': led_state = bathroom; break;
      case '^': led_state = bathroomOff; break;
      case '7': led_state = kitchen; break;
      case '&': led_state = kitchenOff; break;
      
      
      default:
      {
        for (int i = 0; i < 5; ++i)
        {
          digitalWrite(13, HIGH);
          delay(50);
          digitalWrite(13, LOW);
          delay(50);
        }
      }
    }
  }
  Serial.print("led_state="); Serial.println(led_state);
  
  switch (led_state)
  {
  case allOff:  // Выключаем все реле.
  {
	Serial.println("POPALI v CASE allOff");
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    break;
  }
    case livingRoom: // Инвертируем реле обоих реле освещения люстры в гостиной.
    {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    break;
    }
  case livingRoomOff: // Инвертируем реле обоих реле освещения люстры в гостиной.
    {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    break;
    }
    case livingRoom1: digitalWrite(2, !digitalRead(2)); break; // Инвертируем реле освещения люстры в гостиной. (Одна лампа)
    case livingRoom2: digitalWrite(3, !digitalRead(3)); break; // Инвертируем реле освещения люстры в гостиной. (Две лампы)
    case hillway: digitalWrite(4, !digitalRead(4)); break; // Инвертируем реле освещения в коридоре.
  case lumberRoom: digitalWrite(5, !digitalRead(5)); break; // Инвертируем реле освещения в чулане.
  case bathroom: digitalWrite(6, !digitalRead(6)); break; // Инвертируем реле освещения в ванной.
  case kitchen: digitalWrite(7, !digitalRead(7)); break; // Инвертируем реле освещения в кухне.
    
    /*case LED_BLINK:
    {
      static unsigned long start_millis = 0;
      
      if (millis() - start_millis >= 300)
      {
        start_millis = millis();
        digitalWrite(LED_PIN, !digitalRead(LED_PIN));
      }
    }*/
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А чем Вы свою команду в Serial пихаете? 

В общем, запустите "монитор порта" (в IDE в правом верхнем углу кнопка) и из монитора пихайте команду и в нём же смотрите что печатает. Если запстите, а там грязь - выставьте в мониторе порта такую скорость, как у Вас в скетче.

Soichi
Soichi аватар
Offline
Зарегистрирован: 02.11.2015

При попытке зацепиться к  Serial через IDE, пишет что порт занят.

А команду в Serial пихаю через Termite, по Bluetooth.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так отключите свой термине и блютузом. Просто отключите и поработайте сначала с чистой программой через терминал. Почему все новички юбят все сложности в одну кучу свалить и сидеть возле них.

Когда Вы всё выключите, перезапустите IDE. Запустите монитор порта (должен быть свободен). После этого заоивайте скетч и вводите команды из монитора порта. Если порт всё равно занят - смотрите, что не отключили. Прегрузите компьютерн, наконец. Если занят, значит кто-то его занимает.

Soichi
Soichi аватар
Offline
Зарегистрирован: 02.11.2015

Спасибо большое за подсказку. Это ж насколько проще становится программу отлаживать с мониторингом порта :)

В итоге вот что получилось. Всё работает так как было задумано. Ура, ура! :)

void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  Serial.begin(9600);
}

void loop()
{
  if (Serial.available())
  {
    char command = Serial.read();

    switch (command)
    {
      case '0': digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); break;
      case '1': digitalWrite(2, !digitalRead(2)); digitalWrite(3, !digitalRead(3)); break;
      case '2': digitalWrite(2, !digitalRead(2)); break;
      case '3': digitalWrite(3, !digitalRead(3)); break;
      case '4': digitalWrite(4, !digitalRead(4)); break;
      case '5': digitalWrite(5, !digitalRead(5)); break;
      case '6': digitalWrite(6, !digitalRead(6)); break;
      case '7': digitalWrite(7, !digitalRead(7)); break;
      case '*': digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); break;

      default: digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); break;
    }
  }
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

С Победой!