Prosessing "line"

Odpovědět
Mildes
Příspěvky: 5
Registrován: 24 kvě 2020, 15:47

Prosessing "line"

Příspěvek od Mildes » 24 kvě 2020, 16:20

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;
Voltmetr.JPG
Voltmetr.JPG (17.28 KiB) Zobrazeno 7285 x

Uživatelský avatar
SkullKeep
Příspěvky: 297
Registrován: 23 srp 2017, 18:51
Bydliště: Brno
Kontaktovat uživatele:

Re: Prosessing "line"

Příspěvek od SkullKeep » 25 kvě 2020, 08:16

To by chtělo jsem dát célý upravený program. Jenom ze dvou řádků se nedá určit problém.
:twisted: :?: :arrow: :geek: P. Q. M.

Mildes
Příspěvky: 5
Registrován: 24 kvě 2020, 15:47

Re: Prosessing "line"

Příspěvek od Mildes » 25 kvě 2020, 15:22

Tady je celý můj program - prakticky opsáno
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);
}
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

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);
    }  
}  

Uživatelský avatar
SkullKeep
Příspěvky: 297
Registrován: 23 srp 2017, 18:51
Bydliště: Brno
Kontaktovat uživatele:

Re: Prosessing "line"

Příspěvek od SkullKeep » 25 kvě 2020, 18:49

Trochu jsem upravil kód pro processing už nedělá duchy:

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);
  }
}
A nezapomeň změnit COM port určitě není arduino na portu COM3!!!! na tvém PC.
:twisted: :?: :arrow: :geek: P. Q. M.

Mildes
Příspěvky: 5
Registrován: 24 kvě 2020, 15:47

Re: Prosessing "line"

Příspěvek od Mildes » 26 kvě 2020, 14:07

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].

Uživatelský avatar
SkullKeep
Příspěvky: 297
Registrován: 23 srp 2017, 18:51
Bydliště: Brno
Kontaktovat uživatele:

Re: Prosessing "line"

Příspěvek od SkullKeep » 26 kvě 2020, 16:01

Mildes píše:
26 kvě 2020, 14:07
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.
To je snad jediná nevýhoda Processingu ,kterou jsem ještě taky nepochopil.
:twisted: :?: :arrow: :geek: P. Q. M.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 0 hostů