LilyPad

Hallo Zusammen,

im Rahmen meiner Abschlussarbeit im Bereich Smart Clothes möchte ich ein intelligentes Kleid nähen, was bei Berührung textiler Sensoren LEDs (in Parallelschaltung) auslöst.
Als Mikrocontroller verwende ich das Arduino Lilypad.

Ich benutze haargenau diese Beschreibung und die dazugehörige Programmiersprache: https://www.arduino.cc/en/Tutorial/Button

An Stelle des "Buttons/Taster" habe ich einen textilen Sensor gebaut. Ich beschreibe euch kurz, wie es ungefähr aussieht. Ich habe "zwei Stofffetzen" aus leitendem, textilem Gewebe. Wenn sich beide Stoffe berühren, wird der Schaltkreis geschlossen und die Lichter gehen an.

Die eine Stoffhälfte ist mit 5V verbunden. Die andere Stoffhälfte mit PIN 2 und einem Widerstand (10K OHM). Der Widerstand ist mit GND verbunden. Also eigentlich so, wie in der Beschreibung des BUTTONS erklärt.

Als LEDs benutze ich die Lilypad LEDs mit integriertem Widerstand. Diese sind parallel geschaltet. Der Minuspol ist mit GND verbunden und der Pluspol mit PIN 12.

Da ich mehrere Sensoren in das Kleid integrieren möchte, verwende ich diesen Schaltkreis mehrmals. Also:

INPUT PIN 2 / OUTPUT PIN 12
INPUT PIN 3 / OUTPUT PIN 11
INPUT PIN 4 / OUTPUT PIN 10
INPUT PIN 5 / OUTPUT PIN 9
INPUT PIN 6 / OUTPUT PIN 8

Jetzt kommt meine Frage:

Muss ich unbedingt einen Widerstand mit einbauen? Ich habe nämlich gelesen, dass man bei der Programmierung einen PULL UP Widerstand aktivieren kann, und zwar, wenn man den Befehl DIGITALWRITE definiert. Verstehe ich das richtig, dass man dann kein Widerstand benötigt?
Ich habe es ohne Widerstand versucht und es funktioniert irgendwie nicht. Selbstverständlich habe ich auch darauf geachtet, dass sich die elektrisch leitenden Fäden im Kleid nicht berühren.

Ihr fragt euch bestimmt warum ich das Aufnähen von Widerständen vermeiden möchte...und zwar ist es nicht so einfach die Widerstände aufzunähen ohne dass sie sich im laufe der Zeit nicht vom Kleid lösen. Außerdem würde mir viel Arbeit erspart bleiben.

Ich füge einfach mal meine Programmierung mit ein. Vielleicht findet ihr den Fehler...

Herzlichen Dank im Voraus! Da ich ein Neuling bin und keine Ahnung und Erfahrung habe, freue ich mich über jede Hilfe.

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin1 = 2;     // the number of the pushbutton pin
const int buttonPin2 = 3;     // the number of the pushbutton pin
const int buttonPin3 = 4;     // the number of the pushbutton pin
const int buttonPin4 = 5;     // the number of the pushbutton pin
const int buttonPin5 = 6;     // the number of the pushbutton pin


const int ledPin1 =  12;       // the number of the LED pin
const int ledPin2 =  11;       // the number of the LED pin
const int ledPin3 =  10;       // the number of the LED pin
const int ledPin4 =  9;       // the number of the LED pin
const int ledPin5 =  8;       // the number of the LED pin

// variables will change:
int buttonState = 0;          // variable for reading the pushbutton status

void setup() {                // initialize the LED pin as an output:
 pinMode(12, OUTPUT);         //Pin als Ausgang
 pinMode(11, OUTPUT);         //Pin als Ausgang
 pinMode(10, OUTPUT);         //Pin als Ausgang
 pinMode(9, OUTPUT);         //Pin als Ausgang
 pinMode(8, OUTPUT);         //Pin als Ausgang

 
                           // initialize the pushbutton pin as an input:
 pinMode(2, INPUT);        //Pin als Eingang
 pinMode(3, INPUT);        //Pin als Eingang
 pinMode(4, INPUT);        //Pin als Eingang
 pinMode(5, INPUT);        //Pin als Eingang
 pinMode(6, INPUT);        //Pin als Eingang
}

void loop() {

buttonState = digitalRead(2); //Hier wird Pin4 ausgelesen

if(buttonState == HIGH)       // wenn Schalter gedrückt ist 

{
 digitalWrite(12, HIGH);   //dann soll Led leuchten
 delay(1000);              //und zwar für 1 Sekunde
}                           //Programmabschnitt des If- Befehls schließen

else {                      //ansonsten

digitalWrite(12, LOW);
}

buttonState = digitalRead(3); //Hier wird Pin3 ausgelesen
 
if(buttonState == HIGH)       // wenn Schalter gedrückt ist 
{
 digitalWrite(11, HIGH);   //dann soll Led leuchten
 delay(1000);              //und zwar für 1 Sekunde
}                           //Programmabschnitt des If- Befehls schließen

else {                      //ansonsten

digitalWrite(11, LOW);
}

buttonState = digitalRead(4); //Hier wird Pin2 ausgelesen
 
if(buttonState == HIGH)       // wenn Schalter gedrückt ist 
{
 digitalWrite(10, HIGH);   //dann soll Led leuchten
 delay(1000);              //und zwar für 1 Sekunde
}                           //Programmabschnitt des If- Befehls schließen

else {                      //ansonsten

digitalWrite(10, LOW);      //danach soll die Led aus sein
}

buttonState = digitalRead(5); //Hier wird Pin1 ausgelesen
 
if(buttonState == HIGH)       // wenn Schalter gedrückt ist 
{
 digitalWrite(9, HIGH);   //dann soll Led leuchten
 delay(1000);              //und zwar für 1 Sekunde
}                           //Programmabschnitt des If- Befehls schließen

else {                      //ansonsten

digitalWrite(9, LOW);      //danach soll die Led aus sein
}


buttonState = digitalRead(6); //Hier wird Pin1 ausgelesen
 
if(buttonState == HIGH)       // wenn Schalter gedrückt ist 
{
 digitalWrite(8, HIGH);   //dann soll Led leuchten
 delay(1000);              //und zwar für 1 Sekunde
}                           //Programmabschnitt des If- Befehls schließen

else {                      //ansonsten

digitalWrite(8, LOW);      //danach soll die Led aus sein
}
}

Problem 1:
Wenn du den internen Pullup nutzen möchtest, dann solltest du ihn auch aktivieren.

Problem 2:
Wenn der externe Pulldown gegen den internen Pullup getauscht wird, invertiert die Tasterlogik

Problem 3:
Dein delay() blockiert alle weiteren Abläufe.

Setze deinen Sketch bitte in Code-Tags, so ist der nicht lesbar.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Und wofür möchtest du Widerstände einsetzen ?

Für die Taster oder für die Led's ?

Vielen Dank für eure Hilfe!!

@combie

zu Problem 1: Wenn es möglich ist die externen Widerstände wegzulassen, würde ich gerne das interne Pullup nutzen. Aber wie wird er aktiviert?

zu Problem 3: ich hatte vor, dass die LEDs ein wenig länger im Kleid blinken. Soll ich die delays komplett entfernen wenn es alle anderen Abläufe blockiert?

@HotSystems: die externen Widerstände werden jeweils für die Taster verwendet. Die LEDs, die ich verwende haben einen internen Vorwiderstand.

Ok, das hatte ich nicht so verstanden.
Das mit den Pullups ist einfach, z.B. so:

pinMode(2, INPUT_PULLUP);

Nur wie combie schrieb, der Eingang wird invertiert (also auf LOW) abgefragt.

Und bitte setze die Code-Tags, das geht auch nachträglich.

Ich wünsche dir viel Freude hiermit:

#define CountArray(array) (sizeof(array)/sizeof(array[0])
#define ForEach(array,var) for(int var=0;var<CountArray(array));var++)





// ------------------------------

const unsigned long wartezeit = 1000; // leuchtdauer

struct LED 
{
  byte taster;
  byte led;
  unsigned long startzeit;

  void init()
  {
    pinMode(led,OUTPUT);
    digitalWrite(led,0);
    pinMode(taster,INPUT_PULLUP);
  }

  void update()
  {
    if(digitalRead(led) && millis()-startzeit>wartezeit) digitalWrite(led,0);  
    if(!digitalRead(taster)) // invers, wg. internem Pullup
    {
      digitalWrite(led,1); 
      startzeit = millis();
    }
  }
};

LED ledGruppe[]
{
// {tasterpin,ledpin},
  {2,12},
  {3,11},
  {4,10},
  {5,9},
  {6,8},
};

void setup() 
{
  ForEach(ledGruppe,i) ledGruppe[i].init();
}

void loop() 
{
  ForEach(ledGruppe,i) ledGruppe[i].update();
}

@combie: vielen dank für den Sketch. Leider taucht folgende Fehlermeldung auf:

Arduino: 1.8.2 (Windows 10), Board: "LilyPad Arduino, ATmega328"

sketch_typforum:15: error: stray '\302' in program

  byte taster;

^

sketch_typforum:15: error: stray '\240' in program

sketch_typforum:16: error: stray '\302' in program

  byte led;

^

sketch_typforum:16: error: stray '\240' in program

sketch_typforum:17: error: stray '\302' in program

  unsigned long startzeit;

^

sketch_typforum:17: error: stray '\240' in program

sketch_typforum:19: error: stray '\302' in program

  void init()

^

sketch_typforum:19: error: stray '\240' in program

sketch_typforum:20: error: stray '\302' in program

  {

^

sketch_typforum:20: error: stray '\240' in program

sketch_typforum:21: error: stray '\302' in program

  Â  pinMode(led,OUTPUT);

^

sketch_typforum:21: error: stray '\240' in program

sketch_typforum:21: error: stray '\302' in program

sketch_typforum:21: error: stray '\240' in program

sketch_typforum:22: error: stray '\302' in program

  Â  digitalWrite(led,0);

^

sketch_typforum:22: error: stray '\240' in program

sketch_typforum:22: error: stray '\302' in program

sketch_typforum:22: error: stray '\240' in program

sketch_typforum:23: error: stray '\302' in program

  Â  pinMode(taster,INPUT_PULLUP);

^

sketch_typforum:23: error: stray '\240' in program

sketch_typforum:23: error: stray '\302' in program

sketch_typforum:23: error: stray '\240' in program

sketch_typforum:24: error: stray '\302' in program

  }

^

sketch_typforum:24: error: stray '\240' in program

sketch_typforum:26: error: stray '\302' in program

  void update()

^

sketch_typforum:26: error: stray '\240' in program

sketch_typforum:27: error: stray '\302' in program

  {

^

sketch_typforum:27: error: stray '\240' in program

sketch_typforum:28: error: stray '\302' in program

  Â  if(digitalRead(led) && millis()-startzeit>wartezeit) digitalWrite(led,0);  

^

sketch_typforum:28: error: stray '\240' in program

sketch_typforum:28: error: stray '\302' in program

sketch_typforum:28: error: stray '\240' in program

sketch_typforum:28: error: stray '\302' in program

sketch_typforum:28: error: stray '\240' in program

sketch_typforum:29: error: stray '\302' in program

  Â  if(!digitalRead(taster)) // invers, wg. internem Pullup

^

sketch_typforum:29: error: stray '\240' in program

sketch_typforum:29: error: stray '\302' in program

sketch_typforum:29: error: stray '\240' in program

sketch_typforum:30: error: stray '\302' in program

  Â  {

^

sketch_typforum:30: error: stray '\240' in program

sketch_typforum:30: error: stray '\302' in program

sketch_typforum:30: error: stray '\240' in program

sketch_typforum:31: error: stray '\302' in program

  Â  Â  digitalWrite(led,1); 

^

sketch_typforum:31: error: stray '\240' in program

sketch_typforum:31: error: stray '\302' in program

sketch_typforum:31: error: stray '\240' in program

sketch_typforum:31: error: stray '\302' in program

sketch_typforum:31: error: stray '\240' in program

sketch_typforum:32: error: stray '\302' in program

  Â  Â  startzeit = millis();

^

sketch_typforum:32: error: stray '\240' in program

sketch_typforum:32: error: stray '\302' in program

sketch_typforum:32: error: stray '\240' in program

sketch_typforum:32: error: stray '\302' in program

sketch_typforum:32: error: stray '\240' in program

sketch_typforum:33: error: stray '\302' in program

  Â  }

^

sketch_typforum:33: error: stray '\240' in program

sketch_typforum:33: error: stray '\302' in program

sketch_typforum:33: error: stray '\240' in program

sketch_typforum:34: error: stray '\302' in program

  }

^

sketch_typforum:34: error: stray '\240' in program

sketch_typforum:40: error: stray '\302' in program

  {2,12},

^

sketch_typforum:40: error: stray '\240' in program

sketch_typforum:41: error: stray '\302' in program

  {3,11},

^

sketch_typforum:41: error: stray '\240' in program

sketch_typforum:42: error: stray '\302' in program

  {4,10},

^

sketch_typforum:42: error: stray '\240' in program

sketch_typforum:43: error: stray '\302' in program

  {5,9},

^

sketch_typforum:43: error: stray '\240' in program

sketch_typforum:44: error: stray '\302' in program

  {6,8},

^

sketch_typforum:44: error: stray '\240' in program

sketch_typforum:49: error: stray '\302' in program

  ForEach(ledGruppe,i) ledGruppe[i].init();

^

sketch_typforum:49: error: stray '\240' in program

sketch_typforum:54: error: stray '\302' in program

  ForEach(ledGruppe,i) ledGruppe[i].update();

^

sketch_typforum:54: error: stray '\240' in program

exit status 1
stray '\302' in program

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

@HotSystems

ich versuche es mit dem PullUp wie beschrieben, danke.

Diese Code-Tags finde ich auf der Schaltfläche nicht. Kannst du es mir etwas besser erklären?

Leider taucht folgende Fehlermeldung auf:

Nochmal getestet, der Code in dem Feld ist OK.

Da läuft was beim Kopieren falsch.
In meinem Code befinden sich keine illegalen Zeichen.

Und, mach sie doch einfach weg.
In den Meldungen steht doch genau, wo sie stecken.

hi,

Du hast ein problem beim kopieren/einfügen. irgendwie wird bei Dir bei jeder einrückung ein Ä statt eines leerzeichens (oder tabs) geschrieben. vielleicht auch ein unsichtbares sonderzeichen...

sieht man schön. je weiter eingerückt, umso mehr Ä.

bei mir gibts keine probleme...

gruß stefan

dolcestella:
Diese Code-Tags finde ich auf der Schaltfläche nicht. Kannst du es mir etwas besser erklären?

In "How to use this Forum - Punkt 7" ist das sehr schön beschrieben.
Dein Code ist so nicht lesbar.

hi,

ich hab' Dir den sketch jetzt mal als anhang reingestellt.

gruß stefan

aaa.zip (545 Bytes)

Hier ist nochmal eine Variante, ohne das ForEach Makro:

const unsigned long wartezeit = 1000; // leuchtdauer

struct LED 
{
  byte taster;
  byte led;
  unsigned long startzeit;

  void init()
  {
    pinMode(led,OUTPUT);
    digitalWrite(led,0);
    pinMode(taster,INPUT_PULLUP);
  }

  void update()
  {
    if(digitalRead(led) && millis()-startzeit>wartezeit) digitalWrite(led,0);  
    if(!digitalRead(taster)) // invers, wg. internem Pullup
    {
      digitalWrite(led,1); 
      startzeit = millis();
    }
  }
};

LED ledGruppe[]
{
// {tasterpin,ledpin},
  {2,12},
  {3,11},
  {4,10},
  {5,9},
  {6,8},
};

void setup() 
{
 for(auto && i :ledGruppe) i.init();
}

void loop() 
{
 for(auto && i :ledGruppe) i.update();
}

Wir sind der Problemlösung schon ein wenig näher gekommen. Ich habe es in die Praxis umgesetzt mit dem Code von Combie, allerdings leuchtet die LED durchgängig, d.h. wenn ich die beiden leitenden Stoffe zusammendrücke leuchtet die LED leichter. Mein Ziel ist es, dass die LED erst beim Zusammendrücken der beiden leitenden Stoffe anfängt zu leuchten. Also wie ein Schalter und nicht andersrum.

Wenn ihr mir den Code schickt, bitte ich euch es als ZIP (wie es Eisbär gemacht hat) anzuhängen, weil ich Probleme beim kopieren habe....

Ich danke euch wirklich sehr....so langsam macht mir Arduino auch Spaß...

dolcestella:
Die eine Stoffhälfte ist mit 5V verbunden. Die andere Stoffhälfte mit PIN 2 und einem Widerstand (10K OHM). Der Widerstand ist mit GND verbunden. Also eigentlich so, wie in der Beschreibung des BUTTONS erklärt.

Eine mögliche Ursache wäre: Die eine Stoffhälfte muss mit GND statt 5V verbunden werden. Der interne Pull-Up verbindet mit 5V. Bei Berührung wird der Pin auf GND gezogen.

@Thesus: du hattest recht!!!

Jetzt funktioniert alles, so wie ich es wollte.

Vielen lieben Dank euch!!!!!

Fein!

Freut mich. Ich fände es spannend das Kleid zu sehen. Vielleicht kannst du es hier bei Gelegenheit zeigen.