Вот пример с кнопкой, работает с кодом для Arduino выложеным в первом примере.
Вот пример с кнопкой, работает с кодом для Arduino выложеным в первом примере.
Последний раз редактировалось Chip; 26.01.2010 в 22:29.
2 Chip
Мысль понятна - респект! Я, не дожидаючись, слабал целых пять кнопок (не таких красивых, но с примерным функционалом: курсор на кнопке - меняем цвет ее или фона, т.е. чего-то, да делаем).
В твоем примере в порт шлется одна единица (т.е. вообще говоря - в никуда).PHP код:
* Buttons.
*
* Click on one of the shapes to change
* the background color. This example
* demonstates a class for buttons.
*/
color currentcolor;
RectButton rect1, rect2, rect3, rect4, rect5;
boolean locked = false;
void setup()
{
size(800, 600);
smooth();
color baseColor = color(255, 255, 2552);
currentcolor = baseColor;
color buttoncolor = color(255);
color highlight = color(255, 0,0);
// Define and create rectangle button
buttoncolor = color(255, 0,0);
highlight = color(0, 0, 255);
rect1 = new RectButton(585, 387, 140, 86, buttoncolor, highlight);
// Define and create rectangle button
buttoncolor = color(0, 0, 255);
highlight = color(0);
rect2 = new RectButton(439, 387, 140, 86, buttoncolor, highlight);
// Define and create rectangle button
buttoncolor = color(102);
highlight = color(51);
rect3 = new RectButton(289, 387, 140, 86, buttoncolor, highlight);
// Define and create rectangle button
buttoncolor = color(102);
highlight = color(51);
rect4 = new RectButton(146, 387, 140, 86, buttoncolor, highlight);
// Define and create rectangle button
buttoncolor = color(102);
highlight = color(51);
rect5 = new RectButton(4, 387, 140, 86, buttoncolor, highlight);
}
void draw()
{
background(currentcolor);
stroke(255);
update(mouseX, mouseY);
rect1.display();
rect2.display();
rect3.display();
rect4.display();
rect5.display();
}
void update(int x, int y)
{
if(locked == false) {
rect1.update();
rect2.update();
rect3.update();
rect4.update();
rect5.update();
}
else {
locked = false;
}
if(mousePressed) {
if(rect1.pressed()) {
currentcolor = rect1.basecolor;
}
else if(rect2.pressed()) {
currentcolor = rect2.basecolor;
}
else if(rect3.pressed()) {
currentcolor = rect2.basecolor;
}
else if(rect4.pressed()) {
currentcolor = rect2.basecolor;
}
else if(rect5.pressed()) {
currentcolor = rect2.basecolor;
}
}
}
class Button
{
int x, y;
int w, h;
color basecolor, highlightcolor;
color currentcolor;
boolean over = false;
boolean pressed = false;
void update()
{
if(over()) {
currentcolor = highlightcolor;
}
else {
currentcolor = basecolor;
}
}
boolean pressed()
{
if(over) {
locked = true;
return true;
}
else {
locked = false;
return false;
}
}
boolean over()
{
return true;
}
boolean overRect(int x, int y, int width, int height)
{
if (mouseX >= x && mouseX <= x+width &&
mouseY >= y && mouseY <= y+height) {
return true;
}
else {
return false;
}
}
}
class RectButton extends Button
{
RectButton(int ix, int iy, int iw, int ih, color icolor, color ihighlight)
{
x = ix;
y = iy;
w = iw;
h = ih;
basecolor = icolor;
highlightcolor = ihighlight;
currentcolor = basecolor;
}
boolean over()
{
if( overRect(x, y, w, h) ) {
over = true;
return true;
}
else {
over = false;
return false;
}
}
void display()
{
stroke(255);
fill(currentcolor);
rect(x, y, w, h);
}
}
А если стоит задача послать пакет байтов (те самые FF 16 01) - т.е. 16 устройств а-ля реле (вкл/выкл)?
P.S. А вообще, суть проекта здесь
Последний раз редактировалось Pinin; 26.01.2010 в 20:46.
Извиняюсь пример выложил с ошибкой , не отражалось нажатие кнопки.
Перезалил http://www.compcar.ru/forum/showpost...7&postcount=11
При желании можно любое количество кнопок сделать на базе этого примера.
Последний раз редактировалось CarMonitor.ru; 27.01.2010 в 01:56.
"Перечитывал пейджер. Много думал..."
Ладно, спасибо! Попробую дотумкать сам
Держи код для двух кнопок, на его базе добавить еще несколько кнопок не составит труда. Изображения кнопок должны лежать в папке со скетчем
PHP код:
import processing.serial.*;
Serial port;
int x,y,x1,y1,w,h;
boolean stat0,stat1;
PImage bs,dw;
void setup()
{
port = new Serial(this, "COM7", 115200); // Прописываем COM-порт на котором у вас сидит Carduino
size(290, 200); //размер окна
background(60, 80, 90); //цвет окна
bs = loadImage("base.png"); //загрузить изображение кнопки
dw = loadImage("down.png"); //загрузить изображение нажатой кнопки
w = bs.width; // Размер кнопки по горизонтали
h = bs.height; // Размер кнопки по вертикали
x = 20; // Х начальная координата кнопки
y = 20; // y начальная координата кнопки
x1= x;
y1= h+40;
image(bs, x, y); // Нарисовать в окне первую кнопку
image(bs, x1, y1); // Нарисовать в окне вторую кнопку
port.write('1');
port.write('0');
}
void draw()
{
if( mousePressed)
{
if ( mouseX >= x && mouseX <= x + w && mouseY >= y && mouseY <= y + h) //отслеживаем область курсора
{
stat0=!stat0;
if (stat0) {port.write('1'); image(dw, x+1, y+1); } // послать =1 в Carduino нарисовать нажатую кноку
if (!stat0) {port.write('0'); image(bs, x, y);} // послать =0 в Carduino нарисовать кноку
}
if (mouseX >= x1 && mouseX <= x1 + w && mouseY >= y1 && mouseY <= y1 + h) //отслеживаем область курсора
{
stat1=!stat1;
if (stat1) {port.write('3'); image(dw, x1+1, y1+1); } // послать =1 в Carduino нарисовать нажатую кноку
if (!stat1) {port.write('2'); image(bs, x1, y1);} // послать =0 в Carduino нарисовать кноку
}
delay(200);
}
}
Последний раз редактировалось Chip; 27.01.2010 в 14:05.
Спасибо! Я тут на досуге уже кое-чего слабал сам, но это вспоможение большое
Я так понимаю, что запись port.write('3'); допустима и означает, что в ардуине надо для этого прописать:
?if (val == '3') digitalWrite...
Все верно
Набросал черновик на 5 кнопок (задействованы пока только 2):
На ардуине залито:PHP код:
import processing.serial.*;
Serial port;
int x,y,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,w,h;
boolean stat0,stat1;
PImage bs,dw;
void setup()
{
port = new Serial(this, "COM5", 115200); // Прописываем COM-порт на котором у вас сидит Carduino
size(800, 500); //размер окна
background(60, 80, 90); //цвет окна
bs = loadImage("base.png"); //загрузить изображение кнопки
dw = loadImage("down.png"); //загрузить изображение нажатой кнопки
w = bs.width; // Размер кнопки по горизонтали
h = bs.height; // Размер кнопки по вертикали
x = 20; // Х начальная координата кнопки
y = 450; // y начальная координата кнопки
x1= w+30;
y1= 450;
x2= x1+w+10;
y2= 450;
x3= x2+w+10;
y3= 450;
x4= 20;
y4= 400;
x5= w+30;
y5= 400;
image(bs, x, y); // Нарисовать в окне 1 кнопку
image(bs, x1, y1); // Нарисовать в окне 2 кнопку
image(bs, x2, y2); // Нарисовать в окне 3 кнопку
image(bs, x3, y3); // Нарисовать в окне 3 кнопку
image(bs, x4, y4); // Нарисовать в окне 4 кнопку
image(bs, x5, y5); // Нарисовать в окне 5 кнопку
}
void draw()
{
if( mousePressed)
{
if ( mouseX >= x && mouseX <= x + w && mouseY >= y && mouseY <= y + h)
{
stat0=!stat0;
if (stat0) {port.write('1'); image(dw, x+1, y+1); } // послать =1 в Carduino нарисовать нажатую кноку
if (!stat0) {port.write('0'); image(bs, x, y);} // послать =0 в Carduino нарисовать кноку
}
if (mouseX >= x1 && mouseX <= x1 + w && mouseY >= y1 && mouseY <= y1 + h)
{
stat1=!stat1;
if (stat1) {port.write('3'); image(dw, x1+1, y1+1); } // послать =3 в Carduino нарисовать нажатую кноку
if (!stat1) {port.write('2'); image(bs, x1, y1);} // послать =2 в Carduino нарисовать кноку
}
delay(200);
}
}
Два непонятных косяка:PHP код:
int outputPin1 = 9; //здесь храним номер контакта
int outputPin2 = 11;
int val; //здесь будет храниться принятый символ
void setup()
{
Serial.begin(115200); //установка порта
pinMode(outputPin1, OUTPUT); //устанавливаем 13 контакт в режим вывода
pinMode(outputPin2, OUTPUT);
}
void loop()
{
if (Serial.available() > 2) //если есть принятый символ,
{
val = Serial.read(); // то читаем его и сохраняем в val
if (val == '1') digitalWrite(outputPin1, HIGH);// если=1 то включаем светодиод
if (val == '0') digitalWrite(outputPin1, LOW); // если=0 то выключаем светодиод
if (val == '3') digitalWrite(outputPin2, HIGH);// если=1 то включаем светодиод
if (val == '2') digitalWrite(outputPin2, LOW); // если=0 то выключаем светодиод
При первом запуске проекта в процессинге на первое нажатие виртуальной кнопки - реакции никакой. Реагирует только на последующие. Причем тоже странно: команда посылается на один светодиод - загорается второй. Если после нескольких последовательных включений/выключений одного светодиода нажать на кнопку включения второго - сначала загорается предыдущий (не от своей кнопки!), и только потом - управляемый.
Вроде бы по листингу таких смещений быть не должно - но их есть...
Второй косяк - при экспорте папка application.windows с экзешником создается, но тот не запускается:
"Не удается найти javaw.exe"...
И почему-то не прошла запись команды в виде
- хотя так было бы логичнееPHP код:
if (stat1) {port.write('0101'); ...
__________________________________________________ ____________
БЛИН, какой же я тупой! -
- первый вопрос снимается...PHP код:
if (Serial.available() > 2)
Последний раз редактировалось Pinin; 27.01.2010 в 15:42.
только хотел сказать про строчку if (Serial.available() > 2) , но уже и сам разобрался,
пиши отдельно каджую цифруPHP код:
if (stat1) {port.write('0101'); ...
либо попробуй такPHP код:
if (stat1) {port.write('0');if (stat1) {port.write('0');port.write('1');port.write('0');port.write('1'); ...
PHP код:
if (stat1) {port.write(0101);
Последний раз редактировалось AlexNS; 27.01.2010 в 17:21.
Еще есть алфавил , так что можно использовать символы "A","В","С" и т.д.if (stat1) {port.write('0101'); ...
Нужно использовать export applicationВторой косяк - при экспорте папка application.windows с экзешником создается, но тот не запускается:
"Не удается найти javaw.exe"...
У меня создает экзешник
Не нужно было две строчки в setup удалять или ты думал я их туда просто так вставил?При первом запуске проекта в процессинге на первое нажатие виртуальной кнопки - реакции никакой. Реагирует только на последующие.
Последний раз редактировалось Chip; 27.01.2010 в 18:46.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)