Eine LED mit einem kapazitiven Schalter dimmen oder umschalten

Ein kapazitiver offener Draht soll auf dem Arduino Uno eine LED umschalten oder dimmen.

Die verwendete Hardware:
– Arduino Uno
– 1nF Kondensator
– Draht
– 200 Ohm Widerstand
– LED

Pin 8 > 1nF Kondensator > Draht zum anfassen
Pin3 (PWM) > LED > Widerstand 200 Ohm > GND

Basierend auf dem vorherigen Artikel wird eine LED an PIN3 nun umgeschaltet oder gedimmt. Nur auf einigen Pins steht die PWM Dimmer Funktion analogWrite() zur Verfügung, deshalb wird hier der Pin 3 verwendet.

Wenn der Draht (kapazitiver Sensor) berührt wurde, wird 300ms gewartet. Dann wird entschieden:
– losgelassen heisst LED Umschalten.
– festgehalten heisst Dimmer hoch und runter fahren bis losgelassen wird.

Hier das fertige Programm.

// LED kapazitiv umschalten oder dimmen mit PWM
// Pin8 > 1nF Kondensator > Draht offen
// Pin3 (PWM) > LED > Widerstand 200 Ohm > GND
//
// von Matthias Busse 6.12.2014 Version 1.0

int touch, up=1, dim=0;

void setup() {
  Serial.begin(4800);
  pinMode(3, OUTPUT);
}

void loop() {
  touch=readCapacitivePin(8);
  if(touch > 4) {
    delay(300); // Verzögerung entscheider über schalten oder dimmen
    touch=readCapacitivePin(8);
      if(touch < 4) { // schnell wieder losgelassen heisst umschalten
        if(dim > 0) dim=0;
        else dim=255;
        analogWrite(3, dim);
      }
      else { // festgehalten heisst dimmen
        while(readCapacitivePin(8) > 4) {
          if(dim >= 255) up=0;
          if(dim <= 0) up=1;
          if(up) dim++;
          else dim--;
          analogWrite(3, dim);
          delay(10);
        }
      }
    }    
  delay(100);
}

// readCapacitivePin
//  http://playground.arduino.cc/Code/CapacitiveSensor
//  Input: Arduino pin number
//  Output: A number, from 0 to 17 expressing
//  how much capacitance is on the pin
//  When you touch the pin, or whatever you have
//  attached to it, the number will get higher
uint8_t readCapacitivePin(int pinToMeasure) {
  volatile uint8_t* port;
  volatile uint8_t* ddr;
  volatile uint8_t* pin;
  byte bitmask;
  port = portOutputRegister(digitalPinToPort(pinToMeasure));
  ddr = portModeRegister(digitalPinToPort(pinToMeasure));
  bitmask = digitalPinToBitMask(pinToMeasure);
  pin = portInputRegister(digitalPinToPort(pinToMeasure));
  *port &= ~(bitmask);
  *ddr  |= bitmask;
  delay(1);
  uint8_t SREG_old = SREG; 
  noInterrupts();
  *ddr &= ~(bitmask);
  *port |= bitmask;
  uint8_t cycles = 17;
       if (*pin & bitmask) { cycles =  0;}
  else if (*pin & bitmask) { cycles =  1;}
  else if (*pin & bitmask) { cycles =  2;}
  else if (*pin & bitmask) { cycles =  3;}
  else if (*pin & bitmask) { cycles =  4;}
  else if (*pin & bitmask) { cycles =  5;}
  else if (*pin & bitmask) { cycles =  6;}
  else if (*pin & bitmask) { cycles =  7;}
  else if (*pin & bitmask) { cycles =  8;}
  else if (*pin & bitmask) { cycles =  9;}
  else if (*pin & bitmask) { cycles = 10;}
  else if (*pin & bitmask) { cycles = 11;}
  else if (*pin & bitmask) { cycles = 12;}
  else if (*pin & bitmask) { cycles = 13;}
  else if (*pin & bitmask) { cycles = 14;}
  else if (*pin & bitmask) { cycles = 15;}
  else if (*pin & bitmask) { cycles = 16;}
  SREG = SREG_old;
  *port &= ~(bitmask);
  *ddr  |= bitmask;
  return cycles;
}

Hier die Grundlagen im vorherigen Artikel.

von Matthias Busse

3 Gedanken zu „Eine LED mit einem kapazitiven Schalter dimmen oder umschalten

  1. Pingback: Kapazitiver LED Umschalter mit einem einfachen, offenen Draht | Shelvin – Elektronik ausprobiert und erläutert

  2. Nicolas

    Hi Matthias,
    ich habe den Dimmer auch mal ausprobiert. Aber mit einem ESP8266, da ich die Lampe auch gerne über Wlan ansteuern wollte. Jedenfalls klappt das ganze nur gut, wenn der Chip per USB an dem PC angeschlossen ist. Sobald ich die Verbindung trenne, wird fast nur noch eine kurze berührung erkannt.
    Scheinbar irgendein Masseproblem? Hast du eine Idee wie ich weiterkomme?

    Antworten
    1. Tomi

      Versuch mal den Arduino richtig zu grounden, indem du:
      A) den GND Pin deines Arduino mit der Erde verbindest, oder mit einer großen ableitenden Masse (Wand, Heizung etc)
      oder B) den Arduino auf den Boden legst

      Mfg Tomi

      Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.