Shot Timer OLED Verzweiflung

Hallo zusammen,
dies ist mein erster Post, seid bitte gnädig...
Ich würde gerne an meiner Espressomaschine einen Timer nachrüsten. Ich möchte keinen kaufen, sondern Spass am Bauen haben...
Was soll es können?
Ein Reed Sensor merkt wenn ein Kaffee gezogen wird.
Daraufhin startet ein OLED Display eine "Stoppuhr". Wenn der Bezug vorbei ist (Reed ohne Magnetfeld) wird die vergangene Zeit noch 5 Sekunden angezeigt, dann geht das Display aus und wartet auf den nächsten Bezug.
Ich habe VIEL versucht und nun seit ihr der nächste Schritt zur Lösung :slight_smile:
Was kann ich bis jetzt?
OLED startet bei Aktivierung des Reed Kontakts und zählt hoch. Wenn ich den Magneten weg nehme wird die vergangene Zeit angezeigt.
Mehr bekomme ich nicht hin. Der Code ist aus verschiedenen Beispielen und Versuchen zusammengewürfelt und vermutlich furchtbar. Der Schaltplan sieht so aus:
grafik
Der Code so:

// Arduino OLED ShotTimer

#include <U8g2lib.h> // u8g2
#include <Wire.h>    // u8g2

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// SCL A5
// SDA A4

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,U8X8_PIN_NONE,16,17);   //u8g2 OLED Construktor

void setup()   {
  //pinMode(6,INPUT_PULLUP);  //Taster, später Reed Kontakt
  pinMode(5,INPUT_PULLUP);  //Taster, später Reed Kontakt
  u8g2.begin();    
}

int poz=1; 
int broj=1;
int kretanjeY=30;

int sec1=0; //Sekunde
int min1=0; //Minute
unsigned long msec=0;
unsigned long mili=0;
int pres=0;
int fase=0;
int start=0;

unsigned long tim=0;
void loop()
  {
    u8g2.clearBuffer();
    if(digitalRead(5)==LOW)// Timer gestartet 
     {      
         {
          if(start==0)
           {
            start=1;
            tim=millis();  
           }
            msec=(millis()-tim);
            min1=msec/60000;       
        
           if((msec/1000)>59)
            {
             sec1=(msec/1000)-(min1*60);
            }else{
              
             sec1=msec/1000;
            }

            //mili=(msec%1000)/10;
            //u8g2.setFont(u8g2_font_logisoso62_tn);
            u8g2.setCursor(25,62); //Sekundenplatzierung
            if(min1<=9)
            {

            }else {u8g2.print(min1);
              //u8g2.sendBuffer();
              }

            if(sec1<=9)
           {
            u8g2.print("0");//führende 0
            u8g2.print(sec1);
            u8g2.sendBuffer();
            }else {u8g2.print(sec1);
            u8g2.sendBuffer();
            }
             if(mili<=9)
             {
             }else {
             }
            } 
    
//if(fase==2)
{
     u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_logisoso62_tn);
           u8g2.setCursor(25,62); //Sekundenplatzierung
         
             if(sec1<=9)
           {
            u8g2.print("0");
            u8g2.print(sec1);
            u8g2.sendBuffer();
            
            }else {u8g2.print(sec1);
            //u8g2.sendBuffer();
           
            }
          
           
  }
           //u8g2.clearBuffer();
           //if(digitalRead(5)==HIGH)// Reed ohne Magnet
          //void(* resetFunc) (void) = 0;  // declare reset fuction at address 0
  }
  
  }

Ich bin für alles zu haben, Feedbach, hilfe, fertige Lösungen.
Danke und Grüße
Ralf

Hallo,
In deiner akruellen Schaltung kann man nicht erkennen, wie du den Taster angeschlossen hast. Das sieht mehr nach einem Kurzschluss aus.
Und wozu der Widerstand, wenn du doch einen Pullup im Sketch verwendest ?

Mir scheint, dass du einen endlichen Automaten bauen möchtest.

Hier nochmal entzerrt.
Der Widerstand beruht auf solidem Halbwissen.


Wenn der unsinn ist , kann der weg...i

Zwischen GND und 5V ist der flüssiger als Wasser.
Überflüssig.

OK, ich dachte der entprellt den Reed Switch...
Hab ihn raus genommen, funktioniert genauso :slight_smile:

Manchmal werden Gedanken wahr.
Aber manchmal sieht das nur so aus....

z.B. ich habe noch nie eine Entprellung gesehen, welche auf einem einsamen Widerstand basiert. Gaube auch nicht, dass dieses jemals geschieht.
Aber vielleicht ist meine Fantasie auch zu begrenzt.

Hallo,
gibt es ein Grund warum der Taster auch einen Rest machen soll ?

sehr ungewöhnlich :roll_eyes:

hier gibts was gerade ähnliches

Reset?
Nee...
Da ist nur die Kurve, in der grünen Wurst, arg unglücklich platziert.

Sorry stimmt , da muss man 2 mal hinsehen

So eine Art Timer hatten wir - mit einem anderen Display und einem anderen Controller - doch vor einem halben Jahr schon mal:

Hallo zusammen,
nein, kein Reset. Auch das Schaltungsprogramm nutze ich zum ersten mal, sorry.
Ich habe die beiden alten Themen gelesen, konnte dafür für mich aber leider nichts ableiten.
Ich hatte im Code einen Versuch mit einem Reset des Codes gemacht, weil ich keine Ahnung habe warum der nicht mit dem Zählen aufhört...#
Überraschung... hat nicht funktioniert.
Jetzt habe ich soviel in dem Code rumgefuscht, dass ich den Überblick verloren habe.

Das Thema mit dem Runden kannte ich noch nicht.
Schaue ich mir an, ist im Grunde das gleiche denke ich...

Hallo,
Eventuell hilft dir ein logischer Ablaufplan
du solltest feststellen wenn der Kontakt gerade geschlossen wird und wenn er gerade geöffnet wird, also eine Flankenerkennung machen.

ist gerade geschlossen worden ( positive Flanke) Kontakt==HIGH && merker ==LOW
Startzeit setzen (startzeit=millis();
merker =HIGH

ist geschlossen
Anzeige aktuelle Differenz
Differenz = millis()-Startzeit

ist gerade geöffnet worden (negative Flanke) Konatkt==LOW && Merker==HIGH
Merker =LOW
Differenz bilden millis()-startzeit
Ergebnis Differenz anzeigen
delay (5000) (im einfachsen Fall )
Display dunkel schalten

Nur heruntergetippt. Ohne Compiler und Testsystem:

// Arduino OLED ShotTimer

#include <U8g2lib.h> // u8g2
#include <Wire.h>    // u8g2

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, 16, 17); //u8g2 OLED Construktor

void setup()   {
  //pinMode(6,INPUT_PULLUP);  //Taster, später Reed Kontakt
  pinMode(5, INPUT_PULLUP); //Taster, später Reed Kontakt
  u8g2.begin();
}

unsigned long lastActionTime = 0;
int state = 0;
int msec, min1, sec1;

void loop() {
  switch (state) {
    case 0: //Warten auf schalter
      if (digitalRead(5) == LOW) { // Timer gestartet
        lastActionTime = millis();
        state = 1;
      }
      break;
    case 1:
      u8g2.clearBuffer();
      msec = (millis() - lastActionTime);
      min1 = msec / 60000;
      if ((msec / 1000) > 59)
      {
        sec1 = (msec / 1000) - (min1 * 60);
      } else {
        sec1 = msec / 1000;
      }
      u8g2.setCursor(25, 62); //Sekundenplatzierung
      if (min1 <= 9) {

      } else {
        u8g2.print(min1);
      }

      if (sec1 <= 9) {
        u8g2.print("0");//führende 0
        u8g2.print(sec1);
        u8g2.sendBuffer();
      } else {
        u8g2.print(sec1);
        u8g2.sendBuffer();
      }
      if (digitalRead(5) == HIGH) { // Taster losgelassen
        lastActionTime = millis();
        state = 2;
      }
      break;
    case 2: //Anzeige stehen lassen
      if (millis() - lastActionTime > 5000) {
        u8g2.clearBuffer();
        u8g2.sendBuffer();
        state = 0;
      }
      break;
  }
}

Compiliert problemlos, zeigt aber nichts an. Weder bei Kontakt geschlossen, noch bei geöffnet.

mach mal das u8g2.clearBuffer(); hinter case 1 raus

Ich hab den Font reingesetzt.
u8g2.setFont(u8g2_font_logisoso62_tn);
Jetzt wird was angezeigt

1 Like

Also über setcursor.
Ich teste jetzt nochmal ein wenig, sieht aber gut aus...

Wenn Du einen Widerstand als externen Pullupwiderstand nehmen willst dann mußt Du ihn zwischen +5V und dem Pin das zum digitalen Eingang geht (also am anderen Pin des Tasters).

Grüße Uwe

1 Like