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?
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.
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.
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.
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!
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();
}
}
}
}
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();
}
}
}
}