Как создать массив из 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);
}
}
@Sjoerd Mol, 👍1
Обсуждение2 ответа
Лучший ответ:
Если вы можете отправить сообщение в виде 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.");
}
}
}
Спасибо @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.");
}
}
}
- Печать массива с помощью функции печати и последовательной записи в Arduino Uno
- Последовательный разбор странных данных
- массив в последовательный порт
- Как преобразовать строку в шестнадцатеричный массив
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
- Самый быстрый способ прочитать массив чисел из python
- Самый прямой способ назначить байты Serial.read() массиву?
- ЖК-дисплей с байтовым массивом
Так в чем проблема?, @jsotola
Вы уже сохранили данные в массиве источников света (если раскомментировать оператор newvalue if). Где именно вам нужна помощь? Что не работает так, как вы предполагали, и что на самом деле делает?, @chrisl