Kann mir jemand helfen? Tasten gehen nicht

Hallo, ich bin Anfänger und habe ein kleines Problem,
ich habe ein Sketch aus mehreren Teilen zusammengesetzt, aber leiter funktionieren jetzt die Tasten nicht mehr.
Jemand eine Idee?

#include <Tiny4kOLED.h>

const int Taster1 = 13;
const int Taster2 = 12;

int OUT1 = A2;
int OUT2 = A3;

int Zaehler1 = 100; //Wert beim Start
int Zaehler2 = 20; //Wert beim Start
int Zaehler3 = Zaehler1 + Zaehler2; //Wert beim Start

const unsigned int maxZaehler1 = 201; // Maximaler Wert
const unsigned int minZaehler1 = 40; // Minimaler Wert
const unsigned int maxZaehler2 = 81; // Maximaler Wert
const unsigned int minZaehler2 = 1; // Minimaler Wert
const int tick = 100; // Wert in ms
unsigned long lastmillis;
bool lastread = false;

const unsigned char  img_heart_small[] PROGMEM = {
  0x00, 0x00, 0xc0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00
};

const unsigned char  img_heart_big[] PROGMEM = {
  0xe0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xe0, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00
};

void splash() {
  oled.clear();
  oled.setCursor(15, 1);
  oled.print(F("ATtiny85+SSD1306"));

  oled.setCursor(42, 3);
  oled.print(F("Example"));

  oled.setCursor(35, 7);
  oled.print(F("wokwi.com"));
}

void heartBeat() {
  static char big = 1;
  static long startTime = 0;
  long currentTime;

  // Get current time
  currentTime = millis();

  // Update if 200ms passed
  if ((currentTime - startTime) > 2000) {
    startTime = currentTime;
    big = 1 - big;

    if (big) {
      oled.bitmap(20, 4, 37, 6, img_heart_big);
    } else {
      oled.bitmap(20, 4, 37, 6, img_heart_small);
    }
  }
}

void prepareDisplay() {
  unsigned int i, k;
  unsigned char ch[5];

  oled.clear();
  oled.begin();

  oled.setCursor(10, 1);
  oled.print(F("Sollbereich:"));
  oled.setCursor(30, 2);
  oled.print(Zaehler1);
  oled.setCursor(60, 2);
  oled.print(Zaehler3);

  oled.bitmap(10, 5, 17, 2, img_heart_small);
}

float Messwert;
float Spannung;

void setup()
{  
pinMode(Taster1, INPUT_PULLUP);
pinMode(Taster2, INPUT_PULLUP);
pinMode(OUT1, OUTPUT);
pinMode(OUT2, OUTPUT);
Serial.begin(9600); //serielle Verbindung starten. Dies ist notwendig um die Ergebnisse später mit dem Begehl "Serial.Println" an den Seriellen Monitor senden zu können.

  oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);

  // Two fonts are supplied with this library, FONT8X16 and FONT6X8
  oled.setFont(FONT6X8);

  // To clear all the memory
  oled.clear();
  oled.on();
  splash();

  delay(3000);
  prepareDisplay();
}

void loop()
{

Messwert=analogRead(A1); //Spannungswert am analogen Eingang 1 auslesen
Spannung= map(Messwert, 0, 1023, 0, 250); //Umwandeln des Sensorwertes mit Hilfe des "map" Befehls. Da der Map-Befehl keine Kommastellen ausgibt, wird hier vorerst mit größeren Zahlen gearbeitet.
Spannung=Spannung/1; // Das Ergebnis wird nun durch 10 geteilt, um die Anzeige als korrekten Wert mit einer Nachkommastelle ausgeben zu können.

if(Spannung < Zaehler1)
{
  digitalWrite(OUT1, HIGH);
  oled.setCursor(0,7);

    // Print to display
    oled.print("Auf");
   }
else{
  digitalWrite(OUT1, LOW);
}

if(Spannung > Zaehler1)
{
  digitalWrite(OUT1, LOW);
  oled.setCursor(0,7);

    // Print to display
    oled.print("    ");
   }
else{
  digitalWrite(OUT2, LOW);
}

if(Spannung < Zaehler3)
{
  digitalWrite(OUT2, LOW);
   }
else{
  digitalWrite(OUT2, HIGH);
   oled.setCursor(0,7);

    // Print to display
    oled.print("Ab");
}
{ 
  static long startTime = 0;
  long currentTime;
 

  // Get current time
  currentTime = millis();

  // Checks 1 second passed
  if ((currentTime - startTime) > 1000) {
    startTime = currentTime;

    // Set cursor
    oled.setCursor(50, 5);

    // Print to display
    oled.print("Spannung: ");

     
    // Set cursor
    oled.setCursor(57,7);

    // Print to display
    oled.print(Spannung, 2);
    oled.print(" V  ");

  }

  heartBeat();
}

if (millis() - lastmillis > tick)
    lastread = false;

  if
 (Zaehler2 == 81){  Zaehler2 = 1; oled.clear(); }
  if
  (Zaehler1 == 201){  Zaehler1 = 40; oled.clear(); }

  if (!digitalRead(Taster1) && !lastread && Zaehler1 < maxZaehler1)
  {
   Zaehler1++;
   lastmillis = millis(); lastread = true;
  }
  if (!digitalRead(Taster2) && !lastread && Zaehler2 < maxZaehler2)
  {
    Zaehler2++;
    lastmillis = millis(); lastread = true;
  }
  delay(1000);
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Spannung = Spannung / 1; // Das Ergebnis wird nun durch 10 geteilt,

unnötig oder Tippfehler?

noch unnötig, im späteren Einsatz brauche ich es, deshalb schon mit geschrieben.

Hallo silviovogel

Spendiere hier und in weiteren Codestellen ein paar Klammern.
Der Compiler kann noch keine Gedanken lesen was für eine Logik sich dahinter verbergen soll. :sunglasses:

if (!digitalRead(Taster1) && !lastread && Zaehler1 < maxZaehler1)

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

erstelle eine separate .INO Datei und sammle dort Sachen di in Zukunft vllt. genutzt werden können.

  Messwert = analogRead(A1); //Spannungswert am analogen Eingang 1 auslesen
  Spannung = map(Messwert, 0, 1023, 0, 250); //Umwandeln des Sensorwertes mit Hilfe des "map" Befehls. Da der Map-Befehl keine Kommastellen ausgibt, wird hier vorerst mit größeren Zahlen gearbeitet.
  Spannung = Spannung / 10; // Das Ergebnis wird nun durch 10 geteilt, um die Anzeige als korrekten Wert mit einer Nachkommastelle ausgeben zu können.

=

Spannung = (float)analogRead(A1)*250.0/1024.0; 

Danke für die schnelle Antwort aber ich habe es immer noch nicht kapiert.

Sorry habe ich bloß vergessen auszukommentieren.

Das ist eigentlich ganz einfach, eigentlich.

Unter welcher logischen Kombinationen der Parameter soll die IF-Abfrage true oder false als Ergebnis haben?

eigentlich if true

Danke für den Tip!

  static char big = 1;
.....
    big = 1 - big;

was soll denn das bewirken? ist es deine Art eine Inversion durchzuführen? oder was

Ehrlich gesagt, keine Ahnung. Das habe ich so übernommen aus einem bestehenden Code.

sag mal, für welches Chip ist es gedacht?

Arduino Uno

Also das mit den Tasten bekomme ich immer noch nicht hin...
Verstehe ich einfach nicht. Wenn ich es in einer extra Datei schreibe funktioniert es...

#include <Tiny4kOLED.h>

const int Taster1 = 13;
const int Taster2 = 12;

const unsigned int maxZaehler1 = 201; // Maximaler Wert
const unsigned int minZaehler1 = 40; // Minimaler Wert
const unsigned int maxZaehler2 = 81; // Maximaler Wert
const unsigned int minZaehler2 = 1; // Minimaler Wert
const int tick = 100; // Wert in ms
unsigned long lastmillis;
bool lastread = false;

int Zaehler1 = 120; //Wert beim Start
int Zaehler2 = 40; //Wert beim Start

void prepareDisplay() {
  unsigned int i, k;
  unsigned char ch[5];

  oled.clear();
  oled.begin();
 
}

void setup()
{
  Serial.begin(115200);
  pinMode(Taster1, INPUT_PULLUP);
  pinMode(Taster2, INPUT_PULLUP);
 oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);

  // Two fonts are supplied with this library, FONT8X16 and FONT6X8
  oled.setFont(FONT6X8);

  // To clear all the memory
  oled.clear();
  oled.on();
  prepareDisplay();
}

void loop()
{
  oled.setCursor(0, 1);
  oled.print("Zaehler1");
  oled.setCursor(0, 2);
  oled.print(Zaehler1);
  oled.setCursor(0, 3);
  oled.print("Zaehler2");
  oled.setCursor(0, 4);
  oled.print(Zaehler2);

if (millis() - lastmillis > tick)
    lastread = false;

  if
 (Zaehler2 == 81){  Zaehler2 = 1; oled.clear(); }
  if
  (Zaehler1 == 201){  Zaehler1 = 40; oled.clear(); }

  if (!digitalRead(Taster1) && !lastread && Zaehler1 < maxZaehler1)
  {
   Zaehler1++;
   lastmillis = millis(); lastread = true;
  }
  if (!digitalRead(Taster2) && !lastread && Zaehler2 < maxZaehler2)
  {
    Zaehler2++;
    lastmillis = millis(); lastread = true;
  }
}



#include <Tiny4kOLED.h>

const int Taster1 = 13;
const int Taster2 = 12;
const int OUT1 = A2;
const int OUT2 = A3;

int Zaehler1 = 100; //Wert beim Start
int Zaehler2 = 20; //Wert beim Start
#define Zaehler3  (Zaehler1 + Zaehler2) //Wert beim Start

const unsigned int maxZaehler1 = 201; // Maximaler Wert
const unsigned int minZaehler1 = 40; // Minimaler Wert
const unsigned int maxZaehler2 = 81; // Maximaler Wert
const unsigned int minZaehler2 = 1; // Minimaler Wert
const int Pause = 100; // Wert in ms

const unsigned char  img_heart_small[] PROGMEM = {
  0x00, 0x00, 0xc0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00
};

const unsigned char  img_heart_big[] PROGMEM = {
  0xe0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xe0, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00
};

void heartBeat() {
  static bool big = true;
  static long startT = 0;
  if ((millis() - startT) > 2000) {
    startT += 2000;
    big = !big;
    if (big)oled.bitmap(20, 4, 37, 6, img_heart_big);
    else oled.bitmap(20, 4, 37, 6, img_heart_small);
  }
}

#define Tast1IsPressed (!digitalRead(Taster1))
#define Tast2_IsPressed (!digitalRead(Taster2))

void setup() {
  pinMode(Taster1, INPUT_PULLUP);
  pinMode(Taster2, INPUT_PULLUP);
  pinMode(OUT1, OUTPUT);
  pinMode(OUT2, OUTPUT);
  Serial.begin(9600); 

  oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);
  oled.setFont(FONT6X8);
  oled.on();
  oled.clear();
  oled.setCursor(10, 1);
  oled.print(F("Sollbereich:"));
  oled.setCursor(30, 2);
  oled.print(Zaehler1);
  oled.setCursor(60, 2);
  oled.print(Zaehler3);
  oled.bitmap(10, 5, 17, 2, img_heart_small);
}

void loop() {
  static unsigned long startTime = 0;
  static unsigned long lastmillis = 0;
  static float Spannung = 0;

  Spannung = (float)analogRead(A1) * 250.0 / 1024.0;
  if (Spannung < Zaehler1)  {
    digitalWrite(OUT1, HIGH);
    oled.setCursor(0, 7);
  }  else digitalWrite(OUT1, LOW);

  if (Spannung > Zaehler1)  {
    digitalWrite(OUT1, LOW);
    oled.setCursor(0, 7);
    oled.print("    ");
  }  else digitalWrite(OUT2, LOW);

  if (Spannung < Zaehler3)    digitalWrite(OUT2, LOW);
  else {
    digitalWrite(OUT2, HIGH);
    oled.setCursor(0, 7);
    oled.print("Ab");
  }

  if (millis() - startTime > 1000) { // Checks 1 second passed
    startTime += 1000;
    oled.setCursor(50, 5);
    oled.print("Spannung: ");
    oled.setCursor(57, 7);
    oled.print(Spannung, 2);
    oled.print(" V  ");
    heartBeat();
  }

  if (Zaehler2 >= maxZaehler2) {
    Zaehler2 = minZaehler2;
    oled.clear();
  }
  if (Zaehler1 >= maxZaehler1) {
    Zaehler1 = minZaehler1;
    oled.clear();
  }
  if (millis() - lastmillis > Pause) {
    lastmillis +=  Pause;
    if (Tast1IsPressed  && Zaehler1 < maxZaehler1)   Zaehler1++;
    if (Tast2_IsPressed  && Zaehler2 < maxZaehler2)Zaehler2++;
  }
  delay(1000);
}
1 Like

Vielen Dank für die Hilfe. Wenn ich den Sketch in den Simulator lade (wokwi) dann gehen die Taster aber immer noch nicht. Woran kann das liegen?
Und den Part verstehe ich auch noch nicht ganz:

if (Tast1IsPressed  && Zaehler1 < maxZaehler1)   Zaehler1++;
    if (Tast2_IsPressed  && Zaehler2 < maxZaehler2)Zaehler2++;

Sind das bloß verschiedene Schreibweisen oder bewirken sie unterschiedliche Sachen?

an Simulator. neulich ein Poti angeschlossen und Wischer mit einer taste getrennt. wokwi hat das nicht verstanden. und dachte es sei nicht angeschlossen überhaupt. auch nicht wenn die Taste kurzgeschlossen mit 'ner Verbindung

ich wusste es! deshalb eine Definition mit "_" geschrieben, so das sie optisch leichter auseinander zu erkennen.