Hallo Leute,
ich habe mir den Nintendo DS screen (4-wire) bei/von Sparkfun gekauft. Ich habe das Teil auch zum Laufen bekommen und kann mir die Position meines Fingers über die serielle Schnittstelle anzeigen lassen. Jetzt stört mich aber, dass der ganze serielle Monitor vollgeschrieben wird, auch wenn ich nicht auf den screen drücke. Das kommt wohl daher, dass da irgendwie die analogen Eingänge floaten, wenn nichts definiertes anliegt!? Kann man das irgendwie verhindern?
Jedenfalls dachte ich mir, dass ich das Problem durch Mittelwertbildung aus dem Weg räumen könnte...aber zum einen wird dann die Reaktionszeit runtergesetzt (bei größeren Schleifen) und zum anderen funktioniert das auch nur bedingt :~
Ab und an bzw. nach einer gewissen Zeit sendet der Controller munter weiter Koordinaten, obwohl ich den screen gar nicht berühre.
Hier mal mein Code:
const int analog_1 = 14; //define Analog Pins0...4
const int analog_2 = 15; //
const int analog_3 = 16; //
const int analog_4 = 17; //
void setup()
{
Serial.begin(9600); // Set data rate for communication
}
void loop()
{
if(detect_touch()) // if touch detected print coordinates to serial Interface
{
Serial.println(Read_x(),DEC);
Serial.println(Read_y(),DEC);
}
delay(100);
}
int Read_x() // Read x-position
{
int x_position = 0;
pinMode(analog_1,INPUT);
pinMode(analog_2,OUTPUT);
pinMode(analog_4,OUTPUT);
pinMode(analog_3,INPUT);
digitalWrite(analog_2,LOW);
digitalWrite(analog_4,HIGH);
x_position=analogRead(2);
//delay(50);
digitalWrite(analog_4,LOW);
return x_position;
}
int Read_y() // Read y-position
{
int y_position=0;
pinMode(analog_1,OUTPUT);
pinMode(analog_2,INPUT);
pinMode(analog_3,OUTPUT);
pinMode(analog_4,INPUT);
digitalWrite(analog_1,LOW);
digitalWrite(analog_3,HIGH);
y_position = analogRead(3);
//delay(50);
digitalWrite(analog_3,LOW);
return y_position;
}
boolean detect_touch() // detect touch on screen
{
int i;
int sum_x = 0;
int sum_y = 0;
double average_x=0;
double average_y=0;
for (i = 0;i < 15; i++) // loop for the summation of x,y coordinates
{
sum_x += Read_x();
sum_y += Read_y();
}
average_x = sum_x/15; // averaging
average_y = sum_y/15;
if(average_x == Read_x() && average_y == Read_y()) // if x- and y-averages match to the current x- and y- value --> touch detected
{
return true;
}
else
return false;
}
Über die Mittelwertbildung habe ich mir erhofft, dass ich nur bei einem sicheren Berühren etwas über die serielle Schnittstelle ausgebe. Vielleicht hat von euch ja jemand einen heißen Tip wie man diesem Problem begegnen könnte!?
Viele Grüße,
Jimmy