HIGH/LOW ändern sich beliebig ohne Tasterbenutzung

Hallo zusammen!

vorneweg, ich bin neu hier im Forum, habe aber Kenntnisse bei meinem Arduino.
Mein Projekt gestaltet sich wie folgt:

  • Taster abfragen -> 1 bzw 0 in Variable schreiben
  • Variablen der Reihe nach am LCD ausgeben
  • wieder von vorne

An sich trivial, jedoch habe ich folgendes Problem:
Es funktioniert eine Zeit lang - 1 bis 30 Sekunden - dann ändern sich alle Variablenwerte ohne
mein Eingreifen auf 0. Was mir aufgefallen ist, ist, dass mein LCD für einen kleinen Moment aus bleibt.
Sind wieder alle Werte auf 0, funktionierts wieder ein paar Sekunden, und das gleiche Problem wieder
von vorne :frowning:

Nachfolgend mein Code:

#include <Wire.h>
#include <LiquidCrystal.h>
#define   BACKLIGHT_PIN  7
#define   WARTEN 250            // hier das Timing noch anpassen
#define   WARTENKURZ 100
// ab hier wird dann alles initialisiert
LiquidCrystal lcd(12, 11, 5, 4, 3, 2, BACKLIGHT_PIN, POSITIVE );
int Taster1 = 6;
int Taster2 = 7;
int Taster3 = 13;
// die nächsten drei dienen dem Shiftregister für die LEDs
int taktPin = 8;
int speicherPin = 9;
int datenPin = 10;
// die hier sollen mal die Werte von den Tastern weiter geben, wenn es endlich mal geht.
// wenn das hier mal bestellt wurde, schauen, ob das auch geht, also, dass man die 8 LEDs
// ansteuert: http://www.amazon.de/dp/B00LLW7D1K/ref=wl_it_dp_o_pC_S_ttl?_encoding=UTF8&colid=3RMBWOI8HD619&coliid=I1VL4S168OWU1P
// schaut an sich aber so aus, als dass ich dennoch meine 8 digitalen Eingänge verbrate. Veilleicht doch bei den urpsr. Tastern bleiben?
int a;              // a wird als erste Variable festgesetzt für die Tasterbetätigung an 1
int b;              // b wird als zweite Variable festgesetzt für die Tasterbetätigung an 2
int c;              // c wird als dritte Variable festgesetzt für die Tasterbetätigung an 3
//int d = 1;          // die nächsten derweil noch als 1 festgesetzt - beizeiten mit dem Shiftregister erfassen
//int e = 1;
//int f = 1;
//int g = 1;
//int h = 1;
//int Array[] = {a,b,c,d,e,f,g,h};
// hier wird dann das Setup gemacht
void setup()
{
  Serial.begin ( 9600 );
  lcd.backlight();
  lcd.begin(16,2);                         //16x2er LCD                 
  pinMode(Taster1, INPUT);                 //setzt den ersten Taster als INPUT fest
  pinMode(Taster2, INPUT);                 //setzt den zweiten Taster als INPUT fest
  pinMode(Taster3, INPUT);                 //setzt den dritten Taster als INPUT fest
  pinMode(taktPin, OUTPUT);                // die drei sind dann fürs Shiftregister  
  pinMode(speicherPin, OUTPUT);
  pinMode(datenPin, OUTPUT);  
}
// hier steht dann die ganze Schleife, die dauernd läuft
void loop()
{
// ab hier werden die Taster abgefragt und die LEDs angesprochen
if (digitalRead(Taster1) == HIGH)
   {
    a==0?a=1:a=0;                     // wenn Taster gedrückt wurde, wirds HIGH geschrieben; ists schon HIGH, wirds LOW geschrieben
    delay(WARTENKURZ);
   }
delay(WARTEN);
if (digitalRead(Taster2) == HIGH)
   {
    b==0?b=1:b=0;
    delay(WARTENKURZ);
   }
delay(WARTEN);   
if (digitalRead(Taster3) == HIGH)
   {
    c==0?c=1:c=0;
    delay(WARTENKURZ);
   }
delay(WARTEN);   
// ab hier steht das Schieberegister
//lcd.clear();               // LCD leeren
lcd.home();                // Heimatposition
lcd.print(a);              // die drei Variablen schreiben
lcd.print(b);
lcd.print(c);
delay(WARTEN);
//lcd.print(d);
//delay(WARTEN);
//lcd.print(e);
//delay(WARTEN);
//lcd.print(f);
//delay(WARTEN);
//lcd.print(g);
//delay(WARTEN);
//lcd.print(h);
//delay(WARTEN);
//  digitalWrite(speicherPin, LOW);
//  shiftOut(datenPin, taktPin, MSBFIRST, Array);                                  // hier ist noch ein Fehler
//  digitalWrite(speicherPin, HIGH);
//  delay(20);
}

Ich hoffe, mir kann wer weiter helfen!
P.S.: LEDs und Schieberegister hab ich der Übersichtlichkeit wegen raus geworfen.

Liebe Grüße & schönen Montag,
Michi

Are you lost? This is the English language forum.

michiries:
a==0?a=1:a=0;

Wer hilft mir bei dieser Syntax auf die Sprünge?

Für mich wäre die Lesbarkeit deutlich besser, wenn Du den auskommentierten Teil tatsächlich für's Forum auch rauswirfst.

Wenn die BEDINGUNG wahr ist, wird die ANWEISUNG1 ausgeführt. Ansonsten wird ANWEISUNG2 ausgeführt. Der Programmablaufplan ist identisch mit dem der if else-Anweisung. Sie benötigen beispielsweise von zwei Zahlen den höheren Wert? Mit dem Bedingungsoperator ?: könnten Sie folgendermaßen arbeiten:
<BEDINGUNG> ? <ANWEISUNG 1> : <ANWEISUNG 2>

Wobei ich davon ausgehe, dass der TE den Teil aus irgendeinem Code kopiert hat. Nutze die Schreibweise nicht. Ist deutlich schwerer zu sehen, dass es sich um eine if-Anweisung handelt.

Klaus_ww:

michiries:
a==0?a=1:a=0;

Wer hilft mir bei dieser Syntax auf die Sprünge?

Das ist quasi:

if (a==0) a=1; else a=0;

Von dem, was er da machen möchte, würde ich aber schreiben:

a=!a;

Selbst für den Konditional-Operator ist das sehr, sehr unschön gelöst. Mit dem kann man nämlich direkt Zuweisungen machen:

a = (a == 0) ? 1 : 0;

Wie gesagt, hier nicht die beste Wahl. Es gibt aber Situation wo das sehr praktisch ist und auch lesbarer als if/else

Serenifly:
Selbst für den Konditional-Operator ist das sehr, sehr unschön gelöst. Mit dem kann man nämlich direkt Zuweisungen machen:

a = (a == 0) ? 1 : 0;

Wenn schon auf diese Art, dann schreibt man es wohl eher so:

a=a?0:1;

PaulS:
Are you lost? This is the English language forum.

Und was hat er fürn Auftrag hier?

http://forum.arduino.cc/index.php?topic=268358.msg1891752#msg1891752

Er hat nen Doppelpost gemacht. Einmal hier, wusste ich doch, dass mir das ganze bekannt vor kam XD und halt im Internationalen. Aber schon mutig, das es auch leute gibt, die einfahc mal auf Deutsch in einem Englischen Forum es versuchen.

Hallo, Tut mir sehr leid dass meine Deutsch is so Schlect.

Ich hab code zum Taster status lesen geschrieben und hoffe das es dir hilft.

Ich bin auch neu in der Arduino welt.

Gruesse

Dennis

#include <LiquidCrystal.h>
int a; // a wird als erste Variable festgesetzt für die Tasterbetätigung an 1
int b; // b wird als zweite Variable festgesetzt für die Tasterbetätigung an 2
int c; // c wird als dritte Variable festgesetzt für die Tasterbetätigung an 3
//int d = 1; // die nächsten derweil noch als 1 festgesetzt - beizeiten mit dem Shiftregister erfassen
//int e = 1;
//int f = 1;
//int g = 1;
//int h = 1;
//int Array[] = {a,b,c,d,e,f,g,h};
// hier wird dann das Setup gemacht

// wenn Taster gedrückt wurde, wirds HIGH geschrieben; ists schon HIGH, wirds LOW geschrieben
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int Taster1 = 6;
int Taster2 = 7;
int Taster3 = 10; // Bitte notieren dass die PIN 13 sollte als INPUT pin vermeiden.
// Ich hab stat pin 13 pin 10 benuzt
void setup()
{
lcd.begin(16,2);
Serial.begin ( 9600 );
// lcd.backlight();
lcd.begin(16,2);
// lcd.print("Hello World"); //16x2er LCD
pinMode(Taster1, INPUT); //setzt den ersten Taster als INPUT fest
pinMode(Taster2, INPUT); //setzt den zweiten Taster als INPUT fest
pinMode(Taster3, INPUT); //setzt den dritten Taster als INPUT fest
// pinMode(taktPin, OUTPUT); // die drei sind dann fürs Shiftregister
//pinMode(speicherPin, OUTPUT);
//pinMode(datenPin, OUTPUT);

pinMode( Taster1, LOW); // Hier alle drei Inputs LOW fest geschrieben
pinMode( Taster2, LOW);
pinMode( Taster3, LOW);
}

void loop()

{
//a = digitalRead(Taster1);
b = digitalRead( Taster2); // Die Taster status lesen
// c = digitalRead( Taster3);

if (b == 1) // Wenn das ist HIGH
b = 0; // Dann Schreib das LOW
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ANFANGSTATUS="); // Schreib anfang Status
lcd.print(b); // Shreib wert von b
delay(2500); // Kurz Warten

// b Taster Geduckt status lesen
b = digitalRead( Taster2); // b Taster nochmal lesen
if (b == 1) // Wenn b is HIGH
lcd.clear();
lcd.setCursor(0,0);
lcd.print("GEDRUKTSTATUS="); // Gedrucjt status Schreiben
lcd.print(b);
delay(2500);
}

``

Zizat von sschultewolter:

Wobei ich davon ausgehe, dass der TE den Teil aus irgendeinem Code kopiert hat. Nutze die Schreibweise nicht. Ist deutlich schwerer zu sehen, dass es sich um eine if-Anweisung handelt.

Sehe das auch so, als das zum Erstem mal gesehen hatte (bin ja Umsteiger von pascal) habe ich erstmal Tante Google gefragt.
Manche Dinge in C im Vergleich zu Pascal sehe ich inzwischen als Vorteil.

Das hier braucht es nicht wirklich. Wo liegt hier der Mehrwert ?

rudirabbit:
Wo liegt hier der Mehrwert ?

Hier keiner. Ich verwende den Konditional-Operator wenn man schon viel Code hat und man nicht noch mal ein paar Zeilen für ein if-else verbraten will. Manchmal ist es übersichtlicher wenn man weiß was gemacht wird.

Eine Sache die dabei aber sehr schön ist, ist dass man direkt Zuweisungen machen kann. Wenn man mit if/else einer neuen Variablen etwas zuweisen will, muss man diese außerhalb des if/else deklarieren, was nochmal eine Zeile ist.

Bitte im anderen Post weiterschreiben
Grüeß Uwe