Одна из возможных причин этой проблемы может быть связана с тем, как вы передаете данные между Processing и Arduino. В коде Processing вы используете функцию serial.write() для отправки данных на Arduino. Однако в коде Arduino вы используете функцию Serial.readBytesUntil() для чтения данных из порта последовательного соединения. Эти две функции могут не работать должным образом вместе, потому что serial.write() отправляет данные как байты, а Serial.readBytesUntil() ожидает получить данные в виде символов.
Чтобы исправить эту проблему, вы можете попробовать использовать функцию
Serial.read () в коде Arduino для чтения данных из порта последовательного соединения по одному байту за раз. Затем вы можете использовать эти данные для управления реле.
Код процессинг:
int speed = 115200;
import processing.serial.*;
Serial serial;
import controlP5.*;
ControlP5 cp5;
String portName;
int potVal;
int fillVal = 0;
Chart myChart;
int x = 250, y = 100;
void setup() {
size(500, 250);
cp5 = new ControlP5(this);
cp5.setFont(createFont("calibri", 16));
// кнопки
cp5.addButton("open").setPosition(90, 10).setSize(80, 30);
cp5.addButton("close").setPosition(170, 10).setSize(80, 30).linebreak();
// тогглы
cp5.addToggle("neck").setMode(ControlP5.SWITCH);
cp5.addToggle("mouth").setMode(ControlP5.SWITCH);
// выпадающий список
cp5.addScrollableList("com")
.setPosition(10, 10)
.setSize(80, 100)
.setBarHeight(30)
.setItemHeight(30)
.close()
.addItems(Serial.list()); // добавляем список портов
;
}
void com(int n) {
portName = Serial.list()[n];
}
void open() {
serial = new Serial(this, portName, speed);
}
void close() {
serial.stop();
}
void neck(int val) {
if (val == 1) {
serial.write("3,+" + val + ";");
} else {
serial.write("3,-" + val + ";");
}
}
void mouth(int val) {
if (val == 1) {
serial.write("4,+" + val + ";");
} else {
serial.write("4,-" + val + ";");
}
}
void draw() {
background(120);
fill(fillVal);
if (serial != null) {
if (serial.available() > 0) {
String str = serial.readStringUntil('\n');
str = str.trim();
String data[] = str.split(",");
switch (int(data[0])) {
case 0:
fillVal = int(data[1]) * 255;
break;
}
}
}
}
Код ардуино:
#define RELAY1 6
#define RELAY2 5
bool flag = 0;
void setup() {
Serial.begin(115200);
pinMode(RELAY1, 1);
pinMode(RELAY2, 1);
}
void loop() {
if (Serial.available()) {
char buf[50];
int num = Serial.readBytesUntil(';', buf, 50);
buf[num] = NULL;
int ints[10];
switch (ints[0]) {
case 0:
digitalWrite(RELAY1, ints[1]);
break;
case 1:
digitalWrite(RELAY2, ints[1]);
break;
}
}
}
static uint32_t tmr = 0;