Проблема с funktion в loop
- Войдите на сайт для отправки комментариев
Пнд, 21/07/2014 - 13:17
Работаю над одной программой и все вроде бы хорошо, но вот наткнулся на одну проблему и с места сдвинутся не могу.
В общем, моя проблема в том, что когда я в loop начинаю функ. она делает не все что должна.
Код функции:
gang_s umschaltfkt( gang_s j[], gang_s n[], gang_s w[], int t, int tol ) //Funktion zum Umschalten zwischen den Gängen
{
lcd.clear();
int pwma; //Wert für Ua Ausgabe
int pwmw; //Wert für Uw Ausgabe
int time; //Wert für Delay
int tabs; //Wert für Delayberechnung
gang_s soll;
int a; //Wert für Umschaltung zwischen jetzt.gUa und neutral.gUa
int d;
int b; //Werte zum Erkennen im welchen Uw sich der jetztige und gewünschte Gang befinden
int c;
int e;
int f;
int x;
int y;
soll.gUw = (w[20].gUw + ((w[20].gUw * tol)/100));
soll.gUa = (w[20].gUa + ((w[20].gUa * tol)/100));
for( b = 0; b < 20; b++ ){ // Es wird erkannt im welchen Uw bereich der jetzige Gang ist
for(x = 0; x < 20; x++){
c++;
if(j[b].gUw == n[x].gUw){
break;
}
}
}
for( d = 0; d < 20; d++ ){ // Es wird erkannt im welchen Uw bereich der gewünschte Gang ist
for(y = 0; y <20; y++){
if(w[d].gUw == n[y].gUw){
e++;
break;
}
}
}
tabs = c - e; // Es wird berechnet wieviele Schritte zwischen Uwjetzt und Uwsoll sind
time = ( t/(abs(tabs)+42)); // Es wird berechnet wie lang das Delay sein muss
if (j[20].gUa != n[20].gUa){ // Wenn Uajetzt größer als Uaneutral ist:
for( a = 20; a > 0; a--)
{
pwma = (((j[a].gUa)>>4)-(j[a].gUa>>7)-(j[a].gUa>>8)); // PWM Signal für Ua wird berechnet
pwma = (pwma + ((pwma * tol)/100)); // Die Toleranz wird dazugerechnet
pwmw = (((j[a].gUw)>>4)-(j[a].gUw>>7)-(j[a].gUw>>8)); // PWM Signal für Uw wird berechnet
pwmw = (pwmw + ((pwmw * tol)/100)); // Die Toleranz wird dazugerechnet
lcd.setCursor(0, 0);
lcd.print((j[a].gUw + ((j[a].gUw*tol)/100))); // Uw auf dem Display angezeigt
lcd.setCursor(0,1);
lcd.print((j[a].gUa + ((j[a].gUa*tol)/100))); // Ua auf dem Display angezeigt
analogWrite(uaPinPWM, pwma); // PWM Signal ausgegeben
analogWrite(uwPinPWM, pwmw);
delay(time);
}
}
if( c > e){ // Wenn das Uwjetzt > Uwsoll ist
do{ // Wird
pwmw = (((n[c].gUw)>>4)-(n[c].gUw>>7)-(n[c].gUw>>8)); // PWM Signal für Uw wird berechnet
pwmw = (pwmw + ((pwmw * tol)/100)); // Die Toleranz wird dazugerechnet
pwma = (((n[c].gUa)>>4)-(n[c].gUa>>7)-(n[c].gUa>>8)); // PWM Signal für Ua wird berechnet
pwma = (pwma + ((pwma * tol)/100)); // Die Toleranz wird dazugerechnet
lcd.setCursor(0, 0);
lcd.print((n[c].gUw + ((n[c].gUw*tol)/100))); // Uw auf dem Display angezeigt
lcd.setCursor(0, 1);
lcd.print((n[c].gUa + ((n[c].gUa*tol)/100))); // Uw auf dem Display angezeigt
analogWrite(uwPinPWM, pwmw); // PWM Signal ausgegeben
analogWrite(uaPinPWM, pwma);
c--; // Der nächste Wert ausgewählt
}
while(n[c].gUw > n[e].gUw) ; // Solange Uwsoll nicht erreicht wird
}
else if (e > c){ // Wenn das Uwjetzt < Uwsoll ist
do{ // Wird
pwmw = (((n[c].gUw)>>4)-(n[c].gUw>>7)-(n[c].gUw>>8)); // PWM Signal für Uw berechnet
pwmw = (pwmw + ((pwmw * tol)/100)); // Die Toleranz wird dazugerechnet
pwma = (((n[c].gUa)>>4)-(n[c].gUa>>7)-(n[c].gUa>>8)); // PWM Signal für Uw berechnet
pwma = (pwma + ((pwma * tol)/100)); // Die Toleranz wird dazugerechnet
lcd.setCursor(0, 0);
lcd.print((n[c].gUw + ((n[c].gUw*tol)/100))); // Uw auf dem Display angezeigt
lcd.setCursor(0,1);
lcd.print((n[c].gUa + ((n[c].gUa*tol)/100))); // Ua auf dem Display angezeigt
analogWrite(uwPinPWM, pwmw); // PWM Signal ausgegeben
analogWrite(uaPinPWM, pwma);
c++; // Der nächste Wert ausgewählt
}
while(n[e].gUw > n[c].gUw) ; // Solange Uwsoll nicht erreicht wird
}
for( d = 0; d < 20; d++){
pwma = (((w[d].gUa)>>4)-(w[d].gUa>>7)-(w[d].gUa>>8)); // Der PWM Signal für Ua wird berechnet
pwma = (pwma + ((pwma * tol)/100)); // Die Toleranz wird dazugerechnet
pwmw = (((w[d].gUw)>>4)-(w[d].gUw>>7)-(w[d].gUw>>8)); // Der PWM Signal für Uw wird berechnet
pwmw = (pwmw + ((pwmw * tol)/100)); // Die Toleranz wird dazugerechnet
lcd.setCursor(0, 0);
lcd.print(w[d].gUw); // Uw auf dem Display anzeigen
lcd.setCursor(0,1);
lcd.print(w[d].gUa); // Ua auf dem Display anzeigen
analogWrite(uaPinPWM, pwma); // PWM Signal wird ausgeben
analogWrite(uwPinPWM, pwmw);
delay(time);
}
A=0;
return soll; // Der gewünschte Wert ist die Rückgabe
}
По плану тут на LCD должно было показывать как меняются числа, но в итоге на LCD появляется только последнее число. Знатоки, внимание вопрос: почему это так???
Уже замучился с этой тупостю и не могу никак продвинутся. помогите пожалуйста
Вот полный код:
#include <LiquidCrystal.h>
/*
* LCD RS mit Pin 12 verbinden
* LCD Enable mit Pin 11 verbinden
* LCD D4 Pin mit 5 verbinden
* LCD D5 Pin mit 4 verbinden
* LCD D6 Pin mit 3 verbinden
* LCD D7 Pin mit 2 verbinden
*/
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buttonPinLeft = 13; // Up button
const int buttonPinRight = 8; // Down button
const int buttonPinEsc = 7; // Esc button
const int buttonPinEnter = 6; // Enter button
int uwPinPWM = 10; // Pin für PWM ausgabe
int uaPinPWM = 9; // Pin für PWM ausgabe
int lastButtonPushed = 0; // Für debounce
int lastButtonEnterState = LOW; // Für Tastensteuerung
int lastButtonEscState = LOW; // Für Tastensteuerung
int lastButtonLeftState = LOW; // Für Tastensteuerung
int lastButtonRightState = LOW; // Für Tastensteuerung
long lastEnterDebounceTime = 0; // Für debounce
long lastEscDebounceTime = 0; // Für debounce
long lastLeftDebounceTime = 0; // Für debounce
long lastRightDebounceTime = 0; // Für debounce
long debounceDelay = 150; // Für debounce
int A = 0; // Wert für Menü
int reading; // Für debounce
int toleranz = 0; // Wert für Toleranz
int schaltzeit = 100; // Wert für die Zeit
int gang = 0; // Wert für den Gang
int pwmUa; // Wert für Ua Signal
int pwmUw; // Wert für Uw Signal
#define MAXSIZE 21
typedef struct // Struktur von einem Messwert
{ // Uw und Ua sind gespeichert
unsigned int gUw;
unsigned int gUa;
}
gang_s;
gang_s jetzt = { //Werte für den Gang am Anfang
2475,2500 };
gang_s erster[MAXSIZE]= { //Messwerte des 1. Gangs
{
2125,2500 }
,{
2125,2575 }
,{
2125,2650 }
,{
2125,2725 }
,{
2125,2800 }
,{
2125,2875 }
,{
2125,2950 }
,{
2125,3025 }
,{
2125,3100 }
,{
2125,3175 }
,{
2125,3250 }
,{
2125,3325 }
,{
2125,3400 }
,{
2125,3475 }
,{
2125,3550 }
,{
2125,3625 }
,{
2125,3700 }
,{
2125,3775 }
,{
2125,3850 }
,{
2125,3925 }
,{
2125,4000 }
};
gang_s zweiter[MAXSIZE]= { //Messwerte des 2. Gangs
{
2125,2500 }
,{
2125,2425 }
,{
2125,2350 }
,{
2125,2275 }
,{
2125,2200 }
,{
2125,2125 }
,{
2125,2050 }
,{
2125,1975 }
,{
2125,1900 }
,{
2125,1825 }
,{
2125,1750 }
,{
2125,1675 }
,{
2125,1600 }
,{
2125,1525 }
,{
2125,1450 }
,{
2125,1375 }
,{
2125,1300 }
,{
2125,1225 }
,{
2125,1150 }
,{
2125,1075 }
,{
2125,1000 }
};
gang_s dritter[MAXSIZE]= { //Messwerte des 3. Gangs
{
3250,2500 }
,{
3250,2575 }
,{
3250,2650 }
,{
3250,2725 }
,{
3250,2800 }
,{
3250,2875 }
,{
3250,2950 }
,{
3250,3025 }
,{
3250,3100 }
,{
3250,3175 }
,{
3250,3250 }
,{
3250,3325 }
,{
3250,3400 }
,{
3250,3475 }
,{
3250,3550 }
,{
3250,3625 }
,{
3250,3700 }
,{
3250,3775 }
,{
3250,3850 }
,{
3250,3925 }
,{
3250,4000 }
};
gang_s vierter[MAXSIZE]= { //Messwerte des 4. Gangs
{
3250,2500 }
,{
3250,2425 }
,{
3250,2350 }
,{
3250,2275 }
,{
3250,2200 }
,{
3250,2125 }
,{
3250,2050 }
,{
3250,1975 }
,{
3250,1900 }
,{
3250,1825 }
,{
3250,1750 }
,{
3250,1675 }
,{
3250,1600 }
,{
3250,1525 }
,{
3250,1450 }
,{
3250,1375 }
,{
3250,1300 }
,{
3250,1225 }
,{
3250,1150 }
,{
3250,1075 }
,{
3250,1000 }
};
gang_s fuenfter[MAXSIZE]={ //Messwerte des 5. Gangs
{
4125,2500 }
,{
4125,2575 }
,{
4125,2650 }
,{
4125,2725 }
,{
4125,2800 }
,{
4125,2875 }
,{
4125,2950 }
,{
4125,3025 }
,{
4125,3100 }
,{
4125,3175 }
,{
4125,3250 }
,{
4125,3325 }
,{
4125,3400 }
,{
4125,3475 }
,{
4125,3550 }
,{
4125,3625 }
,{
4125,3700 }
,{
4125,3775 }
,{
4125,3850 }
,{
4125,3925 }
,{
4125,4000 }
};
gang_s sechster[MAXSIZE]={ //Messwerte des 6. Gangs
{
4125,2500 }
,{
4125,2425 }
,{
4125,2350 }
,{
4125,2275 }
,{
4125,2200 }
,{
4125,2125 }
,{
4125,2050 }
,{
4125,1975 }
,{
4125,1900 }
,{
4125,1825 }
,{
4125,1750 }
,{
4125,1675 }
,{
4125,1600 }
,{
4125,1525 }
,{
4125,1450 }
,{
4125,1375 }
,{
4125,1300 }
,{
4125,1225 }
,{
4125,1150 }
,{
4125,1075 }
,{
4125,1000 }
};
gang_s rueck[MAXSIZE]= { //Messwerte des R Gangs
{
875,2500 }
,{
875,2575 }
,{
875,2650 }
,{
875,2725 }
,{
875,2800 }
,{
875,2875 }
,{
875,2950 }
,{
875,3025 }
,{
875,3100 }
,{
875,3175 }
,{
875,3250 }
,{
875,3325 }
,{
875,3400 }
,{
875,3475 }
,{
875,3550 }
,{
875,3625 }
,{
875,3700 }
,{
875,3775 }
,{
875,3850 }
,{
875,3925 }
,{
875,4000 }
};
gang_s neutral[MAXSIZE]= { //Messwerte des N Gangs
{
875,2500 }
,{
1025,2500 }
,{
1175,2500 }
,{
1350,2500 }
,{
1500,2500 }
,{
1650,2500 }
,{
1825,2500 }
,{
1975,2500 }
,{
2125,2500 }
,{
2300,2500 }
,{
2475,2500 }
,{
2625,2500 }
,{
2775,2500 }
,{
2925,2500 }
,{
3100,2500 }
,{
3250,2500 }
,{
3400,2500 }
,{
3575,2500 }
,{
3725,2500 }
,{
3875,2500 }
,{
4125,2500 }
};
gang_s umschaltfkt( gang_s j[], gang_s n[], gang_s w[], int t, int tol ); // Funktion zum Umschalten zwischen Gängen
gang_s umschaltN(gang_s j[],int t,int tol); // Funktion zum Umschalten auf N
void setup() {
pinMode(buttonPinLeft, INPUT); //Buttons
pinMode(buttonPinRight, INPUT); //werden
pinMode(buttonPinEnter, INPUT); //als Input
pinMode(buttonPinEsc, INPUT); // definiert
lcd.begin(16, 4); //Eigenschaften des LCDs
lcd.clear();
}
void loop() {
pwmUa = (((jetzt.gUa)>>4)-(jetzt.gUa>>7)-(jetzt.gUa>>8)); // Ua wird berechnet
pwmUw = (((jetzt.gUw)>>4)-(jetzt.gUw>>7)-(jetzt.gUw>>8)); // Ua wird berechnet
analogWrite(uwPinPWM, pwmUw); //Der Pin uwPinPWM hat immer eine Ausgabe
analogWrite(uaPinPWM, pwmUa); //Der Pin uaPinPWM hat immer eine Ausgabe
switch(A){ //Der Wert von A wird zur Steurung des Menüs verwendet
case 0: //Wenn A = 0:
lcd.setCursor(0, 0);
lcd.print(jetzt.gUw); //Der Uw Wert wird in der ersten Zeile angezeigt
lcd.setCursor(0,1);
lcd.print(jetzt.gUa); //Der Ua Wert wird in der zweiten Zeile angezeigt
lcd.setCursor(0,2);
if ((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)) { //Je nach dem welchen Wert wir haben Schreibt LCD, im welchen Gang wir sind
lcd.print("Gang: 1");
}
else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)) {
lcd.print("Gang: 2");
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)) {
lcd.print("Gang: 3");
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)) {
lcd.print("Gang: 4");
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)) {
lcd.print("Gang: 5");
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)) {
lcd.print("Gang: 6");
}
else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)) {
lcd.print("Gang: R");
}
else{
lcd.print("Gang: N");
}
break;
case 10: //Wenn A = 10 wird Toleranz: Ideal makiert
lcd.setCursor(0, 0);
lcd.print("> T: Ideal");
lcd.setCursor(0,1);
lcd.print(" T: +5%");
lcd.setCursor(0,2);
lcd.print(" T: -5%");
lcd.setCursor(0,3);
lcd.print(" T: +10%");
break;
case 20: //Wenn A = 20 wird Toleranz: +5% makiert
lcd.setCursor(0,0);
lcd.print(" T: Ideal");
lcd.setCursor(0,1);
lcd.print("> T: +5%");
lcd.setCursor(0,2);
lcd.print(" T: -5%");
lcd.setCursor(0,3);
lcd.print(" T: +10%");
break;
case 30: //Wenn A = 30 wird Toleranz: -5% makiert
lcd.setCursor(0,0);
lcd.print(" T: Ideal");
lcd.setCursor(0,1);
lcd.print(" T: +5%");
lcd.setCursor(0,2);
lcd.print("> T: -5%");
lcd.setCursor(0,3);
lcd.print(" T: +10%");
break;
case 40: //Wenn A = 40 wird Toleranz: +10% makiert
lcd.setCursor(0,0);
lcd.print(" T: +5%");
lcd.setCursor(0,1);
lcd.print(" T: -5%");
lcd.setCursor(0,2);
lcd.print("> T: +10%");
lcd.setCursor(0,3);
lcd.print(" T: -10%");
break;
case 50: //Wenn A = 50 wird Toleranz: -10% makiert
lcd.setCursor(0,0);
lcd.print(" T: +5%");
lcd.setCursor(0,1);
lcd.print(" T: -5%");
lcd.setCursor(0,2);
lcd.print(" T: +10%");
lcd.setCursor(0,3);
lcd.print("> T: -10%");
break;
case 11: //Wenn A = 11 wird 1. Gang makiert
lcd.setCursor(0, 0);
lcd.print("> auf 1.Gang");
lcd.setCursor(0,1);
lcd.print(" auf 2.Gang");
lcd.setCursor(0,2);
lcd.print(" auf 3.Gang");
lcd.setCursor(0,3);
lcd.print(" auf 4.Gang");
break;
case 12: //Wenn A = 12 wird 2. Gang makiert
lcd.setCursor(0,0);
lcd.print(" auf 1.Gang");
lcd.setCursor(0,1);
lcd.print("> auf 2.Gang");
lcd.setCursor(0,2);
lcd.print(" auf 3.Gang");
lcd.setCursor(0,3);
lcd.print(" auf 4.Gang");
break;
case 13: //Wenn A = 13 wird 3. Gang makiert
lcd.setCursor(0,0);
lcd.print(" auf 1.Gang");
lcd.setCursor(0,1);
lcd.print(" auf 2.Gang");
lcd.setCursor(0,2);
lcd.print("> auf 3.Gang");
lcd.setCursor(0,3);
lcd.print(" auf 4.Gang");
break;
case 14: //Wenn A = 14 wird 4. Gang makiert
lcd.setCursor(0,0);
lcd.print(" auf 2.Gang");
lcd.setCursor(0,1);
lcd.print(" auf 3.Gang");
lcd.setCursor(0,2);
lcd.print("> auf 4.Gang");
lcd.setCursor(0,3);
lcd.print(" auf 5.Gang");
break;
case 15: //Wenn A = 15 wird 5. Gang makiert
lcd.setCursor(0,0);
lcd.print(" auf 3.Gang");
lcd.setCursor(0,1);
lcd.print(" auf 4.Gang");
lcd.setCursor(0,2);
lcd.print("> auf 5.Gang");
lcd.setCursor(0,3);
lcd.print(" auf 6.Gang");
break;
case 16: //Wenn A = 16 wird 6. Gang makiert
lcd.setCursor(0,0);
lcd.print(" auf 4.Gang");
lcd.setCursor(0,1);
lcd.print(" auf 5.Gang");
lcd.setCursor(0,2);
lcd.print("> auf 6.Gang");
lcd.setCursor(0,3);
lcd.print(" auf R");
break;
case 17: //Wenn A = 17 wird R Gang makiert
lcd.setCursor(0,0);
lcd.print(" auf 5.Gang");
lcd.setCursor(0,1);
lcd.print(" auf 6.Gang");
lcd.setCursor(0,2);
lcd.print("> auf R");
lcd.setCursor(0,3);
lcd.print(" auf N");
break;
case 18: //Wenn A = 18 wird N Gang makiert
lcd.setCursor(0,0);
lcd.print(" auf 5.Gang");
lcd.setCursor(0,1);
lcd.print(" auf 6.Gang");
lcd.setCursor(0,2);
lcd.print(" auf R");
lcd.setCursor(0,3);
lcd.print("> auf N");
break;
case 110: //Wenn A = 110 wird die Schaltzeit angezeigt
lcd.setCursor(0,0);
lcd.print(" Schaltzeit:");
lcd.setCursor(0,1);
lcd.print(schaltzeit);
lcd.setCursor(0,2);
break;
default:
lcd.setCursor(0,0);
lcd.print("Glückwunsch!");
lcd.setCursor(0,1);
lcd.print("Du hast das Pro-");
lcd.setCursor(0,2);
lcd.print("gramm kaputt");
lcd.setCursor(0,3);
lcd.print("gemacht! :-D");
break;
}
int buttonEnterState=LOW; // Der Zustand der Buttons
int buttonEscState=LOW;
int buttonLeftState=LOW;
int buttonRightState=LOW;
reading = digitalRead(buttonPinEnter); // Debounce der Buttons
if (reading != lastButtonEnterState) {
lastEnterDebounceTime = millis();
}
if ((millis() - lastEnterDebounceTime) > debounceDelay) {
buttonEnterState=reading;
lastEnterDebounceTime=millis();
}
lastButtonEnterState = reading;
reading = digitalRead(buttonPinEsc);
if (reading != lastButtonEscState) {
lastEscDebounceTime = millis();
}
if ((millis() - lastEscDebounceTime) > debounceDelay) {
buttonEscState = reading;
lastEscDebounceTime=millis();
}
lastButtonEscState = reading;
reading = digitalRead(buttonPinRight);
if (reading != lastButtonRightState) {
lastRightDebounceTime = millis();
}
if ((millis() - lastRightDebounceTime) > debounceDelay) {
buttonRightState = reading;
lastRightDebounceTime =millis();
}
lastButtonRightState = reading;
reading = digitalRead(buttonPinLeft);
if (reading != lastButtonLeftState) {
lastLeftDebounceTime = millis();
}
if ((millis() - lastLeftDebounceTime) > debounceDelay) {
buttonLeftState = reading;
lastLeftDebounceTime=millis();
}
lastButtonLeftState = reading;
if (buttonEnterState==HIGH){
lastButtonPushed=buttonPinEnter;
}
else if(buttonEscState==HIGH){
lastButtonPushed=buttonPinEsc;
}
else if(buttonRightState==HIGH){
lastButtonPushed=buttonPinRight;
}
else if(buttonLeftState==HIGH){
lastButtonPushed=buttonPinLeft;
}
else{
lastButtonPushed=0;
}
////////////////////////////// Taster ///////////////////////////////////
//menu key down
if (buttonRightState==HIGH ) {
if((A == 10) || (A == 20) || (A == 30)|| (A == 40)) { //Wenn A zwischen 10 und 40 ist und Button wird gedrückt, wird A um 10 größer
A = A + 10;
}
else if((A == 11) || (A == 12) || (A == 13) || (A == 14) || (A == 15) || (A == 16) || (A == 17)) { //Wenn A zwischen 11 und 17 ist und Button wird gedrückt, wird A um 1 größer
A = A + 1;
}
else if(A == 110){ //Wenn A = 110 und Button wird gedrückt, wird Schaltzeit um 100ms länger
schaltzeit = schaltzeit + 100;
}
}
//menu key up
if (buttonLeftState==HIGH) {
if((A == 20) || (A == 30) || (A == 40)|| (A == 50)) { //Wenn A zwischen 20 und 50 ist und Button wird gedrückt, wird A um 10 kleiner
A = A - 10;
}
else if((A == 12) || (A == 13) || (A == 14) || (A == 15) || (A == 16) || (A == 17) || (A == 18)) { //Wenn A zwischen 12 und 18 ist und Button wird gedrückt, wird A um 1 kleiner
A = A - 1;
}
else if( A == 110 ){ //Wenn A = 110 und Button wird gedrückt, wird Schaltzeit um 100ms kürzer
schaltzeit = schaltzeit - 100;
}
}
//menu key ok
if (buttonEnterState==HIGH) {
switch(A){
case 0:
A = 10;
break;
case 10: //Wenn A=10 und Button wird gedrückt, wird Toleranz 0% und A=11
toleranz=0;
A=11;
break;
case 20: //Wenn A=20 und Button wird gedrückt, wird Toleranz +5% und A=11
toleranz=5;
A=11;
break;
case 30: //Wenn A=30 und Button wird gedrückt, wird Toleranz -5% und A=11
toleranz=-5;
A=11;
break;
case 40: //Wenn A=40 und Button wird gedrückt, wird Toleranz +10% und A=11
toleranz=10;
A=11;
break;
case 50: //Wenn A=50 und Button wird gedrückt, wird Toleranz -10% und A=11
toleranz=-10;
A=11;
break;
case 11: //Wenn A=11 und Button wird gedrückt, wird gespeichert, dass auf den 1. Gang gewechselt werden soll und A=110
gang = 1;
A=110;
break;
case 12: //Wenn A=12 und Button wird gedrückt, wird gespeichert, dass auf den 2. Gang gewechselt werden soll und A=110
gang = 2;
A=110;
break;
case 13: //Wenn A=13 und Button wird gedrückt, wird gespeichert, dass auf den 3. Gang gewechselt werden soll und A=110
gang = 3;
A=110;
break;
case 14: //Wenn A=14 und Button wird gedrückt, wird gespeichert, dass auf den 4. Gang gewechselt werden soll und A=110
gang = 4;
A=110;
break;
case 15: //Wenn A=15 und Button wird gedrückt, wird gespeichert, dass auf den 5. Gang gewechselt werden soll und A=110
gang = 5;
A=110;
break;
case 16: //Wenn A=16 und Button wird gedrückt, wird gespeichert, dass auf den 6. Gang gewechselt werden soll und A=110
gang = 6;
A=110;
break;
case 17: //Wenn A=17 und Button wird gedrückt, wird gespeichert, dass auf den R Gang gewechselt werden soll und A=110
gang = 7;
A=110;
break;
case 18: //Wenn A=18 und Button wird gedrückt, wird gespeichert, dass auf den N Gang gewechselt werden soll und A=110
gang = 8;
A=110;
break;
case 110:
switch(gang){
case 1:
if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){ //Auf den 1. Gang umschalten, wenn man im 2. ist
jetzt = umschaltfkt( zweiter, neutral, erster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){ //Auf den 1. Gang umschalten, wenn man im 3. ist
jetzt = umschaltfkt( dritter, neutral, erster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){ //Auf den 1. Gang umschalten, wenn man im 4. ist
jetzt = umschaltfkt( vierter, neutral, erster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){ //Auf den 1. Gang umschalten, wenn man im 5. ist
jetzt = umschaltfkt( fuenfter, neutral, erster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){ //Auf den 1. Gang umschalten, wenn man im 6. ist
jetzt = umschaltfkt( sechster, neutral, erster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){ //Auf den 1. Gang umschalten, wenn man im R ist
jetzt = umschaltfkt( rueck, neutral, erster, schaltzeit, toleranz );
A = 0;
}
else{ //Auf den 1. Gang umschalten, wenn man im N ist
jetzt = umschaltfkt( neutral, neutral, erster, schaltzeit, toleranz );
A = 0;
}
break;
case 2:
if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){ //Auf den 2. Gang umschalten, wenn man im 1. ist
jetzt = umschaltfkt( erster, neutral, zweiter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){ //Auf den 2. Gang umschalten, wenn man im 3. ist
jetzt = umschaltfkt( dritter, neutral, zweiter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){ //Auf den 2. Gang umschalten, wenn man im 4. ist
jetzt = umschaltfkt( vierter, neutral, zweiter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){ //Auf den 2. Gang umschalten, wenn man im 5. ist
jetzt = umschaltfkt( fuenfter, neutral, zweiter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){ //Auf den 2. Gang umschalten, wenn man im 6. ist
jetzt = umschaltfkt( sechster, neutral, zweiter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){ //Auf den 2. Gang umschalten, wenn man im R ist
jetzt = umschaltfkt( rueck, neutral, zweiter, schaltzeit, toleranz );
A = 0;
}
else{ //Auf den 2. Gang umschalten, wenn man im N ist
jetzt = umschaltfkt( neutral, neutral, zweiter, schaltzeit, toleranz );
A = 0;
}
break;
case 3:
if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){ //Auf den 3. Gang umschalten, wenn man im 1. ist
jetzt = umschaltfkt( erster, neutral, dritter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){ //Auf den 3. Gang umschalten, wenn man im 2. ist
jetzt = umschaltfkt( zweiter, neutral, dritter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){ //Auf den 3. Gang umschalten, wenn man im 4. ist
jetzt = umschaltfkt( vierter, neutral, dritter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){ //Auf den 3. Gang umschalten, wenn man im 5. ist
jetzt = umschaltfkt( fuenfter, neutral, dritter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){ //Auf den 3. Gang umschalten, wenn man im 6. ist
jetzt = umschaltfkt( sechster, neutral, dritter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){ //Auf den 3. Gang umschalten, wenn man im R ist
jetzt = umschaltfkt( rueck, neutral, dritter, schaltzeit, toleranz );
A = 0;
}
else{ //Auf den 3. Gang umschalten, wenn man im N ist
jetzt = umschaltfkt( neutral, neutral, dritter, schaltzeit, toleranz );
A = 0;
}
break;
case 4:
if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){ //Auf den 4. Gang umschalten, wenn man im 1. ist
jetzt = umschaltfkt( erster, neutral, vierter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){ //Auf den 4. Gang umschalten, wenn man im 2. ist
jetzt = umschaltfkt( zweiter, neutral, vierter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){ //Auf den 4. Gang umschalten, wenn man im 3. ist
jetzt = umschaltfkt( dritter, neutral, vierter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=2000)){ //Auf den 4. Gang umschalten, wenn man im 5. ist
jetzt = umschaltfkt( fuenfter, neutral, vierter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){ //Auf den 4. Gang umschalten, wenn man im 6. ist
jetzt = umschaltfkt( sechster, neutral, vierter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){ //Auf den 4. Gang umschalten, wenn man im R ist
jetzt = umschaltfkt( rueck, neutral, vierter, schaltzeit, toleranz );
A = 0;
}
else{ //Auf den 4. Gang umschalten, wenn man im N ist
jetzt = umschaltfkt( neutral, neutral, vierter, schaltzeit, toleranz );
A = 0;
}
break;
case 5:
if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){ //Auf den 5. Gang umschalten, wenn man im 1. ist
jetzt = umschaltfkt( erster, neutral, fuenfter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){ //Auf den 5. Gang umschalten, wenn man im 2. ist
jetzt = umschaltfkt( zweiter, neutral, fuenfter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){ //Auf den 5. Gang umschalten, wenn man im 3. ist
jetzt = umschaltfkt( dritter, neutral, fuenfter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=2000)){ //Auf den 5. Gang umschalten, wenn man im 4. ist
jetzt = umschaltfkt( vierter, neutral, fuenfter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){ //Auf den 5. Gang umschalten, wenn man im 6. ist
jetzt = umschaltfkt( sechster, neutral, fuenfter, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){ //Auf den 5. Gang umschalten, wenn man im R ist
jetzt = umschaltfkt( rueck, neutral, fuenfter, schaltzeit, toleranz );
A = 0;
}
else{ //Auf den 5. Gang umschalten, wenn man im N ist
jetzt = umschaltfkt( neutral, neutral, fuenfter, schaltzeit, toleranz );
A = 0;
}
break;
case 6:
if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){ //Auf den 6. Gang umschalten, wenn man im 1. ist
jetzt = umschaltfkt( erster, neutral, sechster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){ //Auf den 6. Gang umschalten, wenn man im 2. ist
jetzt = umschaltfkt( zweiter, neutral, sechster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){ //Auf den 6. Gang umschalten, wenn man im 3. ist
jetzt = umschaltfkt( dritter, neutral, sechster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){ //Auf den 6. Gang umschalten, wenn man im 4. ist
jetzt = umschaltfkt( vierter, neutral, sechster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){ //Auf den 6. Gang umschalten, wenn man im 5. ist
jetzt = umschaltfkt( fuenfter, neutral, sechster, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >=831) && (jetzt.gUw <=918) && (jetzt.gUa>=3000)){ //Auf den 6. Gang umschalten, wenn man im R ist
jetzt = umschaltfkt( rueck, neutral, sechster, schaltzeit, toleranz );
A = 0;
}
else{ //Auf den 6. Gang umschalten, wenn man im N ist
jetzt = umschaltfkt( neutral, neutral, sechster, schaltzeit, toleranz );
A = 0;
}
break;
case 7:
if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){ //Auf R umschalten, wenn man im 1. ist
jetzt = umschaltfkt( erster, neutral, rueck, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){ //Auf R umschalten, wenn man im 2. ist
jetzt = umschaltfkt( zweiter, neutral, rueck, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){ //Auf R umschalten, wenn man im 3. ist
jetzt = umschaltfkt( dritter, neutral, rueck, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){ //Auf R umschalten, wenn man im 4. ist
jetzt = umschaltfkt( vierter, neutral, rueck, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){ //Auf R umschalten, wenn man im 5. ist
jetzt = umschaltfkt( fuenfter, neutral, rueck, schaltzeit, toleranz );
A = 0;
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){ //Auf R umschalten, wenn man im 6. ist
jetzt = umschaltfkt( sechster, neutral, rueck, schaltzeit, toleranz );
A = 0;
}
else{ //Auf R umschalten, wenn man im N ist
jetzt = umschaltfkt( neutral, neutral, rueck, schaltzeit, toleranz );
A = 0;
}
break;
case 8:
if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa>=3000)){ //Auf N umschalten, wenn man im 1. ist
jetzt = umschaltN( erster, schaltzeit, toleranz);
}
else if((jetzt.gUw >= 2018) && (jetzt.gUw <= 2231) && (jetzt.gUa<=2000)){ //Auf N umschalten, wenn man im 2. ist
jetzt = umschaltN(zweiter, schaltzeit, toleranz);
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa>=3000)){ //Auf N umschalten, wenn man im 3. ist
jetzt = umschaltN(dritter,schaltzeit,toleranz);
}
else if((jetzt.gUw >= 3087) && (jetzt.gUw <= 3412) && (jetzt.gUa<=2000)){ //Auf N umschalten, wenn man im 4. ist
jetzt = umschaltN(vierter,schaltzeit,toleranz);
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa>=3000)){ //Auf N umschalten, wenn man im 5. ist
jetzt = umschaltN(fuenfter,schaltzeit,toleranz);
}
else if((jetzt.gUw >= 3918) && (jetzt.gUw <= 4331) && (jetzt.gUa<=2000)){ //Auf N umschalten, wenn man im 6. ist
jetzt = umschaltN(sechster,schaltzeit,toleranz);
}
else{
jetzt = umschaltN(rueck,schaltzeit,toleranz); //Auf N umschalten, wenn man im R ist
}
break;
default:
break;
}
}
}
//menu key ESC
if ( buttonEscState==HIGH) {
if((A == 11) || (A == 12) || (A == 13) || (A == 14) || (A == 15) || (A == 16) || (A == 17) || (A == 18)) { //Wenn A zwischen 11 und 18 ist und Button wird gedrückt, wird A = 10
A = 10;
}
else if(A > 100) { //Wenn A größer 100 ist und Button wird gedrückt, wird A = 11
A = 11;
}
else if((A == 10) ||(A == 20) || (A == 30) || (A == 40) || (A == 50)) { //Wenn A zwischen 10 und 50 ist und Button wird gedrückt, wird A = 0
A = 0;
}
else if(A == 110) { //Wenn A=110 und Button wird gedrückt, wird A = 11
A = 11;
}
}
}
gang_s umschaltfkt( gang_s j[], gang_s n[], gang_s w[], int t, int tol ) //Funktion zum Umschalten zwischen den Gängen
{
lcd.clear();
int pwma; //Wert für Ua Ausgabe
int pwmw; //Wert für Uw Ausgabe
int time; //Wert für Delay
int tabs; //Wert für Delayberechnung
gang_s soll;
int a; //Wert für Umschaltung zwischen jetzt.gUa und neutral.gUa
int d;
int b; //Werte zum Erkennen im welchen Uw sich der jetztige und gewünschte Gang befinden
int c;
int e;
int f;
int x;
int y;
soll.gUw = (w[20].gUw + ((w[20].gUw * tol)/100));
soll.gUa = (w[20].gUa + ((w[20].gUa * tol)/100));
for( b = 0; b < 20; b++ ){ // Es wird erkannt im welchen Uw bereich der jetzige Gang ist
for(x = 0; x < 20; x++){
c++;
if(j[b].gUw == n[x].gUw){
break;
}
}
}
for( d = 0; d < 20; d++ ){ // Es wird erkannt im welchen Uw bereich der gewünschte Gang ist
for(y = 0; y <20; y++){
if(w[d].gUw == n[y].gUw){
e++;
break;
}
}
}
tabs = c - e; // Es wird berechnet wieviele Schritte zwischen Uwjetzt und Uwsoll sind
time = ( t/(abs(tabs)+42)); // Es wird berechnet wie lang das Delay sein muss
if (j[20].gUa != n[20].gUa){ // Wenn Uajetzt größer als Uaneutral ist:
for( a = 20; a > 0; a--)
{
pwma = (((j[a].gUa)>>4)-(j[a].gUa>>7)-(j[a].gUa>>8)); // PWM Signal für Ua wird berechnet
pwma = (pwma + ((pwma * tol)/100)); // Die Toleranz wird dazugerechnet
pwmw = (((j[a].gUw)>>4)-(j[a].gUw>>7)-(j[a].gUw>>8)); // PWM Signal für Uw wird berechnet
pwmw = (pwmw + ((pwmw * tol)/100)); // Die Toleranz wird dazugerechnet
lcd.setCursor(0, 0);
lcd.print((j[a].gUw + ((j[a].gUw*tol)/100))); // Uw auf dem Display angezeigt
lcd.setCursor(0,1);
lcd.print((j[a].gUa + ((j[a].gUa*tol)/100))); // Ua auf dem Display angezeigt
analogWrite(uaPinPWM, pwma); // PWM Signal ausgegeben
analogWrite(uwPinPWM, pwmw);
delay(time);
}
}
if( c > e){ // Wenn das Uwjetzt > Uwsoll ist
do{ // Wird
pwmw = (((n[c].gUw)>>4)-(n[c].gUw>>7)-(n[c].gUw>>8)); // PWM Signal für Uw wird berechnet
pwmw = (pwmw + ((pwmw * tol)/100)); // Die Toleranz wird dazugerechnet
pwma = (((n[c].gUa)>>4)-(n[c].gUa>>7)-(n[c].gUa>>8)); // PWM Signal für Ua wird berechnet
pwma = (pwma + ((pwma * tol)/100)); // Die Toleranz wird dazugerechnet
lcd.setCursor(0, 0);
lcd.print((n[c].gUw + ((n[c].gUw*tol)/100))); // Uw auf dem Display angezeigt
lcd.setCursor(0, 1);
lcd.print((n[c].gUa + ((n[c].gUa*tol)/100))); // Uw auf dem Display angezeigt
analogWrite(uwPinPWM, pwmw); // PWM Signal ausgegeben
analogWrite(uaPinPWM, pwma);
c--; // Der nächste Wert ausgewählt
}
while(n[c].gUw > n[e].gUw) ; // Solange Uwsoll nicht erreicht wird
}
else if (e > c){ // Wenn das Uwjetzt < Uwsoll ist
do{ // Wird
pwmw = (((n[c].gUw)>>4)-(n[c].gUw>>7)-(n[c].gUw>>8)); // PWM Signal für Uw berechnet
pwmw = (pwmw + ((pwmw * tol)/100)); // Die Toleranz wird dazugerechnet
pwma = (((n[c].gUa)>>4)-(n[c].gUa>>7)-(n[c].gUa>>8)); // PWM Signal für Uw berechnet
pwma = (pwma + ((pwma * tol)/100)); // Die Toleranz wird dazugerechnet
lcd.setCursor(0, 0);
lcd.print((n[c].gUw + ((n[c].gUw*tol)/100))); // Uw auf dem Display angezeigt
lcd.setCursor(0,1);
lcd.print((n[c].gUa + ((n[c].gUa*tol)/100))); // Ua auf dem Display angezeigt
analogWrite(uwPinPWM, pwmw); // PWM Signal ausgegeben
analogWrite(uaPinPWM, pwma);
c++; // Der nächste Wert ausgewählt
}
while(n[e].gUw > n[c].gUw) ; // Solange Uwsoll nicht erreicht wird
}
for( d = 0; d < 20; d++){
pwma = (((w[d].gUa)>>4)-(w[d].gUa>>7)-(w[d].gUa>>8)); // Der PWM Signal für Ua wird berechnet
pwma = (pwma + ((pwma * tol)/100)); // Die Toleranz wird dazugerechnet
pwmw = (((w[d].gUw)>>4)-(w[d].gUw>>7)-(w[d].gUw>>8)); // Der PWM Signal für Uw wird berechnet
pwmw = (pwmw + ((pwmw * tol)/100)); // Die Toleranz wird dazugerechnet
lcd.setCursor(0, 0);
lcd.print(w[d].gUw); // Uw auf dem Display anzeigen
lcd.setCursor(0,1);
lcd.print(w[d].gUa); // Ua auf dem Display anzeigen
analogWrite(uaPinPWM, pwma); // PWM Signal wird ausgeben
analogWrite(uwPinPWM, pwmw);
delay(time);
}
A=0;
return soll; // Der gewünschte Wert ist die Rückgabe
}
gang_s umschaltN(gang_s j[],int t,int tol){ //Funktion zum Umschalten auf N
int pwmw; // Wert für PWM Signal für Uw
int pwma; // Wert für PWM Signal für Ua
int a; // Wert für die Umschaltung
gang_s soll;
soll.gUw = (j[0].gUw + ((j[0].gUw * tol)/100));
soll.gUa = (j[0].gUa + ((j[0].gUa * tol)/100));
for( a = 20; a > 0; a--)
{
pwmw = (((j[a].gUw)>>4)-(j[a].gUw>>7)-(j[a].gUw>>8)); // Der PWM Signal für Uw wird berechnet
pwmw = (pwmw + ((pwmw * tol)/100)); // Die Toleranz wird dazugerechnet
pwma = (((j[a].gUa)>>4)-(j[a].gUa>>7)-(j[a].gUa>>8)); // Der PWM Signal für Ua wird berechnet
pwma = (pwma + ((pwma * tol)/100)); // Die Toleranz wird dazugerechnet
lcd.setCursor(0, 0);
lcd.print((j[a].gUw + ((j[a].gUw*tol)/100))); // Uw wird auf dem Display angezeigt
lcd.setCursor(0,1);
lcd.print((j[a].gUa + ((j[a].gUa*tol)/100))); // Ua wird auf dem Display angezeigt
analogWrite(uwPinPWM, pwmw); // PWM Signal ausgeben
analogWrite(uaPinPWM, pwma);
delay(t/21);
}
return j[0]; // Ein Punkt von N Gang ist die Rückgabe
}
Зарание спасибо!
Какое то июльское обострение на почве функций?
Туши свет, они на свет лезут.
А идея что оно рисует, но быстро и глазом не видно, вас не посещала?
Не думаю что кто будет читать вашу 1000 строк фигню с коментами на немецком.
да, об этом я тоже думал, но проблема в том что даже если сделать так, чтоб функция длилась к примеру 20сек, мы все равно поподаем толко на последнее число.
и да, наверно многие(или скорее всего все) не прочитают, но надежда умирает последней)))
Да никто не будет это читать и вникать. Код для постепенной перерисовки цыфр не может быть на 1000+ строк. Это бред а не код.
код не только это делает. проблема появляется толко там где он должен это делать. а так в программе меню и оно занимает так много места. В общем, программа симулирует сенсор переключения скоростей.
Фраза "когда я в loop начинаю функ. она делает не все что должна" как бы и дает ответ.
Вот я Вам отвечаю, но Вы как бы не всё понимаете, что я Вам отвечаю.
то что ошибка скорее всего там я вроде как и сам понял, поэтому в первую очередь ее код и отправил, но вопрос: где?
мои предположение указывают на вот это:
Но если ошибка тут, то как ее исправить?
Ладно, давайте сузим наш область поиска ошибки. Ошибка находится именно в функции с вероятностью 99.9%
Проблема у нас иммено с delay и вероятнее всего в числe в скобках. Значит по логике ошибка должна находится где то тут:
for( b = 0; b < 20; b++ ){ // Es wird erkannt im welchen Uw bereich der jetzige Gang ist for(x = 0; x < 20; x++){ c++; if(j[b].gUw == n[x].gUw){ break; } } } for( d = 0; d < 20; d++ ){ // Es wird erkannt im welchen Uw bereich der gewünschte Gang ist for(y = 0; y <20; y++){ if(w[d].gUw == n[y].gUw){ e++; break; } } } tabs = c - e; // Es wird berechnet wieviele Schritte zwischen Uwjetzt und Uwsoll sind tabs = abs(tabs); time = ( t/(tabs+42)); // Es wird berechnet wie lang das Delay sein mussЕсли вам поможет, я могу перевести вам коменты, но в общем в них не такая трудная или важная инфо. так как вы почти в каждой теме на этом форуме успели появится, я пологаю что вы хорошо разбираетесь в программах и надеюсь на вашу помощь
Мне не нужно переводить. Я не собираюсь сидеть вникать в чужой спагети код. Я злой.
Меня злит человеческая тупость. Попробую аналогии, когда разрабатывают нечто большое и сложное, то сначала делают и отлаживают маленькие модули , по отдельности! И когда каждый модуль сам по себе работает, их начигают собирать в кучку, постепенно.
А не валят все запчамти в кучу с целью поиграть в игру "плпробуй отгадай что тут глючит"
Не понятно? Ну тогда ОЙ.
Хорошо, раз мы злые, то вот вам тупой вопрос, что значит "она делает не все что должна.", мы тут все скучающие телепаты, которые сидят, ничего не делают и только ждут, когда маленькие добренькие дети придут и что то спросят, а мы их сожрем!
"она делает не все что должна."
А что именно именно она не делает?
А если не понятен вопрос, то ответьте на мой вопрос, сколько ступенек на лестничной площадке между первым и вторым этажом?
А что она должна? Как давно? И каковы проценты? Будем пытать паяльником что вернула че должна.
Ну да, мы тут все полиглоты, немецкий знаем в совершенстве, код по 100 строк читаем с листа, а 1200 строке - вообще влет. У нас же времени дофига, мы же спецы, гуру, Эйнштейны и т.п. Хотя мы тупые, каких то сто строк не нашли время разобрать, зато пишем целыми днями всякие какашки и всем должны.
Меня доктор пытал как то спагети кодом на несколько сотен строк. И до сих пор чуть че соазу угрожать начинает, типа будешь с советами лезть, выдам спагети на пару тысяч строк. Он жесток и страшен.
"она делает не все что должна."
А что именно именно она не делает?
А если не понятен вопрос, то ответьте на мой вопрос, сколько ступенек на лестничной площадке между первым и вторым этажом?
давайте я попробую еще раз. Программа должна симулировать сенсор переключения скоростей. Она состоит из: меню(работает) и 2 функций(почти работает). В функции произходит следуйшее: Медленно, программа должна симулировать смену скорости что она и делает, но как я успел понять, ошибку я сделал в разсчете delay и досих пор не могу понять где и как. В общем по логике ошибка должна быть тут:
for( b = 0; b < 20; b++ ){ c++; if(j.gUw == n[b].gUw){ break; } } for( d = 0; d < 20; d++ ){ if(w[0].gUw == n[d].gUw){ e++; break; } } tabs = c - e; tabs = abs(tabs); time = ( t/(tabs+42));почему то delay у меня получается 0 и я не понимаю почему, ведь вроде как он должен был его посчитать
Ну так выводите в терминал значения и найдете свою ошибку в расчетах.
как я понял вы из германии, может сможете это на немецкий перевести? "терминал значения" в жизни не слышал.. ок, нет все таки слышал. Я не уверен в том что ошибка в array а скорее в самом подсчете. Но за совет спасибо
Хех :) Это два разных слова: Выводите в терминал полученные программой значения ))))
Перевожу на русский. Для полных танкистов.
Отладочные строчки вставь и смотри в терминале что там насчитывается
Ой, простите)) не правильно из контекста понял) почему то выводит 0.. как такое вообще возможно? В array точно есть одинаковое число, то есть он должен где то сдеалть стоп.
подружитесь с командами Serial.print("xxx"); и Serial.println("xxxx"); Они Вам сэкономят сотни строк кода, бессонные ночи и "ругательства матом громко и внятно когда вся семья уже спит"
Пальцем в небо
time = ((double)t) / (tabs + 42);
Второе, у Вас t всегда больше чем 42?
подружитесь с командами Serial.print("xxx"); и Serial.println("xxxx"); Они Вам сэкономят сотни строк кода, бессонные ночи и "ругательства матом громко и внятно когда вся семья уже спит"
именно этим и восползовался чтоб понять что у меня в 0 выходит))
Пальцем в небо
time = ((double)t) / (tabs + 42);
Второе, у Вас t всегда больше чем 42?
нет об этом не подумал, но даже когда было больше (к примеру 10000) ничего не изменялось
ну спасибо за советы, за разговоры добрые)) настроение уж tочно поднять смогли ну а дальше я наверно сам как нибудь попробую. если опять в тупике окажусь обязательно вам на нервы подействую))
Нам на нервы трудно подействовать. Тут скорее что у вас нервов хватило наши советы понимать.
О це дило, тупиковыми ответами мы завсегда отоварить рады!
Рекомендую:
1. Имена переменных, функций, параметров использовать нормальные, например:
uint8_t r_d( uint8_t a, uint8_t b ) { return a + b; } сравните с: uint8_t CalcSum( uint8_t p_Summand1, uint8_t p_Summand2 ) { return p_Summand1 + p_Summand2; }2. Комментарии везде писать не нужно, достаточно описания главного и тонких мест
3. Перед выкладыванием скетча в форум, форматируйте его хотя бы нажимая Ctrl-T в ArduinoIDE, так он (текст скетча) более просто читается. Это сократит время тем, кто "заинтересуется" Вашим вопросом и попробует разобраться.
4. Старайтесь прочитать свой вопрос нашими глазами. Т.е. представьте себя на нашем месте. Подумайте, что Вы видите, что Вы делаете, а мы этого не видим.
Хотя бы учтите эти мелочи и Вам будет намного проще общаться на форуме.
Gelingen
Надеюсь не ошибся с пожеланием, немецкого практически не знаю :)