Передача данных по Serial
- Войдите на сайт для отправки комментариев
Вс, 12/02/2017 - 21:13
Добрый день!
Суть вопроса в передаче данных с одной платы ардуино (передатчик) к которой подключен 8-ми позиционный переключатель, на другую (приемник).
В передатчике нужно отслеживать положение переключателя и передавать его по Serial соединению на приемник, а на нем, в зависимости от положения переключателя, выполнять необходимые действия.
Прошу помочь в написании кода передатчика.
Код приемника:
void setup() {
Serial.begin(9600);
for (int outPin = 6; outPin < 13; outPin++) {
pinMode(outPin, OUTPUT);
}
}
void loop() {
if (Serial.available() > 0) {
int inByte = Serial.read();
switch (inByte) {
case 'a': // 1 положение
delay(500);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(9, HIGH);
delay(500);
digitalWrite(7, HIGH);
break;
case 'b': // 2 положение
delay(500);
digitalWrite(11, HIGH);
delay(500);
digitalWrite(9, HIGH);
delay(500);
digitalWrite(7, HIGH);
break;
case 'c': // 3 положение
delay(500);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(8, HIGH);
delay(500);
digitalWrite(7, HIGH);
break;
case 'd': // 4 положение
delay(500);
digitalWrite(11, HIGH);
delay(500);
digitalWrite(8, HIGH);
delay(500);
digitalWrite(7, HIGH);
break;
case 'e': // 5 положение
delay(500);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(7, HIGH);
break;
case 'f': // 6 положение
delay(500);
digitalWrite(11, HIGH);
delay(500);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(7, HIGH);
break;
case 'g': // 7 положение
delay(500);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(9, HIGH);
delay(500);
digitalWrite(6, HIGH);
break;
case 'h': // 8 положение
delay(500);
digitalWrite(11, HIGH);
delay(500);
digitalWrite(9, HIGH);
delay(500);
digitalWrite(6, HIGH);
break;
default:
// выключаем все светодиоды:
for (int outPin = 6; outPin < 13; outPin++) {
digitalWrite(outPin, LOW);
}
}
}
}
Код передатчика Вы не привели, поэтому по нему сказать нечего, а вот в приемнике, есть подозрение, что строки 18, 26, 34, 42, 50, 58, 66 и 74 являются лишними.
Но наверняка этого сказать нельзя, т.к. Вы не написали, что именно должны делать Ваши программы.
Передатчик определяет в каком положении находится 8-ми позиционный переключатель и отправляет в Serial. Приемник по команде выполняет включение светодиодов в определенной последовательности.
if (digitalRead (2) == HIGH) { Serial.print('x'); Serial.print('a'); } if (digitalRead (3) == HIGH) { Serial.print('x'); Serial.print('b'); } // и т.д.где:
х - для сброса светодиодов
a, b - включение определенной последовательности светодиодов
Проблема в том что передатчик непрерывно шлет в Serial, например, xa или xb. А нужно чтобы он это делал однократно.
Ну так введите переменную, в которой хранится последний посланный сигнал, и если состояние не меняется, ничего в порт не посылайте.
Можете мне код набросать на примере поста №2? Я в этом деле новичек, совсем недавно взялся за Ардуино.))
1. Определяете конфигурацию состояния входных пинов. В принципе достаточно одной 8-битной переменной, но если не владеете битовыми операциями, можно использовать массив из 8 булевых переменных.
2. Сравниваете новое состояние со старым, хранящемся в глобальной или статической переменной.
3. Если не равны, посылаем в последовательный порт нужные команды и обновляем значение статической переменной.
Спасибо большое! Вроде получилось...
int var = 0; int oldvar = 0; void setup() { Serial.begin(9600); pinMode(5, INPUT); pinMode(6, INPUT); pinMode(7, INPUT); pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); } void loop() { if (digitalRead (2) == HIGH) { var = 1; if (var != oldvar) { Serial.print('x'); Serial.println("a"); } } if (digitalRead (3) == HIGH) { var = 2; if (var != oldvar) { Serial.print('x'); Serial.println("b"); } } oldvar = var; delay(100); }Я, правда, еще на приемнике не проверял, но в Serial все красиво.