Go Down

Topic: Einsteiger mit If-Else-Problem (Read 9450 times) previous topic - next topic

eavel

Sep 29, 2013, 09:45 pm Last Edit: Sep 29, 2013, 09:47 pm by eavel Reason: 1
Hallo liebe Arduino-Fans,

ich arbeite mich gerade in das Thema Mikrocontroller ein und bin vom Arduino begeistert. Es macht so riesig Spaß, dass ich mir auch ein Buch dazu gekauft habe. Hier werden die Grundlagen erklärt und an Beispielen vertieft.

Jetzt ist es so, dass ich die Beispiele gern abwandle und eigene Dinge probiere. So komme ich allerdings auch vom Hölzchen zum Stöckchen. Blablabla... Jetzt aber zu meinem Problem:

Ich habe einen Sketch aus insgesamt 3 Funktionen (void loop, Funktion 1 und Funktion 2) geschrieben. Ich habe dazu ein Beispiel aus dem Buch genommen und Stückweise angepasst. Im "loop" rufe ich durch "if-Bedingungen" meine Funktionen auf, das klappt auch soweit super. Aber sobald ich die Bedingungen durch Hinzufügen weiterer "else if" oder nur "else" etwas erweitere, führt es dazu, dass der Sketch nicht mehr ans Bord übertragen wird. Der Kompiler läuft ohne zu meckern durch, aber der Upload ans Board wird (ohne Fehlermeldung) nicht abgeschlossen. Erst durch ziehen des USB-Kabels gibts es einen Timeout error.
Wenn ich die else if/else Anweisungen wieder  ausklammere (// oder mit /*), Funktioniert der Upload wieder und alles läuft super.

Könnt ihr mir nen Rat geben, wie ich an das Problem herangehen kann?
Habe jetzt ersteinmal darauf verzichtet, den Sketch hier einzustellen, da der Kompiler ja nicht meckert. Wieso will das Board nicht wie ich will? ;-)

Habe bisher auch durch googeln nichts dazu gefunden - ich tue mich auch schwer, das Problem kurz zu umreißen, das merkt ihr ja ;-)

Ich nutze Win7 64bit und einen Arduino Mega2560 Rev.3 an USB (COM5). Habe dazu alle Bluetoothschnittstellen im Bios deaktiviert, deren Treiber deinstalliert und die Arduino-IDE sowie dessen Treiber gemäß arduino.cc Anleitung installiert. Läuft auch alles, abgesehen von diesem komischen if-else Ding.


Danke für Eure Unterstützung

Schachmann

Hallo,

vielleicht solltest Du den Sketch doch mal posten. Entweder kann man den Fehler sehen oder - ich habe z.B. auch einen Mega2560 - könnte zumindest mal probieren, ob er bei mir läuft.

Gruß,
Ralf

sschultewolter

Wie Ralf sagte, Sketch bitte in [*code] ... [*/code] posten. Ohne * ;)

Code: [Select]
if(bedingung == wert) {
  // ausführen
} else if(bedingung2 == wert2) {
  //ausführen
}
else {
// ...
}
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

eavel

Hallo Ralf,

danke, dass Du Dir das mal ansehen magst.

Frag bitte nicht nach dem höheren Ziel - das mit dem "Kompressor" ist nur aus einem anderen Beispielsketch. Das Board steuert LEDs.

Code: [Select]

#include <LiquidCrystal.h>
#define sensorPin 0  //Verbunden mit LM35 Ausgang
#define DELAY 10    //kurze Wartezeit
const int cycles = 5;  //Anzahl der Messungen
#define RS 12 //Register Select
#define E 11  //Enable
#define D4 5  //Datenleitung D4
#define D5 4  //Datenleitung D5
#define D6 3  //Datenleitung D6
#define D7 2  //Datenleitung D7
#define COLS 16   //Anzahl Spalten
#define ROWS 2    //Azahl Zeilen
#define KOMP1 31  //Kompressor1 PIN 31
#define KOMP2 32  //Kompressor2 PIN 32
#define KOMP3 33  //Kompressor3 PIN 33
#define PSENS 8  //Druckwächter PIN 13

boolean PSTAT;      //Variable Druckschalter
String STATUS = "WARTEN"; //Textvariable Kompressorstatus
int TEMP = 0;         //Variable gerundete Temperatur
boolean COUNT = false;  //Steuerungsvariable
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);  //Objekt instanziieren

void setup(){
  lcd.begin(COLS, ROWS);          //Anzahl Spalten und Zeilen
  pinMode(KOMP1, OUTPUT);       
  pinMode(KOMP2, OUTPUT);
  pinMode(KOMP3, OUTPUT);
  pinMode(PSENS,  INPUT);
}
void loop(){

//Temperaturauswertung, Berechnung und Displayanzeige
 
  float resultTemp = 0.0;
  for(int i = 0; i < cycles; i++){
    int analogValue = analogRead(sensorPin);
    float temperature = (5.0 * 100.0 * analogValue) / 1024;
    resultTemp += temperature; //Aufsummieren der Messwerte
    delay(DELAY);
  }
  resultTemp /=cycles;
  resultTemp += 0.5;
  TEMP = resultTemp;
  lcd.clear();
  lcd.print("Temperatur:");        //Ausgabe des Textes
  lcd.setCursor(0,1);             //Cursorsprung in 2. Zeile
  lcd.print(TEMP);               //Ausgabe des Textes
  lcd.print(" Grad Celsius");    //Ausgabe des Textes
  delay(2000);                    //Pause
  lcd.clear();                    //Löscht das Display
  lcd.print("Status:");           //Ausgabe des Textes
  lcd.setCursor(0,1);             //Cursorsprung in 2. Zeile
  lcd.print(STATUS);              //Ausgabe des Textes
  delay(800);

//Auswerte und Steuerteil: 

  PSTAT = digitalRead(PSENS);
  if(TEMP >=5 && TEMP <=24){
    if(PSTAT == HIGH && COUNT == false){
    lcd.clear();                        //Löscht das Display
    lcd.print("Kompressor");            //Ausgabe des Textes
    lcd.setCursor(0,1);                 //Cursorsprung in 2. Zeile
    lcd.print("startet...");           //Ausgabe des Textes
    Kompressor_Start();                //Aufruf der Funktion "Kompressor_Start"
    }
  }

//von HIER:
  else if(TEMP > 24){
    lcd.clear();                        //Löscht das Display
    lcd.print("Kompressor");           //Ausgabe des Textes
    lcd.setCursor(0,1);               //Cursorsprung in 2. Zeile
    lcd.print("überhitzt!!!");       //Ausgabe des Textes
   }
  else{
    lcd.clear();                        //Löscht das Display
    lcd.print("FEHLER");               //Ausgabe des Textes
    lcd.setCursor(0,1);               //Cursorsprung in 2. Zeile
    lcd.print("FEHLER");             //Ausgabe des Textes
  }
//Bis HIER ausklammern und der Sketch läuft einwandfrei!!!
  if(PSTAT == LOW && COUNT == true){
      lcd.clear();                        //Löscht das Display
      lcd.print("Kompressor");               //Ausgabe des Textes
      lcd.setCursor(0,1);               //Cursorsprung in 2. Zeile
      lcd.print("stoppt...");       //Ausgabe des Textes
      Kompressor_Stop();                //Aufruf der Funktion "Kompressor_Start"
      delay(1500);
  }
}

void Kompressor_Start(){
 
    digitalWrite(KOMP1, HIGH);
    delay(2000);
    digitalWrite(KOMP2, HIGH);
    delay(2000);
    digitalWrite(KOMP3, HIGH);
    COUNT = true;
    STATUS = "FUELLEN";
  }

void Kompressor_Stop(){
   digitalWrite(KOMP1, LOW);
   digitalWrite(KOMP2, LOW);
   digitalWrite(KOMP3, LOW);
   COUNT = false;
   STATUS = "WARTEN";
}


Kurz zur Erklärung...

Ein 2x16 Display, ein Tempsensor LM35, externe Spannungsversorgung 5V über 3 Transistoren BC547 auf 3 LED (simulierte Kompressoren), Kippschalter simuliert einen Druckwächter.
Sketch soll:
1. Display ansteuern
2. Temperatur messen
3. Bei Schalter ein, Temperatur prüfen, Kompressoren nacheinander (verzögert) einschalten
4. Bei Schalter aus, Kompressoren abschalten
5. Bei kritischer Temp. Kompressoren abschalten
6. Alle Statusmeldungen (Warten, Füllen, Komp. STARTEN/STOPPEN) ausgeben

Die Delays im Loop sind sicherlich nicht fein - aber ich bin ja noch in der Entwicklung ;-) und fange gerade erst an

ALSO NICHT LACHEN ! ]:)

Ralf ist ein geiler Name! So heiße ich auch  :P

jurs


    lcd.print("überhitzt!!!");       //Ausgabe des Textes


Hahaha, schlechte Grammatik ist nur im Forum erlaubt!!!

Und damit meine ich die drei Ausrufungszeichen im Text.
Die mag der Mega2560 bei vielen Bootloader-Versionen nicht leiden.

Und bestraft den Uploader damit, dass der Sketch nicht hochgeladen wird.

Vermeide die drei Ausrufungszeichen hintereinander, dann klappt's auch mit dem Hochladen!


eavel

:smiley-eek:
Wirklich?

Das probiere ich gleich aus!
Das wäre ja......  :0

eavel

:smiley-yell:

Der Wahnsinn! Das war wirklich das Problem!

Vielen DANK!!!       und noch drei extra !!!  ]:D

...es läuft zwar noch nicht wie erwartet-aber ich habe die Fehler auch schon erkannt!

Hauptsache der Upload klappt jetzt!

FEIN FEIN und gut'n Abend Euch.

nu wird's doch noch ne lange Nacht heute :smiley-sweat:

Schachmann

Da komme ich ja wohl zu spät. Frage mich, ob die Kollegen auch mal schlafen  :smiley-roll:

Gruß,
Ralf

eavel

Hallo '
ja, das ging gestern wirklich "ultraschnell".
Dank Dir trotzdem für die Unterstützung. Hättest Du das auch gewusst? Wo steht sowas?

Gruß Ralf

Schachmann


Hättest Du das auch gewusst?


Ich muss zu meiner Schande gestehen, das hätte ich nicht gewusst. Aber jurs überrascht mich immer wieder mit Dingen, die er weiß und ich nicht.


Wo steht sowas?


Naja, im Zweifel, hier im Forum (aber wo jurs das jetzt wirklich her hat, weiß ich nicht).

Gruß,
Ralf

Eisebaer

hi,

sowas weiß man eigentlich nur, wenn man immer hier im forum mitliest.
für die "alten hasen" sind die 3 rufzeichen schon sowas wie ein running gag, für einen anfänger natürlich der supergau. wonach soll man schließlich suchen?

gruß stefan

michael_x

Quote
für die "alten hasen" sind die 3 rufzeichen schon sowas wie ein running gag, für einen anfänger natürlich der supergau. wonach soll man schließlich suchen?

Klar ist es schwer, nach "!!!" zu suchen, aber das weiss man ja gar nicht, als "junger Hase" ;)

Auch mit "Upload Problem" braucht es viel Geduld, bis man über Stories mit den 3 ! stolpert...

Selbst
"Arduino Mega 2560 program upload timeout"
liefert einiges an Müll, bis der Thread mit genau diesem Titel einen mit der Nase auf dieses "alter Bootloader und  !!! " - Schmankerl stößt 

Go Up