Hallo,
ich habe ein Array aus 10 Elementen und möchte nun bei einer
eingegebenen Variable abfragen, ob der Wert der Variable im Array
vorkommt.
Die Abfrage würde ich gerne als Funktion lösen, die dann ein true oder
false zurückgibt.
Leider scheint da aber beim return etwas nicht zu stimmen, da das immer
wahr ist.
Das array:
Du hast nicht alle Warnungen des Compilers eingeschaltet oder beachtet.
Wenn der Sourcecode im Original genauso formatiert ist wie hier, sagt
dir eigentlich schon, was das Problem ist.
Oliver
Max schrieb:> Die Abfrage würde ich gerne als Funktion lösen, die dann ein true oder> false zurückgibt.
Dein Funktion kann "true" zurückgeben, wenn sie was findet.
Aber wo kann sie "false" zurück geben, wenn sie nichts findet?
Deklariere die Return-variale am Anfang der Funktion bzw. gib ihr den
den Wert FALSE. Entweder die Schleife ändert sie oder halt nicht.
So einfach ist das.
Nachtrag:
Bin ich blind oder finde ich die Deklarierung von TEST nicht.
if (test == sensor_OR[i]) { ' <- die da meine ich
Also meine Compiler melden eigentlich "nicht deklariere Variable". Aber
vielleicht bin ich ja echt blind.
Dann sorry.
Max schrieb:> byte sensor_OR[ARSIZE] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
ist nicht nötig.
Hier wird genauso alles auf 0 gesetzt und man muss nichts abzählen:
Max schrieb:> Die Abfrage würde ich gerne als Funktion lösen, die dann ein true oder> false zurückgibt.
Du willst doch auch bestimmt die Position im Array haben. Besser wäre es
byte* als Rückgabewert zu definieren und NULL (nicht gefunden) bzw. die
Position (gefunden) zurückzugeben.
Schlaumaier schrieb:> Nachtrag:>> Bin ich blind oder finde ich die Deklarierung von TEST nicht.>> if (test == sensor_OR[i]) { ' <- die da meine ich>> Also meine Compiler melden eigentlich "nicht deklariere Variable". Aber> vielleicht bin ich ja echt blind.>> Dann sorry.
Die ist zwei Zeilen darüber, als Parameter der Funktion
> boolean testinArray_OR(byte test) {
Hallo,
super danke für den Hinweis mit dem fehlenden false. Das hat
funktioniert.
>Du willst doch auch bestimmt die Position im Array haben
Nein für mein Beispiel brauche ich das nicht.
Das Ziel soll sein am Ende, dass ich ein Array für ODER-Verknüpfungen
habe und drei Arrays mit UND-Verknüpfungen.
Wenn eine Nummer im OR Array ist soll ausgelöst werden oder wenn eine
Kombination im UND Array sich befindet etc. Als weitere Schwierigkeit
kommt dann noch dazu, dass die UND Verknüpfungen innerhalb einer Sekunde
zB stattfinden müssen
if (array_OR || array_AND_1 || array_AND_2 || array_AND_3)
{ausloesen();}
..aber erstmal versuche ich mich dem Schrittweise zu nähern. Mit
return-Werten hatte ich bis dato noch nicht zu tun.
Ein Empfänger liefert mir IDs von Sensoren, die Bewegung erkannt haben.
Diese IDs will ich nun mit den in den Arrays gespeicherten Nummern
abgleichen und dann bei richtiger Bedingung einen Ausgang zu schalten.
Die Arrays deshalb, damit ich flexible auswählen kann welche IDs in
Frage kommen und das ganze im EEPROM abspeicherbar ist.
Das ganze wird tatsächlich in der Arduino Umgebung programmiert
Hallo,
ich habe mal das ganze Programm angehängt.
Bei dem nächsten Schritt komme ich beim Ansatz nicht weiter.
Das ganze soll ja einen Ausgang schalten wenn alle Nummern eines
AND-Arrays empfangen wurden und erfolgreich abglichen wurden.
Wird also 10,11 empfangen, dann wäre die Bedingung für das Array AND_1
gültig:
sensor_AND_1[0] = 10;
sensor_AND_1[1] = 11;
Nun muss das ganze aber innerhalb von einer gewissen Zeit passieren,
sagen wir 2 sek. Ebenso soll der µC so oft wie möglich schlafen, da
Batteriebetrieb.
Die erste Idee, die noch im Code ist war wenn eine Zahl im Array
auftaucht einen counter zu erhöhen: AND_1_counter++ und mit der Anzahl
der Elemente im Array zu vergleichen. Funktioniert aber nicht, wenn zB
zweimal die gleiche Zahl aufgerufen wird, dann wird der Counter um zwei
erhöht und wäre fehlerhaft.
Eine Idee war ein zweites Array zusätzlich für jedes AND-Array in dem
dann millis() gespeichert werden, oder eine Flag, an der entsprechenden
Position.
Man könnte auch über eine RTC die aktuelle Uhrzeit+Datum holen.
Problem 1: wenn der µC schläft, werden die millis() nicht erhöht,
müsste man per wdt interrupt den µC vermutlich alle paar ms aufwecken
und eine Variable erhöhen
Problem 2: Der Speicherplatz, wenn ich da noch für jedes Element im
Array Zeit/Datum ablegen muss in meinem Atmega328P
Wie würdet ihr das angehen? (Das ganze kann auf einem Arduino Nano/Uno
per Terminal getestet werden)
1
StringNum1;
2
#define ARSIZE 10
3
4
bytesensor_OR[ARSIZE]={0};
5
bytesensor_AND_1[ARSIZE]={0};
6
bytesensor_AND_2[ARSIZE]={0};
7
bytesensor_AND_3[ARSIZE]={0};
8
9
intOR_counter=0;
10
intAND_1_counter=0;
11
intAND_2_counter=0;
12
intAND_3_counter=0;
13
14
intOR_isset_counter=0;
15
intAND_1_isset_counter=0;
16
intAND_2_isset_counter=0;
17
intAND_3_isset_counter=0;
18
19
voidsetup(){
20
21
sensor_OR[0]=18;
22
sensor_OR[1]=2;
23
24
sensor_AND_1[0]=10;
25
sensor_AND_1[1]=11;
26
27
sensor_AND_2[0]=20;
28
sensor_AND_2[1]=21;
29
30
sensor_AND_3[0]=30;
31
sensor_AND_3[1]=31;
32
sensor_AND_3[2]=32;
33
34
Serial.begin(115200);
35
36
}
37
38
39
booleantestinArray(byteval,bytearr[],intarrsize)
40
{
41
for(inti=0;i<arrsize;i++)
42
{
43
if(val==arr[i])
44
{
45
returntrue;
46
}
47
}
48
returnfalse;
49
}
50
51
52
intisset_counter(bytearr[],intarrsize)
53
{intcount=0;
54
for(inti=0;i<arrsize;i++)
55
{
56
if(arr[i]>0){count++;ArrayRecord[i]=millis();}// wenn ID vorhanden, ID > 0
57
}
58
returncount;
59
}
60
61
voidloop(){
62
63
//In der Praxis soll die Nummerneingabe von einem Funkmodul kommen was den µC per Interrupt aufweckt, der ansonsten schläft
Ich hätte es wahrscheinlich so gemacht:
Einfach die ID's von Sensoren in einem 2D-Array speichern und die zweite
Zeile gibt dann an, ob dieser Sensor schon mal aktiv war.
Hallo,
ich habe mal meine letzte Version hier angehängt. Deinen Vorschlag mit
dem 2D Array fände ich gut, ich bin mir nur nicht sicher, wie man das
implementieren könnte.
Deine Auswertung kann ich nicht übernehmen, da ich die IDs flexible über
ein Menü in die einzelnen "Container" Arrays schieben möchte.
Also ob jetzt ID 12 im OR oder AND_1 Array ist, darf nicht im Programm
fix sein.
Ich habe mal noch eine Zeichnung angehängt. Ansonsten macht mein
Programm- bis auf die Bedingung, dass die AND Bedingungen innerhalb 2s
erfolgen müssen- soweit alles korrekt. Bin mir nur sicher, man könnte es
bestimmt noch effizienter und intelligenter machen. Das würde mich
interessieren :)
1
#define NUM_OF_MAX_SENSORS 10
2
3
bytesensor_OR[NUM_OF_MAX_SENSORS]={0};
4
bytesensor_AND_1[NUM_OF_MAX_SENSORS]={0};
5
bytesensor_AND_2[NUM_OF_MAX_SENSORS]={0};
6
bytesensor_AND_3[NUM_OF_MAX_SENSORS]={0};
7
8
byteTRIGGERED_sensor_AND_1[NUM_OF_MAX_SENSORS]={0};//wenn ID gemeldet wurde, wird an der Position der ID eine 1 eingetragen
Hallo, etwas konnte ich das Programm nun noch zusammenraffen:
Das ist jetzt der letzte Stand. Sieht da jemand noch
Verbesserungspotential und wie könnte ich am Geschicktesten etwas
einbauen, damit ein Zeitfenster von 2 sekunden besteht während die AND..
Eingaben erfolgen müssen?