Kämpfe mit Class

Vielen Dank Euch allen

Am Verpacken von qsort in eine Class scheitere ich noch immer aber ich lass es glaub ich nun mal sein und Wurstle weiter Python liegt mir besser aber ich will mehr über C++ lernen, darum quäle ich mich ein bischen und Euch auch

``````using namespace std;

#include "MyTca9548aTsl2591.h"
MyTca9548aTsl2591 TopSpectrum(0);  //# <--- i2cBus
MyTca9548aTsl2591 LeftSpectrum(1);
MyTca9548aTsl2591 RightSpectrum(2);
MyTca9548aTsl2591 BackSpectrum(3);

#include "MyHCSR04.h"
MyHCSR04 TopDistance(30,31);
MyHCSR04 LeftDistance(32,33);
MyHCSR04 RightDistance(34,35);
MyHCSR04 BackDistance(36,37);

#define BaudRate 115200
#define KeepDistance 10.0

//
/* an example of struct */
struct Sensors{
char name[10];
float value;
};

/* qsort struct comparision function (value float field) */
int CompareSensorsByValue(const void *a, const void *b)
{
struct Sensors *ia = (struct Sensors *)a;
struct Sensors *ib = (struct Sensors *)b;
return (int)(100.f*ia->value - 100.f*ib->value);
/* float comparison: returns negative if b > a
and positive if a > b. We multiplied result by 100.0
to preserve decimal fraction */

}

char *GetSensorNameByPosition(struct Sensors *array, int pos)
{
return array[pos].name;
}

float GetSensorValueByPosition(struct Sensors *array, int pos)
{
return array[pos].value;
}

void setup(void)
{

Serial.begin(BaudRate);
while(!Serial);

TopDistance.begin();
LeftDistance.begin();
RightDistance.begin();
BackDistance.begin();

TopSpectrum.begin();
LeftSpectrum.begin();
RightSpectrum.begin();
BackSpectrum.begin();

// Now we're ready to get readings ... move on to loop()!
}

void loop(void)
{

struct Sensors sensors[] = {
{"TopSpectrum", 	TopSpectrum.getFullSpectrum()},
{"LeftSpectrum", 	LeftSpectrum.getFullSpectrum()},
{"RightSpectrum", 	RightSpectrum.getFullSpectrum()},
{"BackSpectrum", 	BackSpectrum.getFullSpectrum()}
};

size_t sensors_len = sizeof(sensors) / sizeof(struct Sensors);
qsort(sensors, sensors_len, sizeof(struct Sensors), CompareSensorsByValue);

int check_next = 0;

while (check_next < sensors_len) {

if ( strcmp(GetSensorNameByPosition(sensors, check_next),"TopSpectrum") == 0 ) {
if (TopDistance.GetDistInCm() < KeepDistance) {
check_next += 1;
Serial.println("STOOOOOOOP Top");
Serial.println(check_next);
} else {
Serial.println("GOOOOO Top");
break;
}

}

if ( strcmp(GetSensorNameByPosition(sensors, check_next),"LeftSpectrum") == 0 ) {
if (LeftDistance.GetDistInCm() < KeepDistance) {
check_next += 1;
Serial.println("STOOOOOOOP Leeft");
Serial.println(check_next);
} else {
Serial.println("GOOOOO LEEEEFT");
break;
}
}

if ( strcmp(GetSensorNameByPosition(sensors, check_next),"RightSpectrum") == 0 ) {
if (RightDistance.GetDistInCm() < KeepDistance) {
check_next += 1;
Serial.println("STOOOOOOOP Right");
Serial.println(check_next);
} else {
Serial.println("GOOOOO Right");
break;
}
}

if ( strcmp(GetSensorNameByPosition(sensors, check_next),"BackSpectrum") == 0 ) {
if (BackDistance.GetDistInCm() < KeepDistance) {
check_next += 1;
Serial.println("STOOOOOOOP Back");
Serial.println(check_next);
} else {
Serial.println("GOOOOO BACK");
break;
}

}

}

}
``````

Es soll so etwas wie eine Motte werden - es bewegt sich immer zur hellsten Stelle ausser da ist eine Wand, dann bewegt es sich zur zweithellsten Stelle ausser da ist eine Wand … usw… wenn es weder vor noch zurück kann stoppt es und explodiert Neee … Ich weiss noch nicht was es machen soll wenn es stoppt … Vorschläge sind willkommen

Uiiii - da geht aber einiges durcheinander.
In aller Kürze hier die Auflistung (ich werde frühestens heute abend dazu kommen, mir das genauer anzuschauen):

• Was sind das für merkwürdige Includes / Libraries?
• Namen für die Sensoren brauchst Du eigentlich für die Funktion gar nicht
• Die Struktur für einen Sensor dürfte sowohl das ominöse Spektrum als auch den Distanzwert enthalten, denn die treten immer zusammen auf
• Der Sensor-Array wird in jedem loop()-Aufruf neu vereinbart; das gehört außerhalb oder static
• Die Abfrage aller Sensoren (‘while’ über check_next) kann in jedem loop()-Durchlauf weitergeschaltet werden Das while braucht es nicht (in dem Fall wäre dann übrigens ein for (check_next = 0; check_next < sensors_len; check_next++) angesagt)
• Die ganzen if’s sind ziemlich häßlich, ein switch (check_next) mit passenden cases ist richtig - es handelt sich um Systemzustände
• Und diese Systemzustände schreien nach einer Benennung à la LINKS, RECHTS… in einem enum
• Sortiert wird nirgends.

Das gibt eine Menge Arbeit.

Moin,
ich muss mich entschuldigen und das gleich zweimal:

• hatte die Tage wenig Zeit - deshalb späte Antwort
• habe auch Deinen Code nicht aufmerksam genug gelesen.

Allerdings werde ich nur bedingt helfen können, denn ich habe Deine Libraries nicht, die zu den Includes von MyTca9548aTsl2591.h und MyHCSR04.h führen.

Jetzt aber:
Du sortierst natürlich doch; der qsort-Aufruf ist mir durchgegangen.
Durch das Sortieren ist natürlich die Logik dahinter eine andere als von mir vermutet.

Damit ich es richtig verstehe:
Spectrum ist der Helligkeitswert (je kleiner desto hell), Distance der Abstand zur Wand in derselben Richtung.
Richtig?

Eine Anmerkung:
Da Du - falls die Distanzschwelle nicht unterschritten ist - sofort mit break aus dem while() rausspringst, kann es beim nächsten Loop-Durchlauf durchaus sein, dass die Richtung mit dem niedrigsten Spectrum-Wert dann eine andere ist.

Noch eine Frage:
Brauchst Du den Namen des Sensors an Index 0 (nach dem Sortieren) zu irgendetwas anderem außer der Ausgabe?
Ich vermute nämlich, dass sich dahinter eigentlich der Zustand “Motte bewegt sich in Richtung X” verbirgt und diese Richtungsangabe auch noch zum Steuern der Fortbewegung nützlich sein könnte.

EDIT:
Ich habe Deine Sensorklassen mal minimal nachgebildet, damit ich was zum Laufen habe und Dein Programm meinem Verständnis der Aufgabe entsprechend umgeändert. Es hat ein paar Ausgaben auf Serial, damit man sehen kann was passiert. Ich finde, es funktioniert (auf meinem Uno jedenfalls).
ZIP im Anhang, es sind jetzt drei Dateien in einem Sketch-Ordner.

sketch_feb17a.zip (2.78 KB)

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.