Moin,
ich versuche mich derzeit an der Programmieurng meiens ersten Arduino Projektes und habe zwei Probleme (A + B) an denne ich derzeit nicht weiterkomme.
Anliegend mein Sketch.
A. Zeile 151 - 159
Hier wusste ich mir nicht anders zu helfen, als if/else Abfragen miteinander zu verknüpfen. Tatsächlich komme ich aber so nicht in "void automat" und auch nicht in "void kalibr" sondern hänge in der letzen 'else' zeile 155 fest --> Ergebnis servo.write(anglerauf)
Wie müsste ich die Zeilen umformulieren um zu den genannten Bedingungen die gewünschten Funktionen ansteuern zu können?
Zur Erklärung:
Die Schaltung soll drei Zustände kennen.
- void automat
ODER
- void kalibr
ODER
- servo.write(anglerauf)
Nur einer der drei Zustände soll, in Abhängigkeit der aufgeführten Variablen, gültig sein.
Ich habe das ganze auch mal als drei einzelne if Abfragen umgeschrieben, aber das klappt auch nicht. Auch hier "klemme" ich in servo.write(anglerauf) fest.
s. dazu den zweiten Sketch.
B.
Ich möchte die Ausschläges des Servos über einen Poti kalibrieren (void kalibr) und die eingestellten Werte im EEPROM speichern (zwei Positionen: setrauf bzw setrunter) um die Einstellungen nicht jedesmal von vorne vornehmen zu müssen.
Mit welcher EEPROM Funktion ist das am zielführendsten? Ich konnte hierzu noch kaum Vorarbeit leisten und wäre für konkrete Codierungsvorschläge sehr dankbar.
Ohne die angesprochene void kalibr Funktion klappt die void automat Funktion. Das habe ich bereits in einem weiteren Sketch getestet.
Vielen Dank und Viele Grüße, Hoosy
ERSTER SKETCH --> MIT DIESEM SKETCH MÖCHTE ICH DIE SCHALTUNG AUFBAUEN
#include <Servo.h>
#include <EEPROM.h>
Servo servo;
bool s1 = false; //Taster Drosselklappe auf
bool s2 = false; //Taster Drosselklappe zu
bool s3 = false; //Taster Gangwahl auf raufschalten
bool s4 = false; //Taster Gangwahl auf runterschalten
bool s5 = false; //Taster Gangwahl zwangsweise auf rauf
bool s6 = false; //Schalter System an oder aus
bool s7 = false; //Schalter für Set Funktion
bool s8 = false; //Tatser für Set Funktion
unsigned long timer1 = 0; // Entpreller Timer s1
unsigned long timer2 = 0; // Entpreller Timer s2
unsigned long timer3 = 0; // Entpreller Timer s3
unsigned long timer4 = 0; // Entpreller Timer s4
unsigned long timer5 = 0; // Entpreller Timer s5
unsigned long timer6 = 0; // Entpreller Timer s6
unsigned long timer7 = 0; // Entpreller Timer s7
unsigned long timer8 = 0; // Entpreller Timer s8
bool s1an = false; //Zwischenvariable für s1
bool s2an = false; //Zwischenvariable für s2
bool s3an = false; //Zwischenvariable für s3
bool s4an = false; //Zwischenvariable für s4
bool s5an = false; //Zwischenvariable für s5
bool s6an = false; //Zwischenvariable für s6
bool s7an = false; //Zwischenvariable für s7
bool s8an = false; //Zwischenvariable für s8
bool RAUF = false; // Ergebnis fuer raufschalten
bool RUNTER = false; // Ergebnis für runterschalten
bool automatan = false; // Ergebnis ob automat an sein soll
bool kalibran = false; // Ergebnis ob Kalibrierung an sein soll
bool kalibran1 = false; // Ergebnis ob Kalibrierung an sein soll final
int setrauf; // abgelesener winkel über poti bei raufschalten, in eeprom gespeichert
int setrunter; // abgelesener winkel über poti bei runterschalten, in eeprom gespeichert
int set; // abgelesener Winkel über poti
int anglerauf = 150; //Servostellung set raufschalten --> 150 Platzhalter, eigentlich angelrauf = setrauf
int anglerunter = 40; //Servostellung set runterschalten --> 40 Platzhalter, eigentlich angelrunter = setrunter
void setup() {
servo.attach(11); //Servomotor
servo.write(90);
pinMode(3, INPUT_PULLUP); // Taster Drosselklappe auf
pinMode(4, INPUT_PULLUP); // Taster Drosselklappe zu
pinMode(5, INPUT_PULLUP); // Taster Gangwahl auf raufschalten
pinMode(6, INPUT_PULLUP); // Taster Gangwahl auf runterschalten
pinMode(7, INPUT_PULLUP); // Taster Gangwahl zwangsweise auf rauf
pinMode(8, INPUT_PULLUP); // Schalter System an oder aus
pinMode(9, OUTPUT); // LED System ist an
pinMode(10, OUTPUT); // LED System ist aus
pinMode(13, OUTPUT); // LED Gangwahl auf raufschalten
pinMode(12, OUTPUT); // LED Gangwahl auf runterschalten
pinMode(2, INPUT_PULLUP); // Schalter für Set Funktion an oder aus
pinMode(1, INPUT_PULLUP); //Taster für Einspeichern/Set des Winkels
}
void loop() {
s1 = digitalRead(3);
s2 = digitalRead(4);
s3 = digitalRead(5);
s4 = digitalRead(6);
s5 = digitalRead(7);
s6 = digitalRead(8);
s7 = digitalRead(2);
s8 = digitalRead(1);
if (s1 == true) {
timer1 = millis();
}
if (s2 == true) {
timer2 = millis();
}
if (s3 == true) {
timer3 = millis();
}
if (s4 == true) {
timer4 = millis();
}
if (s5 == true) {
timer5 = millis();
}
if (s6 == true) {
timer6 = millis();
}
if (s7 == true) {
timer7 = millis();
}
if (s8 == true) {
timer8 = millis();
}
if (s7 == false && millis() - timer7 > 25) {
s7an = true;
} else {
s7an = false;
}
if (s6 == false && millis() - timer6 > 25) {
s6an = true;
} else {
s6an = false;
}
if (s3 == false && millis() - timer3 > 25) {
s3an = true;
} else {
s3an = false;
}
if (s4 == false && millis() - timer4 > 25) {
s4an = true;
} else {
s4an = false;
}
if (s6an == true && s7an == false || s6an == true && s7an == true) { // Schalter System an und Schalter Set Funktion an oder aus
automatan = true;
kalibran = false;
} else { // Schalter System aus und Schalter Set Funktion an oder aus
automatan = false;
kalibran = true;
}
if (kalibran == true && s7an == true) { // Schalter System aus und Schalter Set Funktion an
kalibran1 = true;
} else {
kalibran1 = false;
}
if (automatan == true && kalibran1 == false) { // Schalter System an und Schalter Set Funktion aus
void automat();
} else if (automatan == false && kalibran1 == true) { // Schalter System aus und Schalter Set Funktion an
void kalibr();
} else if (automatan == false && kalibran1 == false) { // Schalter System aus und Schalter Set Funktion aus
servo.write(anglerauf);
} else {
servo.write(90);
}
if (s3an == true) { // LED Gangwahl auf raufschalten
digitalWrite(13, true);
} else {
digitalWrite(13, false);
}
if (s4an == true) { // LED Gangwahl auf runterschalten
digitalWrite(12, true);
} else {
digitalWrite(12, false);
}
if (s6an == true) { // LED System ist an
digitalWrite(9, true);
} else {
digitalWrite(9, false);
}
if (s6an == false) { // LED System ist aus
digitalWrite(10, true);
} else {
digitalWrite(10, false);
}
}
//################################################################
//# Funktionen #
//################################################################
void automat() {
if (s1 == false && millis() - timer1 > 25) {
s1an = true;
} else {
s1an = false;
}
if (s2 == false && millis() - timer2 > 25) {
s2an = true;
} else {
s2an = false;
}
if (s5 == false && millis() - timer5 > 25) {
s5an = true;
} else {
s5an = false;
}
if (s1an == true && s2an == false || s1an == true && s2an == true || s1an == false && s2an == false) {
RAUF = true;
RUNTER = false;
} else {
RAUF = false;
RUNTER = true;
}
if (RUNTER == true && s5an == false) {
servo.write(anglerunter);
} else {
servo.write(anglerauf);
}
if (RAUF == true) {
servo.write(anglerauf);
}
}
void kalibr() {
set = analogRead(0);
set = map(set, 0, 1023, 0, 180);
if (s8 == false && millis() - timer8 > 25) {
s8an = true;
} else {
s8an = false;
}
if (s3an == true && s8an == true) {
setrauf = set;
}
if (s4an == true && s8an == true) {
setrunter = set;
}
servo.write(set);
}
ZWEITER SKETCH --> OHNE ELSE ABFRAGE
#include <Servo.h>
#include <EEPROM.h>
Servo servo;
bool s1 = false; //Taster Drosselklappe auf
bool s2 = false; //Taster Drosselklappe zu
bool s3 = false; //Taster Gangwahl auf raufschalten
bool s4 = false; //Taster Gangwahl auf runterschalten
bool s5 = false; //Taster Gangwahl zwangsweise auf rauf
bool s6 = false; //Schalter System an oder aus
bool s7 = false; //Schalter für Set Funktion
bool s8 = false; //Tatser für Set Funktion
unsigned long timer1 = 0; // Entpreller Timer s1
unsigned long timer2 = 0; // Entpreller Timer s2
unsigned long timer3 = 0; // Entpreller Timer s3
unsigned long timer4 = 0; // Entpreller Timer s4
unsigned long timer5 = 0; // Entpreller Timer s5
unsigned long timer6 = 0; // Entpreller Timer s6
unsigned long timer7 = 0; // Entpreller Timer s7
unsigned long timer8 = 0; // Entpreller Timer s8
bool s1an = false; //Zwischenvariable für s1
bool s2an = false; //Zwischenvariable für s2
bool s3an = false; //Zwischenvariable für s3
bool s4an = false; //Zwischenvariable für s4
bool s5an = false; //Zwischenvariable für s5
bool s6an = false; //Zwischenvariable für s6
bool s7an = false; //Zwischenvariable für s7
bool s8an = false; //Zwischenvariable für s8
bool RAUF = false; // Ergebnis fuer raufschalten
bool RUNTER = false; // Ergebnis für runterschalten
bool automatan = false; // Ergebnis ob automat an sein soll
bool kalibran = false; // Ergebnis ob Kalibrierung an sein soll
bool kalibran1 = false; // Ergebnis ob Kalibrierung an sein soll final
int setrauf; // abgelesener winkel über poti bei raufschalten, in eeprom gespeichert
int setrunter; // abgelesener winkel über poti bei runterschalten, in eeprom gespeichert
int set; // abgelesener Winkel über poti
int anglerauf = 150; //Servostellung set raufschalten --> 150 Platzhalter, eigentlich angelrauf = setrauf
int anglerunter = 40; //Servostellung set runterschalten --> 40 Platzhalter, eigentlich angelrunter = setrunter
void setup() {
servo.attach(11); //Servomotor
servo.write(90);
pinMode(3, INPUT_PULLUP); // Taster Drosselklappe auf
pinMode(4, INPUT_PULLUP); // Taster Drosselklappe zu
pinMode(5, INPUT_PULLUP); // Taster Gangwahl auf raufschalten
pinMode(6, INPUT_PULLUP); // Taster Gangwahl auf runterschalten
pinMode(7, INPUT_PULLUP); // Taster Gangwahl zwangsweise auf rauf
pinMode(8, INPUT_PULLUP); // Schalter System an oder aus
pinMode(9, OUTPUT); // LED System ist an
pinMode(10, OUTPUT); // LED System ist aus
pinMode(13, OUTPUT); // LED Gangwahl auf raufschalten
pinMode(12, OUTPUT); // LED Gangwahl auf runterschalten
pinMode(2, INPUT_PULLUP); // Schalter für Set Funktion an oder aus
pinMode(1, INPUT_PULLUP); //Taster für Einspeichern/Set des Winkels
}
void loop() {
s1 = digitalRead(3);
s2 = digitalRead(4);
s3 = digitalRead(5);
s4 = digitalRead(6);
s5 = digitalRead(7);
s6 = digitalRead(8);
s7 = digitalRead(2);
s8 = digitalRead(1);
if (s1 == true) {
timer1 = millis();
}
if (s2 == true) {
timer2 = millis();
}
if (s3 == true) {
timer3 = millis();
}
if (s4 == true) {
timer4 = millis();
}
if (s5 == true) {
timer5 = millis();
}
if (s6 == true) {
timer6 = millis();
}
if (s7 == true) {
timer7 = millis();
}
if (s8 == true) {
timer8 = millis();
}
if (s7 == false && millis() - timer7 > 25) {
s7an = true;
} else {
s7an = false;
}
if (s6 == false && millis() - timer6 > 25) {
s6an = true;
} else {
s6an = false;
}
if (s3 == false && millis() - timer3 > 25) {
s3an = true;
} else {
s3an = false;
}
if (s4 == false && millis() - timer4 > 25) {
s4an = true;
} else {
s4an = false;
}
if (s6an == true && s7an == false || s6an == true && s7an == true) { // Schalter System an und Schalter Set Funktion an oder aus
automatan = true;
kalibran = false;
} else { // Schalter System aus und Schalter Set Funktion an oder aus
automatan = false;
kalibran = true;
}
if (kalibran == true && s7an == true) { // Schalter System aus und Schalter Set Funktion an
kalibran1 = true;
} else {
kalibran1 = false;
}
if (automatan == true && kalibran1 == false) { // Schalter System an und Schalter Set Funktion aus
void automat();
}
if (automatan == false && kalibran1 == true) { // Schalter System aus und Schalter Set Funktion an
void kalibr();
}
if (automatan == false && kalibran1 == false) { // Schalter System aus und Schalter Set Funktion aus
servo.write(anglerauf);
}
if (s3an == true) { // LED Gangwahl auf raufschalten
digitalWrite(13, true);
} else {
digitalWrite(13, false);
}
if (s4an == true) { // LED Gangwahl auf runterschalten
digitalWrite(12, true);
} else {
digitalWrite(12, false);
}
if (s6an == true) { // LED System ist an
digitalWrite(9, true);
} else {
digitalWrite(9, false);
}
if (s6an == false) { // LED System ist aus
digitalWrite(10, true);
} else {
digitalWrite(10, false);
}
}
//################################################################
//# Funktionen #
//################################################################
void automat() {
if (s1 == false && millis() - timer1 > 25) {
s1an = true;
} else {
s1an = false;
}
if (s2 == false && millis() - timer2 > 25) {
s2an = true;
} else {
s2an = false;
}
if (s5 == false && millis() - timer5 > 25) {
s5an = true;
} else {
s5an = false;
}
if (s1an == true && s2an == false || s1an == true && s2an == true || s1an == false && s2an == false) {
RAUF = true;
RUNTER = false;
} else {
RAUF = false;
RUNTER = true;
}
if (RUNTER == true && s5an == false) {
servo.write(anglerunter);
} else {
servo.write(anglerauf);
}
if (RAUF == true) {
servo.write(anglerauf);
}
}
void kalibr() {
set = analogRead(0);
set = map(set, 0, 1023, 0, 180);
if (s8 == false && millis() - timer8 > 25) {
s8an = true;
} else {
s8an = false;
}
if (s3an == true && s8an == true) {
setrauf = set;
}
if (s4an == true && s8an == true) {
setrunter = set;
}
servo.write(set);
}
DRITTER SKETCH --> OHNE VOID KALIBR
#include <Servo.h>
Servo servo;
bool s1 = false; //Taster Drosselklappe auf
bool s2 = false; //Taster Drosselklappe zu
bool s3 = false; //Taster Gangwahl auf raufschalten
bool s4 = false; //Taster Gangwahl auf runterschalten
bool s5 = false; //Taster Gangwahl zwangsweise auf rauf
bool s6 = false; //Schalter System an oder aus
unsigned long timer1 = 0; // Entpreller Timer s1
unsigned long timer2 = 0; // Entpreller Timer s2
unsigned long timer3 = 0; // Entpreller Timer s3
unsigned long timer4 = 0; // Entpreller Timer s4
unsigned long timer5 = 0; // Entpreller Timer s5
unsigned long timer6 = 0; // Entpreller Timer s6
bool s1an = false; //Zwischenvariable für s1
bool s2an = false; //Zwischenvariable für s2
bool s3an = false; //Zwischenvariable für s3
bool s4an = false; //Zwischenvariable für s4
bool s5an = false; //Zwischenvariable für s5
bool s6an = false; //Zwischenvariable für s6
bool RAUF = false; // Ergebnis fuer raufschalten
bool RUNTER = false; // Ergebnis für runterschalten
int anglerauf = 150; //Servostellung set raufschalten
int anglerunter = 40; //Servostellung set runterschalten
void setup() {
servo.attach(11); //Servomotor
servo.write(90);
pinMode(3, INPUT_PULLUP); // Taster Drosselklappe auf
pinMode(4, INPUT_PULLUP); // Taster Drosselklappe zu
pinMode(5, INPUT_PULLUP); // Taster Gangwahl auf raufschalten
pinMode(6, INPUT_PULLUP); // Taster Gangwahl auf runterschalten
pinMode(7, INPUT_PULLUP); // Taster Gangwahl zwangsweise auf rauf
pinMode(8, INPUT_PULLUP); // Schalter System an oder aus
pinMode(9, OUTPUT); // LED System ist an
pinMode(10, OUTPUT); // LED System ist aus
pinMode(13, OUTPUT); // LED Gangwahl auf raufschalten
pinMode(12, OUTPUT); // LED Gangwahl auf runterschalten
}
void loop() {
s1 = digitalRead(3);
s2 = digitalRead(4);
s3 = digitalRead(5);
s4 = digitalRead(6);
s5 = digitalRead(7);
s6 = digitalRead(8);
if (s1 == true) {
timer1 = millis();
}
if (s2 == true) {
timer2 = millis();
}
if (s3 == true) {
timer3 = millis();
}
if (s4 == true) {
timer4 = millis();
}
if (s5 == true) {
timer5 = millis();
}
if (s6 == true) {
timer6 = millis();
}
if (s6 == false && millis() - timer6 > 25) {
s6an = true;
} else {
s6an = false;
}
if (s3 == false && millis() - timer3 > 25) {
s3an = true;
} else {
s3an = false;
}
if (s4 == false && millis() - timer4 > 25) {
s4an = true;
} else {
s4an = false;
}
if (s6an == true) { // Schalter System an oder aus
automat();
} else {
servo.write(anglerauf);
}
if (s3an == true) { // LED Gangwahl auf raufschalten
digitalWrite(13, true);
} else {
digitalWrite(13, false);
}
if (s4an == true) { // LED Gangwahl auf runterschalten
digitalWrite(12, true);
} else {
digitalWrite(12, false);
}
if(s6an == true){ // LED System ist an
digitalWrite(9, true);
}else{digitalWrite(9, false);
}
if(s6an == false){ // LED System ist aus
digitalWrite(10, true);
}else{digitalWrite(10, false);
}
}
//################################################################
//# Funktionen #
//################################################################
void automat() {
if (s1 == false && millis() - timer1 > 25) {
s1an = true;
} else {
s1an = false;
}
if (s2 == false && millis() - timer2 > 25) {
s2an = true;
} else {
s2an = false;
}
if (s5 == false && millis() - timer5 > 25) {
s5an = true;
} else {
s5an = false;
}
if (s1an == true && s2an == false || s1an == true && s2an == true || s1an == false && s2an == false) {
RAUF = true;
RUNTER = false;
} else {
RAUF = false;
RUNTER = true;
}
if (RUNTER == true && s5an == false) {
servo.write(anglerunter);
} else {
servo.write(anglerauf);
}
if (RAUF == true) {
servo.write(anglerauf);
}
}