Stránka 1 z 1

Processing - graf

Napsal: 13 úno 2015, 18:38
od arduino2015
Ahoj, potřeboval bych nějaké nápady, jak udělat sloupcový graf, co se bude měnit podle informací zaslaných z Arduina po sériovém portu.
Má s tímto někdo nějaké zkušenosti?

Napsal: 13 úno 2015, 18:46
od termit256

Napsal: 13 úno 2015, 19:13
od arduino2015
Ten Processing je ale VIZUALIZAČNÍ software, takže mi jde o to naprogramovat skript, co mi umožní na svém monitoru vidět měnící se graf.

Napsal: 13 úno 2015, 19:47
od Honza_dy
http://www.root.cz/clanky/arduino-merim ... text-title
a pokračuj v původním vlákně, jinak dostaneš od admina přes porty.

Napsal: 13 úno 2015, 20:14
od arduino2015
To bylo téma o Arduinu, teď řeším Processing.

Napsal: 15 úno 2015, 14:36
od arduino2015
Zdravím, mám tuto aplikaci pro processing:

import processing.serial.*;
String temperature = "";
PImage pozadi;
PFont font;
Serial port;
void setup() {
pozadi = loadImage("pozadi.jpg");
size(1024, 768, P2D);
rect(30, 20, 55, 55, 7);
font = loadFont("Algerian-30.vlw");
port = new Serial(this, "COM4", 9600);
fill(0);
smooth();
}

void draw () {
image(pozadi, 0, 0, width, height);
int q = second();
int w = hour();
int e = minute();
int r = day();
int t = month();
int z = year();
text(":" , 78, 50);
text(":" , 115, 50);
text("." , 78, 80);
text("." , 115, 80);
fill(249, 250, 56);
if (port.available()>0) {
delay(100);
temperature = port.readString();

if(temperature.length() > 0)
{
int div_n = temperature.indexOf( '|' );
if( div_n > 0 )
{

float temp1 = float( temperature.substring( 0, div_n ));
float temp2 = float( temperature.substring( div_n+1 ));

text(temp1 +""+ temp2, width/3, height/3);

String
s = String.valueOf(w);
text(s, 47, 50);
textFont(font, 25);
s = String.valueOf(e);
text(s, 85, 50);
s = String.valueOf(q);
text(s, 120, 50);
s = String.valueOf(r);
text(s, 47, 80);
s = String.valueOf(t);
text(s, 85, 80);
s = String.valueOf(z);
text(s, 122, 80);
}}}
}

A pro Arduino:

int sensorPin1 = 0; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.
int sensorPin2 = 1; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.

//funkce uvedené zde se načtou po spuštění arduina a platí po celou dobu běhu programu.

void setup()
{
Serial.begin(9600); //nabindování sériové komunikace s počítačem.
Serial.println("Vitejte v programu na mereni teploty."); // odeslani textu po seriove lince s odradkovanim

}

void loop() // tyto funkce se cyklicky opakují
{
//čtení napěťových hodnot z teplotního senzoru
int reading1 = analogRead(sensorPin1);
int reading2 = analogRead(sensorPin2);
// převod načtených hodnot na napětí (?), for 3.3v arduino use 3.3
float voltage1 = reading1 * 3.3;
voltage1 /= 1024.0;

float voltage2 = reading2 * 3.3;
voltage2 /= 1024.0;
// zobrazení napěťových hodnot
Serial.println(voltage1+'|'+voltage2);

delay(5000); //doba zobrazení textu 5s
}


Mělo by to bejt tak, že mi arduino měří analogově teplotu, a ta se mi zobrazí na vizualizaci v Processingu. Okno processingu se zobrazí, ale žádné údaje tam nejsou.. co s tím?

Děkuji.

Napsal: 15 úno 2015, 16:58
od Honza_dy
Proč do pc posíláš

Kód: Vybrat vše

Serial.println("Vitejte v programu na mereni teploty."); // odeslani textu po seriove lince s odradkovanim
?
Asi bude potřeba vytvořit nějaký přenosový protokol...

Napsal: 15 úno 2015, 17:16
od arduino2015
Ikdyž to odstraním, tak mi to k ničemu nepomůže.

A k čemu přenosovej protokol? Když jsem měl toto:

Kód: Vybrat vše

int sensorPin1 = 0; //Definice analogového pinu, ke kterému připojím výstup snímače teploty 
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.
int sensorPin2 = 1; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.

//funkce uvedené zde se načtou po spuštění arduina a platí po celou dobu běhu programu.

void setup()
{
Serial.begin(9600); //nabindování sériové komunikace s počítačem.
Serial.println("Vitejte v programu na mereni teploty."); // odeslani textu po seriove lince s odradkovanim

}

void loop() // tyto funkce se cyklicky opakují
{
//čtení napěťových hodnot z teplotního senzoru
int reading1 = analogRead(sensorPin1);
int reading2 = analogRead(sensorPin2);
// převod načtených hodnot na napětí (?), for 3.3v arduino use 3.3
float voltage1 = reading1 * 3.3;
voltage1 /= 1024.0;

float voltage2 = reading2 * 3.3;
voltage2 /= 1024.0;
// zobrazení napěťových hodnot
Serial.print("Senzor A:"); Serial.print(voltage1); Serial.println(" V");
Serial.print("Senzor B:"); Serial.print(voltage2); Serial.println(" V");

// zobrazení teploty v °C
float temperatureC1 = (voltage1 - 0.5) * 100 ; //převod teploty (10 mv = 1 °C) s celkovám rozsahem 500mV !offset!
//to degrees ((voltage - 500mV) times 100 ?)
Serial.print("Teplota A:"); Serial.print(temperatureC1); Serial.println(" stupnu C");

float temperatureC2 = (voltage2 - 0.5) * 100 ; //převod teploty (10 mv = 1 °C) s celkovám rozsahem 500mV !offset!
//to degrees ((voltage - 500mV) times 100 ?)
Serial.print("Teplota B:"); Serial.print(temperatureC2); Serial.println(" stupnu C");


delay(5000); //doba zobrazení textu 5s
}


Kód: Vybrat vše

import processing.serial.*;
String temperature = "0";
PImage pozadi;
PFont font;
Serial port;
void setup() {
pozadi = loadImage("pozadi.jpg");
size(1024, 768, P2D);
rect(30, 20, 55, 55, 7);
font = loadFont("Algerian-30.vlw");
port = new Serial(this, "COM4", 9600);
fill(0);
smooth();
}
void draw () {
image(pozadi, 0, 0, width, height);
int q = second();
int w = hour();
int e = minute();
int r = day();
int t = month();
int z = year();
text(":" , 78, 50);
text(":" , 115, 50);
text("." , 78, 80);
text("." , 115, 80);
fill(249, 250, 56);
if (port.available()>0) {
delay(100);
temperature = port.readString();
}

text(temperature, width/3, height/3);

String
s = String.valueOf(w);
text(s, 47, 50);
textFont(font, 25);
s = String.valueOf(e);
text(s, 85, 50);
s = String.valueOf(q);
text(s, 120, 50);
s = String.valueOf(r);
text(s, 47, 80);
s = String.valueOf(t);
text(s, 85, 80);
s = String.valueOf(z);
text(s, 122, 80);
}


Tak se mi ta textová informace v okně normálně zobrazila. Nyní jsem chtěl udělat grafické řešení, jako je zde: https://boolscott.wordpress.com/2010/02 ... r-graph-2/

a výsledkem je prázdné Processing okno, kde se mi zobrazí jen soubor pozadi.jpg a žádný graf.

A už si fakt nevím rady.

Napsal: 22 úno 2015, 14:18
od arduino2015
Já už si s tím prostě nevím rady.
Mám v současné době tento program:

Kód: Vybrat vše

int sensorPin1 = 0; //Definice analogového pinu, ke kterému připojím výstup snímače teploty 
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.
int sensorPin2 = 1; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.

//funkce uvedené zde se načtou po spuštění arduina a platí po celou dobu běhu programu.

void setup()
{
Serial.begin(9600); //nabindování sériové komunikace s počítačem.
Serial.println("Vitejte v programu na mereni teploty."); // odeslani textu po seriove lince s odradkovanim

}

void loop() // tyto funkce se cyklicky opakují
{
//čtení napěťových hodnot z teplotního senzoru
int reading1 = analogRead(sensorPin1);
int reading2 = analogRead(sensorPin2);
// převod načtených hodnot na napětí (?), for 3.3v arduino use 3.3
float voltage1 = reading1 * 5.0;
voltage1 /= 1024.0;

float voltage2 = reading2 * 5.0;
voltage2 /= 1024.0;
// zobrazení napěťových hodnot
Serial.print("Senzor A:"); Serial.print(voltage1); Serial.println(" V");
Serial.print("Senzor B:"); Serial.print(voltage2); Serial.println(" V");

// zobrazení teploty v °C
float temperatureC1 = (voltage1 - 0.5) * 100 ; //převod teploty (10 mv = 1 °C) s celkovám rozsahem 500mV !offset!
//to degrees ((voltage - 500mV) times 100 ?)
Serial.print("Teplota A:"); Serial.print(temperatureC1); Serial.println(" stupnu C");

float temperatureC2 = (voltage2 - 0.5) * 100 ; //převod teploty (10 mv = 1 °C) s celkovám rozsahem 500mV !offset!
//to degrees ((voltage - 500mV) times 100 ?)
Serial.print("Teplota B:"); Serial.print(temperatureC2); Serial.println(" stupnu C");


delay(5000); //doba zobrazení textu 5s
}


A tuto vizualizaci:

Kód: Vybrat vše

import processing.serial.*;
String temperature = "0";
PImage pozadi;
PFont font;
Serial port;
void setup() {
pozadi = loadImage("pozadi.jpg");
size(1024, 768, P2D);
rect(30, 20, 55, 55, 7);
font = loadFont("Algerian-30.vlw");
port = new Serial(this, "COM4", 9600);
fill(0);
smooth();
}
void draw () {
image(pozadi, 0, 0, width, height);
int q = second();
int w = hour();
int e = minute();
int r = day();
int t = month();
int z = year();
text(":" , 78, 50);
text(":" , 115, 50);
text("." , 78, 80);
text("." , 115, 80);
fill(249, 250, 56);
if (port.available()>0) {
delay(100);
temperature = port.readString();
}

text(temperature, width/3, height/3);

String
s = String.valueOf(w);
text(s, 47, 50);
textFont(font, 25);
s = String.valueOf(e);
text(s, 85, 50);
s = String.valueOf(q);
text(s, 120, 50);
s = String.valueOf(r);
text(s, 47, 80);
s = String.valueOf(t);
text(s, 85, 80);
s = String.valueOf(z);
text(s, 122, 80);
}


Výsledek u mě vypadá takto:

http://img24.cz/images/16052531158694030888.jpg

Chtěl jsem docílit toho, abych měl, namísto textového zobrazení hodnot, graf, jako je tento:
https://boolscott.wordpress.com/2010/02 ... r-graph-2/ (nejde mi o doslovně stejný grafický řešení, ale "pouze" o tento princip: graf mění svou velikost podle měřených hodnot.)

A už nevím, proč mi o věčně nejde. Nevím, co dělám špatně, a mě už je z toho špatně.

Děkuji za radu, sám si už žádnou nedám.

Napsal: 28 úno 2015, 13:51
od arduino2015
Tak, nakonec sem čerpal inspiraci odtud (konkrétně kapitola "Graphing Serial Data in Processing"):

http://www.dustynrobots.com/nyu/seeing- ... nsed-data/

Nedostatkem je, že tastovací zapojení potenciometru (levá noha uzemněna, prostřední na A0, pravá na 5V) funguje na jedničku, zatímco ta s TM36 (+Vs - 5V, Vout na A0, GND na GND http://www.analog.com/media/en/technica ... _36_37.pdf) taky zobrazí nějakou grafickou hodnotu, ale stále stejnou.

Tak už teda nevím, zda je problém *někde*, anebo, zda jde jen o nastavení škály, že ty teplotní změny jsou pro tento graf moc malé.

Nějaké tipy?

http://www.dustynrobots.com/nyu/seeing- ... nsed-data/