Prosessing "line"
Prosessing "line"
Podle https://www.root.cz/clanky/arduino-meri ... -veliciny/ jsem chtěl nakreslit v Processing ručkový voltmetr. Zkopíroval jsem zdroj a spustil. Nakreslila se stupnice, ale ručka se nenakreslila. Program jsem krokoval, všechny hodnoty byly správné, jen příkaz "line" pro nakreslení ručky se neprovedl.
Tak jsem zkusil přesunout zpracování naměřené hodnoty do void draw(), v SerialEvent zůstalo pouze přečtení hodnoty.
Program začal fungovat, ale s jedním problémem. Při kreslení nové hodnoty se má stará ručka smazat a nekreslit nová, jenže stará ručka zústáva a jenom změní barvu na šedou, nová ručka se nakreslí černě. V čem mohou být problémy?
stroke(255);
line(width/2, height, lastx,lasty);
stroke(0);
line(width/2, height, x,y);
lastx = x;
lasty = y;
Tak jsem zkusil přesunout zpracování naměřené hodnoty do void draw(), v SerialEvent zůstalo pouze přečtení hodnoty.
Program začal fungovat, ale s jedním problémem. Při kreslení nové hodnoty se má stará ručka smazat a nekreslit nová, jenže stará ručka zústáva a jenom změní barvu na šedou, nová ručka se nakreslí černě. V čem mohou být problémy?
stroke(255);
line(width/2, height, lastx,lasty);
stroke(0);
line(width/2, height, x,y);
lastx = x;
lasty = y;
Re: Prosessing "line"
To by chtělo jsem dát célý upravený program. Jenom ze dvou řádků se nedá určit problém.
P. Q. M.
Re: Prosessing "line"
Tady je celý můj program - prakticky opsáno
Arduino skeč - jednoduché odečítání potenciometru
Processing skeč - v původním programu bylo kreslení ručičky na konci serialEvent a draw() bylo prázdné - ručička se nekreslila
Arduino skeč - jednoduché odečítání potenciometru
Kód: Vybrat vše
void setup() {
Serial.begin(38400);
}
void loop() {
// Přečteme vstup 0
int hodnota = analogRead(0);
// a výsledek pošleme na sériový port jako číslo
Serial.println(hodnota);
// počkáme, aby se převodník mohl ustálit, a pak celý postup zopakujeme
delay(1000);
}
Kód: Vybrat vše
import processing.serial.*;
//Odsud čteme data
Serial myPort;
float inByte;
void setup () {
size(200, 101);
println(Serial.list());
// používám třetí sériový port Serial.list()[2].
myPort = new Serial(this, Serial.list()[2], 38400);
// Počkáme si na znak nového řádku:
myPort.bufferUntil('\n');
lastx = width/2;
lasty = height;
arc(width/2, height, width, width, PI, 2*PI);
for (int v = 1; v < 5; v++) {
stupnice( v * ( PI / 5 ) );
}
}
//Pomocné proměnné pro malování ručičky měřidla
int lastx, lasty;
void hand(float ang) {
int x = floor(cos(ang+PI) * (width/2.2) + width/2);
int y = height - floor(sin(ang) * (height/1.1));
stroke(255);
line(width/2, height, lastx,lasty);
stroke(0);
line(width/2, height, x,y);
lastx = x;
lasty = y;
}
void stupnice(float ang) {
int x1 = floor(cos(ang+PI) * (width/2.2) + width/2);
int y1 = height - floor(sin(ang) * (height/1.05));
int x2 = floor(cos(ang+PI) * (width/2) + width/2);
int y2 = height - floor(sin(ang) * (height));
stroke(10);
line(x1, y1, x2, y2);
}
void draw() {
println(inByte);
//namalujeme ručičku měřidla
hand (inByte);
}
void serialEvent(Serial myPort) {
String inString = myPort.readStringUntil('\n');
if (inString != null) {
// odsekneme znak konce řádku
inString = trim(inString);
// převedeme na číslo
inByte = float(inString);
//mapujeme získané číslo v rozsahu 0-1023 na rozsah 0-PI
inByte = map(inByte, 0, 1023, 0, PI);
}
}
Re: Prosessing "line"
Trochu jsem upravil kód pro processing už nedělá duchy:
A nezapomeň změnit COM port určitě není arduino na portu COM3!!!! na tvém PC.
Kód: Vybrat vše
import processing.serial.*;
//Odsud čteme data
Serial myPort;
float inByte;
//Pomocné proměnné pro malování ručičky měřidla
int lastx, lasty;
float kam=0;
void setup () {
size(200, 101);
background(222);
println(Serial.list());
// používám třetí sériový port Serial.list()[2].
myPort = new Serial(this, Serial.list()[3], 38400);
// Počkáme si na znak nového řádku:
myPort.bufferUntil('\n');
lastx = width/2;
lasty = height;
stupnice();
}
void hand(float ang) {
int x = floor(cos(ang+PI) * (width/2.2) + width/2);
int y = height - floor(sin(ang) * (height/1.1));
stroke(255, 255);
line(width/2, height, lastx, lasty);
stupnice(); //znovu vykresli stupnici
stroke(0);
line(width/2, height, x, y);
lastx = x;
lasty = y;
}
void stupnice() {
float ang;
stroke(10);
arc(width/2, height, width, width, PI, 2*PI);
for (int v = 1; v < 5; v++) {
ang =( v * ( PI / 5 ) );
int x1 = floor(cos(ang+PI) * (width/2.2) + width/2);
int y1 = height - floor(sin(ang) * (height/1.05));
int x2 = floor(cos(ang+PI) * (width/2) + width/2);
int y2 = height - floor(sin(ang) * (height));
line(x1, y1, x2, y2);
}
}
void draw() {
//namalujeme ručičku měřidla
//hand (inByte);
}
void serialEvent(Serial myPort) {
String inString = myPort.readStringUntil('\n');
if (inString != null) {
// odsekneme znak konce řádku
inString = trim(inString);
// převedeme na číslo
inByte = float(inString);
//mapujeme získané číslo v rozsahu 0-1023 na rozsah 0-PI
inByte = map(inByte, 0, 1023, 0, PI);
}
}
P. Q. M.
Re: Prosessing "line"
Děkuji,skutečně to takto funguje, ale rád bych znal vysvětlení, proč se to musí celé vždy znovu překreslit a proč to nefunguje, když je hand(inByte) umístěno přímo v serialEvent.
K použitému portu: nepoužívám COM3, ale COM12, což je u mne třetí položka v poli Serial.list(), začínajícím od 0, tedy Serial.list()[2].
K použitému portu: nepoužívám COM3, ale COM12, což je u mne třetí položka v poli Serial.list(), začínajícím od 0, tedy Serial.list()[2].
Re: Prosessing "line"
To je snad jediná nevýhoda Processingu ,kterou jsem ještě taky nepochopil.
P. Q. M.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 0 hostů