Pages: [1] 2 3   Go Down
Author Topic: Probleme eines Anfängers :)  (Read 3838 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,

habe mich grade erst hier angemeldet und habe auch erst vor wenigen wochen mit der Arduino begonnen zu arbeiten

vorher habe ich die AtMegas mit Bascom geärgert smiley-wink

Da mir aber Bascom + Hardware zu teuer war und auch einige projekte in Bascom zu aufwändig wurden wollte ich mall so versuchen.

Nunja ich habe mir auch schon ein paar bücher zum thema besorgt und gelesen aber im moment stehe ich auf dem schlauch.

ich möchte gerne auf tastendruck unterschiedliche werte ausgegeben haben

beispiel:    Uhrzeit
            - Temperatur
            - Wasserstand
            - usw

Jedesmal wenn der taster gedrückt wird soll er einen weiter springen.

meine idee war jetzt das ganze mit einem counter der jedesmal eins hochzählt und dann mit swich case ??

hier mal mein code  ... ist net viel weil bin mir grade sehr unsicher  . smiley-cry

Code:
#include <LiquidCrystal.h>

int Button = 8;

int backLight = 13;    // pin 13 schaltet die hintergrundbeleuchtung

// Connections:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

void setup()
  {
    pinMode(ButtonDown, INPUT);
    pinMode(backLight, OUTPUT);
    digitalWrite(ButtonDown, LOW); 
    digitalWrite(backLight, HIGH);  //LCD Licht an
    lcd.begin(16,2);             
    lcd.clear();                 
    lcd.setCursor(0,0);           
    lcd.print("Wetterstation");   
    lcd.setCursor(0,1);           
    lcd.print("Version 1.0");
  }

void loop()



Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also ich arbeite bei "Displaymenüs" immer mit switchcase. In dem Switchcase hinterlegt du dann die einzelnen Seiten. Du kannst dann innerhalb der Siwtchcases dann deine Displayausgabe gestalten und außerhalb der Cases die Werte verarbeiten. Wie du deine Displayseiten umschaltest ist ja dann dir überlassen :-)
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hmm das klingt schonmal sehr gut ...

hast du auch zufällig ein code schnipsel aus dem ich sowas ableiten kann??
Logged

Cologne
Offline Offline
Sr. Member
****
Karma: 11
Posts: 496
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...mal eben auf die schnelle.

    pinMode(ButtonDown, INPUT);
    digitalWrite(ButtonDown, LOW); 

Du initialisierst ButtonDown als Input und schreibst dann ein LOW auf diesen Pin. Das geht nicht.
Es gibt an jedem Pin nur einen internen Pullup, den man mit digitalWrite(ButtonDown, HIGH) aktivieren könnte. Einen Pulldown gibt es nicht und dementsprechend auch nicht die oben genutzte Aktivierung.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

danke für den tip ...
ABER ... das löst mein grundsätzliches problem noch net smiley-sad

ich weis nicht wie ich jetzt einen counter initialisiere und durch cases switch ....

sprich tastendruck

case1

tastendruck

case2

tastendruck

case3

tastendruck

zurück zu case 1
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
  int page;
...
  if (digitalRead(BUTTONPIN) == TRUE)
    page = (page+1)%3; // Dreiseitiges Menue. '%' ('modulo') sorgt dafuer dass nach '2' wieder '0' kommt...

  switch (page) {
    case 0:
      // erste Seite...
    break;
    case 1:
      // zweite Seite...
    break;
    case 2:
      // dritte Seite...
    break;
  }

Was in der Gegend.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

also brauch ich garkeinen counter ??

Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Der counter ist in dem Fall "page".
Logged

Germany
Offline Offline
Edison Member
*
Karma: 46
Posts: 2310
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Variable page ist doch der Zähler. Oder willst du auf etwas anderes hinaus?

[edit] Ja ja, zu langsam... smiley-wink
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hier mal ein Schnipsel einer Uhr die die Zeit in klarem Text auf ein Diplay zeigt und entsprechenden Seiten zum Stellen der einzelenen Sachen (die RTC Funktionen habe ich nicht mitkopiert)
Main Loop
Code:
void loop() {
  tempist=get_TEMP();                           // einlesen Temperatur Istwert
  T1Read=digitalRead(Taster1);                  // Taster 1
  T2Read=digitalRead(Taster2);                  // Taster 2
  ssIn=digitalRead(RTCPuls);
  digitalWrite(13,ssIn);
  if (T1Read==false&&LT1Read==true){  // Taster muss gedrückt sein und darf vorher nicht gedrückt sein
    LT1Read=false;                    // Hilfmerker zum einmal ausführen
    setmode=setmode++;                // Erhöhen des Setmode zum Stellen 1=Std 2=Minuten 3=Tag 4=Monat 5=Jahr 0=Normalbetrieb
    Buttonmillis=millis();
    kopieren=false;
    lcd.clear();
    if (setmode>=7){
      lcd.clear();
      setmode=0;
      run=true;
    }  
  }
  if (T1Read==true&&LT1Read==false){
    LT1Read=true;
  }
  if (T2Read==false&&LT2Read==true&&setmode>0){   // Taster muss gedrückt sein und darf vorher nicht gedrückt sein
    LT2Read=false;                                // Hilfmerker zum einmal ausführen
    Wert=Wert++;                                  // Erhöhen des Setmode 1=Std 2=Minuten 3=Tag 4=Monat 5=Jahr 0=Normalbetrieb
    Buttonmillis=millis();  
  }
  if (T2Read==true&&LT2Read==false){
    LT2Read=true;
  }
  if (millis()-Buttonmillis>=7500&&setmode>0){      // Rücksetzen nach 7,5 Sekunden
    setmode=0;
    run=true;  
  }
  if (ssIn==true&&lssIn==false){
    ++ss;
    if (DR==true){
      DateRead();
      DR=false;
    }
    if (ss==60){
      ss=0;
      mm=mm+1;
    }
    if (mm>=60){                                    //=> dann hier weiter (zählen) der Sekunden/Minuten/Stunden
      mm=0;
      hh=hh++;
      oncehh=false;
    }
    if (hh>=24){
      hh=0;
      DR=true;
    }
    lssIn=true;
  }
  if (ssIn==false&&lssIn==true){
    lssIn=false;
  }

  switch (setmode){
  case 0:
    lcd.setCursor(0,0);
    lcd.print("ES IST "); // Bis Position 6,0
    lcd.setCursor(7,0);
    if (mm!=lmm || run==true){
      hh=HourRead();                                // RTC Funktion lesen der aktuellen zeit Stunden
      mm=MinuteRead();                              // RTC Funktion lesen der aktuellen zeit Minuten
      ss=SecondRead();                              // RTC Funktion lesen der aktuellen zeit Sekunden  
     check=true;
      lcd.clear();
      lcd.setCursor(7,0);
      MinutetoText(mm);
      HourtoText(hh);
      //  DatetoText
      lcd.setCursor(0,1);
      lcd.print("AM ");
      WeekdaytoText(WTag);
      printDate2();
      lmm=mm;
      run=false;
    }
    printTemp(31,0,tempist);
    break;
  case 1:
    if (kopieren==false){                                    // Einmaliges Kopieren des Istwertes in den Encoderarbeitswert nach aufruf dieses Setmodes
      Wert=hh;                                               // Schreiben des Istwertes in den Arbeitswert
      kopieren=true;                                         // Merker setzten zum einmaligen ausführen
    }
    if(hh!=Wert){                                         // Wenn der Stundewert über den Encoder verändert wurde
      if (Wert>=24){                                      // Abfang überlauf nach oben größer 23 Uhr
        Wert=0;
      }
      hh=Wert;                                            // Schreiben des Arbeitswertes in den neuen Istwert
      RTC_Set_Time();                                     // Schreiben der neuern Werte in die RTC
    }
    lcd.setCursor(0,0);
    lcd.print("STELLEN STUNDEN                         ");
    break;
  case 2:
    if (kopieren==false){                                    // Einmaliges Kopieren ders Istwertes in den Encoderarbeitswert nach aufruf dieses Setmodes
      Wert=mm;                                            // Schreiben des Istwertes in den Arbeitswert
      kopieren=true;                                         // Merker setzten zum einmaligen ausführen
    }
    if(mm!=Wert){                                         // Wenn der Stundewert über den Encoder verändert wurde
      if (Wert>=60){                                      // Abfang überlauf nach oben größer 23 Uhr
        Wert=0;
      }
    }
    mm=Wert;                                            // Schreiben des Arbeitswertes in den neuen Istwert
    RTC_Set_Time();
    lcd.setCursor(0,0);
    lcd.print("STELLEN MINUTEN                        ");
    break;
  case 3:
    if (kopieren==false){                                    // Einmaliges Kopieren ders Istwertes in den Encoderarbeitswert nach aufruf dieses Setmodes
      Wert=Tag;                                            // Schreiben des Istwertes in den Arbeitswert
      kopieren=true;                                         // Merker setzten zum einmaligen ausführen
    }
    if(Tag!=Wert){                                         // Wenn der Stundewert über den Encoder verändert wurde
      if (Wert>31){                                      // Abfang überlauf nach oben größer 23 Uhr
        Wert=1;
      }
    }
    Tag=Wert;          
    RTC_Set_Date();    
    lcd.setCursor(0,0);
    lcd.print("STELLEN TAG                            ");
    break;
  case 4:
    if (kopieren==false){                                    // Einmaliges Kopieren ders Istwertes in den Encoderarbeitswert nach aufruf dieses Setmodes
      Wert=Monat;                                            // Schreiben des Istwertes in den Arbeitswert
      kopieren=true;                                         // Merker setzten zum einmaligen ausführen
    }
    if(Monat!=Wert){                                         // Wenn der Stundewert über den Encoder verändert wurde
      if (Wert>12){                                      // Abfang überlauf nach oben größer 23 Uhr
        Wert=1;
      }
    }
    Monat=Wert;
    RTC_Set_Date();
    lcd.setCursor(0,0);
    lcd.print("STELLEN MONAT                          ");
    break;
  case 5:
    if (kopieren==false){                                    // Einmaliges Kopieren ders Istwertes in den Encoderarbeitswert nach aufruf dieses Setmodes
      Wert=Jahr;                                            // Schreiben des Istwertes in den Arbeitswert
      kopieren=true;                                         // Merker setzten zum einmaligen ausführen
    }
    if(Jahr!=Wert){                                         // Wenn der Stundewert über den Encoder verändert wurde
      if (Wert>2019){                                      // Abfang überlauf nach oben größer 23 Uhr
        Wert=2011;
      }

    }
    Jahr=Wert;
    RTC_Set_Date();
    lcd.setCursor(0,0);
    lcd.print("STELLEN JAHR                           ");
    break;  
  case 6:
    if (kopieren==false){                                    // Einmaliges Kopieren ders Istwertes in den Encoderarbeitswert nach aufruf dieses Setmodes
      Wert=WTag;                                            // Schreiben des Istwertes in den Arbeitswert
      kopieren=true;                                         // Merker setzten zum einmaligen ausführen
    }
    if(WTag!=Wert){                                         // Wenn der Stundewert über den Encoder verändert wurde
      lcd.clear();
      if (Wert>7){                                        // Abfang überlauf nach oben größer 23 Uhr
        Wert=1;
      }
    }
    WTag=Wert;
    RTC_Set_Date();
    lcd.setCursor(0,0);
    lcd.print("STELLEN WOCHENTAG  ");
    lcd.print(Name[Pointer]);
    lcd.print(" NOCH ");
    lcd.print(RestTage);
    lcd.print(" TAGE ");
    break;  

  }
  if (setmode>=1){
    printTime(0,1);
    printDate(9,1);
    WeekdaytoText(WTag);
  }
  if (test==true){

  }
  checkBday();
}
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Funktionen dazu
Code:
[code]
void MinutetoText(int m){
  if (m >=5&&m<10){
    lcd.print(MinArray[2]);    // fuenf
    lcd.print(MinArray[1]);    // nach
  }
  if (m >=10&&m<15){
    lcd.print(MinArray[3]);    // zehn
    lcd.print(MinArray[1]);    // nach
  }
  if (m >=15&&m<20){
    lcd.print(MinArray[4]);    // viertel
    lcd.print(MinArray[1]);    // nach
  }
  if (m >=20&&m<25){
    lcd.print(MinArray[5]);    // zwanzig
    lcd.print(MinArray[1]);    // nach
  }
  if (m >=25&&m<30){
    lcd.print(MinArray[2]);    // fuenf
    lcd.print(MinArray[0]);    // vor
    lcd.print(MinArray[6]);    // halb
  }
  if (m >=30&&m<35){
    lcd.print(MinArray[6]);    // halb
  }
  if (m >=35&&m<40){
    lcd.print(MinArray[2]);    // fuenf
    lcd.print(MinArray[1]);    // nach
    lcd.print(MinArray[6]);    // halb
  }
  if (m >=40&&m<45){
    lcd.print(MinArray[5]);    // zwanzig
    lcd.print(MinArray[0]);    // vor
  }
  if (m >=45&&m<50){
    lcd.print(MinArray[4]);    // viertel
    lcd.print(MinArray[0]);    // vor
  }
  if (m >=50&&m<55){
    lcd.print(MinArray[3]);    // zehn
    lcd.print(MinArray[0]);    // nach
  }
  if (m >=55&&m<=59){
    lcd.print(MinArray[2]);    // fuenf
    lcd.print(MinArray[0]);    // vor
  }
}

void HourtoText(int h){
  if (h>12){
    h=h-12;
  }
  if (h==0){
    h=h+12;
  }
  if (mm>=25){
    if (h==12){
      lcd.print(StdArray[0]);
    }
    else
      lcd.print(StdArray[h]);
  }
  else{
    lcd.print(StdArray[h-1]);
  }
  if (mm<5){
    lcd.print(" UHR");
  } 
}

void WeekdaytoText(int d){
  lcd.print(TagArray[d-1]);
  if(setmode==0){
    lcd.print(" DEN ");
  }
}

void printDate2(){
  if (Tag<10){
    lcd.print("0");
  }
  lcd.print(Tag);
  lcd.print(".");
  if(Monat<10){
    lcd.print("0");
  }
  lcd.print(Monat);
  lcd.print(".");
  lcd.print(Jahr);
  lcd.print(" ");
}

void printTime(int x,int y){
  lcd.setCursor(x, y);
  if (hh<10){
    lcd.print("0");
  }
  lcd.print(hh);
  lcd.print(":");
  if(mm<10){
    lcd.print("0");
  }
  lcd.print(mm);
  lcd.print(":");
  if (ss<10){
    lcd.print("0");
  }
  lcd.print(ss);
}

void printDate(int x,int y){
  lcd.setCursor(x, y);
  if (Tag<10){
    lcd.print("0");
  }
  lcd.print(Tag);
  lcd.print(".");
  if(Monat<10){
    lcd.print("0");
  }
  lcd.print(Monat);
  lcd.print(".");
  lcd.print(Jahr);
  lcd.print(" ");
}

void printTemp(int x,int y, int z){
  int First;
  int Last;
  lcd.setCursor(x,y);
  Last=z%10;
  First=(z-Last)/10;
  lcd.print(First);
  lcd.print(".");
  lcd.print(Last);
  lcd.print(" Grad");

}

int get_TEMP(){                               // Funktion Einlesen Lambda
  long TEMPY;
  long TEMPX;
  long TEMPact;
  long TEMPdis;
  TEMPact=analogRead(temp);                  // Einlesen des Lambdaistwertes
  TEMPX=TEMPact*10*0.2;                        // Filter neuer Lesewert mit 20% pro Zyklus
  TEMPY=TEMPlast*10*0.8;
  TEMPdis=(TEMPX+TEMPY)/10;
  TEMPlast=TEMPdis;
  return TEMPdis;
}


void checkBday(){
  for (int i=0;i<=4;i++){
    TempTag=Datum[i]%100;
    TempMon=(Datum[i]-TempTag)/100; 
    if ((TempMon-Monat)==0&&check==true){
      RestTage=TempTag-Tag;
      if (RestTage<=14&&RestTage>=1){
        Pointer=i;
        check=false; 
      }
    }
  }
}
[/code]
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ich danke euch für eure hilfe ....

werde mich dann gleich mal an die arbeit machen und meinen erfolg dann die tage verkünden ausser es gibt noch fragen bzw. probleme dann hört ihr früher von mir smiley

gruß

ice-man
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
also der Code ist aber extrem lang um ein Uhrmodul zu stellen oder die Uhrzeit anzuzeigen.
Anzeigen geht z.B. auch so (jede Sekunde einmal):
Angezeigt wird Datum und Uhrzeit im Format: 29.11.11  20:12:12

Code:

RTC.get(UhrDaten,true);
 if(UhrMomentanzeit - UhrStartzeit > 1000){
  lcd.setCursor(0,0);
  sprintf (puffer, "%02d.%02d.%02d", UhrDaten[4],UhrDaten[5],UhrDaten[6]);  // %02d sind Platzhalter: int mit zwei Ziffern und führender Null ausgeben
  lcd.print(puffer); lcd.print(" ");
  sprintf (puffer, "%02d:%02d:%02d", UhrDaten[2],UhrDaten[1],UhrDaten[0]);  
  lcd.print(puffer);

und stellen geht auch wesentlich einfacher.
gruß
Bernward
« Last Edit: November 29, 2011, 02:06:22 pm by maverick1509 » Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lieber maverick Die Uhr schreibt alles in Buchstaben aus deswegen ist die Sache auch etwas komplizierter

also:
Es ist zwanzig vor sieben
am Dienstag den 29.11.2011

Und den Geburtag der hinterlegten zeigt diese auch an mit 14 Tage vorlauf .
Also nicht einfach so Zahlen anzeigen. Ausserdem sollte das Stellen dann auch komfortabel sein wenn man schon mal ein 40*2 Display hat
also oben in der Zeile steht was man gearde stellen kann und unten sieht man das.
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

eine wort uhr will ich mir auch gerne mal basteln aber da fehlt mir noch jede menge erfahrung smiley

ich hab nochmal ne frage jetzt hab ich meine switch case anweisung und ich muss sagen  es läuft smiley 

ABER  smiley-eek

wenn das program nachher mehr aufgaben hat z.b. ein rtc mudul dran hängt u.s.w. würde es ja "ewig" dauern bis das die schleife wieder an der tasten abfrage vorbei kommt

ich weis das ich mein problem mit debounce und nem interrupt in den griff bekomme   ABER

das mit dem interrupt habe ich im bascom nichtmal richtig verstanden smiley-sweat ....

hättet ihr da vielleicht noch ein paar zeilen code oder eine seite mit einem möglichst verständlichem tutorial ??

bin um jede hilfe dankbar

mfg
Ice-Man
Logged

Pages: [1] 2 3   Go Up
Jump to: