Forum: PC-Programmierung Abfrage nach Element in Array


von Max (Gast)


Lesenswert?

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:
1
#define ARSIZE 10
2
byte sensor_OR[ARSIZE] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
3
byte ID = 3;
4
//byte ID = 2;
5
6
void setup() {
7
  sensor_OR[0] = 18;
8
  sensor_OR[1] = 2;  
9
}
1
  if (testinArray_OR(ID)) {
2
     Serial.print(ID); Serial.println(" in Array");
3
  }

Die Funktion
1
boolean testinArray_OR(byte test) {
2
  for (int i = 0; i < ARSIZE; i++) {
3
    if (test == sensor_OR[i]) {
4
      Serial.println(i);
5
      return true;
6
    }
7
  }
8
}

von Oliver S. (oliverso)


Lesenswert?

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

von Vincent H. (vinci)


Lesenswert?

Max schrieb:
> Die Abfrage würde ich gerne als Funktion lösen, die dann ein true oder
> false zurückgibt.

Das gibts bereits in der Standard-Library:
https://en.cppreference.com/w/cpp/algorithm/all_any_none_of
https://en.cppreference.com/w/cpp/algorithm/ranges/all_any_none_of

Beispiel:
https://godbolt.org/z/n8banq

von Interessierter (Gast)


Lesenswert?

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?

von Tom K. (ez81)


Lesenswert?

Das sieht nach Arduino aus. Da gibt es weder Warnungen (sind (oder waren 
zumindest früher) in Standardeinstellung deaktiviert) noch STL.

von Schlaumaier (Gast)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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.

von in der Kürze liegt die Würze (Gast)


Lesenswert?

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:
1
byte sensor_OR[ARSIZE] = {0};

von in der Kürze liegt die Würze (Gast)


Lesenswert?

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.

von Flo (Gast)


Lesenswert?

@Schlaumaier
Die Variable 'test' ist der Parameter der Funktion 'testinArray_OR'

@Max
Deine Funktion müsste so aussehen:
1
boolean testinArray_OR(byte test)
2
{
3
  for (int i = 0; i < ARSIZE; i++)
4
  {
5
    if (test == sensor_OR[i])
6
    {
7
      Serial.println(i);
8
      return true;
9
    }
10
  }
11
  return false;
12
}

Oder du nimmst eine Funktion aus der Std-Library, wie von  Vincent H. 
(vinci) vorgeschlagen.

Grüße Flo

von Markus E. (markus_e176)


Lesenswert?

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) {

Beitrag #6451518 wurde von einem Moderator gelöscht.
von Schlaumaier (Gast)


Lesenswert?

Ok ich gebs zu ich bin Scheuklappenblind.

Bei mir ist es halt anders herum deshalb hab ich das übersehen. Sorry.

von Flo (Gast)


Lesenswert?

SoNicht! schrieb im Beitrag #6451518:
> seit wann gibts boolean in c?

Der TO programmiert wohl mit der Arduino Umgebung:
https://www.arduino.cc/reference/de/language/variables/data-types/boolean/

von Max (Gast)


Lesenswert?

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

von Max (Gast)


Lesenswert?

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
String Num1;
2
#define ARSIZE 10
3
4
byte sensor_OR[ARSIZE] = {0};
5
byte sensor_AND_1[ARSIZE] = {0};
6
byte sensor_AND_2[ARSIZE] = {0};
7
byte sensor_AND_3[ARSIZE] = {0};
8
9
int OR_counter=0;
10
int AND_1_counter=0;
11
int AND_2_counter=0;
12
int AND_3_counter=0;
13
14
int OR_isset_counter=0;
15
int AND_1_isset_counter=0;
16
int AND_2_isset_counter=0;
17
int AND_3_isset_counter=0;
18
  
19
void setup() {
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
boolean testinArray(byte val, byte arr[], int arrsize)
40
{
41
  for (int i = 0; i < arrsize; i++)
42
  {
43
    if (val == arr[i])
44
    {
45
      return true;
46
    }
47
  }
48
  return false;
49
}
50
51
52
int isset_counter(byte arr[], int arrsize)
53
{  int count=0;
54
  for (int i = 0; i < arrsize; i++)
55
  {
56
    if (arr[i]>0) { count++; ArrayRecord[i]=millis(); } // wenn ID vorhanden, ID > 0
57
  }
58
  return count;
59
}
60
61
void loop() {
62
63
  //In der Praxis soll die Nummerneingabe von einem Funkmodul kommen was den µC per Interrupt aufweckt, der ansonsten schläft
64
  Serial.println("Enter Number : ");
65
  while (Serial.available() == 0)
66
  {}
67
  Num1 = Serial.readString();
68
  byte ID = Num1.toInt();
69
  
70
  
71
  Serial.print("ID "); Serial.println(ID);
72
   
73
  if (testinArray(ID, sensor_OR, ARSIZE ))    { Serial.println("Auslösen"); }
74
  if (testinArray(ID, sensor_AND_1, ARSIZE )) { AND_1_counter++; }
75
  if (testinArray(ID, sensor_AND_2, ARSIZE )) { AND_2_counter++; }
76
  if (testinArray(ID, sensor_AND_3, ARSIZE )) { AND_3_counter++; } 
77
78
79
  OR_isset_counter    = isset_counter(sensor_OR, ARSIZE);
80
  AND_1_isset_counter = isset_counter(sensor_AND_1, ARSIZE);
81
  AND_2_isset_counter = isset_counter(sensor_AND_2, ARSIZE);
82
  AND_3_isset_counter = isset_counter(sensor_AND_3, ARSIZE);
83
  
84
85
  Serial.print("OR_counter ");    Serial.print(OR_counter);     Serial.print(" / OR_isset_counter "); Serial.println(OR_isset_counter);
86
  Serial.print("AND_1_counter "); Serial.print(AND_1_counter);  Serial.print(" / AND_1_isset_counter "); Serial.println(AND_1_isset_counter);
87
  Serial.print("AND_2_counter "); Serial.print(AND_2_counter);  Serial.print(" / AND_2_isset_counter "); Serial.println(AND_2_isset_counter);
88
  Serial.print("AND_3_counter "); Serial.print(AND_3_counter);  Serial.print(" / AND_3_isset_counter "); Serial.println(AND_3_isset_counter);
89
  
90
  Serial.println();
91
}

von it doesn't matter (Gast)


Lesenswert?

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.
1
#define NUM_OF_SENSORS 6
2
3
#define SENSOR_ID 0
4
#define SENSOR_STATE 1
5
6
#define SENSOR_TEMP1    0 // SENSOR_ID==17
7
#define SENSOR_TEMP2    1 // SENSOR_ID==42
8
#define SENSOR_PRESSURE 2 // usw..
9
#define SENSOR_IR_FRONT 3
10
#define SENSOR_IR_LEFT  4
11
#define SENSOR_IR_RIGHT 5
12
13
uint8_t sensor[2][NUM_OF_SENSORS] = { { 17, 42, 92, 10, 38, 22 },
14
                                      { 0 } };

Eine Funktion zum Prüfen von gültigen ID's (gleichzeitig wird der Status 
bei gültigen ID's auf 1 gesetzt)
1
bool
2
is_valid_sensor_id(uint8_t sensor_id)
3
{
4
   for (size_t i = 0; i < NUM_OF_SENSORS; i++) {
5
      if (sensor[SENSOR_ID][i] == sensor_id) {
6
         sensor[SENSOR_STATE][i] = 1;
7
         return true;
8
      }
9
   }
10
   return false;
11
}

und dann bestimmte Kombinationen von Sensoren abfragen:
1
      if (is_valid_sensor_id(x)) {
2
3
         // sensors SENSOR_TEMP1 and SENSOR_IR_FRONT activated?
4
         if (sensor[SENSOR_STATE][SENSOR_TEMP1] &&
5
             sensor[SENSOR_STATE][SENSOR_IR_FRONT]) {
6
            
7
             do_something();
8
9
            // reset all states to 0
10
            memset(&sensor[SENSOR_STATE][0], 0, NUM_OF_SENSORS);
11
         }
12
      }

von Max (Gast)


Lesenswert?

Hallo,
danke für deinen Vorschlag! Das klingt und sieht interessant aus. Ich 
versuche das zu verstehen und mal auszuprobieren

von Max (Gast)


Angehängte Dateien:

Lesenswert?

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
byte sensor_OR[NUM_OF_MAX_SENSORS] = {0}; 
4
byte sensor_AND_1[NUM_OF_MAX_SENSORS] = {0};
5
byte sensor_AND_2[NUM_OF_MAX_SENSORS] = {0};
6
byte sensor_AND_3[NUM_OF_MAX_SENSORS] = {0};
7
8
byte TRIGGERED_sensor_AND_1[NUM_OF_MAX_SENSORS] = {0}; //wenn ID gemeldet wurde, wird an der Position der ID eine 1 eingetragen
9
byte TRIGGERED_sensor_AND_2[NUM_OF_MAX_SENSORS] = {0};
10
byte TRIGGERED_sensor_AND_3[NUM_OF_MAX_SENSORS] = {0};
11
12
13
int OR_counter = 0;
14
int AND_1_counter = 0;
15
int AND_2_counter = 0;
16
int AND_3_counter = 0;
17
18
int OR_isset_counter = 0;
19
int AND_1_isset_counter = 0;
20
int AND_2_isset_counter = 0;
21
int AND_3_isset_counter = 0;
22
23
24
uint32_t start;
25
uint32_t stop;
26
27
28
void setup() {
29
/*
30
Es gibt 2 verschiedene Arten im Menü: Im Abschnitt OR sind alle Sensoren eingetragen, die ohne weitere Bedingung auslösen sollen
31
Im AND_1 Abschnitt werden IDs eingetragen, die nur dann auslösen, wenn alle darin eingetragenen IDs sich innerhalb von 2s melden.
32
AND_2 und AND_3 ebenso.
33
*/
34
  sensor_OR[0] = 18; 
35
  sensor_OR[1] = 2;
36
37
  sensor_AND_1[0] = 10;
38
  sensor_AND_1[1] = 11;
39
40
  sensor_AND_2[0] = 20;
41
  sensor_AND_2[1] = 21;
42
43
  sensor_AND_3[0] = 30;
44
  sensor_AND_3[1] = 31;
45
  sensor_AND_3[2] = 32;
46
47
  Serial.begin(115200);
48
49
}
50
51
52
boolean testinArray(byte val, byte arr[], int arrsize) //überprüft, ob ID im Array vorkommt
53
{
54
  for (int i = 0; i < arrsize; i++)
55
  {
56
    if (val == arr[i])
57
    {
58
      return true;
59
    }
60
  }
61
  return false;
62
}
63
64
65
int isset_counter(byte arr[], int arrsize)  //überprüft die Anzahl vorhandener Sensoren. 0=kein Sensor
66
{ int count = 0;
67
  for (int i = 0; i < arrsize; i++)
68
  {
69
    if (arr[i] > 0) {
70
      count++;  // wenn ID vorhanden, ID > 0
71
    }
72
  }
73
  return count;
74
}
75
76
void loop() {
77
78
  Serial.println("Enter Number : ");
79
  while (Serial.available() == 0)
80
  {}
81
  byte ID = Serial.readString().toInt();
82
83
84
85
  Serial.print("ID "); Serial.println(ID);
86
87
  if (testinArray(ID, sensor_OR, NUM_OF_MAX_SENSORS ))    {
88
    Serial.println("OR Auslösen");
89
  }
90
91
92
  int pos1 = linearSearchBreak(ID, sensor_AND_1, NUM_OF_MAX_SENSORS);
93
  if (pos1 > -1) {    TRIGGERED_sensor_AND_1[pos1] = 1;  }
94
95
  int pos2 = linearSearchBreak(ID, sensor_AND_2, NUM_OF_MAX_SENSORS);
96
  if (pos2 > -1) {    TRIGGERED_sensor_AND_2[pos2] = 1;  }
97
98
  int pos3 = linearSearchBreak(ID, sensor_AND_3, NUM_OF_MAX_SENSORS);
99
  if (pos3 > -1) {    TRIGGERED_sensor_AND_3[pos3] = 1;  }
100
101
102
  //Wenn die gemeldeten IDs innerhalb eines Arrays alle angekommen sind, dann wird ausgelöst.
103
  if (isset_counter(sensor_AND_1, NUM_OF_MAX_SENSORS) == isset_counter(TRIGGERED_sensor_AND_1, NUM_OF_MAX_SENSORS)) { Serial.println("AND 1 Auslösen"); memset(TRIGGERED_sensor_AND_1, 0, NUM_OF_MAX_SENSORS); }
104
  if (isset_counter(sensor_AND_2, NUM_OF_MAX_SENSORS) == isset_counter(TRIGGERED_sensor_AND_2, NUM_OF_MAX_SENSORS)) { Serial.println("AND 2 Auslösen"); memset(TRIGGERED_sensor_AND_2, 0, NUM_OF_MAX_SENSORS); }
105
  if (isset_counter(sensor_AND_3, NUM_OF_MAX_SENSORS) == isset_counter(TRIGGERED_sensor_AND_3, NUM_OF_MAX_SENSORS)) { Serial.println("AND 3 Auslösen"); memset(TRIGGERED_sensor_AND_3, 0, NUM_OF_MAX_SENSORS); }
106
 
107
 
108
109
  Serial.println();
110
}
111
112
113
114
115
int linearSearchBreak(byte val, byte arr[], int sz)
116
{
117
  int pos = -1;
118
  for (int i = 0; i < sz; i++)
119
  {
120
    if (arr[i] == val)
121
    {
122
      pos = i;
123
      break;
124
    }
125
  }
126
  return pos;
127
}

von Max (Gast)


Lesenswert?

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?

1
#define SENSOR_ID 0
2
#define SENSOR_STATE 1
3
4
5
#define NUM_OF_MAX_SENSORS 10
6
7
byte sensor_OR[NUM_OF_MAX_SENSORS] = { 0 };
8
byte sensor_AND_1[2][NUM_OF_MAX_SENSORS] = { { 0 }, { 0 } };
9
byte sensor_AND_2[2][NUM_OF_MAX_SENSORS] = { { 0 }, { 0 } };
10
byte sensor_AND_3[2][NUM_OF_MAX_SENSORS] = { { 0 }, { 0 } };
11
12
13
14
uint32_t start;
15
uint32_t stop;
16
17
18
void setup() {
19
/*
20
Es gibt 2 verschiedene Arten im Menü: Im Abschnitt OR sind alle Sensoren eingetragen, die ohne weitere Bedingung auslösen sollen
21
Im AND_1 Abschnitt werden IDs eingetragen, die nur dann auslösen, wenn alle darin eingetragenen IDs sich innerhalb von 2s melden.
22
AND_2 und AND_3 ebenso.
23
*/
24
  sensor_OR[0] = 18; 
25
  sensor_OR[1] = 2;
26
27
  sensor_AND_1[SENSOR_ID][0] = 10;
28
  sensor_AND_1[SENSOR_ID][1] = 11;
29
30
  sensor_AND_2[SENSOR_ID][0] = 20;
31
  sensor_AND_2[SENSOR_ID][1] = 21;
32
33
  sensor_AND_3[SENSOR_ID][0] = 30;
34
  sensor_AND_3[SENSOR_ID][1] = 31;
35
  sensor_AND_3[SENSOR_ID][2] = 32;
36
37
  Serial.begin(115200);
38
39
}
40
41
42
43
void loop() {
44
45
  Serial.println("Enter Number : ");
46
  while (Serial.available() == 0)
47
  {}
48
  byte ID = Serial.readString().toInt();
49
50
  if (is_valid_sensor_id_OR(ID)) { Serial.print(ID); Serial.println(" in OR ausgelöst"); }
51
  if (is_valid_sensor_id_AND_1(ID)) { Serial.print(ID); Serial.println(" in AND_1"); }
52
  if (is_valid_sensor_id_AND_2(ID)) { Serial.print(ID); Serial.println(" in AND_2"); }
53
  if (is_valid_sensor_id_AND_3(ID)) { Serial.print(ID); Serial.println(" in AND_3"); }
54
55
 start = micros();
56
 if (isset_counter(sensor_AND_1[SENSOR_STATE], NUM_OF_MAX_SENSORS)==isset_counter(sensor_AND_1[SENSOR_ID], NUM_OF_MAX_SENSORS)) { Serial.println(" AND_1 ausgelöst"); memset(sensor_AND_1[SENSOR_STATE], 0, NUM_OF_MAX_SENSORS); }
57
 if (isset_counter(sensor_AND_2[SENSOR_STATE], NUM_OF_MAX_SENSORS)==isset_counter(sensor_AND_2[SENSOR_ID], NUM_OF_MAX_SENSORS)) { Serial.println(" AND_2 ausgelöst"); memset(sensor_AND_2[SENSOR_STATE], 0, NUM_OF_MAX_SENSORS); }
58
 if (isset_counter(sensor_AND_3[SENSOR_STATE], NUM_OF_MAX_SENSORS)==isset_counter(sensor_AND_3[SENSOR_ID], NUM_OF_MAX_SENSORS)) { Serial.println(" AND_3 ausgelöst"); memset(sensor_AND_3[SENSOR_STATE], 0, NUM_OF_MAX_SENSORS); }
59
60
  stop = micros();
61
  Serial.println(stop - start);
62
63
 
64
  Serial.println();
65
}
66
67
boolean is_valid_sensor_id_OR(byte val) //überprüft, ob ID im Array vorkommt
68
{
69
  for (int i = 0; i < NUM_OF_MAX_SENSORS; i++)
70
  {
71
    if (val == sensor_OR[i])
72
    { 
73
      return true;
74
    }
75
  }
76
  return false;
77
}
78
79
80
bool is_valid_sensor_id_AND_1(uint8_t sensor_id)
81
{
82
   for (size_t i = 0; i < NUM_OF_MAX_SENSORS; i++) {
83
      if (sensor_AND_1[SENSOR_ID][i] == sensor_id) {
84
         sensor_AND_1[SENSOR_STATE][i] = 1;
85
         return true;
86
      }
87
   }
88
   return false;
89
}
90
91
bool is_valid_sensor_id_AND_2(uint8_t sensor_id)
92
{
93
   for (size_t i = 0; i < NUM_OF_MAX_SENSORS; i++) {
94
      if (sensor_AND_2[SENSOR_ID][i] == sensor_id) {
95
         sensor_AND_2[SENSOR_STATE][i] = 1;
96
         return true;
97
      }
98
   }
99
   return false;
100
}
101
102
bool is_valid_sensor_id_AND_3(uint8_t sensor_id)
103
{
104
   for (size_t i = 0; i < NUM_OF_MAX_SENSORS; i++) {
105
      if (sensor_AND_3[SENSOR_ID][i] == sensor_id) {
106
         sensor_AND_3[SENSOR_STATE][i] = 1;
107
         return true;
108
      }
109
   }
110
   return false;
111
}
112
113
int isset_counter(byte arr[], int arrsize)  //überprüft die Anzahl vorhandener Sensoren. 0=kein Sensor
114
{ int count = 0;
115
  for (int i = 0; i < arrsize; i++)
116
  {
117
    if (arr[i] > 0) {
118
      count++;  // wenn ID vorhanden, ID > 0
119
    }
120
  }
121
  return count;
122
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.