Go Down

Topic: Kreis Zeichnen mit Adafruit GFX *DEUTSCH* (Read 717 times) previous topic - next topic

Kaoala

Hallo liebes Forum,

ich habe vor einiger Zeit mal mit der BASIC256 Umgebung gearbeitet.
Ein ziemlich einfaches Tool um mal ein wenig zu programmieren.
Unter anderem habe ich da folgendes Programm geschrieben:

Code: [Select]

fastgraphics
clg
loop = 0
r = 100 #Radius
f = 350 #Feinheit der Plotte
x = 130 #Koordinaten für Mittelpunkt
y = 130 #Koordinaten für Mittelpunkt

loop:

ang=loop/f*pi
xp=r*cos(ang)
yp=r*sin(ang)
plot(x+xp,y+yp)

loop = loop + 1


if loop = 1000 then
   goto ende
end if

goto loop

ende:
refresh
end


Einfach ein Programm was mir einen Kreis zeichnet

Ich weiß hat nichts mit Arduino zu tun aber ich wollte versuchen diesen Code
zu "übersetzten".
Ich habe es mal Versucht und da kam folgendes raus:

Code: [Select]

#include <Adafruit_PCD8544.h>

#include <Adafruit_GFX.h>



void setup()
{
 
int  circle = 0;
int r = 100; //Radius
int f = 350; //Feinheit der Plotte
int x = 130; //Koordinaten für X-Mittelpunkt
int y = 130; //Koordinaten für Y-Mittelpunkt
 
 
}


void loop()
{

ang = ( circle / f * 3,14 );
xp = r * cos(ang);
yp = r * sin(ang);
void drawPixel(x+xp, y+yp, BLACK);

circle = circle + 1


//fertig wenn circle = 1000 ist


Dabei tritt ein fehler bei
Code: [Select]

ang = ( circle / f * 3,14 );

auf (wird rot markiert).

Die Fehler Meldung lautet:
Code: [Select]

C:\Users\*****\Documents\Arduino\libraries\AdafruitPCD8544Nokia5110/Adafruit_PCD8544.h:52: error: expected class-name before '{' token
Circle.ino: In function 'void loop()':
Circle:23: error: 'ang' was not declared in this scope
Circle:23: error: 'circle' was not declared in this scope
Circle:23: error: 'f' was not declared in this scope
Circle:24: error: 'xp' was not declared in this scope
Circle:24: error: 'r' was not declared in this scope
Circle:25: error: 'yp' was not declared in this scope
Circle:26: error: variable or field 'drawPixel' declared void
Circle:26: error: 'x' was not declared in this scope
Circle:26: error: 'y' was not declared in this scope
Circle:28: error: expected `;' at end of input
Circle:28: error: expected `}' at end of input


Ein Fehler der mir bewusst ist, ist das "ang" erst noch definiert werden muss, aber ich weiß nicht wie

Ich arbeite noch nciht lange mit Arduino zusammen also bitte entschuldigt mich  :smiley-roll-blue:
Ich habe auch noch nichtmal einen Arduino :smiley-red: Aber ich habe mir einen bestellt und kann es
kaum erwartet ihn in meinen Händen zu halten *_* Deswegen fange ich jetzt schon mal an zu programmieren  :)
Vielen Dank wenn ihr eure Ideen dazu beitragen könnt

Mfg,
       Kaoala

Serenifly

#1
Sep 15, 2013, 04:11 pm Last Edit: Sep 15, 2013, 04:31 pm by Serenifly Reason: 1
Wenn du die Variablen in setup() deklarierst, dann sind sie auch nur in setup() gültig, bzw. für alle anderen Methoden unsichtbar. Das nennt sich Scope:
http://de.wikipedia.org/wiki/Variable_%28Programmierung%29#Sichtbarkeitsbereich_von_Variablen_.28Scope.29

Das kann man global machen (außerhalb aller Methoden am Anfang des Programms, zwischen den defines und setup). Dann sind die Variablen im ganzen Program sichtbar. Das wird für dich erst mal die beste Wahl sein. Es gibt noch anderen Varianten, aber das wird für dich dann vielleicht etwas zu verwirrend.

Für ang fehlt der Datentyp komplett. Das musst du als float deklarieren. xp und yp als int. Diese Variablen kannst du in loop() lassen, da sie für jeden Durchlauf neu berechnet werden.

Variablen die sich nicht ändern, sollte man dann noch const machen. Das ist aber nicht 100%ig nötig:
const int r = 100;

Bei "circle = circle + 1" fehlt der Strichpunkt am Ende. Und dann noch die schließende Klammer von loop()


EDIT:
Dann noch zwei Sachen

1.) ang = ( circle / f * 3,14 );

Dass muss ein Punkt und kein Komma sein

2.) void drawPixel(x+xp, y+yp, BLACK);

Wenn du eine Methode aufrufst, darfst du keinen Rückgabe-Wert (hier void) angeben. Das ist nur für die Methoden-Definition selbst. Nicht für deren Aufruf.

Kaoala

Erstmal vielen Dank für die Antwort.

Also das die Variablen die im Setup deklariert werden auch nur im Setup gültig sind ist mir neu :o
Wie schaffe ich denn das die "Global" sichtbar sind, bzw wie ist der Befehl?

Ich habe jetzt mal Versucht den Code umzubauen:

Code: [Select]

#include <Adafruit_PCD8544.h>

#include <Adafruit_GFX.h>



void setup()
{
}


void loop()
{
  float ang = 0;
  int xp = 0;
  int yp = 0;
  int  circle = 0;
  int r = 100; //Radius
  int f = 350; //Feinheit der Plotte
  int x = 130; //Koordinaten für X-Mittelpunkt
  int y = 130; //Koordinaten für Y-Mittelpunkt

  ang = ( circle / f * 3.14 );
  xp = r * cos(ang);
  yp = r * sin(ang);
  drawPixel(x+xp, y+yp, BLACK);

  circle = circle + 1;

}
//fertig wenn circle = 1000 ist


So weit in Ordnung ? also er hatte noch gemeckert das x und y und co nicht deklariert worden sind in dem scope.
Also habe ich die einfach mal noch mit In die Loop gepackt. Sind ja auch konstante.

Jetzt fing er an zu meckern bei

drawPixel(x+xp, y+yp, BLACK);

Mir ist aufgefallen das ich hätte noch "BLACK" deklarieren müssen, aber das System erkennt nichtmal
den Befehl "drawPixel"

Fehlercode:
Code: [Select]

In file included from sketch_sep16a.ino:1:
C:\Users\*****\Documents\Arduino\libraries\AdafruitPCD8544Nokia5110/Adafruit_PCD8544.h:52: error: expected class-name before '{' token
sketch_sep16a.ino: In function 'void loop()':
sketch_sep16a:26: error: 'drawPixel' was not declared in this scope


Dabei habe ich das von Adafruit "abgeguckt"  (http://learn.adafruit.com/adafruit-gfx-graphics-library/graphics-primitives)

Hast du da vielleicht noch eine Lösung ?

Mfg,
      Kaoala

Serenifly

#3
Sep 16, 2013, 06:02 pm Last Edit: Sep 16, 2013, 06:48 pm by Serenifly Reason: 1
Quote
Also das die Variablen die im Setup deklariert werden auch nur im Setup gültig sind ist mir neu

Du musst Deklaration und Initialisierung unterscheiden. Du kannst Variablen natürlich in Setup mit einem bestimmten Wert belegen. Aber die müssen dann global deklariert werden, damit sie in anderen Methoden sichtbar sind.


Wie schaffe ich denn das die "Global" sichtbar sind, bzw wie ist der Befehl?

Einfach außerhalb der Methoden deklarieren. Wie gesagt zwischen den includes/defines und setup.

Du kannst Variablen wir r, f, x und y auch in loop lassen, aber das ist irgendwie unschön, da das eigentlich Konstanten sind die sich nie verändern. Deshalb kann man gleich ein const davor setzen:
const int r = 100;
const int f = 350;
const int x = 130;
const int y = 130;


Bei den Variablen die in loop bleiben reicht auch das:
float ang = ( circle / f * 3.14 );
int xp = r * cos(ang);
int yp = r * sin(ang);


Bei "int  circle = 0;" kommt dann noch hinzu dass er das bei jedem Durchlauf von loop auf 0 setzen würde. Deshalb entweder global machen oder innerhalb von loop als static deklarieren.

Du solltest da auch noch eine Abbruch-Bedingung implementieren, z.B. if(circle < ...). Das ist im Moment nur im Kommentar. Alternativ kann man das natürlich auch in setup in einer for-Schleife machen:
for(int circle = 0; circle < ... ; circle++)
{
    ....
}

Dann wird das einmal gemacht. Das reicht für einen Test

Quote

drawPixel(x+xp, y+yp, BLACK);

Mir ist aufgefallen das ich hätte noch "BLACK" deklarieren müssen, aber das System erkennt nichtmal
den Befehl "drawPixel"

drawPixel ist eine Methode. Da die in der Adafruit Lib steht, sollte er die eigentlich erkennen, da du #include <Adafruit_PCD8544.h> gemacht hast.

BLACK sollte irgendwo in den Libs definiert sein. Wenn nicht, dann musst du den Wert per Hand angeben. Das sind 16-bit, also wird es ein High Color Wert sein:
http://en.wikipedia.org/wiki/High_color
Für Schwarz wird auch einfach 0 gehen


EDIT:
Dein Fehler ist glaube ich, dass du die Lib nicht korrekt verwendest. Du solltest dir da immer die Beispiele ansehen:
https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library/blob/master/examples/pcdtest/pcdtest.pde

Du musst da erst mal ein Display Objekt erstellen:
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

Und dann musst du display.drawPixel... machen

Go Up