Помогите разобраться с управлением Arduino через RC-05
- Войдите на сайт для отправки комментариев
Вс, 10/01/2016 - 11:07
Всем привет. Я новичок в работе с ардуино, прошу помощи :)
Скетч взял и переделал вот отсюда
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, те что уже были включены, выключаются..

Подскажите пожалуйста в где искать информацию, чтобы всё это исправить.
Подскажите пожалуйста в где искать информацию,
В Вашем скетче!
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 какое-нибудь значение, а то она у Вас запросто может быть использована ДО инициализации.
Вставил, но.. подскажите чем мониторить то что должно печататься? Пробовал 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)); } }*/ } }А чем Вы свою команду в Serial пихаете?
В общем, запустите "монитор порта" (в IDE в правом верхнем углу кнопка) и из монитора пихайте команду и в нём же смотрите что печатает. Если запстите, а там грязь - выставьте в мониторе порта такую скорость, как у Вас в скетче.
При попытке зацепиться к Serial через IDE, пишет что порт занят.
А команду в Serial пихаю через Termite, по Bluetooth.
Так отключите свой термине и блютузом. Просто отключите и поработайте сначала с чистой программой через терминал. Почему все новички юбят все сложности в одну кучу свалить и сидеть возле них.
Когда Вы всё выключите, перезапустите IDE. Запустите монитор порта (должен быть свободен). После этого заоивайте скетч и вводите команды из монитора порта. Если порт всё равно занят - смотрите, что не отключили. Прегрузите компьютерн, наконец. Если занят, значит кто-то его занимает.
Спасибо большое за подсказку. Это ж насколько проще становится программу отлаживать с мониторингом порта :)
В итоге вот что получилось. Всё работает так как было задумано. Ура, ура! :)
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; } } }С Победой!