Как создать массив из serial.read?

Я работаю над аудиореактивной световой инсталляцией с 16 светодиодами. В Max MSP я анализирую звук и делю частоты на 16 «частей». Я храню эти части в сообщении из 16 целых чисел, либо 1, либо 0 (включено или выключено). Каждый раз, когда обнаруживается новая частота, сообщение обновляется и выводит новое целое из 16 чисел (например, 1000100100110101).

Я получаю этот номер в мониторе последовательного порта Arduino Uno. Я хочу поместить это «incomingValues» в массив, чтобы я мог проверить, является ли число/частота 0 или 1. Когда это 1, я могу включить свое реле/свет. 'incomingValues' меняется довольно быстро, но это не должно быть проблемой, верно?

Я пробовал несколько способов создать массив и обновлять его каждый раз, когда приходит новое последовательное сообщение, но я не привык работать с Arduino, поэтому мне может понадобиться помощь.

Спасибо! :)

Вот мой код:

int counter;
int incomingValues = 0;
int lights[16];


void setup() {
  Serial.begin(9600);
  counter = 0;
  pinMode(13, OUTPUT);
}

void loop() {

  boolean newValue = false;

  while (Serial.available() > 0) {

    incomingValues = Serial.read();
    Serial.print(incomingValues);
    counter = counter + 1;

    newValue = true;
  }


  if (newValue) {
// delay(50);
// загорается[счетчик] = incomingValues;
//
//
// Serial.print(lights[0]);
//
// for (int i = 0; i < 16; i ++) {
// Serial.print(lights[i]);
// }
// Serial.println("");
// новое значение = ложь;
  }

  if (counter > 15) {
    counter = 0;
    Serial.print("\n");
  }

  if (incomingValues == 1) {
    digitalWrite(13, HIGH);
  } else if (incomingValues == 0) {
    digitalWrite(13, LOW);
  }
}

, 👍1

Обсуждение

Так в чем проблема?, @jsotola

Вы уже сохранили данные в массиве источников света (если раскомментировать оператор newvalue if). Где именно вам нужна помощь? Что не работает так, как вы предполагали, и что на самом деле делает?, @chrisl


2 ответа


Лучший ответ:

0

Если вы можете отправить сообщение в виде 16 символов, за которыми следует новая строка, то вот тестовый скетч, который может вам подойти. Используйте Serial Monitor для отправки данных 1000100100110101. Убедитесь, что в Serial Monitor настроена отправка Только новой строки.

// Допустимые входные данные из серийного номера — 16 символов, за которыми следует новая строка.
// 1000100100110101
const byte bufferSize = 17;
char inputBuffer[bufferSize + 1];

void setup(){
  Serial.begin(9600);
}

void loop(){

  if(Serial.available() > 0){
    byte bytesRead = Serial.readBytesUntil('\n', inputBuffer, bufferSize);
    if(bytesRead == 16){
      for(byte i = 0; i < 16; i++){
        if(inputBuffer[i] == '1'){
          Serial.print("on ");
        }
        else{
          Serial.print("off ");
        }
      }
      Serial.println();
    }
    else{
      Serial.println("Invalid data length.");
    }
  }
}
,

0

Спасибо @VE7JRO, это работает :)

const byte bufferSize = 16;
char inputBuffer[bufferSize + 1];
int myDelay = 20;

void setup(){
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);

}

void loop(){

  if(Serial.available() > 0){
    byte bytesRead = Serial.readBytesUntil('\n', inputBuffer, bufferSize);
    if(bytesRead == 16){
      for(byte i = 0; i < 16; i++){
        if(inputBuffer[0] == 1){
          digitalWrite(13, HIGH);
          delay(myDelay);
        }
        else{
          digitalWrite(13, LOW);
        }
        if(inputBuffer[1] == 1){
          digitalWrite(12, HIGH);
          delay(myDelay);
        }
        else{
          digitalWrite(12, LOW);
        }
      }
      Serial.println();
    }
    else{
      Serial.println("Invalid data length.");
    }
  }
}
,