Meine Teemaschine debounce und counter wollen noch nicht

Na der Teebeutel, der an einem Arm über der Tasse hängt, soll alle 30 Sekunden einmal hoch und runter gezogen werden.

Meinst du sowas?

byte minuten ; // wird über Taster eingestellt ( 0 .. theoretisch 255 )
bool stop; // true: Zeit läuft nicht, false: Zeit läuft. Wird über Taster oder bei Zeitablauf gesetzt
uint16_t sekunden; // wird, wenn stop per Taster auf false gesetzt wird, mit minuten*60 initialisiert, dann runtergezählt

void loop() {
 
 // Taster Behandlung hier einbauen

  if (stop) {
    servoUP();
  } else {
    if (sekunden % 60 < 30) servoUP();
    else servoDOWN();

    if ( millis() - lastSecond >= 1000) {
       // einmal pro Sekunde
       lastSecond +=1000; 
       if (sekunden > 0) sekunden--; // im Sekundentakt bis 0 herunterzählen
       else stop = true;
    }
  }
}

% ist die Modulo-Division ( Rest ), falls dir das zur "Eleganz" noch gefehlt haben sollte :wink:

michael_x:
Meinst du sowas?

byte minuten ; // wird über Taster eingestellt ( 0 .. theoretisch 255 )

bool stop; // true: Zeit läuft nicht, false: Zeit läuft. Wird über Taster oder bei Zeitablauf gesetzt
uint16_t sekunden; // wird, wenn stop per Taster auf false gesetzt wird, mit minuten*60 initialisiert, dann runtergezählt

void loop() {

// Taster Behandlung hier einbauen

if (stop) {
    servoUP();
  } else {
    if (sekunden % 60 < 30) servoUP();
    else servoDOWN();

if ( millis() - lastSecond >= 1000) {
      // einmal pro Sekunde
      lastSecond +=1000;
      if (sekunden > 0) sekunden--; // im Sekundentakt bis 0 herunterzählen
      else stop = true;
    }
  }
}



% ist die Modulo-Division ( Rest ), falls dir das zur "Eleganz" noch gefehlt haben sollte ;)

Das verstehe ich noch nicht so ganz, aber der Reihe nach und Danke schonmal :wink:

Habe jetzt erstmal das Relais verkabelt und zum testen folgenden Code geschrieben:

digitalWrite(RECHTS,HIGH); 
delay(3000); 
digitalWrite(RECHTS, LOW); 
digitalWrite(LINKS, HIGH);
delay(3000); 
digitalWrite(LINKS, LOW);

Funktioniert so wie es soll.

Mein Problem ist gerade der StartStopButton.
Ist ja mit -1 definiert, aber wenn ich Ihn ausgeben lasse hat er 1, bei Tastendruck dann 0, bekomme es nicht hin seinen Zustand zu speichern.
Hier mal mein kompletter Code, unten könnt Ihr mein geteste sehen---

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display

#define RECHTS 7 
#define LINKS 8 

const int UpButton = 2;// the number of the pushbutton pin
const int DownButton = 3;// the number of the pushbutton pin
const int StartStopButton = 4;// the number of the pushbutton pin

int buttonPushCounter = 0;   // counter for the number of button presses
int UpButtonState = -1;// current state of the button
int DownButtonState = -1;// current state of the button
int StartStopButtonState = -1;// current state of the button

//boolean lastButtonState = LOW;
boolean lastUpButtonState = LOW;
boolean lastDownButtonState = LOW;// previous state of the button
boolean lastStartStopButtonState = LOW;


void setup() {
  lcd.init();
  lcd.backlight();
  lcd.setCursor(3, 0);
  lcd.print("TeaMyTron");
  lcd.setCursor(0, 1);
  lcd.print("Minuten: 0");

  pinMode(UpButton, INPUT_PULLUP);
  pinMode(DownButton, INPUT_PULLUP);
  pinMode(StartStopButton, INPUT_PULLUP);
  pinMode(RECHTS, OUTPUT); 
  pinMode(LINKS, OUTPUT); 
}


void loop() {

  UpButtonState = digitalRead(UpButton);

  if (UpButtonState != lastUpButtonState) {  // Jeder Button braucht ein Last
    lastUpButtonState = UpButtonState;  // last merken
    delay(10);
    if (UpButtonState == LOW)  // wegin INPUT_PULLUP
    {
      buttonPushCounter++;
      //delay(250);
      lcd.setCursor(9, 1);
      lcd.print(buttonPushCounter);
    }
  }
  
  DownButtonState = digitalRead(DownButton);

  if (DownButtonState != lastDownButtonState) {  // Jeder Button braucht ein Last
    lastDownButtonState = DownButtonState;  // last merken
    delay(10);
    if (DownButtonState == LOW)  // wegin INPUT_PULLUP
    {
      lcd.setCursor(9, 1);
      lcd.print("        ");
      buttonPushCounter--;
      //delay(250);
      lcd.setCursor(9, 1);
      lcd.print(buttonPushCounter);
    }
  }

  if (buttonPushCounter > 10) {
    buttonPushCounter = 0;
    lcd.setCursor(9, 1);
    lcd.print("0        ");
  }
  
  if (buttonPushCounter < 0) {
    buttonPushCounter = 10;
    lcd.setCursor(9, 1);
    lcd.print("10       ");
  }

//StartStopButtonState = digitalRead(StartStopButton);

 //if ((StartStopButtonState = 0) && (buttonPushCounter = 3)) {  // Jeder Button braucht ein Last
   // lastStartStopButtonState = StartStopButtonState;  // last merken
   // delay(10);
// }
  //if (StartStopButtonState == LOW)  // wegin INPUT_PULLUP
    //{  
    //StartStopButtonState = LOW;
    //lcd.setCursor(14, 0);
    //lcd.print("YOO");
    //lcd.print(StartStopButtonState);
 //}
// if (StartStopButtonState == HIGH)  // wegin INPUT_PULLUP
//    {  
//    lcd.setCursor(9, 1);
//    lcd.print("    ");
 //   lcd.print(StartStopButtonState);
 //}

digitalWrite(RECHTS,HIGH); 
delay(3000); 
digitalWrite(RECHTS, LOW); 
digitalWrite(LINKS, HIGH);
delay(3000); 
digitalWrite(LINKS, LOW); 


}

Oh Mann... ratlos

So, bitte testen und bitte genau erklären was es tun soll und was davon vom Verhalten des unteren Sketch abweicht.

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display

#define RECHTS 7
#define LINKS 8

void Motor_Ansteuern(uint8_t Richtung);

const int UpButton = 2;// the number of the pushbutton pin
const int DownButton = 3;// the number of the pushbutton pin
const int StartStopButton = 4;// the number of the pushbutton pin

int buttonPushCounter = 0;   // counter for the number of button presses
int UpButtonState = -1;// current state of the button
int DownButtonState = -1;// current state of the button
int StartStopButtonState = -1;// current state of the button

//boolean lastButtonState = LOW;
boolean lastUpButtonState = LOW;
boolean lastDownButtonState = LOW;// previous state of the button
boolean lastStartStopButtonState = LOW;

uint8_t Gestartet = 0;

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.setCursor(3, 0);
  lcd.print("TeaMyTron");
  lcd.setCursor(0, 1);
  lcd.print("Minuten: 0");

  pinMode(UpButton, INPUT_PULLUP);
  pinMode(DownButton, INPUT_PULLUP);
  pinMode(StartStopButton, INPUT_PULLUP);
  pinMode(RECHTS, OUTPUT);
  pinMode(LINKS, OUTPUT);
}


void loop() {

  UpButtonState = digitalRead(UpButton);

  if (UpButtonState != lastUpButtonState) {  // Jeder Button braucht ein Last
    lastUpButtonState = UpButtonState;  // last merken
    delay(10);
    if (UpButtonState == LOW)  // wegin INPUT_PULLUP
    {
      buttonPushCounter++;
      //delay(250);
      lcd.setCursor(9, 1);
      lcd.print(buttonPushCounter);
    }
  }

  DownButtonState = digitalRead(DownButton);

  if (DownButtonState != lastDownButtonState) {  // Jeder Button braucht ein Last
    lastDownButtonState = DownButtonState;  // last merken
    delay(10);
    if (DownButtonState == LOW)  // wegin INPUT_PULLUP
    {
      lcd.setCursor(9, 1);
      lcd.print("        ");
      buttonPushCounter--;
      //delay(250);
      lcd.setCursor(9, 1);
      lcd.print(buttonPushCounter);
    }
  }

  if (buttonPushCounter > 10) {
    buttonPushCounter = 0;
    lcd.setCursor(9, 1);
    lcd.print("0        ");
  }

  if (buttonPushCounter < 0) {
    buttonPushCounter = 10;
    lcd.setCursor(9, 1);
    lcd.print("10       ");
  }

  StartStopButtonState = digitalRead(StartStopButton);

  if (StartStopButtonState != lastStartStopButtonState) {  // Jeder Button braucht ein Last
    lastStartStopButtonState = StartStopButtonState;  // last merken
    delay(10);

    if (StartStopButtonState == LOW)  // wegin INPUT_PULLUP
    {
      lcd.setCursor(14, 0);
      lcd.print("YOO");
      lcd.print(StartStopButtonState);
      Gestartet = 1;
    }
    if (StartStopButtonState == HIGH)  // wegin INPUT_PULLUP
    {
      lcd.setCursor(9, 1);
      lcd.print("    ");
      lcd.print(StartStopButtonState);
    }
  }

  if (Gestartet) {
    Gestartet = 0;
    Motor_Ansteuern(1);
    Motor_Ansteuern(0);
  }


}

void Motor_Ansteuern(uint8_t Richtung) {
  digitalWrite(RECHTS, !Richtung);
  digitalWrite(LINKS, Richtung);
  delay(3000);
  digitalWrite(RECHTS, LOW);
  digitalWrite(LINKS, LOW);
}

Werde es auf jeden Fall testen sobald ich von der Montage zurück bin, Danke :slight_smile:
Habe aber noch ein kleines anderes Problem.
Zurzeit läuft alles über eine Steckplatine und ein 5V 2A Netzteil, wenn das Relais schaltet flackert mein Display. Vcc und JdVcc jumper ist gesetzt.

Hat das Relais eine Freilaufdiode? Wie sieht es beim Motor aus?

Gruß Tommy

Freilaufdiode, ich muss mal google anschmeißen... :o
Das Relais habe ich.

Die sollten (vermutlich) welche haben.
Bricht evtl. die Spannungsversorgung beim Anlauf kurz ein?

Gruß Tommy

Ja wenn das Relais schaltet, dann läuft der Motor an und das Display flackert, muss dann auch den Kontrast am i2c Board Poti neu einstellen.

Dann ist Deine Spannungsversorgung wohl nicht leistungsfähig genug. Womit versorgst Du?

Gruß Tommy

Siehe Oben #23
5V 2A Netzteil, ehemaliges Samsung Ladegerät

Das sollte eigentlich reichen. Hänge doch mal einen Elko (470 bis 1000 µF) zwischen Vcc und GND des Displays (Polarität beachten).

Gruß Tommy

Bild von Aufbau?
Was für ein Servo ist das?

Ich schmeiße später mal Fitzing an

ChrisBoy:
5V 2A Netzteil, ehemaliges Samsung Ladegerät

Ein Ladegerät nutzt möglicherweise den Akku als Kapazität, dann kommt da nur gleichgerichtete Wechselspannung raus. Auf dem Ladegerät eventuell so gekennzeichnet:

- -
---

Gleichspannung:

---
---

Dann benötigst Du einen Kondensator zur Glättung, siehe #30.

So einmal das Layout, Dateien sind hier:

Der Motor ist ein Esky 8g High Speed Mini Servo

Vielleicht mag ja einer ergänzen wo genau ich ein Elko oder Kerko hinpacken soll :wink:

Auf dem Netzteil ist nichts weiter ersichtlich...
Die LED auf dem Arduino zuckt auch beim schalten des Relais.

Teemaschine.zip (547 KB)