Tabelle einlesen und auswerten

Hallo Zusammen,
ich bin gerade an meinem zweiten Arduino Projekt, eine Alarmanlage mit 433MHz Sensoren und Aktoren.
Sensorcodes sind alle ausgelesen und bekannt, auch die Anlage funktioniert bereits mit je einem Sensor und einem Aktor.
Jetzt zu meinem Problem wovon ich aktuell vor lauter Wald den Baum nicht sehe.
Aktuell frage ich so ab: hier ein Auszug davon.
Ich muss dazu sagen, dass ich von C++ bisher keine Ahnung hatte und mich durch meine Projekte versuche schlau zu machen.

//sensorIDList
//FBs
int FB11 = 5297600; //Aus
int FB12 = 5297420; //Ein
int FB13 = 5297456; //AlarmBeleuchtung Knopf 3
int FB14 = 5297411; //Knopf 4
int FB51 = 1396784; //Aus
int FB52 = 1396748; //Ein
int FB53 = 1396739; //AlarmBeleuchtung Knopf 3
// Hier fehlen noch 3 Fernbedienungen

//Fesnter ( Türen
int f1 = 756799; //Fenster Wohnzimmer/Terasse
//hier kommen nocht ca 10 Sensoren dazu

//IR
int wzIR = 8739903;
int wzSab = 8740083;
// Hier kommen noch zwei dazu

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Pin 2

  pinMode(alarmAktivLED, OUTPUT);
  pinMode(alarmRelais, OUTPUT);
  pinMode(strahlerRelais, OUTPUT);
  pinMode(strahlerIR, INPUT);
  //digitalWrite(alarmRelais, HIGH);
  digitalWrite(strahlerRelais, HIGH);
}

void loop() {
  aufSensorWarten(); //Warten auf Sensor Aktivität
  beleuchtung();

  //Anlage Aus
  if ( sensorID == FB51) {
    alarmOff();
    alarmAktiv = LOW;  //Ausschalten
    quitingsTonOff();
  }
  //Anlage Scharf schalten
  if ( sensorID == FB52) {
    alarmAktiv = HIGH;
    quitingsTonOn();
  }

Ich finde die jetzige Abfrage nicht schön und es wird noch unübersichtlicher wenn ich für jeden Sensor und Aktor zusätzliche If Abfragen eintragen muss.
Meine Idee wäre folgende:
Ich hätte gerne die Aktoren und Sensoren in einer Liste aufgeführt, wo sie auch später leicht zu pflegen sind. Ich bräuchte dafür die
Felder: long sensorID, char name, byte alarmLevel.
Nachdem ich mir einiges angelesen habe, müsste ein struct die richtige Wahl sein?
Aber wie lese ich eine Tabelle in die struct Konstellation ein?
und wie kann ich die Daten darin abfragen?
Ich habe schon etwas probiert und die Sensoren in ein Array eingetragen, aber da fehlt mir noch das zweidimensionale für die Auswertung ob es ein Sensor oder Aktor ist. Also auch keine schöne Lösung und von der Pflege auch recht unübersichtlich.
Ich suche keine fertige Lösung, natürlich würde ich die trotzdem annehmen :slight_smile:
Ich brauche Denkanstöße um mich auf den richtigen Weg zu bringen.
Toll wären auch Beispiel Sketche wo man erkennen kann wie Tabellen eingelesen werden und auch wieder ausgelesen werden.

Jetzt aber erstmal ein Dankeschön, dass Du bis hierher überhaupt gelesn hast.
Vielen Dank schon mal

Setze die Daten doch einfach in Arrays.
Die kannst du dann simpel per ID abfragen.

Hallo,

wenn die Namen kurz bleiben und sonst kein großer Speicherverbrauch zubefürchten ist, kannste das ohne Progmem so machen. char array Größe beachten! Anzahl der Zeichen + 1.

struct t_setup
{
  long sensorID;
  byte alarmlevel;
  char name[11];
};

t_setup aktuator[] = {
  {5297600, 44, "Aktuator 0"},
  {1396748, 66, '\0'},          // ohne Name
  {8739903, 99, "Aktuator 2"},
};


const byte ANZAHL = sizeof(aktuator) / sizeof(t_setup);

void setup()
{
  Serial.begin(9600);
  for (byte i=0; i<ANZAHL; i++) {
      Serial.print(aktuator[i].sensorID); Serial.print('\t'); 
      Serial.print(aktuator[i].alarmlevel); Serial.print('\t'); 
      Serial.println(aktuator[i].name);   
  }
}

void loop()
{}
  {1396748, 66, '\0'},          // ohne Name

wäre nicht

  {1396748, 66, ""},          // ohne Name

deutlicher?

Nicht nur deutlicher, sondern etwas ganz anderes. Und dazu noch richtig: entspräche der Strukturdefinition.

Hallo Doc_Arduino,
vielen Dank für Deine rasche Antwort.
Ich hoffe ich darf nachfragen was ich nicht verstehe. Es darf natürlich jeder antworten.

const byte ANZAHL = sizeof(aktuator) / sizeof(t_setup);
was bedeutet: / sizeof(t_setup);
was macht: Serial.print('\t');

Der serial.print Teil steht im Setup, wird also nur einmal durchlaufen? ich kann den Sinn nicht erkennen,
oder ist das nur zur Demo um zu sehen ob er alles ausgibt?

Sorry für die vielleicht saublöden Fragen.

Hallo,

ein Null Terminator kann doch nie falsch sein. Wundert mich jetzt.
Leserlich ist "" natürlich besser als "leer" erkennbar.

Hallo,

Fragen darf jeder. Ich frage andere auch.

sizeof(t_setup) ermittelt die Größe vom struct t_setup. Da sizeof(aktuator) die Gesamtgröße über alles ermittelt, muss man durch die Größe eines Einzelnen struct teilen, damit man die Anzahl der Initialisierten erhält. Eine Abhandlung übern Indexdurchlauf bietet sich immer an sobald mit Indexen gearbeitet wird oder werden kann.
'\t' erzeugt im Terminal nur einen Tabulatorsprung.
Und ja das ist eine Demo für den Zugriff bzw. Syntax. In der loop würde dir die Demo sinnlos das Terminal zuballern.

Hallo,

habe nochmal nachgeschaut.
https://forum.arduino.cc/index.php?topic=583691.msg3972529#msg3972529

Hier wird *test = 0 zugewiesen. Am Ende ist doch 0 oder NULL oder '\0' alles das Gleiche.
Oder habe ich etwas nicht verstanden?

Doc_Arduino:
Am Ende ist doch 0 oder NULL oder '\0' alles das Gleiche.

Ohne in meinem schlauen Buch nachgesehen zu haben behaupte ich mal, dass zumindest 0 und NULL nicht das Gleiche sind. Im ersten Fall zeigt der Zeiger auf Speicherstelle null, im zweiten ist der Zeiger schlicht ungültig.

Gruß

Gregor

Super, dankeschön :slight_smile:

Die Schleife zum auslesen läuft eh nur wenn ein Signal ankommt sensorID = mySwitch.getReceivedValue();

Kann ich den struct in der for Schleife dann genauso auslesen wie ein array?

rentneruwe:
Kann ich den struct in der for Schleife dann genauso auslesen wie ein array?

Wieder ohne Gewähr (ohne nachgesehen zu haben):

Auf die Elemente einer Struktur greifst Du zu wie auf ein Element einer Klasse. Z. B.

bla = z.foo

Dabei ist z die Struktur, foo ist das Element, auf das Du zugreifst.

Wenn Du ein Array von Strukturen hast, benutzt Du z. B.

bla = z[5].foo

Gruß

Gregor

Hallo,

ich vermute er möchte foo in deinem Beispiel, also die structur Elemente durch einen weiteren Index ersetzen. Laut meiner Meinung müßte man mit größeren Aufwand den Speicherbereich ermitteln. Habe ich mir noch keine Gedanken dazu gemacht, weil dass dann die Elementenamen überflüssig machen würde.
Vielleicht sollte man ein 2D Array erstellen und falls Namen für ein Display benötigt werden ein 2. char Array nur für die Anzeige verwenden. ???

Doc_Arduino:
ich vermute er möchte foo in deinem Beispiel, also die structur Elemente durch einen weiteren Index ersetzen. Laut meiner Meinung müßte man mit größeren Aufwand den Speicherbereich ermitteln.

Ich habe schon mit heftigst verschachtelten Strukturen gespielt und hatte IIRC mit Sachen wie

bla = z[4].foo[3].schlonz[99]

keine Probleme. Oder verstehe ich Dich jetzt falsch?

Gruß

Gregor

gregorss:
Ohne in meinem schlauen Buch nachgesehen zu haben behaupte ich mal, dass zumindest 0 und NULL nicht das Gleiche sind. Im ersten Fall zeigt der Zeiger auf Speicherstelle null, im zweiten ist der Zeiger schlicht ungültig.

NULL steht für 0. NULL ist mit 0 definiert. Damit ein Zeiger definiert auf nichts zeigt wurde nullptr eingeführt mit Typsicherheit. Das wurde wegen der Lesbarkeit gemacht. Alle drei Varianten haben die gleiche Wirkung. Probleme gab es immer bei der Lesbarkeit. Ob der Wert 0 oder wirklich "leer" gemeint sein soll. So entnehme ich das meinem Buch.

Doc_Arduino:
NULL steht für 0. NULL ist mit 0 definiert. Damit ein Zeiger definiert auf nichts zeigt wurde nullptr eingeführt mit Typsicherheit. Das wurde wegen der Lesbarkeit gemacht. Alle drei Varianten haben die gleiche Wirkung. Probleme gab es immer bei der Lesbarkeit. Ob der Wert 0 oder wirklich "leer" gemeint sein soll. So entnehme ich das meinem Buch.

Dass man so einen Wert für die Initialisierung eines char-Arrays nehmen kann ist aber doch eher ungewöhnlich.

Doc_Arduino:
NULL steht für 0. NULL ist mit 0 definiert. Damit ein Zeiger definiert auf nichts zeigt wurde nullptr eingeführt mit Typsicherheit. Das wurde wegen der Lesbarkeit gemacht. Alle drei Varianten haben die gleiche Wirkung. Probleme gab es immer bei der Lesbarkeit. Ob der Wert 0 oder wirklich "leer" gemeint sein soll. So entnehme ich das meinem Buch.

nullptr?! Eine Eingabe im Suchfeld ergab 0 Treffer, ein durchscrollen der Referenz war ebenfalls ergebnislos. Habe ich etwas verpasst?

Gruß

Gregor

Die C++ Referenz?

https://en.cppreference.com/w/cpp/language/nullptr

Whandall:
Die C++ Referenz?
nullptr, the pointer literal (since C++11) - cppreference.com

Danke! Diese Referenz kannte ich noch nicht. Und mit C++11 hatte ich bislang auch noch nicht zu tun.

Wieder was gelernt :slight_smile:

Gregor

Gibt es sogar in Deutsch nullptr pointer literal – cppreference.com.