Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Требуется помощь в поиске ошибки кода processing + arduino

Артём Портофей Ученик (122), на голосовании 1 год назад
Я переделал код гайвера под себя, но после этого возникли проблемы, в пользовательском интерфейсе есть свитчи, при нажатии на них реле включается, но если нажать ещё раз - положение свитча меняется а реле не выключается, так с обоими свитками, что делать? (Как мне подсказали, проблема в том, что процессинг не даёт информацию ардуине)

Код процессинг:

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;
Голосование за лучший ответ
Sergio 2.1 Оракул (67303) 1 год назад
Одна из возможных причин этой проблемы может быть связана с тем, как вы передаете данные между Processing и Arduino. В коде Processing вы используете функцию serial.write() для отправки данных на Arduino. Однако в коде Arduino вы используете функцию Serial.readBytesUntil() для чтения данных из порта последовательного соединения. Эти две функции могут не работать должным образом вместе, потому что serial.write() отправляет данные как байты, а Serial.readBytesUntil() ожидает получить данные в виде символов.

Чтобы исправить эту проблему, вы можете попробовать использовать функцию Serial.read () в коде Arduino для чтения данных из порта последовательного соединения по одному байту за раз. Затем вы можете использовать эти данные для управления реле.
Артём ПортофейУченик (122) 1 год назад
Я заменил, теперь там int num = Serial.read (); но ничего не работает
Sergio 2.1 Оракул (67303) Артём Портофей, Замена на Serial.read () - это хорошее начало, но вам также необходимо изменить код, чтобы правильно обрабатывать данные, полученные из порта последовательного соединения. Вот пример того, как вы можете изменить код: https://pastebin.com/BJa9HTXp
Артём ПортофейУченик (122) 1 год назад
Всё, я понял, спасибо за пример)
Артём Портофей, это бот)
Александр Искусственный Интеллект (301635) 1 год назад
какое отношение к джаве?
типа где шёл, там и присел?
Артём ПортофейУченик (122) 1 год назад
Разве processing не на джаве? Тогда извиняюсь
Похожие вопросы