Show Posts
Pages: 1 ... 84 85 [86] 87 88 ... 163
1276  International / Deutsch / Re: Relais-Problem (SaintSmart) mit 3-Wege-Ventil on: July 26, 2013, 09:56:59 am
Ich meine: das kann doch nicht sein! Ich habe schon daran gedacht, dass die Diode der Relaiskarte zickt - dazu sind aber die Optokoppler doch da, um das auszubügeln.

Diagnose?

Diagnose hast Du doch schon selbst gemacht: Wenn der Motor des Ventils dieses zu Ende gedreht hat, stoppt der Motor automatisch und just in diesem Augenblick stürzt meine Steuerung in der Regl ab.

Mit dem Motor schaltest eine sogenannte "induktive Last", und wenn diese induktive Last abgeschaltet wird, baut sich aus dem in der Motorwicklung gespeicherten Magnetfeld kurzfristig eine Induktionsspannung auf, die ein mehrfaches der geschalteten Spannung beträgt.

Läuft der Motor auf Gleich- oder auf Wechselstrom? Motordaten?

Und was hast Du als Löschschaltung für die Begrenzung der Überspannung beim Abschalten des Motorstroms vorgesehen?

Wahrscheinlich "gar nix" wenn ich mal raten darf und Deine Fehlerbeschreibung lese.
1277  International / Deutsch / Re: Ethernet Shield - welche Ports werden benötigt? on: July 26, 2013, 05:19:34 am
Welche Pins müssen verbunden sein, damit das Shield läuft?

Hilft Dir
http://shieldlist.org/arduino/ethernet-v5
mit den dort geposteten Anmerkungen (zu SD-Kartenschacht, ggf. optional verlöteter Lötbrücke etc.) vielleicht weiter?

Deins ist zwar ein China-Nachbau und nicht das Original, sollte aber soweit passen.
1278  International / Deutsch / Re: Projekt: Schrittmotor on: July 25, 2013, 02:55:47 pm
vielen dank jurs, dass hat funktioniert. werd mir dass mal gleich richtig ansehen

Nur zu! Und wie erwähnt, kannst Du statt auf die ASCII-Codes der Zeichen auch direkt auf die Zeichen prüfen, d.h.

  if (x==49) clkEin=true;
  else if (x==48) clkEin=false;
ist völlig gleichbedeutend mit:
  if (x=='1') clkEin=true;
  else if (x=='0') clkEin=false;

1279  International / Deutsch / Re: Projekt: Schrittmotor on: July 25, 2013, 02:39:51 pm
Ich möchte dass wenn ich in die Konsole 1 eingebe die CLK generiert wird und wenn ich eine 0 eingebe, dass Programm anhält.

Da solltest Dir erstmal klar darüber werden, was eigentlich gesendet wird, wenn Du "1" oder "0" eingibst und sendest.

Der serielle Monitor von Arduino sendet immer Zeilenweise. Jede Zeile wird mit den beiden Steuerzeichen CR (Carriage Return, ASCII-13) und LF (Linefeed, ASCII-10) abgeschlossen.

Das gesendete Zeichen wird in ASCII-Zeichencodierung gesendet, also für "0" eine ASCII-48 und für "1" eine ASCII 49.

D.h. wenn Du "1" sendest, sendest Du tatsächlich: 49 13 10
Und wenn Du "0" sendest, sendest Du tatsächlich: 48 13 10

Du kannst z.B. die Daten laufend auslesen und im Fall, dass 49 und 48 gelesen werden, entsprechend reagieren:

Code:
void loop()
{ char x;
  static boolean clkEin=false;
  x = Serial.read();
  if (x==49) clkEin=true;
  else if (x==48) clkEin=false;
  else ; // ist egal
  if (clkEin)
     {
        digitalWrite(CLK, HIGH); // CLK einschalten
        delay(5);
        digitalWrite(CLK, LOW); // CLK ausschalten
        delay(5);  
     }
}
1280  International / Deutsch / Re: Arduino Ethernet Rev3 Dyn DNS on: July 25, 2013, 09:21:06 am
Nein, er ist nicht an einen Home-DSL-Router angeschlossen. Ich habe die Netzwerkadministration nicht vorgenommen und muss mich erst einarbeiten. Aber danke nochmal für die viele Hilfe. Falls ich noch weitere Fragen haben sollte, werde ich mich hier wieder melden.

OK, nochmal zu Deinem "nicht verbunden" Fehler nach der Zeile:
Ethernet.begin(mac, ip, gateway, subnet);

Diese Intitialisierung gibt es gar nicht, siehe http://arduino.cc/de/Reference/EthernetBegin

Eine Initialisierung mit vier Parametern steht für:
Ethernet.begin(mac, ip, dns, gateway);

Wenn Du unbedingt die Subnetzmaske vorgeben möchtest und der Router gleichzeitig sowohl Internet-Gateway als auch DNS-Server gleichzeitig ist (so ist es zumindest bei DSL-Home-Routern), kannst Du es für eine rein manuelle Netzwerkkonfiguration eher versuchen mit:
  Ethernet.begin(mac, ip, gateway, gateway, subnet);
1281  International / Deutsch / Re: The Arduino starter kid on: July 25, 2013, 08:43:23 am
ich habe ein Arduino starter kit von meinem Ausbilder erhalten.
Leider sind meine Englisch Kenntnisse nicht ausreichend, um die Aufgaben aus
dem begelegten Buch zu erledigen.
Aus diesem Grund wollte ich nachfragen, ob es eine deutsche Ausgabe von dem
Arduino projects book gibt.

Gedruckte Bücher unterliegen im allgemeinen dem Urheberrecht bzw. Copyright und dürfen gar nicht mal einfach so von irgendwem übersetzt werden. Übersetzungen bedürfen der ausdrücklichen Zustimmung des Autoren, und im allgemeinen ist es so, dass wenn der Buchautor ein Honorar für sein Buch erhält, auch Lizenzen für übersetzte Auslandsausgaben nur gegen Zahlung eines Honorars vergeben werden. Auskünfte ob es eine deutsche Ausgabe des Buches gibt und welchen genauen Namen die Ausgabe hat, erfragst Du am besten beim Autoren des Buches.

Wenn es kein Buch in deutscher Sprache gibt, schaust Du Dir am besten an,
- welche Hardware in den Beispielen verwendet wird
- und was damit gemacht wird

Bei einem Anfängerbuch wird es um sehr einfache Hardware gehen (Taster, LEDs, Widerstände, Relais, etc.) und um sehr einfache Standardaufgaben, die damit erledigt werden. Da müßtest Du dann mal das deutsche Google befragen, mit Suchbegriffen wie "Arduino" und "Name der Hardware" bzw. "Name der Aufgabe" als Suchbegriffkombination, oder anderen geeigneten Suchbegriffen, um darüber etwas zu finden.

Du kannst auch mit Google-Chrome auf englischsprachige Seiten gehen, der Browser bietet Dir standardmäßig eine Radebrech-Übersetzung per Google-Translate an, wenn die Browser-Spracheinstellung Deutsch ist und die aufgerufene Seite in einer anderen Sprache. Aber das ist eine ziemliche Krücke.
1282  International / Deutsch / Re: Arduino Ethernet Rev3 Dyn DNS on: July 25, 2013, 07:40:20 am
Aber ich bekomme als Rückgabewert "Verbindung fehlgeschlagen". Könnt ihr vielleicht den Fehler finden und mir sagen was ich falsch gemacht habe?

Ich kenne Deine Netzwerkkonfiguration nicht.

Wenn ich mal raten soll: Die von Dir gewünschte feste IP-Adresse für den Client wird von Deinem Router nicht als Netzwerkadresse akzeptiert, möglicherweise weil sie in den Bereich fällt, der für die dynamische Adressenvergabe per DHCP im Router reserviert ist.

Wenn es um einen Client geht, lasse ihn doch auf einer per DHCP vom Router vergebenen IP-Adresse laufen!
Beispielcode siehe unter "Datei - Beispiele - Ethernet - Webclient".

Ich gehe mal davon aus, dass der Arduino an einen gewöhnlichen Home-DSL-Router mit DHCP angeschlossen wird, oder?
1283  International / Deutsch / Re: Arduino Ethernet Rev3 Dyn DNS on: July 25, 2013, 06:42:53 am
Nur leider wüsste ich gerne, wie ich im Sketch definiere, dass er die Daten an einen Dyn DNS Server, z.B. InternetistfürunsalleNeuland.de sendet und nicht an eine fest vorgegebene IP.

Der Zugriff auf eine "Webadresse mit Namen" ist vollkommen unabhängig davon, ob der Name "dynamisch" oder "statisch" per DNS aufgelöst wird. Ob Du also auf den Server "www.arduino.cc" oder "InternetistfuerunsalleNeuland.de" zugreifst, macht von der Programmierung her absolut keinen Unterschied.

Falls der Zugriff auf einen Webserver an Port-80 erfolgen soll, also beispielsweise:

char server[]="InternetistfuerunsalleNeuland.de";
...
  if (client.connect(server, 80)) {
    Serial.println("connected");
...

Die client.connect() Methode aus der Ethernet-Library hat nämlich nicht nur die Möglichkeit, dass Du sie mit einer IP-Nummer und Portnummer aufrufen kannst, sondern Du kannst sie auch mit einem C-String und einer Portnummer aufrufen, und dann löst die Library den Namen für den Server selbst auf.

[Edit] Ich habe mal den Umlaut aus dem Domainnamen in der Beispiel-Codezeile herausgenommen, denn so funktioniert das nur für Domainnamen ohne Umlaute. Der Zugriff auf Umlaut-Domains erfordert die vorherige Umwandlung des Umlauts nach bestimmten Regeln.
1284  International / Deutsch / Re: Arduino Ethernet Rev3 Dyn DNS on: July 25, 2013, 06:01:33 am
Nun meine Frage: Ist es möglich, dem Arduino mitzuteilen, das er an eine best. Dyn DNS Adresse schicken soll, oder geht wie ich schon in Foren gelesen habe, nur der umgekehrte Weg, dass man dem Arduino eine Dyn DNS vergibt und ihn abfragen muss um die Daten zu protokollieren.

Wie stellte schon Angela M. fest: "Das Internet ist für uns alle Neuland!"
 smiley-twist

Natürlich kann ein Arduino mit Ethernet-Shield nicht nur als Server fungieren und auf Anfragen von einem Client (z.B. Web-Browser) antworten, sondern kann genauso gut als Client fungieren und Verbindung zu einem im Internet laufenden Server aufnehmen und diesem Daten senden.
1285  International / Deutsch / Re: Probleme mit Serieller Verbindung / AT-Befehle GSM on: July 24, 2013, 05:16:06 am
Zum speichern in einer Variable habe ich jetzt aber auch noch eine Frage...

Wie kann ich am besten von dem Output des Handys (bzw. vom Serial Monitor):
...
nur die dritte Zeile, also den "PDU-Code" in eine Variable packen bzw. wie kann man die anderen ausnehmen? Und welchen Variablentyp verwende ich dafür am besten? Ich vermute char?

Indem Du erstmal jede empfangene Zeilen in eine Variable einliest und beim Einlesen der Zeileninhalte auch die Anzahl der empfangenen Zeilen mitzählst, z.B. (teste mal):
Code:
void setup(){
 
Serial.begin(9600);
Serial1.begin(9600);
delay(3000);
Serial1.println("AT+CPMS=\"ME\",\"ME\",\"ME\""); //Auf internen Telefonspeicher umschalten
delay(3000);
}

boolean SendeAlle10Sekunden()
// Rückgabewert
// false: Es wurde nichts gesendet
// true: Es wurde nach Zeitablauf ein Befehl gesendet
{
  static unsigned long lastMillis;
  if (millis()-lastMillis>10000)
  {
    lastMillis=millis();
    Serial1.println("AT+CMGL=4"); //Alle Nachrichten auslesen
    Serial.println("Befehl gesendet: AT+CMGL=4");
    Serial.println("Antwort:");
    return true;
  }
  else return false;
}


char linebuf[81];
char charcounter=0;
byte linecounter=1;

void loop()
{
  char c;
  if (SendeAlle10Sekunden())
  {
    memset(linebuf,0,sizeof(linebuf)); // Zeilenpuffer löschen
    charcounter=0; // Zeichenzähler auf 0
    linecounter=1; // Zeilenzähler auf 1
  }
  while(Serial1.available() > 0)
  {
    c=Serial1.read(); // Zeichen auslesen
    if (c>=32) // ASCII-Code Leerzeichen oder höher
    {
      linebuf[charcounter]=c;  // Zeichen in den Zeilenpuffer einfügen
      if (charcounter<sizeof(linebuf)-1) charcounter++;
    }
    else if (c==13) // CR Zeilenende ("Carriage Return")
    { // Jetzt ist eine Zeile komplett empfangen worden
      Serial.print("Zeile ");
      Serial.print(linecounter); // Zeilennummer
      Serial.print(": ");
      Serial.println(linebuf);  // Inhalt der empfangenen Zeile
      memset(linebuf,0,sizeof(linebuf)); // Zeilenpuffer löschen
      charcounter=0; // Zeichenzähler auf 0
      linecounter++; // Zeilenzähler erhöhen
    }
    else ; // Sonstige Steuerzeichen ignorieren
  }
}

Die geeignete Datenstruktur zum Speichern von Zeichenketten ist bei C immer ein Char-Array. Ich habe mal eins von 81 Zeichen Länge reserviert, das würde für einen String von max. 80 Zeichen Zeilenlänge ausreichen.

Und wenn Du eine bestimmte Zeile haben möchtest, dann machst Du statt:
      Serial.print("Zeile ");
      Serial.print(linecounter); // Zeilennummer
      Serial.print(": ");
      Serial.println(linebuf);  // Inhalt der empfangenen Zeile
eben sowas wie
      if (linecounter==3) ... verarbeite den Inhalt von linebuf weiter
1286  International / Deutsch / Re: Probleme mit Serieller Verbindung / AT-Befehle GSM on: July 24, 2013, 03:37:41 am
Ich habe diesbezüglich noch keine vergleichbaren Probleme gefunden und hoffe dass mir hier geholfen werden kann. Ich probiere nun wirklich schon Ewigkeiten herum und komme nicht voran. Ebenso hoffe ich mal dass mein erster Post so in Ordnung war smiley-wink

Willkommen im Forum!

Ich reiße die Problemfelder in Deinem Sketch mal an:

1. Befehle senden und verarbeiten
Ein Handy verarbeitet keine Befehle in Nullzeit und es kommt in Nullzeit auch keine Antwort. Du mußt daher nach dem Absenden eines Befehls abwarten, dass das Handy den Befehl verarbeitet und seine Antwort zurücksendet. Erst dann kannst Du im Eingangspuffer etwas auslesen.

2. Du kannst bei einem einmaligen Auslesen des Eingangspuffers maximal 63 Zeichen auf einmal auslesen, weil mehr Zeichen nicht in den Eingangspuffer des Arduino hineinpassen. Wenn mehr als 63 Zeichen empfangen werden sollen, muss das Einlesen immer in mehreren Durchgängen erfolgen.

3. Serielle Schnittstellen sind langsam, bei 9600 Baud geht 1 Zeichen pro Millisekunde über die Leitung. Und trotzdem: Der Eingangspuffer einer seriellen Schnittstelle im Arduino ist 63 Zeichen groß und kann daher innerhalb von 63 Millisekunden volllaufen. Danach eintreffende Zeichen gehen verloren. D.h. Du darfst nirgendwo die Programmausführung für mehr als 63 Millisekunden anhalten (bei 9600 Baudrate). Eine Blockierung von 5000 Millisekunden für ein solches Programm ist ein völliges No-Go, das geht gar nicht!

Der erste Schritt wäre nun mal, den Sketch so zu ändern, dass
- kein delay im Programmcode vorkommt und
- trotzdem nicht ständig neue Befehle mit der Loop-Drehzahl gesendet werden

Probier das mal, dieser Code sendet alle 10 Sekunden einen Befehl (das erst mal 10 Sekunden nach Programmstart) und liest zwischendurch ständig die eintreffenden Zeichen aus:
Code:
void setup(){
 
Serial.begin(9600);
Serial1.begin(9600);
delay(3000);
Serial1.println("AT+CPMS=\"ME\",\"ME\",\"ME\""); //Auf internen Telefonspeicher umschalten
delay(3000);
}

void SendeAlle10Sekunden()
{
  static unsigned long lastMillis;
  if (millis()-lastMillis>10000)
  {
    lastMillis=millis();
    Serial1.println("AT+CMGL=4"); //Alle Nachrichten auslesen
    Serial.println("Befehl gesendet: AT+CMGL=4");
    Serial.println("Antwort:");
  }
}

void loop()
{
  SendeAlle10Sekunden();
  while(Serial1.available() > 0)
  {
    Serial.write(Serial1.read());
  }
}

Und wenn das hinhaut, kannst Du im nächsten Schritt die eintreffenden Zeichen in einen eigenen Eingangspuffer als Variable zur weiteren Verarbeitung einlesen.
1287  International / Deutsch / Re: Arduino Robot on: July 23, 2013, 08:13:26 am
Weiß jemand von euch wann der Arduino Robot erhältlich sein wird?

Nein.

Aber ich frage mal meinen Webbrowser, der sagt "Ende August":
http://arduino.cc/en/Main/TempRobotSale

Wahrscheinlich zuerst im Arduino-Shop und dann einige Wochen später auch bei den Distributoren.
1288  International / Deutsch / Re: Öl Temperatur messen, welcher Öltemperaturgeber? (KFZ) on: July 23, 2013, 06:51:26 am
Werde diese auch  Testen und Dir berichten.

Alles klar, da bin ich ja mal gespannt!

Übrigens Kommando zurück was die Berechnung des Vorwiderstands betrifft: Der Strom fließt ja gar nicht über einen Digitalpin des Controllers, sondern nur zwischen 5V und GND. Und am 5V Pin des Arduino Boards darf man bei den meisten Boards bis zu 200mA entnehmen, die 40 mA Grenze für Controller-Pins greift daher NICHT.

Ich weiß nicht, wieviel Strom der Ödruckgeber maximal verkraftet und konnte auch keine Datenblattangaben dazu finden, aber ich schätze mal, dass der schon deutlich mehr als 40mA verkraftet. Um möglichst viel von der 10-Bit ADC Auflösung des Arduino auszunutzen, wäre es daher wahrscheinlich sinnvoller, eher einen Vorwiderstand zu verwenden, der im Bereich des Widerstands des Öldruckgebers liegt. Z.B. 82 Ohm Vorwiderstand. Der Maximalstrom bei 82 Ohm Vorwiderstand und 10 Ohm bei Nulldruck am Geber beträgt dann:
I = U/R = 5 / (82+10) = 54 mA

Das gibt der 5V Pin am Arduino locker her und auch der Geber sollte das locker verkraften.
Also vielleicht doch eher 82 Ohm Vorwiderstand statt 180 Ohm.
Prinzipiell funktionieren sollte beides.

Zum Messen natürlich keine Widerstände mit 10% oder 20% Toleranz verwenden, sondern welche mit höchstens 1% Toleranz (oder noch bessere "Messwiderstände"), sonst nützt die genaueste Formel nichts.
1289  International / Deutsch / Re: Öl Temperatur messen, welcher Öltemperaturgeber? (KFZ) on: July 23, 2013, 01:58:51 am
Die Interpolationsfehler der von mir aufgestellten Formel von 0,02 bis 0,04 bar an einigen Punkten der Messkurve sind zu verkraften, oder muss es genauer gerechnet werden?

Ach, was soll's, die verlinkte Seite zum Auflösen von Gleichungen erlaubt auch umfangreichere Gleichungssysteme, also mache ich mir jetzt mal die Mühe zur Aufstellung einer Formel für eine lineare Gleichung vierter Ordnung aus allen fünf Punkten für eine noch genauere Interpolationsformel.

0 = a * 104 + b * 103 + c * 102 + d * 10 + e
1 = a * 484 + b * 483 + c * 482 + d * 48 + e
2 = a * 824 + b * 823 + c * 822 + d * 82 + e
3 = a * 1164 + b * 1163 + c * 1162 + d * 116 + e
5 = a * 1844 + b * 1843 + c * 1842 + d * 184 + e
ausmultipliziert zum Einsetzen auf der Webseite:
0 = 10000a + 1000b + 100c + 10d + e
1 = 5308416a + 110592b + 2304c + 48d + e
2 = 45212176a + 551368b + 6724c + 82d + e
3 = 181063936a + 1560896b + 13456c + 116d + e
5 = 1146228736a + 6229504b + 33856c + 184d + e
Lösung:
  float a = 2.331362828169e-9;
  float b = -1.00248601611e-6;
  float c = 1.498600025947e-4;
  float d = 0.020190012411;
  float e = -0.21590695198;

Die Schaltung und die Variablen wie gehabt:
Code:
Öldruck-Messschaltung mit veränderlichem Messwiderstand

VB -----<Vorwiderstand>-----<Messwiderstand>----- Ground 0V
5V            RV         |        RN
                         |      
                         |      
                    Analogeingang
                      am Arduino
VA
mit
VB = Betriebsspannung des Arduino (irgendwo bei ca. 5V)
RV = Vorwiderstand
RN = Widerstand des Messwiderstands (in diesem Fall druckabhängig!)
VA = Spannung am Arduino-Messeingang

Code:

/* VDO oil pressure calculation by 'jurs' for German Arduino Forum

Für den 5bar VDO-Öldrucksensor mit dieser Wertetabelle:
0 bar  -  10 Ohm
1 bar  -  48 Ohm
2 bar  -  82 Ohm
3 bar  - 116 Ohm
5 bar  - 184 Ohm

Interpolation mit Hilfe eines Polynoms vierter Ordnung:
p = a*x^4 + b*x^3 + c*x^2 + d*x + e
0 = 10000a + 1000b + 100c + 10d + e
1 = 5308416a + 110592b + 2304c + 48d + e
2 = 45212176a + 551368b + 6724c + 82d + e
3 = 181063936a + 1560896b + 13456c + 116d + e
5 = 1146228736a + 6229504b + 33856c + 184d + e

Aufgelöst mit Hilfe: http://www.arndt-bruenner.de/mathe/scripts/gleichungssysteme.htm
  float a = 2.331362828169e-9;
  float b = -1.00248601611e-6;
  float c = 1.498600025947e-4;
  float d = 0.020190012411;
  float e = -0.21590695198; 
*/


float pressure_VDO5bar(float RV, float VA_VB)
// Ermittlung des Drucks mit einem VDO Öldruckgeber 5bar
// Erklärung der Parameter:
// RV           : Vorwiderstand in Ohm 
// VA_VB        : Spannungsverhältnis "Spannung am NTC zu Betriebsspannung"
// Rückgabewert : Öldruck
//
// Info: http://forum.arduino.cc/index.php?topic=155733.0
{
  float a = 2.331362828169e-9;
  float b = -1.00248601611e-6;
  float c = 1.498600025947e-4;
  float d = 0.020190012411;
  float e = -0.21590695198; 
  float RN=RV*VA_VB / (1-VA_VB); // aktueller Widerstand des NTC
  float pressure= a*RN*RN*RN*RN + b*RN*RN*RN + c*RN*RN + d*RN +e;;
  if (pressure<0) return 0; // Begrenzung nach unten, keine negativen Werte extrapolieren
  else if (pressure>6.66) return 6.66; // Willkürlich gewählte Begrenzung nach oben
  else return(pressure);
}


void setup() {
  Serial.begin(9600);
  float pressure;
  float vorWiderstand=180;
  int messwert; // Messwert am Analogpin
  Serial.println();
  Serial.println("Wert  Druck");
  // In einer Schleife alle möglichen Messwerte simulieren
  for (messwert=0;messwert<1023;messwert++)
  {
    pressure=pressure_VDO5bar(vorWiderstand, messwert/1023.0);
    char buf[20];
    char buf1[15];
    dtostrf(pressure,4,2,buf1);
    sprintf(buf,"%4d  %s",messwert,buf1);
    Serial.println(buf);
  }
}

void loop() {
  // put your main code here, to run repeatedly:


Überlegungen zur Größe des Vorwiderstands: Der Gesamtwiderstand aus Vorwiderstand und Sensor muss mindestens so gross sein, dass der absolute Maximalstrom eines Arduino Pins (40 mA) nicht überschritten wird. In Frage kommen daher Vorwiderstände von 150 oder 180 Ohm, so dass sich mit 10 Ohm Minimalwiderstand des Sensors folgende Maximalströme bei 5V Betriebsspannung ergeben:

I= U/(10+RV150)= 5/160 = 31 mA bei RV= 150 Ohm
I= U/(10+RV180)= 5/190 = 26 mA bei RV= 180 Ohm (den würde ich wohl nehmen)
1290  International / Deutsch / Re: Öl Temperatur messen, welcher Öltemperaturgeber? (KFZ) on: July 22, 2013, 01:46:05 pm
Das mit dem Typ K sensor und den VDO 150°C geht dank des Forums Super gut.
Daher noch einmal mit scharm eine frage.........................  smiley-red

kannst Du aune Formel für einen Drucksensor erstellen ?
http://www.druckgeber-oeldruckgeber.de/vdo-druckgeber-ohne-wk-daten.html

Das kann ich tun, sieht eher nach einer Kleinigkeit zum Rechnen aus.

Wenn die Spannungsteilerschaltung aus Vorwiderstand und Sensor dieselbe ist, gilt auch dieselbe Formel für die Messschaltung beim Messen mit dem Arduino:
RN= RV*VA/VB / (1-VA/VB) ==> Formel für den Widerstand des Sensors!

Das ist schonmal die halbe Miete. Der einzige Unterschied ist nun, dass es kein Datenblatt mit einer Formel für die Beziehung zwischen Widerstand und Messwert (in diesem Fall Druck) gibt, sondern nur eine kleine Tabelle. Und aus der Tabelle muss man sich selbst erst eine Formel aufstellen.

Mit dem 5bar Sensor meinst Du den, der diese Werte hat:
0 bar  -  10 Ohm
1 bar  -  48 Ohm
2 bar  -  82 Ohm
3 bar  - 116 Ohm
5 bar  - 184 Ohm

Wenn man das in einem xy-Koordinatensystem aufträgt, sieht man: Es ist keine Gerade. Eine lineare Interpolation zwischen den Punkten liefert daher sehr schlechte Ergebnisse.

Meine Idee wäre daher, eine Parabel als Nährungskurve zu verwenden, gegeben durch die Gleichung zweiter Ordnung:

p = a * RN2 + b * RN + c

mit
p= Druck
RN = Widerstand des Sensors

Eine Gleichung zweiter Ordnung ist durch drei Punkte vorgegeben, daher wähle ich aus der Tabelle drei Punkte zum Aufstellen der Gleichung, und zwar Anfangs- und Endpunkt und den Messpunkt in der Mitte:
0 bar  -  10 Ohm
2 bar  -  82 Ohm
5 bar  - 184 Ohm

Daraus ergeben sich drei Gleichungen mit drei Unbekannten:

0 = a * 102 + b * 10 + c
2 = a * 822 + b * 82 + c
5 = a *1842 + b * 184 + c

Und da ich ein fauler Sack bin wenn es ums Lösen geht, gehe ich auf http://www.arndt-bruenner.de/mathe/scripts/gleichungssysteme.htm wo es einen Online-Rechner zum Lösen solcher Gleichungen gibt, und bekomme heraus:

  float a=1.0/106488;
  float b=1433.0/53244;
  float c=-3595.0/13311;

So dass der Arduino den Druck nach dieser Formel rechnen kann:
pressure=a*RN*RN + b*RN + c;

Dabei bekomme ich folgende Wertetabelle herausgerechnet:
Code:
Ohm  bar
---  ----
 10  0.00
 11  0.03
 12  0.05
 13  0.08
 14  0.11
 15  0.14
 16  0.16
 17  0.19
 18  0.22
 19  0.24
 20  0.27
 21  0.30
 22  0.33
 23  0.35
 24  0.38
 25  0.41
 26  0.44
 27  0.46
 28  0.49
 29  0.52
 30  0.55
 31  0.57
 32  0.60
 33  0.63
 34  0.66
 35  0.68
 36  0.71
 37  0.74
 38  0.77
 39  0.79
 40  0.82
 41  0.85
 42  0.88
 43  0.90
 44  0.93
 45  0.96
 46  0.99
 47  1.02
 48  1.04
 49  1.07
 50  1.10
 51  1.13
 52  1.15
 53  1.18
 54  1.21
 55  1.24
 56  1.27
 57  1.29
 58  1.32
 59  1.35
 60  1.38
 61  1.41
 62  1.43
 63  1.46
 64  1.49
 65  1.52
 66  1.55
 67  1.58
 68  1.60
 69  1.63
 70  1.66
 71  1.69
 72  1.72
 73  1.74
 74  1.77
 75  1.80
 76  1.83
 77  1.86
 78  1.89
 79  1.91
 80  1.94
 81  1.97
 82  2.00
 83  2.03
 84  2.06
 85  2.09
 86  2.11
 87  2.14
 88  2.17
 89  2.20
 90  2.23
 91  2.26
 92  2.29
 93  2.31
 94  2.34
 95  2.37
 96  2.40
 97  2.43
 98  2.46
 99  2.49
100  2.52
101  2.54
102  2.57
103  2.60
104  2.63
105  2.66
106  2.69
107  2.72
108  2.75
109  2.78
110  2.80
111  2.83
112  2.86
113  2.89
114  2.92
115  2.95
116  2.98
117  3.01
118  3.04
119  3.07
120  3.09
121  3.12
122  3.15
123  3.18
124  3.21
125  3.24
126  3.27
127  3.30
128  3.33
129  3.36
130  3.39
131  3.42
132  3.45
133  3.48
134  3.50
135  3.53
136  3.56
137  3.59
138  3.62
139  3.65
140  3.68
141  3.71
142  3.74
143  3.77
144  3.80
145  3.83
146  3.86
147  3.89
148  3.92
149  3.95
150  3.98
151  4.01
152  4.04
153  4.07
154  4.10
155  4.13
156  4.16
157  4.19
158  4.22
159  4.25
160  4.28
161  4.31
162  4.34
163  4.37
164  4.40
165  4.43
166  4.46
167  4.49
168  4.52
169  4.55
170  4.58
171  4.61
172  4.64
173  4.67
174  4.70
175  4.73
176  4.76
177  4.79
178  4.82
179  4.85
180  4.88
181  4.91
182  4.94
183  4.97
184  5.00
Für 0, 2 und 5 bar ergeben sich dabei die exakten Werte, denn diese Punkte hatte ich ja zum Aufstellen der Gleichung verwendet. Bei der Interpolation der beiden anderen bekannten Punkte ergibt sich folgender Fehler:

Statt  48 Ohm - 1 bar
Gerechnet: 48 Ohm 1.04 bar
und
Statt
116 Ohm - 3 bar
Gerechnet: 116 Ohm - 2.98 bar

Bevor ich weitermache:
Die Interpolationsfehler der von mir aufgestellten Formel von 0,02 bis 0,04 bar an einigen Punkten der Messkurve sind zu verkraften, oder muss es genauer gerechnet werden?
Pages: 1 ... 84 85 [86] 87 88 ... 163