Daten Sammeln, Servo, e piu, alles für Anfänger..

Ciao tutti,

Ich habe was gebastelt. Da ich versucht habe, mich Schritt für Schritt zu nähern, kann das vllt auch anderen Einsteigern helfen.

Erst mal der Code:

// Erfassen von analog-Signal, hier Wegemessung, in den Rechner
//Linearprüfung Wegemessung/ Ausgabe auf Servo
// Hier mit Erweiterung zum Spielen
//
#include <Servo.h>             // Servo Libary laden

Servo myservo;                 // Erzeuge Servo Objekt



int analogPin0 = 0;            // 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int analogPin1 = 0;            // not active 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int analogPin2 = 0;            // not active 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int analogPin3 = 0;            // not active 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int val0 = 0;                  // Ergebnisvariable 0
int val1 = 0;                  // not active Ergebnisvariable 1
int val2 = 0;                  // not active Ergebnisvariable 2
int val3 = 0;                  // not active Ergebnisvariable 3
int pin2 = 2;                  // Digital Pin2, Umschaltung Logger start/ Stop
int pin3 = 3;                  // Digital Pin2, 10facher Taktwert
int valPin2 = 0;               // Status Pin2
int valPin3 = 0;               // Status Pin3
int valServo = 0;              // Servovariable
long time;                     // Millis
long nextMillis;               // nächster Erfassungspunkt
long takt = 1000;              // Erfassungsrate Hier eintragen nach wieviel 
                               // ms die neue Messung beginnt. Minimum 50ms
long ratio = 10;               // Verhältnis lange/ kurze Zeit, Umschaltung Pin3

void setup()
{
  Serial.begin(9600);     // setup serial
  
  Serial.print("Millis, ");
  Serial.print("4xWert, ");
  Serial.print("Status Pin 2 u 3"); 
  
  Serial.println();        // Leerzeile

  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  
  pinMode(pin2 , INPUT);    // Pin2 auf Eingang
  digitalWrite(pin2 , HIGH);// Pin2 Pullup Aktiv
  
  pinMode(pin3 , INPUT);    // Pin3 auf Eingang
  digitalWrite(pin3 , HIGH);// Pin3 Pullup Aktiv
  
}

void loop()

{

valPin2 = digitalRead(pin2);
if (valPin2 == LOW)
  {
  return; // wenn der Taster betätigt wird, dann soll der Logger stoppen, 
  //andernfalls Daten erfassen (später mal auf Karte)inverse Logik
  }
  
valPin3 = digitalRead(pin3); 
if (valPin3 == LOW)
  {
  takt = (takt * ratio);  // Taktzeit mal 10, wenn Kontakt geschlossen, inverse Logik
  }
else
  {
  takt = (takt * 1);    // Tacktzeit direkt, wenn Kontakt geöffnet
  }   


unsigned long currentMillis = millis();

if(currentMillis > nextMillis) {

nextMillis = (currentMillis + takt - 1);

  
val0 = analogRead(analogPin0); // lesen 1.Wert      // hier erstmal nur ein Kanal aktiv
// val1 = analogRead(analogPin1); // lesen 2. Wert  // deaktiviert
val2 = analogRead(analogPin2); // lesen 3. Wert     // aktiv, Random Wert vom Antenneneffekt
// val3 = analogRead(analogPin3); // lesen 4. Wert  // deaktiviert

Serial.print(currentMillis);  // Zeit
Serial.print(" ms,");         // CSV
Serial.print(val0);           // 1. Wert
Serial.print(",");            // CSV
Serial.print(val1);           // 2. Wert
Serial.print(",");            // CSV
Serial.print(val2);           // 3. Wert
Serial.print(",");            // CSV
Serial.print(val3);           // 4. Wert
Serial.print(",Servo: ");     // CSV
Serial.print(valServo);       // 4. Wert
Serial.print(",Status: ");    // CSV
Serial.print(valPin2);        // Status Pin2
Serial.print(",");            // CSV
Serial.print(valPin3);        // Status Pin3

Serial.println();             // neue Zeile

valServo = map(val0, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
myservo.write(valServo);                   // sets the servo position according to the scaled value
delay(15);                                 // waits for the servo to get there 

}

}

Das Ein/ Ausschalten mit 'Return' funzt zwar noch nicht, da komme ich aber auch noch hinter...

Hintergrund war/ ist eine Sensor- Messeung, welche innerhalb ~1 minute zwischen einem Minimum und einem Maximum in einem Gesamtmessbereich von 0- 10 V einen Wert in eine Steuerung liefert. Dort habe ich mich parallel, also gemeinsame Masse, Spannungsteiler (2x 4,7k)/ 10k draufgelget und für die ersten Versuche im 200ms Takt mitgeloggert. Der Fehler konnte so zumindest sichtbar gemacht werden.

ok, etwas umständlich dem Arduino über den Serial Monitor auf die Bits zu gucken, diese dann mit 'Strg+A/ Strg+C' in eine Text/ CSV Datei zu kopieren, hat aber gereicht, bis ich mein zweites Loggerschield habe.

Tests haben ergeben, dass ich bei 9600 bps bis ca. 50ms komme, also für normale elektrische Sachen schon mal nicht verkehrt

die eine ms in der Taktberechnung ist übrigens erforderlich, da sonst, also kleiner oder größer, die ms wehlaufen. mit der zusätzlichen 1 ms komme ich auf 201, 401, 601 usw...

Gibt da noch einen etwas eleganteren Trick?
und wie bekomme ich den Code bei einem anliegenden Signal gestartet/ gestoppt?

Als Äpfelchen habe ich noch den Servo mit eingebaut. Da es um die Linearität des Messsystems geht, kann am Servo schön gesehen werden, wenn/ ob der Wert wackelt. Ok, mit den 15ms delay des Servos ist eine Verzögerung drin, die deutlich gemerkt wird, aber mit einem kleineren Servo will ich demnächst kürzere Delays versuchen.

Ein weiterer Schritt ist auch das zusammenfassen in einen String (also String= String1+ String2...., die einzelnen Strings sollen dann abwechselnd die Zwischenzeichen und die Werte erhalten, und dann 'in einem Flush' auf Karte/ Serial geschrieben werden..) aber das dauert noch was..

Danke, Greetz,

ich hoffe es regt auch ein wenig an...

Greetz, Tom

Darf ich mal neugierig sein?
Was bedeutet der Text in Deiner Signature?
Grüße Uwe

Laut Google-Translator: "Das Gras ist grün und der Ball ist rund." :smiley:
Das hätte ich jetzt aber auch nicht erwartet. Auf jeden Fall eine nette Idee.

Rrrrrrrrriiicccccchhhtiiiiccchhhhhhh...

Skusi, ne Macke eine Ex- Arbeitskollegen, welcher als Syrer die Angewohnheit hatte, 'normale' Sprüche in arabische zu übersetzten..

Also nix mit Bomben, Hochhäusern und verklemmten Religionsverständnis...

Kann mir einer von Euch mal kurz sagen, wie ich mit einem Status, also Taster gedrückt/ bicht gedrückt, das Programm stoppe? oder muss ich da einen Trick mit einer 'sub-loop' anwenden, welche bei dem gewissen Status z.B. nur im Delay nudelt....

Ich dachte da so an break, return oder ähnliches....

Greetz, Linpo..

Also nix mit Bomben, Hochhäusern und verklemmten Religionsverständnis...

Man darf ja mal nur so normal naiv neugierig sein :blush: :blush: :blush: :blush:

Du kannst die Baudrate bis 115200 erhöhen und so weniger ausbremsen durch das Serial.print().

Du liest den Taster ein und setzt eine Statusvariable.
zB Sign in - Google Accounts oder 周口好哉水电安装有限公司

Dann einfach ein if und das ganze loggen nur wenn die Statusvariable HIGH ist.

if(Statuspin2==1)
{
Programmteil loggen
}

Grüße Uwe

Kann mir einer von Euch mal kurz sagen, wie ich mit einem Status, also Taster gedrückt/ bicht gedrückt, das Programm stoppe?

Das Programm eines µC stoppt nicht, sondern nimmt maximal einen anderen Weg durch loop, wie Uwe angedeutet hat.

Du kannst ihn natürlich so programmieren, dass nur noch ein Reset hilft
z.B. so:

if (programmEnde)
  while (1); // Das wars dann

Zum Strom sparen kann man den Prozessor schlafen legen und ihn nach einiger Zeit oder von aussen wieder wecken,
aber das ist wohl auch nicht dein Thema.


...als Syrer die Angewohnheit hatte, 'normale' Sprüche in arabische zu übersetzten...

Von wegen "normal" :Das Ergebnis ist eine tiefe Weisheit, poetisch formuliert, in einer sehr ansprechenden Darstellung.

THX, Grazie...

@ Uwe/ Michael:
Jop, Danke, das war der Ansatz, ich fange gerade erst mit dem IF und den Möglichkeiten damit an. Mit dem Einklammern muss ich mir was überlegen, evtl die Arbeitsschritte in separate Funktionen auslagern, aber damit komme ich schn weiter.

@ Michael:
Wenn Dich Fußball so 'göttlich' begeistert, dann guck mal unter 'http://www.amazon.de/KiTaBu-Hauptsache-Verrückte-Fußballersprüche-ebook/dp/B007AJ9474/ref=sr_1_fkmr0_2?ie=UTF8&qid=1366223119&sr=8-2-fkmr0&keywords=mailand+italien+sportler' ich hoffe das Verlinken ist hier nicht todeswürdig, ist ja ziemlich offtopic... :wink:

und in den aktuellen Zeiten und dem Zusammenhang mit arabischen Sachen, es kann schnell kritisch werden...

Greetz, Linpotec

Doppelmopplepost..

Mythbusters on TV, den UnoR3, eine Adapterplatine und ein Servo zusammenbesatelt und folgendes Programm imSpeicher:

// Erfassen von analog-Signal, hier Wegemessung, in den Rechner
//Linearprüfung Wegemessung/ Ausgabe auf Servo
// Hier mit Erweiterung zum Spielen
// Erstellen von Funktionen mit void
// Abfragen und Verzweigen mit if

// Libaries laden:
#include <Servo.h>             // Servo Libary laden

// Servo:
Servo myservo;                 // Erzeuge Servo Objekt

// Definitionen:
int analogPin0 = 0;            // 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int analogPin1 = 1;            // not active 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int analogPin2 = 1;            // not active 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int analogPin3 = 3;            // not active 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int val0 = 0;                  // Ergebnisvariable 0
int val1 = 0;                  // not active Ergebnisvariable 1
int val2 = 0;                  // not active Ergebnisvariable 2
int val3 = 0;                  // not active Ergebnisvariable 3
int pin2 = 2;                  // Digital Pin2, Umschaltung Logger start/ Stop
int pin3 = 3;                  // Digital Pin2, 10facher Taktwert
int valPin2 = 0;               // Status Pin2
int valPin3 = 0;               // Status Pin3
int valServo = 90;              // Servovariable
long currentMillis;            // Millis
long nextMillis;               // nächster Erfassungspunkt
int takt = 500;                // Erfassungsrate Hier eintragen nach wieviel 
                               // ms die neue Messung beginnt. Minimum 50ms
int ratio = 10;                // Verhältnis lange/ kurze Zeit, Umschaltung Pin3
int zyklus = 1000;              // realer Zyklus Messdaten, berechnet aus Takt* ratio

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

p_headline();         // schreibe Überschrift auf serielle Schnittstelle 

  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  
  pinMode(pin2 , INPUT);    // Pin2 auf Eingang
  digitalWrite(pin2 , HIGH);// Pin2 Pullup Aktiv
  
  pinMode(pin3 , INPUT);    // Pin3 auf Eingang
  digitalWrite(pin3 , HIGH);// Pin3 Pullup Aktiv
  
}

void loop()
{
valPin2 = digitalRead(pin2); //Triggern des Loggers bei LOW/ Schalter eingeschaltet
if (valPin2 == HIGH) // jetzt zum Testen deaktiviert, interner Pullup, somit immer High, somit erfassen
  {
     // wenn der Taster betätigt wird, dann soll der Logger stoppen, 
     //andernfalls Daten erfassen (später mal auf Karte)inverse Logik
     // Ende der Klammer am Ende der Loop Funktion
     
     currentMillis = millis(); // Zeitstempel setzen
     
   valPin3 = digitalRead(pin3); // Messtate ändern, Schalter geschlossen, Messrate * Ratio
if (valPin3 == LOW)         // ok, jetzt zum Testen invertiert
  {
  zyklus = takt * ratio ;  // Taktzeit mal 10, wenn Kontakt geschlossen, inverse Logik
  }
else
  {
  zyklus = takt * 1;    // Tacktzeit direkt, wenn Kontakt geöffnet
  }   

// Abfragen auf Messtakt

if(currentMillis > nextMillis) 
  {          // Abarbeiten im Takt
  nextMillis = currentMillis + zyklus - 1;  // neuer Zeitstempel
  // Definieren des neuen Zeitpunktes
  // Datenlogger 1x anschmeissen:
  
  r_in();      // call Einlesen der Eingänge
  p_data();    // call Schreiben der Daten
  servo_out(); // call Ausgabe auf Servo
  } 
servo_out(); // call Ausgabe auf Servo  
}
// Hier geht es weiter wenn der Schalter offen ist und das Loggen nicht durchgeführt wird.
// gemacht wird nix weiter, außer wieder nach oben springen
}

// Definition der Funktionen

void p_headline()
{
Serial.println("Datenlogger Linpotec");

Serial.print("Millis, ");
Serial.print("4xWert, ");
Serial.print("Status Pin2/3 ");
Serial.print("Zyklus");
  
Serial.println();        // neue Zeile
}

void r_in() // Funktion Eingänge einlesen
{
val0 = analogRead(analogPin0); // lesen 1.Wert      // hier erstmal nur ein Kanal aktiv
val1 = analogRead(analogPin1); // lesen 2. Wert     // aktiv, random Wert Antenneneffekt
val2 = analogRead(analogPin2); // lesen 3. Wert     // aktiv, Random Wert Antenneneffekt
val3 = analogRead(analogPin3); // lesen 4. Wert     // aktiv, Random Wert Antenneneffekt
}

void p_data()  // Funktion Daten formatiert auf serielle Schnittstelle ausgeben
{
Serial.print(currentMillis);  // Zeit
Serial.print(" ms,");         // CSV
Serial.print(val0);           // 1. Wert
Serial.print(",");            // CSV
Serial.print(val1);           // 2. Wert
Serial.print(",");            // CSV
Serial.print(val2);           // 3. Wert
Serial.print(",");            // CSV
Serial.print(val3);           // 4. Wert
Serial.print(",Servo: ");     // CSV
Serial.print(valServo);       // 4. Wert
Serial.print(",Status: ");    // CSV
Serial.print(valPin2);        // Status Pin2
Serial.print(",");            // CSV
Serial.print(valPin3);        // Status Pin3
Serial.print(", Zyklus:");            // CSV
Serial.print(zyklus);         // Taktzeit Messzyklus

Serial.println();             // neue Zeile
}

void servo_out()
{
valServo = map(val1, 15, 250, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
myservo.write(valServo);                   // sets the servo position according to the scaled value
delay(15);                                 // waits for the servo to get there 
}

** Erfolgserlebnis **

und als Äpfelchen eine Servo, welcher auf die radoms aus dem analogen Eingang reagiert... falst schon eine Diebstahlsichernung...

THX2all

An die Anfänger:

Das mit dem VOID unf IF ist gar net soo schwer. Auf Rechschreipunk achten, da ist schnell mal ne Klammer gesetzt und Schwups, berechnet sich ein Wert ganz anders, als eigentlich aus der Mathematik verstanden. Setzt mal bei der Berechnung des Zyklus eine runde Klammer um die die Formel...

Greetz, Linpo