Keine Ausgabe auf Display!

Hallo,

ich habe acht Schalter ueber einen 4051 Multiplexer an meinem Arduino UNO und ein 2,4" TFT Display.

In meinem SerialMonitor werden alle Schalter richtig gelesen und ausgegeben. Aber mein Display bleibt “ROT” als ob es im Setup haengen bleiben wuerde.

Wer kann mir da auf die Spruenge helfen?

Danke!

//25.08.2015
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library


#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// Assign human-readable names to some common 16-bit color values:
#define	BLACK   0x0000
#define	BLUE    0x001F
#define	RED     0xF800
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

byte state = 0;                 // Zustände
int lastState = 0;
int sensorState = HIGH;
int zaehler = 1;

int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void problem(void) {
  tft.fillScreen(RED);
  tft.setCursor(38, 150);
  tft.setTextColor(WHITE);  tft.setTextSize(4);
  tft.println("KEIN");
  tft.setCursor(38, 200);
  tft.println("SIGNAL");
}

void drawChar(char c)
{
  tft.fillScreen(WHITE);
  tft.setCursor(20, 20);
  tft.setTextColor(RED);  
  tft.setTextSize(40);
  tft.print(c);
}

void setup(void) {
  tft.reset();
  tft.begin(0x9341);
  tft.setRotation(0);
  tft.fillScreen(RED);
   
  pinMode(sensorState,INPUT /*_PULLUP*/ );
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  for ( zaehler = 0 ; zaehler <= 7; zaehler++ ) {

  bit1 = bitRead(zaehler, 0);
  bit2 = bitRead(zaehler, 1);
  bit3 = bitRead(zaehler, 2);

  digitalWrite(10, bit1);
  digitalWrite(11, bit2);
  digitalWrite(12, bit3);

  sensorState = digitalRead(13);
  Serial.print("Sensor:");
  Serial.print(zaehler);
  Serial.print(" ");
  Serial.print(sensorState);
  Serial.print("\t");
 } 
 Serial.println("");

  if(zaehler == 0 && sensorState == LOW) state = 0; // N
  if(zaehler == 1 && sensorState == LOW) state = 1; // 1
  if(zaehler == 2 && sensorState == LOW) state = 2; // 2
  if(zaehler == 3 && sensorState == LOW) state = 3; // 3
  if(zaehler == 4 && sensorState == LOW) state = 4; // 4
  if(zaehler == 5 && sensorState == LOW) state = 5; // 5
  if(zaehler == 6 && sensorState == LOW) state = 6; // 6
  if(zaehler == 7 && sensorState == LOW) state = 7; // R
  
  if(lastState != state) {
  lastState = state;
    
      switch (state)
      {
     case 0: 
         drawChar('0');
      break;
     
      case 1:   
        drawChar('1');
      break;
      
      case 2:   
        drawChar('2');
      break;  
      
      case 3:   
        drawChar('3');
      break;
      
      case 4:   
        drawChar('4');
      break;
      
      case 5:  
        drawChar('5');
      break;
      
      case 6:   
        drawChar('6');
      break;
      
      case 7:  
       drawChar('7');
      break;
      
      default:
      problem();
      }
  }
}

petemanzel: In meinem SerialMonitor werden alle Schalter richtig gelesen und ausgegeben. Aber mein Display bleibt "ROT" als ob es im Setup haengen bleiben wuerde.

Hattest Du denn schon mal ein Bild auf dem Display?

Gruß

Gregor

gregorss: Hattest Du denn schon mal ein Bild auf dem Display?

Gruß

Gregor

Ja, aber da habe ich einen Wert von einem Poti an A5 ausgegeben!

petemanzel: Ja aber da habe ich einen wert von einem Poti an A5 ausgegeben!

Dann ist das Display schonmal nicht der Schuldige. Fülle das Display mal mit einer anderen Farbe und/oder probiere, ob etwas im Display erscheint, wenn Du noch in setup() etwas darauf ausgibst. Wenn das funktioniert, kannst Du diese Zeile an unterschiedlichen Stellen im Code platzieren und dadurch evtl. herausfinden, an welcher Stelle genau ein Fehler auftritt.

HTH

Gregor

gregorss: Dann ist das Display schonmal nicht der Schuldige. Fülle das Display mal mit einer anderen Farbe und/oder probiere, ob etwas im Display erscheint, wenn Du noch in setup() etwas darauf ausgibst. Wenn das funktioniert, kannst Du diese Zeile an unterschiedlichen Stellen im Code platzieren und dadurch evtl. herausfinden, an welcher Stelle genau ein Fehler auftritt.

HTH

Gregor

Danke fuer den Tip! Klappt alles bis zu den if Abfragen. Wenn ich einen Text davor Ausgeben lasse blinkt der Text.

petemanzel: Klappt alles bis zu den if Abfragen. Wenn ich einen Text davor Ausgeben lasse blinkt der Text.

Könntest Du Dich genauer ausdrücken? Tritt der Fehler nach dem Serial.println("")* auf?

Gruß

Gregor

  • mach' Serial.println(); daraus.

gregorss:
Könntest Du Dich genauer ausdrücken? Tritt der Fehler nach dem Serial.println("")* auf?

Gruß

Gregor

  • mach’ Serial.println(); daraus.

Sorry!

Ja, genau!

Wenn ich eine Testzeile vor dieser Abfrage:

if(lastState != state) {
lastState = state;

ausgeben lasse, wird der Text angezeigt. Nach dieser Abfrage wird die Testzeile nicht ausgegeben und das Display bleibt “Rot”.

if(zaehler == 0 && sensorState == LOW) state = 0; // N
  if(zaehler == 1 && sensorState == LOW) state = 1; // 1
  if(zaehler == 2 && sensorState == LOW) state = 2; // 2
  if(zaehler == 3 && sensorState == LOW) state = 3; // 3
  if(zaehler == 4 && sensorState == LOW) state = 4; // 4
  if(zaehler == 5 && sensorState == LOW) state = 5; // 5
  if(zaehler == 6 && sensorState == LOW) state = 6; // 6
  if(zaehler == 7 && sensorState == LOW) state = 7; // R

ist das nicht das gleiche wie

if(sensorState == LOW) state = zaehler;

?

Grüße Uwe

Und zack, code sauberer!

Aber loest mein Problem immer noch nicht.

Der Zaehler, zaehlt von 0 bis 7 meine Eingaenge durch und wenn einer der Eingaenge "LOW" ist, soll die entsprechende Nummer des umgelegten Schalters im Display angezeigt werden.

Wenn ich die for- Schleife nur bis 1 zaehlen lasse, bekomme ich eine "2" (also case 2) einmal ausgegeben. Danach passiert nichts mehr.

Hat keiner eine Idee? Was mache ich da falsch?

Hi,

int sensorState = HIGH;
pinMode(sensorState,INPUT /*_PULLUP*/ );

was willst Du mit diesen Zeilen machen?

Gruß Matze

Matze7779:
Hi,

int sensorState = HIGH;

pinMode(sensorState,INPUT /_PULLUP/ );




was willst Du mit diesen Zeilen machen?

Gruß
Matze

Habe ich geaendert:

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library


#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// Assign human-readable names to some common 16-bit color values:
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

byte state = 0;                 // Zustände
int lastState = 0;
int sensorState = 0;
int zaehler = 1;

int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void problem(void) {
  tft.fillScreen(RED);
  tft.setCursor(38, 150);
  tft.setTextColor(WHITE);  tft.setTextSize(4);
  tft.println("KEIN");
  tft.setCursor(38, 200);
  tft.println("SIGNAL");
}

void drawChar(char c)
{
  tft.fillScreen(WHITE);
  tft.setCursor(20, 20);
  tft.setTextColor(RED);  
  tft.setTextSize(40);
  tft.print(c);
}

void setup(void) {
  tft.reset();
  tft.begin(0x9341);
  tft.setRotation(0);
  tft.fillScreen(RED);
   
  pinMode(13,INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  for ( zaehler = 0 ; zaehler <8; zaehler++ ) {

  bit1 = bitRead(zaehler, 0);
  bit2 = bitRead(zaehler, 1);
  bit3 = bitRead(zaehler, 2);

  digitalWrite(10, bit1);
  digitalWrite(11, bit2);
  digitalWrite(12, bit3);

  sensorState = digitalRead(13);
  Serial.print("Sensor:");
  Serial.print(zaehler);
  Serial.print(" ");
  Serial.print(sensorState);
  Serial.print("\t");
 } 
 Serial.println("");

  if(zaehler == 0 && sensorState == LOW) state = 0; // N
  if(zaehler == 1 && sensorState == LOW) state = 1; // 1
  if(zaehler == 2 && sensorState == LOW) state = 2; // 2
  if(zaehler == 3 && sensorState == LOW) state = 3; // 3
  if(zaehler == 4 && sensorState == LOW) state = 4; // 4
  if(zaehler == 5 && sensorState == LOW) state = 5; // 5
  if(zaehler == 6 && sensorState == LOW) state = 6; // 6
  if(zaehler == 7 && sensorState == LOW) state = 7; // R
  
  if(lastState != state) {
  lastState = state;
    
      switch (state)
      {
     case 0: 
         drawChar('0');
      break;
     
      case 1:   
        drawChar('1');
      break;
      
      case 2:   
        drawChar('2');
      break;  
      
      case 3:   
        drawChar('3');
      break;
      
      case 4:   
        drawChar('4');
      break;
      
      case 5:  
        drawChar('5');
      break;
      
      case 6:   
        drawChar('6');
      break;
      
      case 7:  
       drawChar('7');
      break;
      
      default:
      problem();
      }
  }
}

petemanzel: Habe ich geaendert ...

Toll ...

Woher soll ich denn nun wissen, wo Du etwas geändert hast? Soll ich das etwa selber suchen?! Und inwiefern beantwortet das die gestellte Frage?

Bitte versetze Dich beim Schreiben ein bisschen in denjenigen, der es lesen und Dir helfen soll.

Gruß

Gregor

Sorry Matze!
Sorry Gregor!

@Grogor, Du hast natuerlich recht!

Ich habe in den von Matze hingewiesenen Zeilen, einmal die Variable anlegen wollen, wo der Zustand des einzulesenden Pins des Multiplexors eingelesen wird. Deshalb “HIGH”, weil im inaktiven Zustand ein “HIGH” vom Multiplexor ausgegeben wird.

Und dann habe ich dummerweise anstelle von “sensorPin” zum bestimmen des einzulesenden Pins wieder die selbe Variable eingetragen. Habe ich aber jetzt in soweit geaendert, dass ich jetzt Pin 13 direkt ohne Variable in die Zeile “pinMode(sensorState,INPUT /_PULLUP/ );” eingetragen habe!

Sieht jetzt so aus:
pinMode(13 ,INPUT );

Vielen Dank!

Ich habe aber immer noch keine Loesung gefunden!

Ich habe jetzt endlich was auf dem Display!

Es wird richtig ausgelesen aber die zahlen im display springen immer zwischen dem richtigen ausgelesenen wert “case x” und “case 1” hin und her.

Ich vermute, dass ich irgend einen Fehler nach der for schleife habe, und zwar in der if-Abfrage wo der neue zustand mit dem alte zustand verglichen wird.

Kann mir bitte jemand helfen!

Danke!

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// Assign human-readable names to some common 16-bit color values:
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

byte state = 0;                
int lastState = 0;
int count = 0;

int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void problem(void) {
  tft.fillScreen(RED);
  tft.setCursor(38, 150);
  tft.setTextColor(WHITE);  
  tft.setTextSize(4);
  tft.println("KEIN");
  tft.setCursor(38, 200);
  tft.println("SIGNAL");
}

void drawChar(char c)
{
  tft.fillScreen(WHITE);
  tft.setCursor(20, 20);
  tft.setTextColor(RED);  
  tft.setTextSize(40);
  tft.print(c);
}

void setup(void) {
  tft.reset();
  tft.begin(0x9341);
  tft.setRotation(0);
  tft.fillScreen(RED);
   
  pinMode(13, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  
  for (count = 0 ; count <8; count++ ) {

  bit1 = bitRead(count, 0);
  bit2 = bitRead(count, 1);
  bit3 = bitRead(count, 2);

  digitalWrite(10, bit1);
  digitalWrite(11, bit2);
  digitalWrite(12, bit3);

const int sensorState = digitalRead(13);

        Serial.print("Pin: ");
        Serial.print(count);
        Serial.print(" Value: ");
        Serial.print(sensorState);
        Serial.print(" ");
       
      Serial.println("-----");


    if(sensorState == 0) state = count;

      if(lastState != state) {
      lastState = state;

        switch (state)
      {
      case 0: 
        drawChar('0');
       break;
     
      case 1:   
        drawChar('1');
      break;
      
      case 2:   
        drawChar('2');
      break;  
      
      case 3:   
        drawChar('3');
      break;
      
      case 4:   
        drawChar('4');
      break;
      
      case 5:  
        drawChar('5');
      break;
      
      case 6:   
        drawChar('6');
      break;
      
      case 7:  
       drawChar('7');
      break;
      
      default:
      problem();
      }
    }
   } 
}

petemanzel: Ich habe jetzt endlich was auf dem Display!

Das sind ja mal erfreuliche Neuigkeiten :-)

petemanzel: Kann mir bitte jemand helfen!

Gerne, nur nicht sofort - aber ich werde mich bald damit beschäftigen.

Gruß

Gregor

Ich schätze, loop läuft so schnell durch, dass du auf dem display gar nicht alles siehst.

Die Geschwindigkeit hängt an den Serial Testausgaben, die das ganze (bei 9600) auf ca. 1000 Zeichen/sec begrenzen. Bei ca. 30 Zeichen je for-Schleife also 30 Anzeigen /sec, das sollte schöne Flacker-Effekte ergeben.

Mach mal in die for - Schleife ein  delay(300);  und das Ganze sieht sicher anders aus.

michael_x:
Mach mal in die for - Schleife ein delay(300);  und das Ganze sieht sicher anders aus.

Eieiei … eine Blockade! Von Dir!

SCNR

@Pete: Kompliment, Dein Code ist echt schön lesbar! Beim Debugging ist das Gold wert. Ich habe das trotzdem noch ein bisschen „enhanced“ (s. unten). Mich irritierte zuerst, dass Du „sensorState“ als const deklariert hast. IMO ist das da überflüssig, hat aber mit dem Fehlverhalten nichts zu tun. Dafür ist Michaels Hinweis gut. Probiere das mal und berichte.

Gruß

Gregor

PS: Der Code

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

byte state = 0;               
int lastState = 0;
int count = 0;

int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void problem(void)
{
  tft.fillScreen(RED);
  tft.setCursor(38, 150);
  tft.setTextColor(WHITE); 
  tft.setTextSize(4);
  tft.println("KEIN");
  tft.setCursor(38, 200);
  tft.println("SIGNAL");
}

void drawChar(char c)
{
  tft.fillScreen(WHITE);
  tft.setCursor(20, 20);
  tft.setTextColor(RED); 
  tft.setTextSize(40);
  tft.print(c);
}

void setup(void)
{
  tft.reset();
  tft.begin(0x9341);
  tft.setRotation(0);
  tft.fillScreen(RED);
   
  pinMode(13, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  for (count = 0 ; count <8; count++ )
    {
      bit1 = bitRead(count, 0);
      bit2 = bitRead(count, 1);
      bit3 = bitRead(count, 2);
  
      digitalWrite(10, bit1);
      digitalWrite(11, bit2);
      digitalWrite(12, bit3);

      bool sensorState = digitalRead(13); // Bool benoetigt nur 1 Bit
                                          // int aber 4 Byte (32 mal so viel)
                                          // Ist meistens aber wurscht.
      Serial.print("Pin: ");
      Serial.print(count);
      Serial.print(" Value: ");
      Serial.print(sensorState);
      Serial.print(" ");
      Serial.println("-----");

      if(sensorState == false)
	{ state = count; }

      if(lastState != state)
	{
	  lastState = state;

	  switch (state)
	    {
	    case 0:  drawChar('0'); break;
	    case 1:  drawChar('1'); break;
	    case 2:  drawChar('2'); break;
	    case 3:  drawChar('3'); break;
	    case 4:  drawChar('4'); break;
	    case 5:  drawChar('5'); break;
	    case 6:  drawChar('6'); break;
	    case 7:  drawChar('7'); break;
	    default: problem();
	    }
	}
    }
}

Das switch/case kann man auch rausschmeißen:

if (state >= 0 && state <= 7)
  drawchar(state + '0');
else
  problem();

Das ist falsch:

bool sensorState = digitalRead(13); // Bool benoetigt nur 1 Bit

Bool kann nur 0 oder 1 annehmen, aber belegt 1 Byte