Verständnisfrage

Hallo,

ich habe kurz eine Frage zu dem Befehl von folgende Link Mittelwert von meinen Sensorwerten - Deutsch - Arduino Forum

Was soll mit der Zahl 102.0 ausgesagt werden?

const float SensorOffset= 102.0;

Wie bekomme ich z.B. ein Offset weg, wenn ich trotz folgender Funktion
druck = (analogRead(A0) - SensorOffset)

eine Abweichung von z.B. 2mbar habe?

Vielen Dank für die Hilfe :slight_smile:

102 / 1024 * 5V = 0,5 V Offsetspannung

In der Programmiersprache C bzw C++ gibt es keine Befehle sondern Funktionen.

Wie bekomme ich z.B. ein Offset weg, wenn ich trotz folgender Funktion
druck = (analogRead(A0) - SensorOffset)

eine Abweichung von z.B. 2mbar habe?

Wenn die Abweichung konstant ist indem Du den Offsetwert änderst.
Wenn die Abweichung sich änder indem Du eine genauere A/D Wandler nimmst oder/und einen genaueren Sensor.

Grüße Uwe

Vielen dank agmue und Uwe für die Antwort :slight_smile:

kann ich bei einer Abweichung von 2mbar trotz der Funktion druck=(analogRead(A0)-SensorOffset) das Wert bei der Funktion abziehen? wenn ja wie würde ich es bei dieser funktion angeben?

z.B. druck=(analogRead(A0)-SensorOffset)-2 ist das so richtig?

Hi

Klar - ist für den Arduino eh nur eine Zahl. (Was die Sache manchmal nicht einfacher macht - was man kann und was Sinn machen würde)
Am Ende der Zeile erwartet der Kompiler aber zwingend ein ;

MfG

ist das so richtig?

Wenn du einen Offsetfehler hast, und eine Variable/Konstante um den Offsetfehler zu korrigieren, dann frage ich mich:

  1. Warum passt du die nicht an?
  2. Und warum ist der Korrekturwert float?

Zu 2:
Ok, das kann Sinn machen, aber solange das drumrum unbekannt ist, sieht das schon etwas komisch aus.

Auch ich würde die Konstante SensorOffset an meine Bedürfnisse anpassen und nicht einen Wert zusätzlich subtrahieren. Dies weil es klarer im Sketch ist und weil das so in allen berechnungen einfließt und Du nicht jede Formel jedesmal ändern mußt sondern nur den SensorOffset.

Grüße Uwe

  1. Warum passt du die nicht an?
  2. Und warum ist der Korrekturwert float?

Zu 2:
Ok, das kann Sinn machen, aber solange das drumrum unbekannt ist, sieht das schon etwas komisch aus.

Wie ich es oben beschrieben habe, habe ich die Zeile mit dem float Offset aus folgende link
https://forum.arduino.cc/index.php?topic=436749.0

Ich versuche zu verstehen wie ich ein offsetfehler korrigieren kann.
So wie ich es aus Euren Kommentar verstehe, soll der wert 102 geändert werden? Aber dann stellt sich die Frage wie ist es wenn ich mehr als ein Sensor habe die unterschiedliche Offsetfehler haben (z.B. erste Sensor 2mbar, zweite Sensor 3mbar)? Dann müsste ich doch einzeln subtrahieren?

Ich möchte gerne verstehen wie man ein offsetfehler programmtechnisch löst ohne an dem sensor was zu machen.

Wenn du mehrere Sensoren hast, dann solltest du die in ein Array stopfen und dort die Kalibrierwerte lagern. Oder auch im EEPROM, welches u.A. genau für solche Zwecke erfunden/eingebaut wurde

Mantra:

  1. Habe ich mehrere Dinge, welche zusammengehören, dann stecke ich sie in eine Struktur.
  2. Habe ich mehrere Dinge/Strukturen, welche gleich (oder hinreichend ähnlich) sind, stopfe ich sie in ein Array(oder einen anderen Container).

Wie ich es oben beschrieben habe, habe ich die Zeile mit dem float Offset aus folgende link
Mittelwert von meinen Sensorwerten - Deutsch - Arduino Forum

Das machts nicht besser....

Denn ohne verstehen/Reflektion werden eher die Fehler/Irrtümer übernommen, als die Genialitäten.

Wenn Du mehrere Sensoren hast dann hat jeder seinen Offsetwert und darum seine Offsetkonstante.

const float SensorOffset0= 105.0;  // offset 0,5V +2 Korrektur Sensor1
const float SensorOffset1= 104.0; // offset 0,5V +3 Korrektur Sensor2

Es ist einfacher den Offsetwert am Anfang des Sketches zu bestimmen und nicht mitten im Sketch was dazu oder wegrechnen oder falls in mehreren Stellen verwendet dann müßtest Du an mehreren Stellen korrigieren.

Bei vielen Sensoren (mehr als 2) ist es einfacher ein Array zu benutzen weil man dann die Umrechnung in einer Schleifen machen kann.

Grüße Uwe

combie:
Denn ohne verstehen/Reflektion werden eher die Fehler/Irrtümer übernommen, als die Genialitäten.

Dazu braucht man aber Hintergrundwissen um zu verstehen was Genialitäten sind und was Fehler/Irrtümer.
Ein Anfänger tut sich da schwer.

Grüße Uwe

uwefed:
Dazu braucht man aber Hintergrundwissen um zu verstehen was Genialitäten sind und was Fehler/Irrtümer.
Ein Anfänger tut sich da schwer.

Genau darum ist es sehr problematisch, wenn Anfänger sich was von Anfängern abschauen. Denn dann potenziert sich das Problem.

Das liegt in der Natur der Dinge/Menschen.
Nur abwendbar durch Wissen anschaffen und üben, viel üben.

Hier mal meine Variante, wie ich das strukturieren würde:

struct DruckSensor
{
  const byte aPin;
  const int korrekturWert;

  int get()
  {
    return analogRead(aPin)-korrekturWert;
  }
};

DruckSensor sensoren[] {/* {pin,korrektur}, */
                           {A0 ,  102    },
                           {A1 ,  104    },
                           {A2 ,  101    },
                       };



void setup() 
{
  Serial.begin(9600);      
  Serial.println("Start");
}

void loop() 
{
  Serial.println("Lese Sensoren");
  for (DruckSensor &s:sensoren) Serial.println(s.get());
  Serial.println("Warte");
  Serial.println();
  delay(5000);
}

(ob genial, oder nicht, darf jeder für sich selber entscheiden)

Wenn eine Filter Funktion gewünscht wird, ist auch diese ganz gut in der DruckSensor Struktur unter zu bringen

Danke :slight_smile:

uwefed:
In der Programmiersprache C bzw C++ gibt es keine Befehle sondern Funktionen

Es gibt auch noch Operatoren und Anweisungen. Das Problem ist dass Leute das alles zu "Befehlen" vereinfachen. Dadurch gehen die Unterschiede verloren und sie verstehen nicht dass das bestimmte Dinge genau definierten Regeln folgen

Maria2:
Danke :slight_smile:

Gerne doch...
Schön, dass es dir gefällt!

Dann hoffe ich mal, dass es dir hilft, dieses und weitere Projekte zu strukturieren.

Ich habe leider ein weiteres Problem. Ich hab ein Motor (Pumpe) an einem relais von arduino angeschlossen und versuche es mit den Befehl Low auszuschalten. Leider funktioniert es nicht. Er geht bisschen runter, aber leider nicht ganz aus.

Unten der Code:

const int Pumpe =   11;
void Pumpereg(){
   digitalWrite(Pumpe, LOW);
 }
void setup() {
pinMode(Pumpe, OUTPUT);
Serial.begin(9600);

}
void loop() {
Pumpereg();
}

eigentlich muss die doch bei diesem Befehl ausgehen? Die Pumpe läuft kontinuierlich.

Erkennt jemand mein fehler?

Danke :slight_smile:

Maria2:
Leider funktioniert es nicht. Er geht bisschen runter, aber leider nicht ganz aus.

Das verstehe ich nicht, was geht runter?

Die meisten Relaismodule schalten bei LOW ein.

Gruß Tommy

mit runter gehen meine ich die lautstärke vom motor, aber es wird nicht ganz ausgeschaltet.
Leider ist er bei Befehl High auch an.

Ich hab ein Motor (Pumpe) an einem relais von arduino angeschlossen

Bewegt sich denn das Relais?

Oder wie soll man diesen Satz verstehen? Skizze?