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.
/* 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.
#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