Code verändern und schreiben

Hallo, wo kann ich was lesen oder Erklärungen finden wie der Code funktioniert? Bzw angepasst werden kann?
Ich habe einen Drucksensor an den Arduino angeschlossen und lese mit diesem Code die Daten aus:

int analogPin = 3;     // potentiometer wiper (middle terminal) connected to analog pin 3
                       // outside leads to ground and +5V
int val = 0;           // variable to store the value read

void setup()
{
  Serial.begin(9600);              //  setup serial
}

void loop()
{
  val = analogRead(analogPin);     // read the input pin
  Serial.println(val);             // debug value
}

Jetzt würde ich aber gerne einen Mittelwert hinzufügen der sich aus den Messwerten berrechnet! Und dann noch jedem wert einen bestimmten Druck zuweisen der auf dem Display ausgegeben wird!

Leider weiß ich nicht wie ich den folgenden Code für einen Mittelwert in Sketch einfüge und vor allem wo?

int sensorPin = 3;
int value;
int mean;
 
void setup() { 
  Serial.begin(9600);
}
void loop() {
  value = analogRead(sensorPin);
  mean = mean - mean / 20;
  mean = mean + value; 
  value = value + mean ;
  Serial.println(value/ 20); 
  delay(19);
}

Und wie gebe ich dann jedem Messwert einen bestimmten Ausgabe Druckwert?

Danke euch

Erst mal indem du die beiden Sketche vergleichst und Ähnlichkeiten feststellst.

Dann fragst du dich hoffentlich, warum du nicht nur den zweiten Sketch nimmst.

Und wie gebe ich dann jedem Messwert einen bestimmten Ausgabe Druckwert?

Der Arduino weiss nicht von sich aus, ob er eine Potentiometerstellung oder einen analogen Drucksensor liest. Er misst eine Spannung ( an Pin A3 in deinem Fall ) und gibt einen Wert zwischen 0 (GND) und 1023 ( Vref = Vcc ) aus.
Das kannst du dann beliebig weiter verrechnen und hängt von deinem Sensor ab.

float druck = value *10.0 / 1023; // 0.0 bei 0V 10.0 bei Vcc
Serial.println(druck);  // druck wird als Zahl zwischen 0.00 10.00 angezeigt

Oder da verstehe ich eventuell die Frage nicht.

Wie der Code generell funktioniert kannst du in der Reference lesen, und wenn du die durch hast, solltest du wissen, dass "die Arduino-Sprache" C++ ist. Da findest du dann viel Hintergrundmaterial.

Danach kannst du noch wissen, dass für "richtige Arduinos" der avr-gcc Compiler mit seinen Laufzeit-Bibliotheken verwendet wird.

Aber wenn du dir alle mitgelieferten Beispiele angeschaut hast, sind wohl die selbstgefundenen Beispiele auch nicht mehr gar so seltsam.

1023

Wäre nicht 1024 besser?
(wenn es auch nicht viel Fehler in sich trägt)

combie:
Wäre nicht 1024 besser?
(wenn es auch nicht viel Fehler in sich trägt)

An der ersten Stelle Nein (0..1023), beim zweiten mal Ja. ( ... / 1024 )
Ich hoffte, durch diesen Fehler diese Diskussion hier mal zu vermeiden.

michael_x:
Ich hoffte, durch diesen Fehler diese Diskussion hier mal zu vermeiden.

Das erscheint mir extrem kontraproduktiv.

int sensorPin = 3;
int value;
int mean;
 
void setup() {
  Serial.begin(9600);
}
void loop() {
  value = analogRead(sensorPin);
  mean = mean - mean / 20;
  mean = mean + value;
  value = value + mean ;
  Serial.println(value/ 20);
  delay(19);
}

Wofür steht in der Formel genau die 20? Ist das die Menge der Wert die zur Durchschnittsberrechnung einbezogen werden?

Der Sensor kann also Werte zwischen 0 und 1023? Kann der Hersteller des Drucksensor mir sagen welchen Wert bei welchem Druck geben sollte? Oder muss ich das selber heraus finden?

Grüße

Wofür steht in der Formel genau die 20? Ist das die Menge der Wert die zur Durchschnittsberrechnung einbezogen werden?

Erstens:
Das ist keine Durchschnittsberrechnung, sondern ein Tiefpass Filter.

Zweitens:
Die 20 sagt, wie stark neue Werte in den gefilterten Wert eingehen.


Die 20 entspricht in etwa der Anzahl Werte,welche in einem Array gehalten werden, um einen echten Durchschnitt berechnen zu können.
Damit hast du also halbwegs recht.

Allerdings:
Die Kurven für den echten Durchschnitt und den Tiefpass liegen nahe beieinander, oft aufeinander, sind aber nicht identisch.


Der Sensor kann also Werte zwischen 0 und 1023?

Es ist der ADC des Arduino, welcher diese Werte liefert.

Kann der Hersteller des Drucksensor mir sagen welchen Wert bei welchem Druck geben sollte?

Im Datenblatt des Sensors solltest du klare und eindeutige Angaben finden, was der Sensor liefert.

Oder muss ich das selber heraus finden?

Datenblatt lesen
Schaltung analysieren.
Berechnen, was es zu berechnen gibt.

legt analogRead() automatisch den Pin als Eingang fest?
wenn nicht fehlt dir im setup pinMode(pin, INPUT)

Alle AVR Arduino Pins sind per Default Inputs.
Ein pinMode(pin, INPUT) ist bei AVRs also generell flüssiger als Wasser, überflüssig!
(bei anderen µC kann/wird das anders sein)

Die Arduino Doku ist da recht klar:

The analogRead command will not work correctly if a pin has been previously set to an output, so if this is the case, set it back to an input before using analogRead. Similarly if the pin has been set to HIGH as an output, the pull-up resistor will be set, when switched back to an input.

Aus: AnalogInputPins

Wobei ich “will not work correctly” nicht so sehe!
Ein High Pin liefert immer 1023
Ein Low Pin immer 0
Das halte ich für voll korrekt.

Wenn man diese Outputs überlastet, stellen sich auch andere Werte ein.
Man kann so also auch die Überlastung eines Pins feststellen.
Wobei ich von solchen Überlastungen dringend abraten möchte.


Eine interessante Spezialität ist der Resetpin des ATTiny85 (und seiner Brüder).
Diesen kann man bis zum erreichen der Resetschwelle auch nebenbei noch als Analog Input nutzen.

combie:
Wobei ich "will not work correctly" nicht so sehe!
Ein High Pin liefert immer 1023
Ein Low Pin immer 0
Das halte ich für voll korrekt.

Das sehe ich anders.
Nicht korrekt arbeitet heißt für mich daß die analoge Spannung die man messen will nicht korrekt gemessen wird. Dieser Satz steht ja in der Beschreibung von analogRead nicht in der Beschreibung von digitalWrite.
Also ist meinem Verständnis nach die Aussage korrekt.
Deine Betractungsweise ist in Funktion des Innenwiderstand der Analogspannungsquelle realitivierbar.
Grüße Uwe

Arne schrieb

Wofür steht in der Formel genau die 20? Ist das die Menge der Wert die zur Durchschnittsberrechnung einbezogen werden?

Der Sensor kann also Werte zwischen 0 und 1023? Kann der Hersteller des Drucksensor mir sagen welchen Wert bei welchem Druck geben sollte? Oder muss ich das selber heraus finden?

Grüße


Hallo,
sorry ich hab den Quote gelöscht

Der verwendete Code wird auch als gleitender Mittelwert bezeichnet, er eignet sich hervorraged dazu Messwerte die zum zappeln neigen zu glätten. (Tiefpass) In der Regel reichen dazu 4-6 Messwerte aus, wenn man zu viele nimmt wird das natürlich langsam.

Ich hab das jahrelang auch bei SPS Steuerungen verwendet. Im code schnipsel ist das in einer Funktion zusammengefasst, die als Rückgabe den gemittelten Wert enthält. Zudem zeigt das Beispiel wie Parameter an eine Funktion übergeben werde können. Eingabe / Ein & Ausgabe / Returnwert.

Da du ja deine Messwerte in eine physikalische Grösse z.B Druck umrechnen willst, wirst Du ja letzlich Dein Ergebniss als reale Zahl = float benötigen. z.B 10,5 bar. Oder wie hier schon gezeigt die Spannung z.B 2,53Volt

Eigendlich würde man in dem konkreten Fall allerdings zuerst glätten und dann in float skalieren. Ist schneller, obs auch genau ist kann ich nicht beantworten , schliesslich gibst bei der Berechnung als Int oder long auch Rundungsfehler, müsste man mal probieren.

Als nächsten Lernschritt kannst Du ja dann mal versuchen die Funktion in Deinen Code einzubauen.

im allgemeinen Teil benötigst dazu noch eine float Variable als buffer

float buffer;

und den Aufruf in dieser Art

Druck=mittelwert(Messwert,buffer,20);

// Berechnung gleitender Mttelwert--------------
float mittelwert( float Rohwert, float &buff, float faktor)
{
  float mi ;
  buff = buff - buff / faktor;
  buff = buff + Rohwert;
  mi = buff / faktor;

  return mi;

}