Hej alle
seit kurzem habe ich Profilab Exp. und bin dabei die Daten von einen 8x8 pixel Thermosensor von Panasonic Grideye http://pewa.panasonic.com/components/bu ... /grid-eye/
graphisch darzustellen
Dazu habe ich den sensor über einen Arduino angebunden und den entsprechenden arduino code (siehe unten) aufgeladen.
Im serial window der Arduino IDE kann ich Daten für alle 64 pixel auslesen.
In Profilab habe ich das Arduino Beispiel aus dem Beispielfolder benutzt und vereinfacht.
Wenn ich die Daten daüber einlese bekome ich nicht alle Daten mit.
Wenn ich es im Arduino code simuliere (loop über 64 Datenpunkte) dann bekome ich ab:
00;23.00;24.00;25.00;26.00;27.00;28.00;29.00;30.00;31.00;......64.00;E;
Wenn ich die Anzahl der zu lesenden positionen mit in der Simulierung auf 40 begrenze bekomme ich alle:
0.00;1.00;2.00;3.00;4.00;5.00;6.00;7.00;8.00;9.00;10.00;11.00;12.00;13.00;14.00;15.00;16.00;17.00;18.00;19.00;20.00;21.00;22.00;23.00;24.00;25.00;26.00;27.00;28.00;29.00;30.00;31.00;32.00;33.00;34.00;35.00;36.00;37.00;38.00;39.00;E;
Gibt es eine Begrenzung der Stringlänge in der Com Übrtragung?
Gruss und Danke, Gernot
#include <Wire.h>
#define HEIGHT 8
#define WIDTH 8
byte pixelTempL;
byte pixelTempH;
int ledNum = 1;
char addr = 0x68;
int celsius;
float deccel;
byte array[HEIGHT*WIDTH];
void readFrame(byte *arr)
{
byte *pos;
byte *uBound;
pos = arr;
uBound = arr + (HEIGHT*WIDTH);
//First two data registers for the pixel temp data are 0x80 and 0x81
pixelTempL=0x80;
pixelTempH=0x81;
//Get Temperature Data for each pixel in the HEIGHT x WIDTH array. Will loop 64 times for Grid-eye
for(int pixel = 0; pixel < (HEIGHT*WIDTH); pixel++)
{
//Get lower level pixel temp byte
Wire.beginTransmission(addr);
Wire.write(pixelTempL);
Wire.endTransmission();
Wire.requestFrom(addr,1);
byte lowerLevel = Wire.read(); //
//Serial.println(lowerLevel);
//Get upper level pixel temp byte
Wire.beginTransmission(addr);
Wire.write(pixelTempH);
Wire.endTransmission();
Wire.requestFrom(addr,1);
byte upperLevel = Wire.read();
//Serial.println(upperLevel);
//Combine the two bytes together to complete the 12-bit temp reading
int temperature = ((upperLevel << 8) | lowerLevel);
//Temperature data is in two's compliment, do conversion.
if (upperLevel != 0)
{
temperature = -(2048 - temperature);
}
celsius = temperature*0.25;
deccel = temperature*0.25;
//Serial.print(celsius);
//Serial.print(";");
Serial.print(deccel);
Serial.print(";");
//*pos = celsius & 63;
*pos = celsius;
pos++;
//Go to next pixel by advancing both the low and high bit two register values
pixelTempL=pixelTempL+2;
pixelTempH=pixelTempH+2;
}
}
void setup()
{
Wire.begin();
Serial.begin(19200);
}
void loop()
{
int input;
float temp;
for(int pixel = 0; pixel < (40); pixel++) //gloops 64 times
{
temp = float(pixel); //generates a float value from int pixel
Serial.print(temp);
Serial.print(";");
}
Serial.println("E;"); //Used in Profilab as separator in COM receiving string
//readFrame(array);Function to read from the IR array 64 float values
delay(2000);
} //end loop
Problem mit String
Re: Problem mit String
Ja, die gibt es. Shortstring=255 Zeichen.
Nach ca. 200 Zeichen sollte man also mal 'umbrechen'.
Nach ca. 200 Zeichen sollte man also mal 'umbrechen'.
ABACOM support
Re: Problem mit String
Danke für die Infoabacom hat geschrieben:Ja, die gibt es. Shortstring=255 Zeichen.
Nach ca. 200 Zeichen sollte man also mal 'umbrechen'.
Ist es am besten den String in zwei Teilen einzulesen (Das kann ich ohne Probleme im Arduino code realisieren) und mit einer Hold funktion den ersten zu halten und dann wenn der zweite reinkommt zB 50 ms später diese mit Add funktion wieder zusammenzusetzen?
Als Alternative havbe ich auch die Buffer funktion gefunden.
Vielleicht hat jemand schon eine ähnliches Projekt realisert wo er über Zeit verschiede Strings einliest und die in einer Warteschleife hält.
gruss, Gernot
Re: Problem mit String
Hallo @alle,
Strings sind zwar einfach zu 'handhaben' aber eben auch 'ineffizient' sobald die Datenmenge grösser wird, z.B. dezinal -122 = 4 Byte 'String', aber NUR 1 Byte 'Numerisch'!
Da jeder beim ARDU sein 'eigenes' Protokoll schreiben kann, ist es zumindest die Überlegung Wert, evtl. die Werte numerisch zu übergeben ... dies kann den 'nach-behandlungs' Aufwand erheblich verringern ($Part etc.). Meine 5 Cent's ...
Strings sind zwar einfach zu 'handhaben' aber eben auch 'ineffizient' sobald die Datenmenge grösser wird, z.B. dezinal -122 = 4 Byte 'String', aber NUR 1 Byte 'Numerisch'!
Da jeder beim ARDU sein 'eigenes' Protokoll schreiben kann, ist es zumindest die Überlegung Wert, evtl. die Werte numerisch zu übergeben ... dies kann den 'nach-behandlungs' Aufwand erheblich verringern ($Part etc.). Meine 5 Cent's ...
++++++
Gruss/regards IKT
Gruss/regards IKT