Hi,
danke für die Antwort. Ich habe nun Kommentare in der Funktion Leiter(), die für die Servobewegung zuständig ist, ergänzt.
Soll Das so?
Ja, in den ersten 45s nur soll es möglich sein die Position, der ausgefahrenen Leiter, zu verändern.
#include <SoftwareServo.h>
SoftwareServo leiterDrehen;
int Transistor = 0;
int PotiPin = 5;
int PotiVal = 0;
int Drehposition = 72 ;
int GrundPosDrehen = 72;
int StandardEndPosDrehen = 35;
int EndPosDrehen = StandardEndPosDrehen;
boolean forward = true ; //Richtung in die Servos verstellt werden
unsigned long ts = millis () ; // time accounting.
int DELAY = 20;
boolean LeiterAusfahren = true;
int lautsprecher = 6;
int Hornzufall = 0;
int zufall = 1;
int Licht2I = 0; //Licht2 Input vom Decoder
int SoundI = 0; //Sound Input
void Leiter();
void Beleuchtung();
void Martinshorn();
//nicht relevant für das Servoausfahren
boolean wechsel = false;
boolean signalwechsel = false;
boolean tonedirection = true;
unsigned long previousMillis = 0;
const long noteDuration = 620;
unsigned long wailpreviousMillis = 0;
const long wailnoteDuration = 20;
int hz = 310;
unsigned long ZpreviousMillis = 0;
const long ZnoteDuration = 12000;
unsigned long HpreviousMillis = 0;
const long HnoteDuration = 1000;
///////////////////////PIN/gesamtZeit/AnzahlZustände/AUS/AN/AUS/AN...//gilt für LOW=LED ein
int Leitersicherung_timing[] = { 1, 500, 5, 50, 150, 50, 150, 100};
int LeiterBlaulicht_timing[] = { 2, 600, 5, 0, 150, 50, 150, 250};
int HA3_timing[] = { 10, 500, 5, 50, 150, 50, 150, 100};
int HA4_timing[] = { 9, 500, 5, 50, 150, 50, 150, 100};
int HA5_timing[] = { 8, 500, 5, 50, 150, 50, 150, 100};
//eigene Animationen für die Heckabsicherung
int HAinnenZ = HIGH;
int HAmitteZ = HIGH;
int HAaussenZ = HIGH;
unsigned long HApreviousM = millis();
int HAduration = 1;
int HAcount = 3;
int HAzufall = random(3);
int Heckabsicherung1[] = {8, 9, 10, 250, 10, 250, 10, 150, 100, 150, 10};
int Heckabsicherung2[] = {8, 9, 10, 150, 100, 150, 50, 150, 100, 150, 50};
void setup() {
pinMode(Transistor, OUTPUT);
pinMode(Leitersicherung_timing[0], OUTPUT);
pinMode(LeiterBlaulicht_timing[0], OUTPUT);
for (int i = 0; i < 3; i++) {
pinMode(Heckabsicherung1[i], OUTPUT);
}
HAduration = Heckabsicherung1[HAcount];
pinMode(3, INPUT);
pinMode(4, INPUT);
digitalWrite(Transistor, HIGH);
leiterDrehen.attach(7);
leiterDrehen.write(Drehposition);
//LEDs auf HIGH also aus
digitalWrite(Heckabsicherung1[0], HIGH);
digitalWrite(Heckabsicherung1[1], HIGH);
digitalWrite(Heckabsicherung1[2], HIGH);
digitalWrite(Leitersicherung_timing[0], HIGH);
digitalWrite(LeiterBlaulicht_timing[0], HIGH);
}
void BlaulichtStatus(int* Blaulichtdata)
{
// Anfangs von eingeschaltetem Blinkstatus ausgehen
boolean blinkStatusOn = true;
// Zeit im Blinkzyklus per Modulo-Arithmetik
// aus millis() und der Gesamt-Zykluszeit des Turms errechnen
long inCycleTime = millis() % Blaulichtdata[1];
int onoffCount = Blaulichtdata[2]; // Anzahl der ein/aus Schaltungen
while (onoffCount > 0 && inCycleTime - Blaulichtdata[3 + Blaulichtdata[2] - onoffCount] > 0)
{
// bereits abgelaufene Blinkzeit abziehen
inCycleTime -= Blaulichtdata[3 + Blaulichtdata[2] - onoffCount];
onoffCount--; // Anzahl der ein/aus Schaltungen vermindert
blinkStatusOn = !blinkStatusOn; // Blinkstatus wechselt
}
// wenn alles durch, dann den errechneten Blinkstatus setzen
digitalWrite(Blaulichtdata[0], blinkStatusOn);
}
void loop() {
Licht2I = digitalRead(3);
SoundI = digitalRead(4);
if (millis() <= 45000) {// Innerhalb der ersten 45s soll die EndPos veränderbar sein
PotiVal = analogRead(PotiPin);
PotiVal = map(PotiVal, 0, 1023, 0, 180);//Werte werden auf 0 bis 180 Grad übertragen
if (PotiVal >= 1 && PotiVal <= 90 && PotiVal <= GrundPosDrehen) {//Damit kein Schaden an der Leiter entsteht und das Programm ordentlich funktioniert
// Ausgehend vom Richtwert StandardEndPos ist von außen erkennbar wie weit die Leiter ausfahren wird
if (PotiVal == StandardEndPosDrehen) {
digitalWrite(Heckabsicherung1[2], LOW);
} else {
digitalWrite(Heckabsicherung1[2], HIGH);
}
if (PotiVal < StandardEndPosDrehen) {
digitalWrite(Heckabsicherung1[1], LOW);
} else {
digitalWrite(Heckabsicherung1[1], HIGH);
}
if (PotiVal > StandardEndPosDrehen) {
digitalWrite(Heckabsicherung1[0], LOW);
} else {
digitalWrite(Heckabsicherung1[0], HIGH);
}
if (StandardEndPosDrehen != PotiVal)
EndPosDrehen = PotiVal;//neue EndPos
}
} else {
Leiter();
Beleuchtung();
Martinshorn();
}
SoftwareServo::refresh();// Servo wird immer refresh
}
void Leiter() {
if (millis () - ts >= DELAY) {
ts = millis() ; // setup timestamp for next time.
if (Licht2I == LOW) {//LICHT2 schaltet am Decoder mit -
if (LeiterAusfahren) {//Über diese Bedingung wird verändert, dass wenn Licht2I==LOW die Leiter nur einmal aus und einfährt
if (forward)//Richtung wird hierrüber bestimmt// diese Drehrichtung funktioniert ohne Probleme
{
if (DELAY == 60)//schnelleres Ausfahren ist leichter für den Servo
DELAY = 20;
if (Drehposition != EndPosDrehen) {
digitalWrite(Transistor, HIGH);//Transistor schaltet während der Bewegung den Strom für die Leiter an
Drehposition -= 1;
} else {
forward = false ;
DELAY = 35000;//Delay verlängert um die Leiter für eine gewisse Zeit ausgefahren zu lassen
digitalWrite(Transistor, LOW);
}
} else {// Ab diesem Punkt scheint der Code nicht mehr richtig auf dem Attiny zu laufen
if (DELAY == 35000)//Delay wieder kleiner nach der Pause
DELAY = 60;
if (Drehposition != GrundPosDrehen) {
digitalWrite(Transistor, HIGH);
Drehposition += 1;
} else { // test for reverse
//forward = true ;
Drehposition = GrundPosDrehen;
LeiterAusfahren = false;// damit nur einmal ausgefahren wird
digitalWrite(Transistor, LOW);// kein unnötiger Stromverbrauch( LiPo wird genutzt)
}
}
}
} else {
LeiterAusfahren = true;//Funktion des Leiterausfahrens wird zurückgesetzt für den nächsten Einsatz
forward = true;
DELAY = 60;
if (Drehposition != GrundPosDrehen) {//als Kontrolle ob die Leiter eingefahren wurde
digitalWrite(Transistor, HIGH);
Drehposition += 1;
} else { // test for reverse
Drehposition = GrundPosDrehen;
}
digitalWrite(Transistor, LOW);// Strom für Servo aus
}
}
leiterDrehen.write (Drehposition); //Positionsänderung des Servos
}
Grüße