Go Down

Topic: [Einsteiger!] brauch Hilfe bei seinem projekt Windmesser (Read 933 times) previous topic - next topic

goody

hallo,
ich bin noch blutiger Anfänger was Arduino betrifft, nun habe ich ein Problem wo ich nicht weiter kommen.
ich habe folgendes Sketch problemlos am laufen.

Code: [Select]
/* Puls-Zaehlung (Status-Aenderung) fuer Windgeschwindigkeits-Messer

Schaltungsaufbau:
Schalter von GND an Pin 3 digital
Widerstand 10K von Pin 3 an +5V (Pullup)


Code ist in der Public Domain.
*/

//einbinden der notwendigen Libraries
#include <LiquidCrystal.h>

// festlegen der Pins fuer das LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define LCDBacklightPin 10

int windGeschw; // Variable fuer Windgeschwindigkeit
int beaufort = 0; // Variable Windstaerke in Beaufort

unsigned long windGeschwMessIntervall = 60000; // alle 10 Minuten startet die Messroutine 600000
unsigned long windGeschwMessZeit = 30000; // fuer einen Zeitraum von 5 Minuten 300000

unsigned long windGeschwStart;
unsigned long windGeschwStartAlt = 0;
unsigned long windGeschwMessStart;
unsigned long windGeschwMessStartAlt = 0;

int windGeschwPinZaehler = 0; // Zaehler fuer empfangene Impulse
int windGeschwPinStatus = 0; // aktueller Impuls-Status
int windGeschwPinStatusAlt = 0; // alter Impuls-Status

const int  windGeschwPin = 2; // Kontakt/Schalter an Pin 2- digital

void setup()
{
  pinMode(windGeschwPin, INPUT); // definieren Pin 3 digital als Eingang
  Serial.begin(9600); // starten serielle Kommunikation
  lcd.begin(16, 2);              // start the library
}

void loop()
{
  windGeschwStart = millis(); // aktualisieren Startzeit

  if (windGeschwStart - windGeschwStartAlt >= windGeschwMessIntervall) // wenn Messintervall ueberschritten ...
  {
    windgeschwmess(); // rufen wir Subroutine zur Geschwindigkeitsmessung auf und
    windGeschwStartAlt = millis(); // merken uns Zeit der letzten Messung
    tempmess();
  }
 
}

// ##### Unterfunktion windgeschwmess

void windgeschwmess()
{   
  windGeschwMessStart = millis(); // aktualieren Startzeit fuer Messung
  windGeschwMessStartAlt = windGeschwMessStart; // merken uns Startzeit
  windGeschwPinZaehler = 0; // setzen Pulszaehler auf 0
  windGeschwPinStatusAlt = HIGH; // setzen PulsStatus auf HIGH

    while ((windGeschwMessStart - windGeschwMessStartAlt) <= windGeschwMessZeit) // solange die 10000 ms (10 Sekunden) noch nicht durch sind ..
  {   
    windGeschwPinStatus = digitalRead(windGeschwPin); // lesen wir Eingang Pin 3 digital und
    if (windGeschwPinStatus != windGeschwPinStatusAlt) // wenn sich Pin-Status geändert hat ...
    {               
      if (windGeschwPinStatus == HIGH) // und wenn Status = HIGH
      {                 
        windGeschwPinZaehler++; // erhoehenn wir den Zaehler um 1
      }
    }
    windGeschwPinStatusAlt = windGeschwPinStatus; // merken uns Pin-Status fuer naechsten Durchlauf
    windGeschwMessStart = millis(); // aktualisieren Zeit
  }

  windGeschw =  ((windGeschwPinZaehler * 12) / 10) + 0.5; //  Windgeschwindigkeit - ein Impuls = 1,2 km/h, aufgerundet -
//  windGeschw =  ((windGeschwPinZaehler * 24) / 10) + 0.5; //  Windgeschwindigkeit - ein Impuls = 2,4 km/h, aufgerundet -
  windGeschw = (windGeschw / (windGeschwMessZeit / 1000)); // geteilt durch Messzeit in Sekunden

   // ermitteln windstaerke nach Beaufort
   if (windGeschw >= 0 && windGeschw <= 2)
   {
     beaufort = 0;
   }
   else if (windGeschw > 2 && windGeschw <= 5)
   {
     beaufort = 1;
   }
   else if (windGeschw > 5 && windGeschw <= 11)
   {
     beaufort = 2;
   }
   else if (windGeschw > 11 && windGeschw <= 19)
   {
     beaufort = 3;
   }
   else if (windGeschw > 19 && windGeschw <= 28)
   {
     beaufort = 4;
   }
   else if (windGeschw > 28 && windGeschw <= 38)
   {
     beaufort = 5;
   }
   else if (windGeschw > 38 && windGeschw <= 49)
   {
     beaufort = 6;
   }
   else if (windGeschw > 49 && windGeschw <= 61)
   {
     beaufort = 7;
   }
   else if (windGeschw > 61 && windGeschw <= 74)
   {
     beaufort = 8;
   }
   else if (windGeschw > 74 && windGeschw <= 88)
   {
     beaufort = 9;
    }
   else if (windGeschw > 89 && windGeschw <= 102)
   {
     beaufort = 10;
   }
   else if (windGeschw > 102 && windGeschw <= 117)
   {
     beaufort = 11;
   }
   else
   {
     beaufort = 12;
   }

  Serial.print("Pulse pro Sekunde: ");
  Serial.print(windGeschwPinZaehler / (windGeschwMessZeit / 1000)); // nur zur Kontrolle
  Serial.print(" Windgeschwindigkeit: "); // nur zur Kontrolle
  Serial.print(windGeschw); // nur zur Kontrolle
  Serial.print(" km/h"); // nur zur Kontrolle
  Serial.print(" windstaerke: "); // nur zur Kontrolle
  Serial.print(beaufort); // nur zur Kontrolle
  Serial.println(" Beaufort"); // nur zur Kontrolle

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(">>>Wind Speed<<<");
  lcd.setCursor(0,1);
  lcd.print(windGeschw);
  lcd.print(" km/h ");
  //zweite zeile - ermittelte geschwindigkeit
  lcd.setCursor(9,1);
  lcd.print(beaufort);
  lcd.print(" Bft ");
{
    ;
  } // verlassen Subroutine
}


nun möchte ich das ein Schrittmotor, der über ein L293DNE angesteuert wird und mit folgenden Sketch Funktion, mir den Beaufort wert Analog auf einer Skala von 1 bis 12 Bft anzeigt.
Den Stepper habe ich schon auf Min und Max begrenzt, Sodas beim start dem Programmes der Stepper erstmal x schritte zurück setzt und dann x schritte nach vorne auf 0 Bft.

dieses Sketch ist nur als Demo für den Stepper gedacht gewesen und als Beispiel wie ich den Stepper angesprochen habe.   

Code: [Select]
#define Stepper_A1 5
#define Stepper_A3 4
#define Stepper_B1 3
#define Stepper_B3 2

byte stepValues[5][4] = {{LOW, LOW,  LOW,  LOW},
                         {LOW, HIGH, HIGH, LOW},
                         {LOW, HIGH, LOW,  HIGH},
                         {HIGH, LOW, LOW,  HIGH},
                         {HIGH, LOW, HIGH, LOW}};
                         
void setup(){
   pinMode(Stepper_A1, OUTPUT);
   pinMode(Stepper_A3, OUTPUT);
   pinMode(Stepper_B1, OUTPUT);
   pinMode(Stepper_B3, OUTPUT);
   for(int i = 0; i < 10; i++){
      action(30, 2);
      action(-30, 2);
//      action(30, 3);
//      action(-30, 2);
//      action(30, 1);
}
    action(0, 0);
}
void loop(){}

void action(int count, byte delayValue){
   if(count > 0)
     for(int i = 0; i < count; i++)
     for(int sequenceStep = 1; sequenceStep <= 4; sequenceStep++)
     moveStepper(sequenceStep, delayValue);
   if(count < 0)
     for(int i = 0; i < abs(count); i++)
     for(int sequenceStep = 4; sequenceStep > 0; sequenceStep--)
     moveStepper(sequenceStep, delayValue);
   if(count == 0)
     moveStepper(0, delayValue);
}
void moveStepper(byte s, byte delayValue){
  digitalWrite(Stepper_A1, stepValues[s][0]);
  digitalWrite(Stepper_A3, stepValues[s][1]);
  digitalWrite(Stepper_B1, stepValues[s][2]);
  digitalWrite(Stepper_B3, stepValues[s][3]);
  delay(delayValue);
}
 

ich hoffe mir kann hier jemand helfe
Danke
goody

UweFederer

Hast Du dir mal die Stepper Bibiothrk angesehen?
http://arduino.cc/en/Reference/Stepper
Grüße Uwe

goody

danke für die Info.
aber damit komme ich jetzt noch nicht weiter.
Ich würde den Stepper gerne so ansprechen.
Code: [Select]
   if (windGeschw >= 0 && windGeschw <= 2)
   {
     beaufort = 0;
     action(4, 2);
     action(0, 0);
   }
   else if (windGeschw > 2 && windGeschw <= 5)
   {
     beaufort = 1;
     action(8, 2);
     action(0, 0);
   }
   else if (windGeschw > 5 && windGeschw <= 11)
   {
     beaufort = 2;
     action(12, 2);
     action(0, 0);
   }


nur mein Problem ist wenn er z.b. 2 Bft anzeigt und auf 1 Bft abfallen soll würde er jetzt 8 Stepps nach vorne anstatt 4 zurück genau das ist mein Problem
ich weis nicht wie ich so etwas umsetzen kann.
Gruß
goody

jubi40

#3
Jan 02, 2013, 07:14 pm Last Edit: Jan 02, 2013, 08:05 pm by jubi40 Reason: 1
Hallo,

um bei deinem Beispiel zu bleiben:

Code: [Select]
   
if (windGeschw >= 0 && windGeschw <= 2)
   {
     beaufort = 0;
     action((beaufort-letzterwert)*4, 2);
     action(0, 0);
     letzterwert=beaufort;
   }


Damit speicherst du den letzten beaufort-Wert in die Variable "letzterwert". Beim erneuten Aufruf vergleichst du die Werte und drehst den Schrittmotor um 4x den Unterschied vor (positiver Wert) oder zurück (negativer Wert).
Eleganter verpackt man das ganze noch in eine Funktion, dann musst nicht immer den ganzen Quark für jeden Bft-Wert eingeben.

ulli.

edit: "letzterwert" und "beaufort" bei "action" getauscht

goody

danke ulli,

aber mit den  Stepps in 4er schritten war nur ein Beispiel die richtige anzahl muss ich noch ermitteln.
z.b Variable Stepps ( Bft0=4, Bft1=6, Bft2=9, ...Bft12=29 )  würde bedeuten  Bft 12 zu Bft 2  (29 - x = 9)  und  Bft 1 zu Bft 12 ( 4 + x =29)
wie setzt man das jetzt in eine Funktion um.
goody

jubi40

Ok, ich ging davon aus, dass die die Bft-Skala linear sein wird.
Wenn dem nicht so ist, kannst ja die Schritt-Werte in ein Array packen:

Code: [Select]

int schritte[]={4,6,9,...,29};

...

action(schritte[beaufort]-schritte[letzterwert],2);


ulli.


Go Up