Передача данных по Serial

john.43
Offline
Зарегистрирован: 12.02.2017

Добрый день!

Суть вопроса в передаче данных с одной платы ардуино (передатчик) к которой подключен 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);
        }
    }
  }
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Код передатчика Вы не привели, поэтому по нему сказать нечего, а вот в приемнике, есть подозрение, что строки 18, 26, 34, 42, 50, 58, 66 и 74 являются лишними.

Но наверняка этого сказать нельзя, т.к. Вы не написали, что именно должны делать Ваши программы.

john.43
Offline
Зарегистрирован: 12.02.2017

Передатчик определяет в каком положении находится 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. А нужно чтобы он это делал однократно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну так введите переменную, в которой хранится последний посланный сигнал, и если состояние не меняется, ничего в порт не посылайте.

john.43
Offline
Зарегистрирован: 12.02.2017

Можете мне код набросать на примере поста №2? Я в этом деле новичек, совсем недавно взялся за Ардуино.))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Определяете конфигурацию состояния входных пинов. В принципе достаточно одной 8-битной переменной, но если не владеете битовыми операциями, можно использовать массив из 8 булевых переменных.

2. Сравниваете новое состояние со старым, хранящемся в глобальной или статической переменной.

3. Если не равны, посылаем в последовательный порт нужные команды и обновляем значение статической переменной.

john.43
Offline
Зарегистрирован: 12.02.2017

Спасибо большое! Вроде получилось...

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 все красиво.