Morse programm von mir geht nicht =(

Hallo zusammen, ich habe mal 3 Taster angeschlossen und einen Lautsprecher, und wollte damit ein paar schöne Morsetöne erzeugen, wollte aber ein großes, möglichst gut ausweitbares Program mit Klassen und so. Bei überprüfen / hochladen kommt aber die Fehlermeldung "request for member 'cq', which is of non-class type int" und "sketch_may21a.ino: In function 'void loop()':
sketch_may21a:17: error: request for member 'cq' in 'morse', which is of non-class type 'int'
sketch_may21a:19: error: request for member 'name' in 'morse', which is of non-class type 'int'
sketch_may21a:21: error: request for member 'sos' in 'morse', which is of non-class type 'int'
sketch_may21a.ino: In member function 'void ton::lang()':
sketch_may21a:45: error: 'zaehle2r' was not declared in this scope
sketch_may21a.ino: In member function 'void morse::cq()':
sketch_may21a:60: error: expected unqualified-id before '.' token
sketch_may21a:61: error: expected unqualified-id before '.' token
sketch_may21a:62: error: expected unqualified-id before '.' token
sketch_may21a:63: error: expected unqualified-id before '.' token
sketch_may21a.ino: In member function 'void morse::name()':
sketch_may21a:67: error: expected unqualified-id before '.' token
sketch_may21a:68: error: expected unqualified-id before '.' token
sketch_may21a:69: error: expected unqualified-id before '.' token
sketch_may21a:70: error: expected unqualified-id before '.' token
sketch_may21a:72: error: expected unqualified-id before '.' token
sketch_may21a:73: error: expected unqualified-id before '.' token
sketch_may21a:74: error: expected unqualified-id before '.' token
sketch_may21a:76: error: expected unqualified-id before '.' token
sketch_may21a:78: error: expected unqualified-id before '.' token
sketch_may21a:79: error: expected unqualified-id before '.' token
sketch_may21a:80: error: expected unqualified-id before '.' token
sketch_may21a:81: error: expected unqualified-id before '.' token
sketch_may21a:82: error: expected unqualified-id before '.' token
sketch_may21a:84: error: expected unqualified-id before '.' token
sketch_may21a:85: error: expected unqualified-id before '.' token
sketch_may21a:86: error: expected unqualified-id before '.' token
sketch_may21a:87: error: expected unqualified-id before '.' token
sketch_may21a:88: error: expected unqualified-id before '.' token
sketch_may21a.ino: In member function 'void morse::sos()':
sketch_may21a:92: error: expected unqualified-id before '.' token
sketch_may21a:93: error: expected unqualified-id before '.' token
sketch_may21a:94: error: expected unqualified-id before '.' token
sketch_may21a:96: error: expected unqualified-id before '.' token
sketch_may21a:97: error: expected unqualified-id before '.' token
sketch_may21a:98: error: expected unqualified-id before '.' token
sketch_may21a:100: error: expected unqualified-id before '.' token
sketch_may21a:101: error: expected unqualified-id before '.' token
sketch_may21a:102: error: expected unqualified-id before '.' token
sketch_may21a.ino: At global scope:
sketch_may21a:104: error: expected unqualified-id at end of input". Bin mir aber sehr unsicher, was das heißt und was ich dagegen tun kann, deshalb hab ich hier den Quellcode mit kursiver fraglicher Stelle:

int morse = 3;
int button1 = 2;
int button2 = 4;
int button3 = 5;
int pin = 0;

void setup() {
pinMode(morse, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
Serial.begin(9600);
}

void loop() {
if (digitalRead(button1) == HIGH && digitalRead(button2) == LOW && digitalRead(button3) == LOW) {
morse.cq();
} else if (digitalRead(button2) == HIGH && digitalRead(button1) == LOW && digitalRead(button3) == LOW) {
morse.name();
} else if (digitalRead(button3) == HIGH && digitalRead(button1) == LOW && digitalRead(button2) == LOW) {
morse.sos();
} else {
Serial.println("...");
}
delay(10);
}

class ton {
void kurz() {
int zaehler = 0;
boolean ver = 0;
while (zaehler != 250000) {
digitalWrite(morse, ver);
if (ver == HIGH) {
ver = LOW;
} else {
ver = HIGH;
}
zaehler = zaehler + 1;
}
}
void lang() {
int zaehler2 = 0;
boolean ver2 = 0;
while (zaehle2r != 250000) {
digitalWrite(morse, ver2);
if (ver2 == HIGH) {
ver2 = LOW;
} else {
ver2 = HIGH;
}
zaehler2 = zaehler2 + 1;
}
}
}

class morse {
public:
void cq() {
ton.lang();
ton.kurz();
ton.lang();
ton.kurz();
delay(800);
}
void name() {
ton.kurz();
ton.lang();
ton.kurz();
ton.kurz();
delay(500);
ton.lang();
ton.kurz();
ton.kurz();
delay(500);
ton.kurz();
delay(500);
ton.lang();
ton.lang();
ton.lang();
ton.lang();
ton.lang();
delay(500);
ton.kurz();
ton.lang();
ton.lang();
ton.lang();
ton.lang();
delay(800);
}
void sos() {
ton.kurz();
ton.kurz();
ton.kurz();
delay(500);
ton.lang();
ton.lang();
ton.lang();
delay(500);
ton.kurz();
ton.kurz();
ton.kurz();
delay(800);
}
}

Kann mir jemand helfen? :zipper_mouth_face:

Hi,

sorry das sagen zu müssen, aber dir fehlt das Verständnis für klassenbasierte Programmierung.
Fange am besten mit einem C++ Buch an und arbeite dich durch.
Zum Beispiel dieses kostenlose Wiki.

Ich hätte dir gerne geholfen, aber es ist einfach zu viel Falsches in dem geposteten Code.
Stichwörter: Klasseninstanziierung, lokale Variablen, Klassenvariablen, Deklarationen.

Grüße
Nighti

Dasichbinich:
Kann mir jemand helfen? :zipper_mouth_face:

Irgendwie scheinen Dir noch ein paar Grundlagen zu fehlen.

Erstens mal darfst Du einen und denselben Bezeichner nicht für zwei ganz verschiedene Dinge verwenden.

int morse = 3;
...
class morse {...

Ja was denn nun: Soll "morse" einen Integer-Wert oder eine Klasse bezeichnen?
Wenigstens die Groß- und Kleinschreibung der Bezeichner sollte sich unterscheiden.
Beispielsweise:
int MORSE = 3;
class Morse {...

Für C sind "MORSE" und "Morse" unterschiedliche Bezeichner.
Aber "morse" und "morse" sind identische Bezeichner.

Merke: Unterschiedliche Bezeichner für unterschiedliche Dinge verwenden, identische Bezeichner für identische Dinge!

Darüber hinaus hast Du zwar die Klassen definiert, aber Du hast keine Klassenvariablen erzeugt.

Ich habe Deinen Code mal geringfügig verändert, dass er fehlerfrei kompiliert.
Also unterschiedliche Bezeichner verwendet, wo Bezeichner unterschiedlich sein müssen und fehlende Klassenvariablen nach bestem Wissen und Gewissen ergänzt (ich programmiere üblicherweise in Sketchen nur prozedural und nicht objektorientiert, so ganz sattelfest bin ich darin auch nicht).

Dass der Code nicht nur kompiliert werden kann, sondern auch wie gewünscht funktioniert, ist bei Deinen Programmierkenntnissen allerdings eher unwahrscheinlich. Aber Du kannst dran arbeiten:

int MORSE = 3;
int button1 = 2;
int button2 = 4;
int button3 = 5;
int pin = 0;

class Ton {
  public:
  void kurz() {
    long zaehler = 0;
    boolean ver = 0;
    while (zaehler != 250000) {
    digitalWrite(MORSE, ver);
    if (ver == HIGH) {
      ver = LOW;
    } else {
      ver = HIGH;
    }
    zaehler = zaehler + 1;
    }
  }
  void lang() {
    long zaehler2 = 0;
    boolean ver2 = 0;
    while (zaehler2 != 250000) {
    digitalWrite(MORSE, ver2);
    if (ver2 == HIGH) {
      ver2 = LOW;
    } else {
      ver2 = HIGH;
    }
    zaehler2 = zaehler2 + 1;
    }
  }
};


class Morse {
  public:
  Ton ton;
  void cq() {
    ton.lang();
    ton.kurz();
    ton.lang();
    ton.kurz();
    delay(800);
  }
  void name() {
    ton.kurz();
    ton.lang();
    ton.kurz();
    ton.kurz();
    delay(500);
    ton.lang();
    ton.kurz();
    ton.kurz();
    delay(500);
    ton.kurz();
    delay(500);
    ton.lang();
    ton.lang();
    ton.lang();
    ton.lang();
    ton.lang();
    delay(500);
    ton.kurz();
    ton.lang();
    ton.lang();
    ton.lang();
    ton.lang();
    delay(800);
  }
  void sos() {
    ton.kurz();
    ton.kurz();
    ton.kurz();
    delay(500);
    ton.lang();
    ton.lang();
    ton.lang();
    delay(500);
    ton.kurz();
    ton.kurz();
    ton.kurz();
    delay(800);
  }
};

Morse morse;

void setup() {
  pinMode(MORSE, OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(button1) == HIGH && digitalRead(button2) == LOW && digitalRead(button3) == LOW) {
    // [i]
    morse.cq();
    // [/i]
  } else if (digitalRead(button2) == HIGH && digitalRead(button1) == LOW && digitalRead(button3) == LOW) {
    morse.name();
  } else if (digitalRead(button3) == HIGH && digitalRead(button1) == LOW && digitalRead(button2) == LOW) {
    morse.sos();
  } else {
    Serial.println("...");
  }
  delay(10);
}

[Edit]
Ich habe außerdem noch ein
int zaehler = 0;
ausgetauscht gegen ein
long zaehler = 0;

Weil int-Zähler zählen nur bis max. 32767 hoch und laufen dann über. Der int-Zähler würde also nie den Wert erreichen, auf den Du prüfst:
while (zaehler != 250000)
Merke: Wenn Zahlen den int-Wertebereich überschreiten, dann stattdessen long-Werte verwenden!

Mal ganz unabhängig von der Frage nach class Objekten ( warum nicht alles static, wennn es sowieso nicht mehrere Instanzen geben kann ?)

int zaehler = 0;
boolean ver;
while (zaehler != 250000) {
 digitalWrite(MORSE, ver = !ver ); 
 zaehler++;
}

geht schon irgendwie, leider nicht wie du erwartest:
int hat den Bereich -32768 .. 32767, und wenn du es nicht speziell als long definierst ist 250000 == 9632
Käme jetzt auf die Umsetzung im Compiler an, welche "Tonhöhe" sich ergibt, und wie lange 9632/2 = 4816 Schwingungen dauern...

Wenn digitalWrite halbwegs ordentlich optimiert ist, sollte mir der Ton eher zu hoch sein, 300 Schwingungen bei 1000 Hz fände ich angenehmer als
4800 bei 16000 Hz...

Und wie lang bzw. wo ist die Pause nach einem Ton.kurz() ? Damit nicht mehrere kurze zusammen einen langen ergeben ?

Vielen Dank für die Hilfe! Das ich das gleich benannt habe ist mir an dem Abend gar nicht aufgefallen! Werd das ganze verbessern und sehen , ob s dann klappt!