Hallo zusammen.
ich baue zur Zeit eine Kleinwindkraftanlage, und habe eine Problem mit der Azimutregelung, also dem drehen des Rotors in die Windrichtung. Hierzu benutze ich eine Windfahne, die mit zwei Lichtschranken arbeitet. Wird die Windfahne z.B. nach rechts geweht, wird eine Lichtschranke verdeckt und nach einer kurzen Zeit wird der Motor des Azimutantriebs gestartet und dreht den Rotor in die entsprechende Richtung.
#include <SD.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int Lichtschranke1 =3; // Azimuthregelung
int Lichtschranke2 =6; // Azimuthregelung
int Lichtschrankenstatus1=0; // Azimuthregelung
int Lichtschrankenstatus2=0; // Azimuthregelung
int Azmr =9; //Azimuth rechts drehen
int Azml =10; //Azimuth links drehen
float Wartezeit1 =0; //Dauer Lichtschranke1 high
float Wartezeit2 =0; //Dauer Lichtschranke2 high
int Startzeit =1000; //Dauer bis Azimuthantrieb reagiert
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode (Lichtschranke1,INPUT);
pinMode (Lichtschranke2,INPUT);
pinMode (Azmr, OUTPUT);
pinMode (Azml, OUTPUT);
}
void loop () {
// Azimutsteuerung
Lichtschrankenstatus1= digitalRead(Lichtschranke1);
if (Lichtschrankenstatus1 == HIGH){
Wartezeit1++;}
if (Lichtschrankenstatus1 ==LOW){
Wartezeit1=0;}
Lichtschrankenstatus2= digitalRead(Lichtschranke2);
if (Lichtschrankenstatus2 == HIGH){
Wartezeit2++;}
if (Lichtschrankenstatus2 ==LOW){
Wartezeit2=0;}
if (Wartezeit1> Startzeit) digitalWrite(Azmr, LOW);
if (Wartezeit1< Startzeit) digitalWrite(Azmr, HIGH);
if (Wartezeit2> Startzeit) digitalWrite(Azml, LOW);
if (Wartezeit2< Startzeit) digitalWrite(Azml, HIGH);
delay (1);
Dieser Sketch funktioniert so gut. Jetzt hatte ich das Problem, dass der Rotor zu oft in dieselbe Richtung gedreht wurde und meine beiden Kabel sich im Turm sehr stark aufgewickelt habe.
Um das zu verhindern möchte ich die Nettolaufzeit des Azimutantriebs erfassen. Die Zeit soll z.B. bei rechts herum drehen positiv gezählt werden und beim links herum negativ. Sobald dann ein wert von z.B. +200sec. oder -200sec erreicht ist soll der Rotor 200sec. in die andere Richtung gedreht werden um die Kabel wieder abzuwickeln. Wie kann ich das programmieren? Mein Hauptproblem ist die Erfassung der Nettolaufzeit, weil die Laufzeit sich in sehr viele kurze Abschnitte aufteilt.
Danke im Voraus für die Hilfe.