Stiegenhauslicht

http://sites.schaltungen.at/arduino-uno-r3/stiegenhauslicht

http://www.linksammlung.info/

http://www.schaltungen.at/

                                                                                             Wels, am 2017-08-28

BITTE nützen Sie doch rechts OBEN das Suchfeld  [                                                              ] [ Diese Site durchsuchen]

DIN A3 oder DIN A4 quer ausdrucken
*******************************************************************************I**
DIN A4  ausdrucken   siehe
********************************************************I*
~015_b_PrennIng-a_arduino.uno.r3-stiegenhauslicht (63 Seiten)_1a.pdf


http://sites.schaltungen.at/elektronik/bausaetze/electronicum/karton-bausaetze



Das Arduino-Quiz

Prüfe Dein ARDUINO Wissen
http://www.struwwwelpeter.de/Default.html
https://www.bombini-verlag.de/teste-dein-arduino-wissen/


Es gibt zahlreiche Möglichkeiten, sich Wissen über den ARDUINO UNO und der Elektronik anzueignen.
Viele davon stehen frei zur Verfügung wie beispielsweise

ARDUINO Tutorial
Tutorials auf der Arduino-Seite https://www.arduino.cc/en/Tutorial/HomePage

Einführung in ARDUINO
deutsche Arduino-Tutorials  http://www.arduino-tutorial.de/

Arduino lernen - ARDUINO Überblick
Arduino und Elektronik        https://et-tutorials.de/6603/arduino-lernen-arduino-uberblick/




********************************************************I*

Arduino IDE installieren

Die Software zum bearbeiten und hochladen der Sketches auf die Arduinos finden wir unter folgender Adresse:
http://arduino.cc/en/Main/Software 


Libraries
Nach erfolgreicher Installation müssen noch die zusätzlichen Libraries herunter geladen und in die IDE integriert werden.
Dazu kopieren wir die entsprechenden Libraries in den Library Ordner der Arduino-Software.
Dazu gibt es zwei Möglichkeiten. Einmal gibt es einen „libraries“ Ordner im Programm-Verzeichnis der Arduino-Software.
Die wahrscheinlich empfehlenswertere Variante wäre der Arduino\libraries Ordner im Dokumente-Verzeichnis des angemeldeten Benutzers.

z.B. C:\Users\BENUTZERNAME\Documents\Arduino\libraries

https://smarthomeyourself.de/anleitung-zum-selber-bauen/arduino-ide-installieren/



********************************************************I*





********************************************************I*
Stiegenhauslicht / Stiegenhausschalter / Treppenhauslicht /
Treppenlicht-Zeitschalter / Treppenhaus-Schaltung / Flurbeleuchtung






********************************************************I*

Treppen-Lauflicht mit Bewegungserkennung (Arduino)


Schieberegister 74HC595  mit 16 LEDs








Sketch einrichten
SHYS-Treppenlauflicht/SHYS-Treppenlauflicht.ino

Das notwendige Sketch für den Arduino könnt ihr unter dem folgenden Link downloaden.
https://github.com/CyborgOne/SHYS-Treppenlauflicht

https://github.com/CyborgOne/SHYS-Treppenlauflicht/blob/master/SHYS-Treppenlauflicht.ino

Oder als Alternative ohne benötigte Librarys:
https://github.com/CyborgOne/SHYS-Treppenlauflicht-Ohne-LAN

https://github.com/CyborgOne/SHYS-Treppenlauflicht-Ohne-LAN/blob/master/shys_treppenlauflicht_ohne_lan.ino

Die beiden Varianten unterscheiden sich nur durch die Verwendung des Ethernet-Shields.
Wer also kein Netzwerk an der Treppe haben möchte um die Bewegungsdaten an die Haussteuerung zu übermitteln, sollte direkt das alternative Sketch verwenden, da die Ethernet-Librarys mit aktuelleren Arduino Versionen scheinbar eh etwas Probleme haben.

Öffnet die Datei mit dem Arduino-Editor. Wie Ihr die Arduino-Software einrichtet, falls noch nicht geschehen, erfahrt Ihr hier:
https://smarthomeyourself.de/anleitung-zum-selber-bauen/arduino-ide-installieren/

Am Anfang des Sketchs findet Ihr die folgenden Einstellungen.
Passt diese frei nach euren Bedürfnissen an und ladet anschließend das Sketch auf euren Arduino.

https://github.com/CyborgOne/SHYS-Treppenlauflicht/blob/master/SHYS-Treppenlauflicht.ino


#include <Ethernet.h>
#include <SPI.h>
#include <Shys_Sensor.h>

//--------------------------------------
// Configuration Start
//--------------------------------------

// PIR-Data-Pins
#define PIR_TOP_PIN 3
#define PIR_BOTTOM_PIN 4

// All LEDs on Switch
#define ALL_ON_SWITCH_PIN 5

// Helligkeitssensor-Pin

int lightPin = 7;

// Schieberegister-Pins
int latchPin = 8;
int dataPin = 11;
int clockPin = 12;

usw.  usw.  usw.  usw.


https://smarthomeyourself.de/anleitung-zum-selber-bauen/unabhaengige-projekte/treppen-lauflicht-mit-bewegungserkennung/





********************************************************I*

Das Schieberegister 74HC595 am Arduino

http://fritzing.org/projects/by-tag/74hc595/

1A  Tutorial



Q0 bis Q7       =  8-bit Datenausgang
DS     pin-14   =  Daten seriel Eingang
-OE    pin-13   =  Output Enable
STCP pin-12   =  Store Clock
SHCP pin-11   =  Shift Clock
-MR   pin-10    =  Master Reset
Q7S  pin-9      =  Serieller Ausgang (Überlauf)


die 8 LEDs mit den 8 Ausgängen des Schieberegisters verbinden   Q0 pin-15 bis Q7 pin-7

Arduino zu Schieberegister
5V        mit Vcc pin-16 verbinden
5V        mit -MR pin-10 verbinden

GND     an GND pin-8
GND     an -OE pin-13

pin-8     an SHCP pin-11
pin-9     an STCP pin-12
pin-10   an DS pin-14


/** * Shift Register Example * for 74HC595 456shift register * http://arduino.cc/en/Tutorial/ShiftOut * This sketch turns 8 LEDs on and of based on bytes * send to a 74HC595 shift register. *  * based on Tim Igoes Sketch one by one * http://arduino.cc/en/Tutorial/ShftOut12 * * Hardware: * * 74HC595 shift register attached to pins 8, 11, and 12 of the Arduino * * LEDs attached to each of the outputs of the shift register * * by Fabian Moron Zirfas  * *///Pin connected to latch pin (ST_CP) of 74HC595const int latchPin = 8;//Pin connected to clock pin (SH_CP) of 74HC595const int clockPin = 12;//Pin connected to Data in (DS) of 74HC595const int dataPin = 11;//this holds our pattern an array of arrays (matrix)char vals [8][8] = {  {'0','1','2','3','4','5','6','0'},  {'4','2','2','3','5','7','0','3'},  {'0','5','4','0','2','2','3','6'},  {'2','7','2','6','6','4','1','4'},  {'7','4','5','5','6','3','0','3'},  {'3','3','5','7','7','1','4','3'},  {'6','2','7','1','0','6','4','2'},  {'5','1','3','0','0','5','7','6'}};void setup() {  //set pins to output because they are addressed in the main loop  pinMode(latchPin, OUTPUT);  pinMode(dataPin, OUTPUT);    pinMode(clockPin, OUTPUT);}void loop() {for(int i = 0; i < 8;i++){  for(int j=0; j< 8; j++){    registerWrite(vals[i][j], HIGH);    delay(100); // wait a moment    }    }}// This method sends bits to the shift register:void registerWrite(char pin, int whichState) {    // ASCII '0' through '9' characters are    // represented by the values 48 through 57.    // so if the  you send a number from 0 through 7 in ASCII,     // you can subtract 48 to get the actual value:    int bitToSet = pin - 48;// the bits you want to send  byte bitsToSend = 0;  // turn off the output so the pins don't light up  // while you're shifting bits:  digitalWrite(latchPin, LOW);  // turn on the next highest bit in bitsToSend:  bitWrite(bitsToSend, bitToSet, whichState);  // shift the bits out:  shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);    // turn on the output so the LEDs can light up:  digitalWrite(latchPin, HIGH);}


Wenn man viele LEDs ansteuern möchte, dann steht man bald einmal vor dem Problem, dass auf einem normalen Arduino eigentlich zu wenige Ausgangspins zur Verfügung stehen.
Der Zustand lässt sich mit einem Schieberegister leicht beheben.
Mit dem weit verbreiteten IC vom Typ 74HC595 (hier bei Amazon) beispielsweise erhält man mit lediglich 3 Arduino-Pins 8 weitere Ausgangspins am Shift Register.
Wenn diese nicht ausreichen, kann man mehrere Schieberegister aneinanderkoppeln und damit auch 16, 24 oder noch mehr einfach ansteuerbare Ausgänge erhalten.
Genau genommen besteht ein Schieberegister aus zwei Registern.
Einmal das Schieberegister, in das der Zustand der einzelnen Ausgangspins seriell, also Bit für Bit, geschoben wird.
Und dann das Ausgangsregister, in welches der Zustand des Schieberegisters auf ein Signal vom Arduino hin kopiert wird.
Erst dann wird der Zustand der ins Schieberegister geschickten Daten an den Ausgangspins sichtbar.
Die Funktionsweise eines Schieberegisters entspricht einer Eimerkette.
Wenn ein am Dateneingang anliegendes Bit in das Schieberegister übernommen wird, rücken alle bereits dort gespeicherten Bits eine Position weiter und machen damit am Eingang eine Speicherstelle frei, welche das neue Bit aufnimmt.
Das Signal zur Speicherung einen neuen Bits erhält der IC dabei über einen Flankenwechsel von LOW auf HIGH an einem seiner Pins (SHCP – SHift Clock Pin, die Bezeichnungen variieren aber je nach Hersteller).
Im folgenden Video versuche ich, die Funktionsweise, einen Testaufbau und zwei Beispiel-Sketches zu erklären.
Als Basis dafür dient das Projekt „Lauflicht mit dem Arduino“ aus einem der früheren Videos.

Der im Video gezeigte Arduino Sketch 1 liest die Zustände der 8 Speicherstellen im Schieberegister aus einem Array und schreibt diese in das Schieberegister.
Um die nötigen Flankenwechsel des Shift Pins und des Store Pins kümmern wir uns dabei selbst.


Sketchs 1 (stehendes Muster)

// Arduino-Pin verbunden mit SH_CP des 74HC595int shiftPin = 8;// Arduino-Pin verbunden mit ST_CP des 74HC595int storePin = 9;// Arduino-Pin verbunden mit DS des 74HC595int dataPin = 10; // Dieses Muster soll ausgegeben werdenint muster[8] = {1,1,1,0,0,1,0,1}; void setup() {  // Pins 8,9,10 auf Ausgabe pinMode(storePin, OUTPUT); pinMode(shiftPin, OUTPUT); pinMode(dataPin, OUTPUT);  // storePin sicherheitshalber auf LOW digitalWrite(storePin, LOW);   for (int i=0; i<8; i++) { // Zuerst immer alle 3 Pins auf LOW // Aktion passiert bei Wechsel von LOW auf HIGH digitalWrite(shiftPin, LOW); // Jetzt den Wert der aktuellen Stelle ans Datenpin DS anlegen  digitalWrite(dataPin, muster[i]); // Dann ShiftPin SHCP von LOW auf HIGH, damit wird der Wert // am Datenpin ins Register geschoben.  digitalWrite(shiftPin, HIGH); }  // Wenn alle 8 Stellen im Register sind, jetzt das StorePin STCP // von LOW auf HIGH, damit wird Registerinhalt an Ausgabepins // kopiert und der Zustand an den LEDs sichtbar  digitalWrite(storePin, HIGH);} void loop () { // Hier passiert nichts.}


Im Arduino Sketch 2 wird ein Zähler von 0 bis 255 gezählt und der jeweilige Wert in binärer Darstellung auf den 8 LEDs, die am Shift Register hängen, ausgegeben.
Zur Übertragung des 8-bit-Wertes in das Schieberegister verwende ich hier den shiftOut()-Befehl des Arduino.
Dieser erledigt die Übertragung der einzelnen Bits ins Schieberegister inklusive der notwendigen Flankenwechsel am Shift Pin.
Die Übertragung des Schieberegister-Inhalts ans Ausgangsregister mit einem Wechsel des STCP (Store Clock Pin) von LOW zu HIGH müssen wir dann noch selbst erledigen.


Sketchs 2  (laufendes Muster)

//Pin verbunden mit SH_CP des 74HC595int shiftPin = 8;//Pin verbunden mit ST_CP des 74HC595int storePin = 9;//Pin verbunden mit DS des 74HC595int dataPin = 10; int counter = 0; // Binärer Counter von 0 bis 255. // 1 = 000000001// 2 = 000000010// 3 = 000000011// 4 = 000000100// 5 = 000000101// usw. Die LEDs zeigen alle Werte von 0 bis 255. void setup() { // Pins 8,9,10 auf Ausgabe stellen pinMode(storePin, OUTPUT); pinMode(shiftPin, OUTPUT); pinMode(dataPin, OUTPUT);}  void loop () {  digitalWrite(storePin, LOW); shiftOut(dataPin, shiftPin, MSBFIRST, counter); digitalWrite(storePin, HIGH); delay(500); // Wartezei 0,5 sek.  counter ++; if (counter > 255) {   counter = 0; }}

http://www.makerblog.at/2015/01/das-schieberegister-74hc595-am-arduino/





********************************************************I*
BUCH

Die elektronische Welt mit Arduino entdecken

Erik Bartmann

http://sites.schaltungen.at/arduino-uno-r3/arduino-entdecken

http://www.erik-bartmann.de/arduino-projekt-kapitel-7.html

http://archive.is/lwk4u


2 Schieberegister 74HC595 Anschließen - Arduino Forum

https://forum.arduino.cc/index.php?topic=93390.0


2 Schieberegister 74HC595 .





software_arduino_entdecken.zip

Mittels 74595 sollen 6 Led angesteuert werden

int taktPin = 8;           // SH_CP
int speicherPin = 9;    // ST_CP
int datenPin = 10;       //DS
int datenArray [] = { = 1, 1, 1, 1, 1, 1};
// int datenArray []  { = 1, 1, 1, 1, 1, 1};  // ev. so
// int datenArray [] = {  1, 1, 1, 1, 1, 1};  // ev so

void setup (){
    pinMode (taktPin, OUTPUT);
     pinMode (speicherPin, OUTPUT);
    pinMode (datenPin, OUTPUT);
    resetPins();               // alle Pins auf Low setzen
   setzePins(datenArray);     // Setze Pins über Datenarray
                                       // Übertragen der internen Speicherregister an die Ausgänge
   digitalWrite (speicherPin, HIGH);    //ST_CP
}

void loop (){/*leer*/}
void resetPins){    // Reset aller pin -> LOW-Pegel
    digitalWrite (taktPin, LOW);
    digitalWrite (speicherPin, LOW);
    digitalWrite (datenPin, LOW);}

void setzePins(int daten []{
for (int i = 0; i < 6; i++){
resetPins();
digitalWrite (datenPin, daten [i]) delay(20);
digitalWrite (taktPin,HIGH); delay(20)
}
}

Siehe Seite 381  387  399  769  784



16 LED mit zwei Schieberegister anzusteuern

Ich habe den ersten Schieberegister den Pin 9 mit den Schieberegister mit den Pin 14 verbunden für dataPin(SER)!
Vom 1 Schieberegister den Pin 11 auf den 2 Schieberegister auf Pin11 und dann noch vom 1Schieberegister von Pin 12 auf den 2 Schieberegister auf Pin12


int dataPin = 11;    // Pin connected to DS of 74HC595
int clockPin = 12; //Pin connected to SH_CP of 74HC595
int latchPin = 8;    //Pin connected to ST_CP of 74HC595


void setup() {
//set pins to output because they are addressed in the main loop
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);

pinMode(latchPin, OUTPUT);
}

void loop() {
//count up routine
for (int j = 0; j < 256; j++) {
//ground latchPin and hold low for as long as you are transmitting

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, j);
//return the latch pin high to signal chip that it
//no longer needs to listen for information
digitalWrite(latchPin, HIGH);
delay(1000);
}
}




Back to ShiftOut Tutorial

/*
  Shift Register Example
  Turning on the outputs of a 74HC595 using an array

 Hardware:
 * 74HC595 shift register
 * LEDs attached to each of the outputs of the shift register

 */

int latchPin = 8;   //Pin connected to ST_CP of 74HC595

int clockPin = 12;   //Pin connected to SH_CP of 74HC595

int dataPin = 11;   //Pin connected to DS of 74HC595


                            //holders for infromation you're going to pass to shifting function
byte data;
byte dataArray[10];

void setup() {
                               //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  Serial.begin(9600);

                                 //Binary notation as comment
  dataArray[0] = 0xFF; //0b11111111
  dataArray[1] = 0xFE; //0b11111110
  dataArray[2] = 0xFC; //0b11111100
  dataArray[3] = 0xF8; //0b11111000
  dataArray[4] = 0xF0; //0b11110000
  dataArray[5] = 0xE0; //0b11100000
  dataArray[6] = 0xC0; //0b11000000
  dataArray[7] = 0x80; //0b10000000
  dataArray[8] = 0x00; //0b00000000
  dataArray[9] = 0xE0; //0b11100000

                                    //function that blinks all the LEDs
                                    //gets passed the number of blinks and the pause time
  blinkAll_2Bytes(2,500);
}

void loop() {

  for (int j = 0; j < 10; j++) {
    //load the light sequence you want from array
    data = dataArray[j];
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, 0);
    //move 'em out
    shiftOut(dataPin, clockPin, data);
    //return the latch pin high to signal chip that it
    //no longer needs to listen for information
    digitalWrite(latchPin, 1);
    delay(300);
  }
}



                                    // the heart of the program
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
                                     // This shifts 8 bits out MSB first,
                                    //on the rising edge of the clock,
                                     //clock idles low

                                     //internal function setup
  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

                                     //clear everything out just in case to
                                     //prepare shift register for bit shifting
  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

                                    //for each bit in the byte myDataOut�
                                    //NOTICE THAT WE ARE COUNTING DOWN in our for loop
                                   //This means that %00000001 or "1" will go through such
                                  //that it will be pin Q0 that lights.
  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

                                   //if the value passed to myDataOut and a bitmask result
                                    // true then... so if we are at i=6 and our value is
                                    // %11010100 it would the code compares it to %01000000
                                    // and proceeds to set pinState to 1.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else { 
      pinState= 0;
    }

                                    //Sets the pin to HIGH or LOW depending on pinState
    digitalWrite(myDataPin, pinState);
                                   //register shifts bits on upstroke of clock pin  
    digitalWrite(myClockPin, 1);
                                    //zero the data pin after shift to prevent bleed through
    digitalWrite(myDataPin, 0);
  }

                                     //stop shifting
  digitalWrite(myClockPin, 0);
}


                                     //blinks the whole register based on the number of times you want to
                                     //blink "n" and the pause between them "d"
                                    //starts with a moment of darkness to make sure the first blink
                                      //has its full visual effect.
void blinkAll_2Bytes(int n, int d) {
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, 0);
  shiftOut(dataPin, clockPin, 0);
  digitalWrite(latchPin, 1);
  delay(200);
  for (int x = 0; x < n; x++) {
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, 255);
    shiftOut(dataPin, clockPin, 255);
    digitalWrite(latchPin, 1);
    delay(d);
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, 0);
    shiftOut(dataPin, clockPin, 0);
    digitalWrite(latchPin, 1);
    delay(d);
  }
}

https://www.arduino.cc/en/Tutorial/ShftOut13
https://www.arduino.cc/en/Tutorial/ShiftOut


https://books.google.at/books?id=3vX3AwAAQBAJ&pg=PA405&lpg=PA405&dq=Das+Schieberegister+74HC595+am+Arduino+fritzing&source=bl&ots=6a6TVEvhj9&sig=4tVTih_sTan3j14PXK8m36B1fYU&hl=de&sa=X&ved=0ahUKEwjXpa6CvfXVAhWDLVAKHZl2AqQQ6AEIYzAM#v=onepage&q=Das%20Schieberegister%2074HC595%20am%20Arduino%20fritzing&f=false




********************************************************I*

Serial to Parallel Shifting-Out with a 74HC595  (1A)

Shifting Out & der 595 Chip

Irgendwann können Sie die Stifte auf Ihrem Arduino-Brett auslaufen und müssen sie mit Schieberegistern erweitern.
Dieses Beispiel basiert auf dem 74HC595. Das Datenblatt bezieht sich auf das 74HC595 als "8-Bit seriell-in, serielles oder paralleles Schieberegister mit Ausgabe-Latches, 3-Zustand."
Mit anderen Worten, Sie können es verwenden, um 8 Ausgänge gleichzeitig zu steuern, während Sie nur einige Stifte auf Ihrem Mikrocontroller aufnehmen.
Sie können mehrere Register miteinander verknüpfen, um Ihre Leistung noch mehr zu erweitern.
(Benutzer können auch nach anderen Treiberchips mit "595" oder "596" in ihren Teilenummern suchen, da sind viele.
Der STP16C596 wird zum Beispiel 16 LEDs fahren und die Serienwiderstände mit eingebauten Konstantstromquellen eliminieren.)

Wie das alles funktioniert, ist eine so genannte "synchrone serielle Kommunikation", d.h. Sie können einen Pin nach oben und unten pulsieren und damit ein Datenbyte dem Register Bit für Bit mitteilen.
Es ist durch pulsierende zweite Pin, die Uhr Pin, dass Sie zwischen Bits abgrenzen.
Dies steht im Gegensatz zu der "asynchronen seriellen Kommunikation" der serial.begin () -Funktion, die auf den Sender und den Empfänger unabhängig auf eine vereinbarte spezifizierte Datenrate setzt.
Sobald das gesamte Byte an das Register übertragen wird, werden die HIGH- oder LOW-Nachrichten, die in jedem Bit gehalten werden, zu jedem der einzelnen Ausgangsstifte herausgezogen.
Dies ist die "parallele Ausgabe" Teil, mit allen Stiften tun, was Sie wollen, dass sie alle auf einmal zu tun.

Der "serielle Ausgang" dieser Komponente stammt aus seinem zusätzlichen Pin, der die vom Mikrocontroller empfangenen seriellen Informationen unverändert wiedergeben kann.
Dies bedeutet, dass Sie 16 Bits in einer Reihe (2 Bytes) übertragen können und die ersten 8 durch das erste Register in das zweite Register fließen und dort ausgedrückt werden.
Sie können das aus dem zweiten Beispiel lernen.

"3 Zustände" bezieht sich auf die Tatsache, dass man die Ausgangspins entweder als hoch, niedrig oder "hochohmig" einstellen kann.
Im Gegensatz zu den HIGH- und LOW-Staaten können Sie die Stifte einfach in ihren hochohmigen Zustand stellen.
Sie können den ganzen Chip nur zusammensetzen.
Das ist eine ziemlich spezialisierte Sache - Denken Sie an ein LED-Array, das möglicherweise gesteuert werden muss Durch ganz andere Mikrocontroller abhängig von einer bestimmten Modus-Einstellung in Ihrem Projekt eingebaut.
Weder Beispiel nutzt diese Funktion und Sie gewann "t in der Regel müssen sich Sorgen um immer einen Chip, der es hat.

Hier ist eine Tabelle, die die vom Phillip-Datenblatt angepassten Pin-Outs erläutert.


74HC595 pin Belegung

PINS 1-7, 15 Q0 " Q7 Output Pins
PIN 8 GND Ground, Vss
PIN 9 Q7" Serial Out
PIN 10 MR Master Reclear, active low
PIN 11 SH_CP Shift register clock pin
PIN 12 ST_CP Storage register clock pin (latch pin)
PIN 13 OE Output enable, active low
PIN 14 DS Serial data input
PIN 16 Vcc Positive supply voltage


Example 1: One Shift Register

Der erste Schritt ist, Ihr Arduino mit einem Schieberegister zu erweitern.

The Circuit

1. Turning it on

Folgende Verbindungen herstellen:

  • GND (pin 8) to ground,
  • Vcc (pin 16) to 5V
  • OE (pin 13) to ground
  • MR (pin 10) to 5V

Diese Einstellung macht alle Ausgabe-Pins aktiv und adressierbar die ganze Zeit.

Der einzige Fehler dieses Aufbaus ist, dass Sie am Ende mit den Lichtern auf den letzten Zustand oder etwas Willkür jedes Mal, wenn Sie zuerst die Schaltung der Schaltung, bevor das Programm beginnt zu laufen.

Sie können dies durch die Kontrolle der MR und OE Pins aus Ihrem Arduino Board zu bekommen, aber dieser Weg wird funktionieren und lassen Sie mit offeneren Pins.



2. Connect to Arduino

  • DS (pin 14) to Ardunio DigitalPin 11 (blue wire)
  • SH_CP (pin 11) to to Ardunio DigitalPin 12 (yellow wire)
  • ST_CP (pin 12) to Ardunio DigitalPin 8 (green wire)


Von nun an werden diese als dataPin, the clockPin bzw. latchPin bezeichnet. Beachten Sie den 0,1 "f Kondensator auf dem LatchPin, wenn Sie etwas Flimmern haben, wenn der Latch Pin Impulse können Sie einen Kondensator verwenden, um es sogar aus.


3. Add 8 LEDs.

In diesem Fall sollten Sie die Kathode (kurzer Stift) jeder LED an eine gemeinsame Masse anschließen und die Anode (langer Stift) jeder LED an den jeweiligen Schieberegisterausgangsstift anschließen.
Mit dem Schieberegister, um Strom wie diese zu liefern, heißt Sourcing Strom.
Einige Schieberegister können keine Stromquelle erzeugen, sie können nur das tun, was als Sinkstrom bezeichnet wird.
Wenn du eines von denen hast, bedeutet das, dass du die Richtung der LEDs umdrehen musst, die Anoden direkt an die Stromversorgung und die Kathoden (Massepins) an die Schieberegisterausgänge stellen.
Sie sollten das spezifische Datenblatt überprüfen, wenn Sie nicht mit einem 595-Serie-Chip arbeiten.
Don 't vergessen, einen 220 Ohm-Widerstand in Serie hinzuzufügen, um die LEDs vor Überlastung zu schützen.





Circuit Diagram

The Code

Hier sind drei Codebeispiele. Der erste ist nur ein "Hallo Welt" -Kode, der einfach einen Byte-Wert von 0 bis 255 ausgibt.
Das zweite Programm leuchtet jeweils eine LED. Der dritte Zyklus durch ein Array.


Der Code basiert auf zwei Informationen im Datenblatt: das Zeitdiagramm und die Logiktabelle.
Die Logiktabelle ist, was Ihnen sagt, dass im Grunde alles Wichtige passiert auf einem up Beat.
Wenn der Taktgeber von niedrig nach hoch geht, liest das Schieberegister den Zustand des Datenstifts.
Wenn die Daten verschoben werden, wird sie in einem internen Speicherregister gespeichert.
Wenn der LatchPin von niedrig nach hoch geht, werden die gesendeten Daten von den Schieberegistern des oben erwähnten Speicherregisters in die Ausgangsstifte verschoben, wobei die LEDs beleuchtet werden.

Code Sample 1.1 Hello World
Code Sample 1.2 One by One
Code Sample 1.3 Using an array

Example 2

In diesem Beispiel fügen Sie ein zweites Schieberegister hinzu, das die Anzahl der Ausgangspins verdoppelt, die Sie haben, während immer noch die gleiche Anzahl von Pins aus dem Arduino verwendet wird

The Circuit

1. Add a second shift register.

Starting from the previous example, you should put a second shift register on the board. It should have the same leads to power and ground.
Ausgehend von dem vorherigen Beispiel solltest du ein zweites Schieberegister auf die Tafel legen.
Es sollte das gleiche zu Macht und Boden führen.



2. Connect the 2 registers.

Two of these connections simply extend the same clock and latch signal from the Arduino to the second shift register (yellow and green wires).
The blue wire is going from the serial out pin (pin 9) of the first shift register to the serial data input (pin 14) of the second register.
Zwei dieser Verbindungen verlängern einfach das gleiche Takt- und Latch-Signal vom Arduino zum zweiten Schieberegister (gelbe und grüne Drähte).
Der blaue Draht geht vom seriellen Ausgangspin (Pin 9) des ersten Schieberegisters zum seriellen Dateneingang (Pin 14) des zweiten Registers



3. Add a second set of LEDs.

In this case I added green ones so when reading the code it is clear which byte is going to which set of LEDs
In diesem Fall habe ich grüne hinzugefügt, also beim Lesen des Codes ist klar, welches Byte zu welchem Satz von LEDs geht


Circuit Diagram



The Code

Here again are three code samples.
If you are curious, you might want to try the samples from the first example with this circuit set up just to see what happens.

Code Sample 2.1 Dual Binary Counters
There is only one extra line of code compared to the first code sample from Example 1.
It sends out a second byte.
This forces the first shift register, the one directly attached to the Arduino, to pass the first byte sent through to the second register, lighting the green LEDs.
The second byte will then show up on the red LEDs.

Code Sample 2.2 2 Byte One By One
Comparing this code to the similar code from Example 1 you see that a little bit more has had to change.
The blinkAll() function has been changed to the blinkAll_2Bytes() function to reflect the fact that now there are 16 LEDs to control.
Also, in version 1 the pulsings of the latchPin were situated inside the subfunctions lightShiftPinA and lightShiftPinB().
Here they need to be moved back into the main loop to accommodate needing to run each subfunction twice in a row, once for the green LEDs and once for the red ones.

Code Sample 2.3 - Dual Defined Arrays
Like sample
2.2, sample 2.3 also takes advantage of the new blinkAll_2bytes() function.
2.3's big difference from sample 1.3 is only that instead of just a single variable called "data" and a single array called "dataArray" you have to have a dataRED, a dataGREEN, dataArrayRED, dataArrayGREEN defined up front. This means that line






Code Beispiel 2.1 Dual Binärzähler
Es gibt nur eine zusätzliche Codezeile im Vergleich zum ersten Codebeispiel aus Beispiel 1.
Es sendet ein zweites Byte aus.
Dies zwingt das erste Schieberegister, das direkt an den Arduino angeschlossen ist, um das erste Byte zu übergeben, das durch das zweite Register geschickt wird, und leuchtet die grünen LEDs.
Das zweite Byte erscheint dann auf den roten LEDs.

//**************************************************************////  Name    : shiftOutCode, Dual Binary Counters                 ////  Author  : Carlyn Maw, Tom Igoe                               ////  Date    : 25 Oct, 2006                                       ////  Version : 1.0                                                ////  Notes   : Code for using a 74HC595 Shift Register            ////          : to count from 0 to 255                             ////**************************************************************////Pin connected to ST_CP of 74HC595int latchPin = 8;//Pin connected to SH_CP of 74HC595int clockPin = 12;////Pin connected to DS of 74HC595int dataPin = 11;void setup() {  //Start Serial for debuging purposes       Serial.begin(9600);  //set pins to output because they are addressed in the main loop  pinMode(latchPin, OUTPUT);}void loop() {  //count up routine  for (int j = 0; j < 256; j++) {    //ground latchPin and hold low for as long as you are transmitting    digitalWrite(latchPin, 0);    //count up on GREEN LEDs    shiftOut(dataPin, clockPin, j);     //count down on RED LEDs    shiftOut(dataPin, clockPin, 255-j);    //return the latch pin high to signal chip that it     //no longer needs to listen for information    digitalWrite(latchPin, 1);    delay(1000);  }}void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {  // This shifts 8 bits out MSB first,   //on the rising edge of the clock,  //clock idles low..//internal function setup  int i=0;  int pinState;  pinMode(myClockPin, OUTPUT);  pinMode(myDataPin, OUTPUT);. //clear everything out just in case to. //prepare shift register for bit shifting  digitalWrite(myDataPin, 0);  digitalWrite(myClockPin, 0);  //for each bit in the byte myDataOut�  //NOTICE THAT WE ARE COUNTING DOWN in our for loop  //This means that %00000001 or "1" will go through such  //that it will be pin Q0 that lights.   for (i=7; i>=0; i--)  {    digitalWrite(myClockPin, 0);    //if the value passed to myDataOut and a bitmask result     // true then... so if we are at i=6 and our value is    // %11010100 it would the code compares it to %01000000     // and proceeds to set pinState to 1.    if ( myDataOut & (1<<i) ) {      pinState= 1;    }    else {          pinState= 0;    }    //Sets the pin to HIGH or LOW depending on pinState    digitalWrite(myDataPin, pinState);    //register shifts bits on upstroke of clock pin      digitalWrite(myClockPin, 1);    //zero the data pin after shift to prevent bleed through    digitalWrite(myDataPin, 0);  }  //stop shifting  digitalWrite(myClockPin, 0);}







Code Sample 2.2 2 Byte eins nach dem anderen
Wenn man diesen Code mit dem ähnlichen Code aus Beispiel 1 vergleicht, sieht man, dass sich ein bisschen mehr ändern musste.
Die Funktion blinkAll () wurde in die Funktion blinkAll_2Bytes () geändert, um die Tatsache zu berücksichtigen, dass jetzt 16 LEDs zu steuern sind.
Auch in der Version 1 befanden sich die Pulsationen des LatchPins innerhalb der Teilfunktionen lightShiftPinA und lightShiftPinB ().
Hier müssen sie zurück in die Hauptschleife bewegt werden, um die Notwendigkeit, jede Unterfunktion zweimal hintereinander laufen zu lassen, einmal für die grünen LEDs und einmal für die roten.

//**************************************************************////  Name    : shiftOutCode, Dual One By One                           ////  Author  : Carlyn Maw, Tom Igoe                               ////  Date    : 25 Oct, 2006                                       ////  Version : 1.0                                                ////  Notes   : Code for using a 74HC595 Shift Register            ////          : to count from 0 to 255                             ////**************************************************************////Pin connected to ST_CP of 74HC595int latchPin = 8;//Pin connected to SH_CP of 74HC595int clockPin = 12;////Pin connected to DS of 74HC595int dataPin = 11;//holder for infromation you're going to pass to shifting functionbyte data = 0; void setup() {  //set pins to output because they are addressed in the main loop  pinMode(latchPin, OUTPUT);}void loop() {  //function that blinks all the LEDs  //gets passed the number of blinks and the pause time  blinkAll_2Bytes(1,500);   // light each pin one by one using a function A  for (int j = 0; j < 8; j++) {    //ground latchPin and hold low for as long as you are transmitting    digitalWrite(latchPin, 0);    //red LEDs    lightShiftPinA(7-j);    //green LEDs    lightShiftPinA(j);    //return the latch pin high to signal chip that it     //no longer needs to listen for information    digitalWrite(latchPin, 1);    delay(1000);  }  // light each pin one by one using a function A  for (int j = 0; j < 8; j++) {    //ground latchPin and hold low for as long as you are transmitting    digitalWrite(latchPin, 0);    //red LEDs    lightShiftPinB(j);    //green LEDs    lightShiftPinB(7-j);    //return the latch pin high to signal chip that it     //no longer needs to listen for information    digitalWrite(latchPin, 1);    delay(1000);  } }//This function uses bitwise math to move the pins upvoid lightShiftPinA(int p) {  //defines a local variable  int pin;  //this is line uses a bitwise operator  //shifting a bit left using << is the same  //as multiplying the decimal number by two.   pin = 1<< p;  //move 'em out  shiftOut(dataPin, clockPin, pin);   }//This function uses that fact that each bit in a byte//is 2 times greater than the one before it to//shift the bits highervoid lightShiftPinB(int p) {  //defines a local variable  int pin;  //start with the pin = 1 so that if 0 is passed to this  //function pin 0 will light.   pin = 1;  for (int x = 0; x < p; x++) {    pin = pin * 2;   }  //move 'em out  shiftOut(dataPin, clockPin, pin);   }// the heart of the programvoid shiftOut(int myDataPin, int myClockPin, byte myDataOut) {  // This shifts 8 bits out MSB first,   //on the rising edge of the clock,  //clock idles low  //internal function setup  int i=0;  int pinState;  pinMode(myClockPin, OUTPUT);  pinMode(myDataPin, OUTPUT);  //clear everything out just in case to  //prepare shift register for bit shifting  digitalWrite(myDataPin, 0);  digitalWrite(myClockPin, 0);  //for each bit in the byte myDataOut�  //NOTICE THAT WE ARE COUNTING DOWN in our for loop  //This means that %00000001 or "1" will go through such  //that it will be pin Q0 that lights.   for (i=7; i>=0; i--)  {    digitalWrite(myClockPin, 0);    //if the value passed to myDataOut and a bitmask result     // true then... so if we are at i=6 and our value is    // %11010100 it would the code compares it to %01000000     // and proceeds to set pinState to 1.    if ( myDataOut & (1<<i) ) {      pinState= 1;    }    else {        pinState= 0;    }    //Sets the pin to HIGH or LOW depending on pinState    digitalWrite(myDataPin, pinState);    //register shifts bits on upstroke of clock pin      digitalWrite(myClockPin, 1);    //zero the data pin after shift to prevent bleed through    digitalWrite(myDataPin, 0);  }  //stop shifting  digitalWrite(myClockPin, 0);}//blinks both registers based on the number of times you want to //blink "n" and the pause between them "d"//starts with a moment of darkness to make sure the first blink//has its full visual effect.void blinkAll_2Bytes(int n, int d) {  digitalWrite(latchPin, 0);  shiftOut(dataPin, clockPin, 0);  shiftOut(dataPin, clockPin, 0);  digitalWrite(latchPin, 1);  delay(200);  for (int x = 0; x < n; x++) {    digitalWrite(latchPin, 0);    shiftOut(dataPin, clockPin, 255);    shiftOut(dataPin, clockPin, 255);    digitalWrite(latchPin, 1);    delay(d);    digitalWrite(latchPin, 0);    shiftOut(dataPin, clockPin, 0);    shiftOut(dataPin, clockPin, 0);    digitalWrite(latchPin, 1);    delay(d);  }}





Code Beispiel 2.3 - Dual Defined Arrays
Wie Beispiel 2.2,
Beispiel 2.3 nutzt auch die neue Funktion blinkAll_2bytes ().
2.3 der große Unterschied von
Beispiel 1.3 ist nur, dass anstatt nur eine einzige Variable namens "data" und ein einziges Array namens "dataArray" müssen Sie eine dataRED, eine dataGREEN, dataArrayRED, dataArrayGREEN definiert vorne.
Dies bedeutet, dass Zeile

data = dataArray[j];

becomes

dataRED = dataArrayRED[j];
dataGREEN = dataArrayGREEN[j];

and

shiftOut(dataPin, clockPin, data);

becomes

shiftOut(dataPin, clockPin, dataGREEN);
shiftOut(dataPin, clockPin, dataRED);


Tom Igoe  2006-11



//**************************************************************////  Name    : shiftOutCode, Predefined Dual Array Style         ////  Author  : Carlyn Maw, Tom Igoe                              ////  Date    : 25 Oct, 2006                                      ////  Version : 1.0                                               ////  Notes   : Code for using a 74HC595 Shift Register           ////          : to count from 0 to 255                            ////****************************************************************//Pin connected to ST_CP of 74HC595int latchPin = 8;//Pin connected to SH_CP of 74HC595int clockPin = 12;////Pin connected to DS of 74HC595int dataPin = 11;//holders for infromation you're going to pass to shifting functionbyte dataRED;byte dataGREEN;byte dataArrayRED[10];byte dataArrayGREEN[10];void setup() {  //set pins to output because they are addressed in the main loop  pinMode(latchPin, OUTPUT);  Serial.begin(9600);  //Arduino doesn't seem to have a way to write binary straight into the code   //so these values are in HEX.  Decimal would have been fine, too.   dataArrayRED[0] = 0xFF; //11111111  dataArrayRED[1] = 0xFE; //11111110  dataArrayRED[2] = 0xFC; //11111100  dataArrayRED[3] = 0xF8; //11111000  dataArrayRED[4] = 0xF0; //11110000  dataArrayRED[5] = 0xE0; //11100000  dataArrayRED[6] = 0xC0; //11000000  dataArrayRED[7] = 0x80; //10000000  dataArrayRED[8] = 0x00; //00000000  dataArrayRED[9] = 0xE0; //11100000  //Arduino doesn't seem to have a way to write binary straight into the code   //so these values are in HEX.  Decimal would have been fine, too.   dataArrayGREEN[0] = 0xFF; //11111111  dataArrayGREEN[1] = 0x7F; //01111111  dataArrayGREEN[2] = 0x3F; //00111111  dataArrayGREEN[3] = 0x1F; //00011111  dataArrayGREEN[4] = 0x0F; //00001111  dataArrayGREEN[5] = 0x07; //00000111  dataArrayGREEN[6] = 0x03; //00000011  dataArrayGREEN[7] = 0x01; //00000001  dataArrayGREEN[8] = 0x00; //00000000  dataArrayGREEN[9] = 0x07; //00000111  //function that blinks all the LEDs  //gets passed the number of blinks and the pause time  blinkAll_2Bytes(2,500); }void loop() {  for (int j = 0; j < 10; j++) {    //load the light sequence you want from array    dataRED = dataArrayRED[j];    dataGREEN = dataArrayGREEN[j];    //ground latchPin and hold low for as long as you are transmitting    digitalWrite(latchPin, 0);    //move 'em out    shiftOut(dataPin, clockPin, dataGREEN);       shiftOut(dataPin, clockPin, dataRED);    //return the latch pin high to signal chip that it     //no longer needs to listen for information    digitalWrite(latchPin, 1);    delay(300);  }}// the heart of the programvoid shiftOut(int myDataPin, int myClockPin, byte myDataOut) {  // This shifts 8 bits out MSB first,   //on the rising edge of the clock,  //clock idles low  //internal function setup  int i=0;  int pinState;  pinMode(myClockPin, OUTPUT);  pinMode(myDataPin, OUTPUT);  //clear everything out just in case to  //prepare shift register for bit shifting  digitalWrite(myDataPin, 0);  digitalWrite(myClockPin, 0);  //for each bit in the byte myDataOut�  //NOTICE THAT WE ARE COUNTING DOWN in our for loop  //This means that %00000001 or "1" will go through such  //that it will be pin Q0 that lights.   for (i=7; i>=0; i--)  {    digitalWrite(myClockPin, 0);    //if the value passed to myDataOut and a bitmask result     // true then... so if we are at i=6 and our value is    // %11010100 it would the code compares it to %01000000     // and proceeds to set pinState to 1.    if ( myDataOut & (1<<i) ) {      pinState= 1;    }    else {            pinState= 0;    }    //Sets the pin to HIGH or LOW depending on pinState    digitalWrite(myDataPin, pinState);    //register shifts bits on upstroke of clock pin      digitalWrite(myClockPin, 1);    //zero the data pin after shift to prevent bleed through    digitalWrite(myDataPin, 0);  }  //stop shifting  digitalWrite(myClockPin, 0);}//blinks the whole register based on the number of times you want to //blink "n" and the pause between them "d"//starts with a moment of darkness to make sure the first blink//has its full visual effect.void blinkAll_2Bytes(int n, int d) {  digitalWrite(latchPin, 0);  shiftOut(dataPin, clockPin, 0);  shiftOut(dataPin, clockPin, 0);  digitalWrite(latchPin, 1);  delay(200);  for (int x = 0; x < n; x++) {    digitalWrite(latchPin, 0);    shiftOut(dataPin, clockPin, 255);    shiftOut(dataPin, clockPin, 255);    digitalWrite(latchPin, 1);    delay(d);    digitalWrite(latchPin, 0);    shiftOut(dataPin, clockPin, 0);    shiftOut(dataPin, clockPin, 0);    digitalWrite(latchPin, 1);    delay(d);  }}

Quelle:
https://www.arduino.cc/en/Tutorial/ShiftOut






********************************************************I*

Arduino LED Lauflicht – Knight Rider K.I.T.T.

Arduino Uno mit Dämmerungssensor und Lauflicht

– 1 Arduino  z.B. Uno R3
– 8 Widerstände 200 Ohm
– 8 LEDs (Farbe egal)
– 1 Potentiometer
– und ein Breadboard samt einigen Steckbrücken oder Kabel


Sketch LED Lauflicht
// Das Array mit den belegten Pins. Die Nullen vorne und hinten sind ein Trick,// damit sich das Lauflicht, dass sich über mehrere LEDs erstreckt, komplett// aus dem Bild laufen kann. int pinArray[] = {0,0,0,6,7,8,9,10,11,12,13,0,0,0}; // Die Anzahl der Elemente im Array. Die Elemente sind dann über die//Indizes [0] bis [13] zu erreichen.int pinCount = 14; // Der aktive Eintrag des Array, pinArray[2] ist das 3(!) Element. Das wird// zum Start gesetzt, die beiden hinterherlaufenden Lichter kriegen dann die // Einträge [1] und [0], also sind zum Start alle // anzusprechenden Pins = 0int activePin = 2; // Die Laufrichtung, in der für den nächsten Schritt zum activePin addiert // wird. dx ist +1 (aufwärts im Array) oder -1 (abwärts im Array)int dx = 1; // Der vom Potentiometer gelieferte Wertint poti = 0; // Mindestverzögerung zwischen zwei Schritten des Lauflichts. // Mit z.B. mintime=20 kann man die maximale Geschwindigkeit begrenzen.int mintime = 0; // setup() wird einmal bei Programmstart ausgeführtvoid setup() {  // Serielle Übertragung starten  Serial.begin(9600);  // Durch das Array gehen, alle Pins auf OUTPUT setzen außer es kommt 0.  for (int i=0; i< pinCount; i++) {    if (pinArray[i] != 0) {      pinMode(pinArray[i], OUTPUT);    }  }} // loop() wird während des Programmablaufs endlos immer wieder aufgerufenvoid loop() {   // Zuerst schalten wir alle Pins of Array auf LOW, als Hilfsfunktion  // verwenden wir digitalWriteNot0(), damit die Array-Einträge mit   // Wert 0 ignoriert werden.  for (int i=0; i<pinCount; i++) {    digitalWriteNot0(pinArray[i], LOW);  }   // Sind wir am Ende des Arrays angekommen? Wenn ja, dann einen Schritt   // zurückgehen (zum vorletzten 0-Element) und mit dx = -1 die Laufrichtung#  // ändern.  if (activePin == (pinCount-1)) {    activePin = (pinCount - 2);    dx = -1;  }   // Sind wir am Anfang des Arrays angekommen? Wenn ja, dann einen Schritt   // weitergehen (zum 2. 0-Element) und mit dx = 1 die Laufrichtung aufwärts setzen.  if (activePin == 0) {    activePin = 1;    dx = 1;  }   // Zum aktiven Pin die Laufrichtung hinzuzählen. An den Rändern des Array mit  // den 3 Nullen sind wir damit mindestens 2 Elemente vom Rand entfernt, haben   // also Platz um 2 weitere LEDs leuchten zu lassen  activePin += dx;   // Potentiometer von Pin 0 einlesen (Wert zwischen 0 und 1023)  poti = analogRead(0);   // Wenn der Wert < 1023 ist, dann...  if (poti < 1023) {    // Die LED auf activePin einschalten    digitalWriteNot0(pinArray[activePin], HIGH);    // und die LED in entgegengesetzter Laufrichtung davor    digitalWriteNot0(pinArray[activePin-dx], HIGH);    // und eine weitere LED in entgegengesetzter Laufrichtung davor    digitalWriteNot0(pinArray[activePin-2*dx], HIGH);    // Das funktoniert, weil wir durch die 3 Nullen an den Rändern des Arrays genug    // Platz haben, um im Array zu lesen, ohnen die Arraygrenzen zu sprengen. Wenn     // als Pin eine 0 drinsteht, wird dieses beim Schalten der LEDs einfach ignoriert.  }   // Debug-Ausgabe für den Seriellen Monitor. Einfach über "Tools" einschalten  Serial.print(poti);  Serial.print(" - ");  Serial.println(activePin);   // Den geviertelten Wert des Potentiometers verwenden wir für die Wartezeit   // zwischen den Schritten in Millisekunden mintime kann als Mindestwert gesetzt   // werden, damit wird die maximale Geschwindigkeit des Lauflichts begrenzt.  delay(mintime+analogRead(0)/4); } // digitalWriteNot0() ist eine Hilfsfunktion, die nur dann digitalWrite() ausführt,// wenn das übergebene Pin nicht 0 ist. Damit werden die Füllelemente des pinArray// bei der Ausgabe einfach ignoriert.void digitalWriteNot0(int pin, boolean state) {  if (pin > 0) {    digitalWrite(pin, state);  }}


http://www.makerblog.at/2014/04/arduino-led-lauflicht-knight-rider/







********************************************************I*

Ich habe mit dem Arduino Microcontroller eine erste kleine Schaltung aufgebaut.
Sie hat zwei Funktionen: Im regulärbetrieb steuert ein FlipFlop eine digitale Uhr, welche durch eine Reihe von LED’s gekennzeichnet wird.
Wenn der Taster gedrückt wird und der Arduino am Pin A02 (Analog In 2) ein Signal bekommt, dann springt er aus der einen Schleife heraus und geht in die andere Schleife hinein.
Lese den ganzen Artikel, um Quellcode, Bauplan, Stückliste und ein exemplarisches Video zu sehen…
Später kann man dann das Arduino Board über eine Bridge auch an den Raspberry Pi anschließen.
Aber auf dem Microcomputer gibts ja noch wesentlich mehr anwendungen.
Vor allem die gesamte open-source szene der Softwareentwicklung.
Und da ist so eine halbwegs gute Linux-kiste wie der Raspberry schon ganz praktisch… aber ich schweife ab, zurück zum Arduino.

Exemplarisches Video:

http://www.youtube.com/watch?v=RWEtv5jkKZs

Stückliste:

  1. Arduino Diecimila, UNO, oder einen anderen
  2. Steckprett oder Lochrasterplatine
  3. LED, 16 Stk.
  4. Widerstand, 220 Ohm, 1 Stk.
  5. Widerstand, 470 Ohm, 1 Stk.
  6. Ein paar Kabel
  7. 1 Taster
Die Verkabelung stellt keine Herausforderung dar.
Die Anode jeder LED wird an die digitalen Ports 0 – 13, sowie die analogen Pins 0 und 1 angeschlossen.


Die Kathoden sind zusammengefaßt und mit einem Strombegrenzendem Widerstand an GND angeschlossen.


An diesem GND wird über ein Taster eine Drahtbrücke zum analogen Eingang A02 aufgebaut. fertig…

Software / Codeschnipsel:

const int columnTime = 100;
const int sekunde = 1000;
const int spacer = 10;
const int kontrollwert = 2;       // Spannungsuntergrenze am Schalter A2 auf die überprüft wird.

int columns[] = { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2};
int column=0;

int columnCount = sizeof(columns) / sizeof(columns[0]); //Counting columns
int zeitzeichen=0;
boolean stoppe=false;

void setup(){
// Define digital pin 0 to 16 as OUTPUT, switch it on, wait, switch it off
for (int i=0;i<16;i++){
pinMode(i,OUTPUT);
digitalWrite(i,HIGH);
delay(columnTime);
digitalWrite(i,LOW);
}
}

void loop(){
stoppe = false;
int sensorValue = analogRead(A2); // Holt den Wert, ob gedrückt.  vom eingang A2

// wenn knopf gedrückt, dann ausführen.
if (sensorValue < kontrollwert)  {

column=0;
while((column<columnCount) && (stoppe != true)){
// Read every bit and set a row
for (int row=0;row<16;row++){
digitalWrite(row,bitRead(columns[column],row));
}
delay(columnTime); // Wait, so your eye or a lense can realise the column

// Set every row LOW
for (int row=0;row<16;row++){
digitalWrite(row,LOW);
}
sensorValue = analogRead(A2); // Holt den Wert, ob gedrückt.  vom eingang A2
if (sensorValue > kontrollwert)  {
stoppe =true; // abspringen, falls nötig

}

column++;

}

}
else {
// Knopf ist nicht gedrückt. mache dass…

// uhrzeit anzeigen

while ((zeitzeichen<32767) && (stoppe != true)){

// Read every bit and set a row
for (int row=0;row<16;row++){
digitalWrite(row,bitRead(zeitzeichen,row));
}
// Wurde der Knopf wieder gedrückt ?
sensorValue = analogRead(A2);
if (sensorValue <  kontrollwert) {
stoppe =true;
}
zeitzeichen++;
delay(sekunde); // Waite eine Sekunde
}

}

}




********************************************************I*
Automatischen Treppenlicht.
2x Ultraschall-Entfernungssensoren SRF02
1x LDR zur Bestimmung der Umgebungs-Helligkeit
45x weiße LEDs.

Zwei Ultraschall-Entfernungssensoren (ein SRF02 im Erdgeschoss, ein zweiter oben) detektieren, ob eine Person die Treppe nutzen will
Die von mir geschriebene Software (SRF02_Ver_1_0) zur Steuerung des Treppenlichts ist so programmiert, dass die Schwellwerte schnell und einfach ermittelt werden können.
Hierzu werden alle nötigen Daten per serieller Schnittstelle ausgegeben.



/* * Treppenlicht mit 2x SRF02 *                  1x LDR *                  45 LEDs in fünf Gruppen *///***LIBRARIES***#include "Wire.h"#include "SRF02.h"//***AUFRUFE***SRF02 Sensor[2] ={  SRF02(0x70, SRF02_CENTIMETERS),  SRF02(0x71, SRF02_CENTIMETERS)};//***VARIABLEN***//unsigned long nextPrint = 0;unsigned long laufzeit = 0;int WaitTime = 750;          // Pause zwischen den Einschalt-Zyklenint AusgabeTime = 0;          // Pause zwischen den seriellen Ausgabenint Wert1 = 0;int Wert2 = 0;int auf = 0;int LDRWert = 0;int MinLicht = 600;           // Mindestwert Lichtstärke für Einschalten (default: 275)int SchwelleUnten = 40;       // Schwellwert für Sensor unten (default: 35)int SchwelleOben = 80;        // Schwellwert für Sensor oben (default: 80)int Brenndauer = 25;          // Brenndauer für Time-Out-Abschaltung in Sekunden (default: 20)//***PINS***int PowerLED = 13;int Kanal_1 = 3;int Kanal_2 = 5;int Kanal_3 = 6;int Kanal_4 = 9;int Kanal_5 = 10;int ResetPIN = 4;int LDRPin = 0;void setup(){  pinMode(PowerLED, OUTPUT);  pinMode(ResetPIN, OUTPUT);  digitalWrite(PowerLED, HIGH);   digitalWrite(ResetPIN, LOW);  Serial.begin(9600);  Wire.begin();  SRF02::setInterval(200);}void loop(){  SRF02::update();  Wert1=Sensor[0].read();  Wert2=Sensor[1].read();  LDRWert = analogRead(LDRPin);//++++++++++++++++++++++++++++EINSCHALTEN Funktion AUF++++++++++++++++++++++++++++  if ( (Wert1 <= SchwelleUnten) && (Wert1 > 0) && (auf == 0) && (LDRWert < MinLicht) )   // Sensor unten hat ausgelöst "AUFWÄRTS einschalten"  {    digitalWrite(PowerLED, LOW);      laufzeit = millis ();                // 1    for (int i=0; i<=255; i+=5)    {      analogWrite(Kanal_1, i);      delay(5);    }       auf = 1 ;  }    if ( (millis() > (laufzeit + WaitTime)) && (auf == 1) )  {    for (int i=0; i<=255; i+=5)          // 2    {      analogWrite(Kanal_2, i);      delay(5);    }    auf = 2;  }    if ( (millis() > (laufzeit + WaitTime * 2 )) && (auf == 2) )  {    for (int i=0; i<=255; i+=5)          // 3    {      analogWrite(Kanal_3, i);      delay(5);    }    auf = 3;  }    if ( (millis() > (laufzeit + WaitTime * 3 )) && (auf == 3) )  {    for (int i=0; i<=255; i+=5)          // 4    {      analogWrite(Kanal_4, i);      delay(5);    }    auf = 4;  }    if ( (millis() > (laufzeit + WaitTime * 4 )) && (auf == 4) )  {    for (int i=0; i<=255; i+=5)          // 5    {      analogWrite(Kanal_5, i);      delay(5);    }    auf = 5;  }//++++++++++++++++++++++++++++EINSCHALTEN Funktion AUF++++++++++++++++++++++++++++//++++++++++++++++++++++++++++EINSCHALTEN Funktion AB+++++++++++++++++++++++++++++  if ( (Wert2 <= SchwelleOben) && (Wert2 > 0) && (auf == 0) && (LDRWert < MinLicht) )   // Sensor oben hat ausgelöst "ABWÄRTS einschalten"  {    digitalWrite(PowerLED, LOW);      laufzeit = millis ();                // 1    for (int i=0; i<=255; i+=5)    {      analogWrite(Kanal_5, i);      delay(5);    }       auf = 11 ;  }    if ( (millis() > (laufzeit + WaitTime)) && (auf == 11) )  {    for (int i=0; i<=255; i+=5)          // 2    {      analogWrite(Kanal_4, i);      delay(5);    }    auf = 12;  }    if ( (millis() > (laufzeit + WaitTime * 2 )) && (auf == 12) )  {    for (int i=0; i<=255; i+=5)          // 3    {      analogWrite(Kanal_3, i);      delay(5);    }    auf = 13;  }    if ( (millis() > (laufzeit + WaitTime * 3 )) && (auf == 13) )  {    for (int i=0; i<=255; i+=5)          // 4    {      analogWrite(Kanal_2, i);      delay(5);    }    auf = 14;  }    if ( (millis() > (laufzeit + WaitTime * 4 )) && (auf == 14) )  {    for (int i=0; i<=255; i+=5)          // 5    {      analogWrite(Kanal_1, i);      delay(5);    }    auf = 15;  }//++++++++++++++++++++++++++++EINSCHALTEN Funktion AUF++++++++++++++++++++++++++++//++++++++++++++++++++++++++++DATENAUSGABE++++++++++++++   if ( AusgabeTime >= 5000 ) {    Serial.print("Sensorwert unten: ");    Serial.println(Sensor[0].read());    Serial.print("Sensorwert oben: ");    Serial.println(Sensor[1].read());    Serial.print("Helligkeit: ");    Serial.println(LDRWert);        Serial.print("Programmposition: ");    Serial.println(auf);    Serial.println("-----------------------------------");    AusgabeTime = 0;   }//++++++++++++++++++++++++++++DATENAUSGABE++++++++++++++ //++++++++++++++++++++++++++++AUSSCHALTEN durch Timeout, Funktion AUF++++++++++++++  if ( (millis() > (laufzeit + WaitTime * Brenndauer)) && (auf == 5) )  {    for (int i=255; i>=0; i-=5)              {      analogWrite(Kanal_1, i);      analogWrite(Kanal_2, i);      analogWrite(Kanal_3, i);      analogWrite(Kanal_4, i);            analogWrite(Kanal_5, i);      delay(20);    }    //auf = 0;    digitalWrite(PowerLED, HIGH);    digitalWrite(ResetPIN, HIGH);  }//++++++++++++++++++++++++++++AUSSCHALTEN durch Timeout, Funktion AUF++++++++++++++//++++++++++++++++++++++++++++AUSSCHALTEN durch Timeout, Funktion AB++++++++++++++  if ( (millis() > (laufzeit + WaitTime * Brenndauer)) && (auf == 15) )  {    for (int i=255; i>=0; i-=5)              {      analogWrite(Kanal_1, i);      analogWrite(Kanal_2, i);      analogWrite(Kanal_3, i);      analogWrite(Kanal_4, i);            analogWrite(Kanal_5, i);      delay(20);    }    //auf = 0;    digitalWrite(PowerLED, HIGH);    digitalWrite(ResetPIN, HIGH);  }//++++++++++++++++++++++++++++AUSSCHALTEN durch Timeout, Funktion AB++++++++++++++  //++++++++++++++++++++++++++++AUSSCHALTEN durch Sensor, Funktion AUF++++++++++++++  if ( (auf == 5) && (Wert2>0) && (Wert2 < SchwelleOben) )          // Treppenlicht ist an und zweiter Sensor hat angeschlagen also "ausschalten"  {    for (int i=255; i>=0; i-=5)              {      analogWrite(Kanal_1, i);      analogWrite(Kanal_2, i);      analogWrite(Kanal_3, i);      analogWrite(Kanal_4, i);            analogWrite(Kanal_5, i);      delay(20);    }    //auf = 0;    digitalWrite(PowerLED, HIGH);    digitalWrite(ResetPIN, HIGH);  }//++++++++++++++++++++++++++++AUSSCHALTEN durch Sensor, Funktion AUF++++++++++++++//++++++++++++++++++++++++++++AUSSCHALTEN durch Sensor, Funktion AB++++++++++++++  if ( (auf == 15) && (Wert1>0) && (Wert1 < SchwelleUnten) )          // Treppenlicht ist an und zweiter Sensor hat angeschlagen also "ausschalten"  {    for (int i=255; i>=0; i-=5)              {      analogWrite(Kanal_1, i);      analogWrite(Kanal_2, i);      analogWrite(Kanal_3, i);      analogWrite(Kanal_4, i);            analogWrite(Kanal_5, i);      delay(20);    }    //auf = 0;    digitalWrite(PowerLED, HIGH);    digitalWrite(ResetPIN, HIGH);  }//++++++++++++++++++++++++++++AUSSCHALTEN durch Sensor, Funktion AB++++++++++++++AusgabeTime = AusgabeTime + 1;}

http://jleopold.de/2010/08/05/arduino-treppenlicht/






********************************************************I*

Treppenbeleuchtung mit Arduino Uno

LED Treppenlicht mit 14 einzeln dimmbaren LED-Strips und zwei Sharp Entfernungs-Sensoren am oberen und unteren Ende der Treppe.

Hier das Resultat:
Eine Schaltung die über 2 Fotodioden ausgelöst wird und einem die Stufen in der dunklen Nacht zeigen kann.

Den Code gibt es als .pde hier zum runterladen:
http://dl.dropbox.com/u/2014602/dbmdb...


https://www.youtube.com/watch?v=H6eLU3sgBa0




Habe nun das Forum schon lange durchlesen aber nix konkretes gefunden bezüglich meiner Treppenlicht-Steuerung.
Zum Einsatz kommen WS2812-LED-Module, ein Arduino UNO oder NANO, zwei PIR-Sensoren oder ähnliche Lichtschranken, ein Lichtsensor.

Funktionieren tut im Moment folgendes:
Person betritt die Treppe oben --> Stufen werden einzeln von oben zeitversetzt beleuchtet und gehen nach einer bestimmten Zeit (leider "delay-Befehl") wieder nacheinander von oben beginnend aus.
Person betritt Treppe von unten --> Stufen werden von unten nach oben zeitversetzt beleuchtet und entsprechend wieder abgeschaltet. Soweit ganz gut, aber:

Betritt von oben eine Person die Treppe und kurz drauf eine Person von unten, so steht die untere Person im Dunkeln, da der untere PIR inaktiv ist.
Ist die Zeit abgelaufen dann werden die LEDs abgeschaltet und leider könnte somit die Person welche als zweites die Treppe betreten hat im Dunkeln stehen....


int PIR001=10;
int PIR002=11;
int LIGHT=A0;
int PHOTO=0;
int MOVEMENT001=0;
int MOVEMENT002=0;


//
#include <Adafruit_NeoPixel.h>

#define PIN 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(20, PIN, NEO_GRB + NEO_KHZ800);
//



void setup() {
  Serial.begin(9600);

  pinMode(PIR001, INPUT);
  pinMode(PIR002, INPUT);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

}

void loop() {
  MOVEMENT001=digitalRead(PIR001);
  MOVEMENT002=digitalRead(PIR002);
  PHOTO=analogRead(LIGHT);

  if ( MOVEMENT001 == HIGH && PHOTO <= 820)         //wenn Treppe von unten betreten
  {    
    colorWipe(strip.Color(255, 0, 0), 500);         //LED nacheinander an / von unten nach oben
    delay(5000);
    colorWipe(strip.Color(0, 0, 0), 500);           //LED nacheinander aus
  }
  
  else if (MOVEMENT002 == HIGH && PHOTO <= 820)   //wenn Treppe von oben betreten
  {      
    colorWipe2(strip.Color(0, 255, 0), 500);      //LED nacheinander an / von oben nach unten
    delay(5000);
    colorWipe2(strip.Color(0, 0, 0), 500);        //LED nacheinander aus
  }

// folgende Abfrage beider PIR funktioniert nicht

// folgende Abfrage beider PIR funktioniert nicht

else if (MOVEMENT001 == HIGH && MOVEMENT002 == HIGH && PHOTO <= 820)
  {      
    colorWipe2(strip.Color(0, 0, 255), 500);
    delay(5000);
    colorWipe2(strip.Color(0, 0, 0), 500);
  }

Serial.print(" - PHOTO ");
Serial.println(PHOTO);
Serial.print(" Sensor unten ");
Serial.println(MOVEMENT001);
Serial.print("  Sensor unten ");
Serial.println(MOVEMENT002);
  


}
void colorWipe(uint32_t c, uint8_t wait) {
   for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
         }
       }

void colorWipe2(uint32_t c, uint8_t wait) {
  for(uint16_t i=strip.numPixels(); i>0; i--) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}


Quelle:
https://www.arduinoforum.de/arduino-Thread-Treppenlicht






********************************************************I*

Treppenbeleuchtung LED NeoPixel Motion Sensor

  1. 1 X Arduino Uno (e-Bay)
  2. 2 X PIR-Bewegungs-Sensoren (e-Bay)
  3. 10M WS2812B LED Light Strip (Länge hängt wie Sie wollen, es rücke. Jede Treppe ist anders!) (e-Bay)
  4. 5V 60A Switching Power supply (e-Bay)
  5. 100ft 18AWG Datenkabel (grün) (e-Bay)
  6. 100ft 18AWG Stromkabel (rot, schwarz) (e-Bay)
  7. Verlängerungskabel oder ein standard-Netzkabel für einen Computer (alte Teile)
  8. Lötkolben + Löt Draht, etc. (vorher gekauft)
  9. Schrumpffolie (e-Bay)
  10. Klebeband (big Box speichern)
  11. Klaren Silikon (big Box speichern)

Quelle:
http://www.genstr.com/treppenbeleuchtung-led-neopixel-motion-sensor_3.html#title





********************************************************I*

PIR Motion Sensor

  1. /*
  2. * PIR sensor tester
  3. */
  4. int ledPin = 13; // choose the pin for the LED
  5. int inputPin = 2; // choose the input pin (for PIR sensor)
  6. int pirState = LOW; // we start, assuming no motion detected
  7. int val = 0; // variable for reading the pin status
  8. void setup() {
  9. pinMode(ledPin, OUTPUT); // declare LED as output
  10. pinMode(inputPin, INPUT); // declare sensor as input
  11. Serial.begin(9600);
  12. }
  13. void loop(){
  14. val = digitalRead(inputPin); // read input value
  15. if (val == HIGH) { // check if the input is HIGH
  16. digitalWrite(ledPin, HIGH); // turn LED ON
  17. if (pirState == LOW) {
  18. // we have just turned on
  19. Serial.println("Motion detected!");
  20. // We only want to print on the output change, not state
  21. pirState = HIGH;
  22. }
  23. } else {
  24. digitalWrite(ledPin, LOW); // turn LED OFF
  25. if (pirState == HIGH){
  26. // we have just turned of
  27. Serial.println("Motion ended!");
  28. // We only want to print on the output change, not state
  29. pirState = LOW;
  30. }
  31. }
  32. }


Quelle:
https://learn.adafruit.com/pir-passive-infrared-proximity-motion-sensor/using-a-pir




********************************************************I*

Treppenbeleuchtung mit ARDUINO

Treppenbeleuchtung mit LEDs
Ein Controller für viele Leuchtdioden

Elektor 05-06/2017 (PDF)



********************************************************I*

Stromstoßschalter/ Treppenlicht-Zeitschalter

Eltako Treppenlicht-Schalter

Eltako Treppenlichtzeitschalter,

Eltako Nachlaufschalter NLZ61NP-230V 1S 10A

Nachlaufschalter NLZ61NP-230V Kontaktschaltung im Nulldurchgang zur Schonung der Kontakte und Verbraucher.Modernste Hybrid-Technik vereint die Vorteileverschleißfreier elektronischer Ansteuerung mitder hohen Leistung von Spezialrelais.Steuer-, Versorgungs- und Schaltspannung 230V.
Durch die Verwendung eines bistabilen Relaisgibt es auch im eingeschalteten Zustandkeine Spulen-Verlustleistung und keine Erwärmung hierdurch.
Nach der Installation die automatische kurzeSynchronisation abwarten, bevor der geschalteteVerbraucher an das Netz gelegt wird.
Nachlaufzeit 1 bis 12 Minuten mit demoberen Drehschalter einstellbar.Ansprechverzögerung 0 bis 12 Minutenmit dem unteren Drehschalter einstellbar

CONRAD 621062-62

https://www.eltako.com/no_cache/at/das-system-im-gebaeude/15-treppenlicht-zeitschalter-und-nachlaufschalter.html?locationData=38%3Att_content%3A99

300_b_eltako-x_Eltako Treppenlicht-Zeitschalter und Nachlaufschalter - Gesamtkatalog_1a.pdf

https://www.eltako.com/fileadmin/downloads/de/Prospekte/Prospekt_Treppenlichtzeitschalter_internet_low.pdf

https://www.elv.at/stromstossschalter-treppenlichtschalter-elektroinstallation.html




********************************************************I*

PIR Motion Sensor Tutorial

l





a




Infrarot-Sensoren, pyroelektrischen ("passiv"):
''' Was ist ein PIR-Sensor?'' "


PIR-Sensoren ermöglichen Ihnen die Sinne Bewegung, fast immer benutzt, um festzustellen, ob ein Mensch im oder außerhalb des Bereichs der Sensoren bewegt hat.
Sie sind klein, günstig, Low-Power, einfach zu bedienen und nicht abgenutzt.
Aus diesem Grund werden sie häufig in Geräte und Gadgets verwendet in Häuser oder Unternehmen gefunden.
Sie werden häufig als "Passive Infrarot" PIR, "Pyroelektrische", oder "IR-Bewegungsmelder".
PIRs bestehen grundsätzlich aus einem pyroelektrische Sensor (die du oben siehst, als die Runde Metalldose mit einem rechteckigen Kristall in der Mitte), die Infrarot-Strahlung detektieren kann.
Alles strahlt einige low-Level Strahlung und je heißer etwas ist, die mehr Strahlung emittiert.
Der Sensor in ein Bewegungsmelder ist eigentlich in zwei Hälften geteilt.
Der Grund dafür ist, dass wir auf der Suche sind um Bewegung (Änderung) zu erkennen nicht durchschnittliche IR Ebenen.
Die beiden Hälften sind verkabelt, so dass sie gegenseitig aufheben.
Wenn eine Hälfte sieht mehr oder weniger IR-Strahlung als die anderen, die Ausgabe werden hoch schwingen oder niedrig.
Zusammen mit den Pyroelectic ist Sensor eine Reihe von Schaltungen, Widerstände und Kondensatoren zu unterstützen.
Es scheint, dass die meisten kleine Hobby-Sensoren nutzen die BISS0001 ("Micro Power PIR Motion Detektor IC"), ohne Zweifel eine sehr preiswerte Chip.
Dieser Chip ist der Ausgang des Sensors und einige kleinere Verarbeitung darauf einen Digitalausgang Impuls aus der analogen Sensor zu emittieren.
Für viele grundlegende Projekte oder Produkte zu erkennen, wenn eine Person verlassen hat oder die Bereich eingegeben oder hat sich näherte, PIR-Sensoren sind groß.
Sie sind low-Power und low-Cost, ziemlich robust, haben eine Weitwinkel-Objektiv-Palette und sind leicht zu Schnittstelle mit.
Beachten Sie, dass PIRs will nicht sagen, wie viele Leute da sind oder wie nah sind sie an den Sensor, die Linse oft auf eine bestimmte Sweep und Entfernung fest ist, (obwohl es irgendwo gehackt werden kann) und sie sind manchmal auch von Haustieren abgesetzt.

Experimentieren ist der Schlüssel!

Einige grundlegende Statistiken
Diese Statistiken sind für den PIR-Sensor im Adafruit Shop, die sehr viel wie die Parallaxe ein.
Fast alle PIRs haben leicht unterschiedliche Spezifikationen, obwohl sie alle so ziemlich die gleiche Arbeit.

Gibt es ein Datenblatt, sollten Sie darauf verweisen
  • Größe: Rechteckige
  • Preis: $10,00 bei Adafruit shop
  • Ausgabe: Digitalen Puls hoch (3V) Auslösung (Bewegung erkannt) Digital niedriger als im Leerlauf (keine Bewegung erkannt).
  • Pulslängen werden durch Widerstände und Kondensatoren auf der Platine bestimmt und unterscheiden sich von Sensor zu Sensor.
  • Empfindlichkeitsbereich: bis zu 20 Fuß (6 m) 110 x 70 Grad Erfassungsbereich
  • Stromversorgung: 3,3V - 5V Eingangsspannung,
  • BIS0001 Datenblatt (der Decoder-Chip verwendet)
  • RE200B Datenblatt (wahrscheinlich die PIR Sensorelement verwendet)
  • NL11NH Datenblatt (entsprechende Objektiv verwendet)
  • Parallaxe Datenblatt auf ihre Version des Sensors

Weitere Links!


Schritt 1: Wie funktioniert es?



a


PIR-Sensoren sind komplizierter als viele der anderen Sensoren in diesen Tutorials (wie Photozellen, FSRs und Tilt-Schalter) erklärt, da gibt es mehrere Variablen, die Sensoren, Eingang und Ausgang.
Zunächst erklären, wie ein grundlegende Sensor funktioniert, verwenden wir das ziemlich nette Diagramm unten (wenn jemand weiß, wo er entsteht lass es mich wissen).
Der PIR-Sensor selbst verfügt über zwei Steckplätze darin, jeden Slot besteht aus einem speziellen Material, die empfindlich auf IR.
Das hier verwendete Objektiv tut nicht wirklich viel und so sehen wir, dass die beiden Schlitze "Vergangenheit einiger Entfernung (im Grunde die Empfindlichkeit des Sensors) raussehen können".
Wenn der Sensor im Leerlauf befindet, erkennen beide Steckplätze die gleiche Menge an IR, die ambient Menge strahlte von Raum oder Wänden oder im Freien.
Wenn ein warmer Körper wie ein Mensch oder Tier vorbei, fängt es zunächst eine Hälfte des PIR-Sensors, wodurch eine positive Veränderung der differente zwischen den beiden Hälften.
Den warmen Körper Erfassungsfeldes verlässt, passiert das Gegenteil, wobei der Sensor eine negative differentielle Änderung erzeugt.
Diese Impulse zu ändern sind, was erkannt wird.

Der PIR-sensor
Der IR-Sensor selbst befindet sich in einem hermetisch verschlossenen Metalldose, Lärm/Temperatur/Luftfeuchte Immunität zu verbessern.
Es gibt ein Fenster von IR-lichtdurchlässige Material (in der Regel beschichtete Silikon da dies sehr leicht zu bekommen ist), das schützt das Sensorelement.
Hinter dem Fenster sind die zwei ausgewogene Sensoren.
Schauen Sie sich die Bilder für weitere Details:


Schritt 2: Linsen





PIR-Sensoren sind eher allgemein gehalten und in den meisten Fällen unterscheiden sich nur in Preis und Empfindlichkeit.
Die meisten der die wirkliche Magie geschieht mit der Optik.
Dies ist eine ziemlich gute Idee für die Fertigung: der PIR-Sensor und Schaltung ist fixiert und kostet ein paar Dollar.
Das Objektiv kostet nur ein paar Cent und kann ändern Sie die breite Palette, Muster, sehr leicht zu spüren.
In der Abbildung oben das Objektiv ist nur ein Stück Plastik, aber das bedeutet, dass der Erfassungsbereich nur zwei Rechtecke.
In der Regel möchten wir einen Erfassungsbereich haben, die viel größer ist. Um dies zu erreichen, verwenden wir ein einfaches Objektiv
z. B. auf eine Kamera: sie verdichtet ein großes Gebiet (z. B. ein Querformat) zu einer kleinen (auf Film oder einen CCD-Sensor).
Aus Gründen, die bald ersichtlich sein werden, möchten wir die PIR-Linsen zu machen, klein und dünn und formbaren aus billigem Plastik, obwohl es Verzerrung hinzufügen kann.
Aus diesem Grund sind die Sensoren tatsächlich Fresnel-Linsen (siehe Bild unten).
OK, so jetzt haben wir eine viel größere Bandbreite.
Beachten Sie jedoch, dass wir tatsächlich zwei Sensoren, und vor allem wir nicht zwei wirklich große Sensor-Bereich Rechtecke, sondern eher eine Streuung von mehreren kleinen Flächen wollen.
Also tun wir das Objektiv in mehrere Kapitel aufgeteilt ist, ist jeder Abschnitt davon einer Fresnel-Linse.
Die verschiedenen Facettierung und Sub-Objektive schaffen eine Reihe von Erfassungsbereiche miteinander verzahnt.
Das ist, warum die Objektiv-Zentren in den oben genannten Facetten sind "inkonsistent" - jeder einzelne Punkte andere Hälfte der PIR-Sensor Messelement


Schritt 3: Schließen Sie an Ihren PIR



a

Die meisten PIR-Module haben einen 3-Pin-Anschluss an der Seite oder unten.
Die Pinbelegung kann variieren zwischen Modulen so Triple-Check das Pinout!
Es ist oft Siebdruck auf rechts neben der Verbindung.
Ein Pin werden Boden, wird ein anderes Signal sein und der letzte sein macht.
Macht ist in der Regel 3-5VDC Eingang kann jedoch so hoch wie 12V.
Manchmal größere Module nicht haben direkten Ausgang und stattdessen nur ein Relais, in diesem Fall es Boden, macht und die zwei Anschlüsse ist, betreiben.
Die Ausgabe von einigen Relais möglicherweise "open Collector" - das heißt, es erfordert einen Pullup-Widerstand.
Wenn Sie eine Variable Ausgabe nicht immer sind unbedingt versuchen, einen 10k Pullup zwischen Signal- und Pins anbringen.
Eine einfache Möglichkeit des Prototyping mit PIR-Sensoren ist, verbinden Sie es mit einem Steckbrett, da der Anschluss 0.1" ist Abstand.
Einige PIRs mit Header kommen auf sie bereits, die von Adafruit nicht wie üblich die Kopfzeile zum Einstecken in ein Steckbrett nutzlos.
Durch Löten im rechten Winkel Header 0,1", ist ein PIR einfach in ein Steckbrett zu installieren


Schritt 4: Testen der PIR



a

Sobald Sie Ihre PIR verdrahtet haben ist es eine gute Idee, einen einfachen Test, um sicherzustellen, dass es so funktioniert, wie Sie erwarten.
Dieser Test ist auch gut für das Angebot zu testen.
Verbinden Sie einfach 3-4 alkaline-Batterien (stellen Sie sicher, Sie haben mehr als 3.5VDC nach außen, aber weniger als 6V mit Ihr Multimeter überprüfen!) und anschließen - PIN auf Ihre PIR. Kraft geht an die + Pin.
Schließen Sie eine einfache rote LED (roten LEDs haben niedrigere Vorwärtsspannungen als grün oder blau, damit sie besser mit nur die 3.3V arbeiten Ausgang) und einen 220 Ohm Widerstand (jeder Wert von 100 Ohm bis 1 k Ohm tun gut) , PIN wie gezeigt. Natürlich können die LED und Widerstand Standorten austauschen, solange die LED orientierte Verbindung ist und zwischen out und Boden verbindet
Jetzt wenn der PIR-Sensor Bewegungen erkennt, gehen die Ausgangs-Pin "high" 3,3V und Leuchten die LED an!
Sobald Sie dem Steckbrett verdrahtet haben, legen Sie Batterien ein und warten Sie 30-60 Sekunden, der PIR-Sensor zu "stabilisieren".
Während dieser Zeit kann ein wenig die LED blinken.
Warten Sie, bis die LED aus ist und dann bewegen Sie davor, winkt eine Hand usw., die LED Leuchten zu sehen!


Schritt 5: Retriggerung



a


Haben Sie die LED blinkt, sehen auf der Rückseite der PIR-Sensor und stellen Sie sicher, dass der Jumper in die L-Stellung gebracht wird, wie unten dargestellt.
Das testing Board jetzt wieder aufgebaut. Sie können feststellen, dass beim Anschluss von den PIR-Sensor wie oben beschrieben
die LED nicht als davor aber eigentlich abwechselnd ein- und Ausschalten pro Sekunde bewegen oder so auf.
Das nennt man "nicht Retriggerung".
Jetzt ändern Sie den Jumper so dass es in der H-Position.
Wenn Sie den Test eingerichtet, werden Sie feststellen, dass jetzt die LED über die ganze Zeit bleibt, dass etwas in Bewegung ist.
Das nennt man "Retriggerung"
Für die meisten Anwendungen ist "Modellreihen" (Jumper in H-Position) Modus ein wenig schöner.
Wenn Sie den Sensor auf etwas flankengetriggert verbinden müssen, Sie wollen es auf "nicht-Retriggerung" festgelegt (Jumper in L-Stellung).


Schritt 6: Längenänderung Puls Zeit und timeout

Tx = Die Zeitdauer, während der der Ausgangsstift (Vo) nach dem Auslösen hoch bleibt.
Ti = Während dieser Zeit wird die Auslösung gehemmt. Siehe Timing-Diagramme für Details.

Tx = The time duration during which the output pin (Vo) remains high after triggering.
Ti = During this time period, triggering is inhibited. See timing charts for details.

Tx ~ 24576 x R10 x C6      Ti ~ 24 x R9 x C7 (ref to schematic)


Gibt es zwei "Timeouts" mit PIR-Sensor verbunden.
Eine ist das "Tx" Timeout: wie lange die LED leuchtet, nachdem es eine Bewegung erkennt.
Das zweite ist das "Ti" Timeout ist, wie lange die LED deaktiviert sein, wenn es keine Bewegung gewährleistet ist.
Diese sind nicht leicht verändert, aber bist du praktisch mit einem Lötkolben Iton ist es im Rahmen des Zumutbaren.
Zunächst werfen wir einen Blick auf die BISS-Datenblatt wieder (siehe Bild unten)
Bestimmung von R10 und R9 ist nicht zu hart. Leider ist dieser PIR-Sensor unten falsch beschriftet (es sieht aus wie sie R9 R17 vertauscht).
Sie können die Stifte durch die Betrachtung der BISS001 Datenblatt verfolgen und herauszufinden, welche Pins sind sie - R10 verbindet auf Pin 3 und R9 verbindet auf Pin 7.
Die Kondensatoren sind ein wenig härter zu ermitteln, aber Sie können "reverse Engineering" vom timing des Sensors und lösen Sie!

Für den Sensor im Adafruit Shop:

TX ist 24576 = * R10 * C6 = ~1.2 Sekunden
R10 = 4,7 K und C6 = 10nF

Ebenso

TI = 24 * R9 * C7 = ~1.2 Sekunden
R9 = 470 K und C7 = 0.1uF

Sie können das Timing ändern, durch verschiedene Widerstände oder Kondensatoren austauschen.
Ein nettes Tutorial auf dieser Seite Keiths PIR Hacker 


Schritt 7: Projektbeispiele

A USB-betriebenen singen und blinken Mario Pilz (es gibt ein Video auf der Website!)
A PIR-basierte remote-Kamera-Auslöser (auch von Lucky Larry!)


Schritt 8: Lesung PIR-Sensoren

Verbindung PIR-Sensoren an einen Mikrocontroller ist wirklich einfach.
Der PIR-Sensor dient als ein digitaler Ausgang, so dass alle Sie tun müssen, ist für den Stift zu hoch drehen hören (erkannt) oder niedrig (nicht erkannt).
Die Wahrscheinlichkeit, dass Sie wollen Reriggering, so sein sicher, setzen Sie den Jumper in der H -Position!
Der PIR-Sensor mit 5V schalten und verbinden von Boden zu Boden.
Dann verbinden Sie den Ausgang zu einem digitalen Stift. In diesem Beispiel verwenden wir Pin 2.
Der Code ist sehr einfach und ist im Grunde nur hält Überblick, ob die Eingabe Pin 2 hoch oder niedrig ist.

Es überwacht auch den Zustand des Stiftes, so dass es ein Signal druckt, wenn Motion gestartet und gestoppt:


/ * PIR Sensor Tester * /

Int-LedPin = 13; Wählen Sie die Pin für die LED
Int InputPin = 2; Wählen Sie die Eingangs-Pin (für PIR-Sensor)
Int PirState = LOW; Wir beginnen, vorausgesetzt, keine Bewegung erkannt
Int Val = 0; Variable für das Lesen der Status-Pins

void setup() {}
PinMode (OUTPUT-LedPin,); LED als Ausgabe zu erklären
PinMode (InputPin, Eingabe); Sensor als Eingabe deklarieren

Serial.Begin(9600);
}

void loop() {}
Val = digitalRead(inputPin); Eingabewert zu lesen
Wenn (Val == HIGH) {/ / prüfen, ob die Eingabe hoch ist
DigitalWrite (LedPin, HIGH); LED ein-
Wenn (PirState == LOW) {}
Wir haben gerade eingeschaltet
Serial.println ("Bewegung erkannt!");
Wir wollen nur auf der Ausgabe ändern, nicht staatliche drucken
PirState = hoch;
}
} else {}
DigitalWrite (LedPin, LOW); LED ausschalten
Wenn (PirState == HIGH) {}
Wir haben gerade von
Serial.println ("Motion beendet!");
Wir wollen nur auf der Ausgabe ändern, nicht staatliche drucken
PirState = niedrig;
}
}
}



Vergessen Sie nicht, dass es einige Male gibt, wenn Sie nicht brauchen einen Mikrocontroller.
Ein PIR-Sensor kann an ein Relais (vielleicht mit einem Transistor-Puffer) ohne ein Mikro angeschlossen werden!


http://www.genstr.com/pir-motion-sensor-tutorial.html




********************************************************I*

Arduino und Pushbuttons

Drucktaster einbinden mit der OneButton Library

Normale Drucktaster, auch Pushbuttons genannt, die nur im gedrückten Zustand Kontakt herstellen, werden bei vielen Arduino Projekten benötigt.
Der Anschluss des Schalters an den Arduino ist recht einfach – solange man nicht auf den notwendigen Pulldown- oder Pullup-Widerstand vergisst, der das Arduino-Pin auch im offenen Schalterzustand auf einen definierten Pegel zieht.
Die OneButton-Library von Matthias Hertel bewahrt uns davor, dass wir uns selbst um Dinge wie prellende Taster und Mehrfachklicks etc. kümmern müssen.
Die Library stellt in sehr einfacher Form einen Mechanismus zur Verfügung, mit dem es möglich ist, beim Eintreten bestimmter Ereignisse (Klick, Doppelklick, langer Klick etc.) eigene Funktionen aufzurufen.

Die OneButton-Library ist hier auf Github zu finden:
https://github.com/mathertel/OneButton

Zur Installation rechts „Download ZIP“ auswählen, das heruntergeladene File entpacken und in den /libraries-Ordner von Arduino kopieren.
Dort noch das „-master“ aus dem Verzeichnisnamen löschen. Damit die Library auch erkannt wird, muss die Arduino Entwicklungsumgebung einmal neu gestartet werden.

Die Initialisierung eines Buttons im Arduino Sketch erfolgt z.B. so:
OneButton button(buttonPin, false);

buttonPin ist dabei das Arduino-Pin, an dem der Taster hängt.

Der zweite Parameter gibt an, ob der ungedrückte Zustand des Buttons dem Pegel LOW oder HIGH entspricht.
Das false im Beispiel bedeutet, dass ein Pulldown-Widerstand verwendet wurde und der Pegel am Arduino bei einem Druck des Tasters von LOW auf HIGH wechselt.

An dieses Button-Objekt können dann Callback-Funktionen für bestimmte Ereignisse gebunden werden, z.B.:

button.attachClick(clickedIt);

D.h. wenn der Button das Ereignis „Klick“ erkennt, wird unsere Funktion clickedIt() aufgerufen.

Damit die OneButton-Library richtig arbeitet, muss in der loop()-Funktion des Sketches regelmäßig

button.tick();

aufgerufen werden.
Die Methode arbeitet sehr effizient und ist schnell abgearbeitet. Irgendwelche delay()-Aufrufe zum Entprellen der Tasten sind nicht notwendig, darum kümmert sich die Library.
Grundlegende Infos zu Pushbuttons und ein Beispiel zur OneButton-Library habe ich im Video zusammengestellt:

Am einfachsten kann man den aktuellen Zustand eines Pushbuttons in der loop()-Funktion abfragen und entsprechend darauf reagieren.
Diese Variante kann aber mit wenig Aufwand nur auf den aktuellen Zustand, nicht aber auf Zustandsänderungen reagieren.
Zustandsänderungen (war der Button beim letzten Mal noch nicht gedrückt, jetzt ist er es aber?) bedürfen außerdem besonderer Aufmerksamkeit, da sie durch prellende Taster usw. nicht immer sofort eindeutig zu erkennen sind oder bei einem Tastendruck irrtümlich mehrfach erkannt werden.

Hier ein Code-Beispiel ohne die OneButtion-Library, das sich in ähnlicher Form auch im Button-Tutorial von arduino.cc findet:


const int buttonPin = 12;const int ledPin = 2; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT);} void loop() { if (digitalRead(buttonPin) == HIGH) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); }}
Das folgende, komplexere Beispiel verwendet die OneButton-Library und unterscheidet bereits zwischen normalen Klicks und Doppelklicks.
Da kann man auch die Funktionsweise der Library schon sehr gut erkennen:

#include "OneButton.h" const int buttonPin = 12;const int ledPin = 2; OneButton button(buttonPin, false); int ledState = LOW; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT);  button.attachClick(clickedIt); button.attachDoubleClick(doubleClickedIt); } void loop() { button.tick();  delay(10);}  void clickedIt() { ledState = !ledState; digitalWrite(ledPin, ledState);} void doubleClickedIt() { for (int i=0; i<5; i++) { digitalWrite(ledPin, HIGH); delay(60); digitalWrite(ledPin, LOW); delay(60); }  digitalWrite(ledPin, ledState);}



Ich habe ein kleines Problem mit OneButton.
ich möchte wenn ich den Taster loslasse die LED wieder ausgeht was muß ich an meinen Code ändern
Gruß Holger

[code]
#include 
int ledPin=13;
int buttonPin1=A1;
OneButton button1=OneButton(buttonPin1,true);

void setup() {
  pinMode(ledPin,OUTPUT);
  pinMode(buttonPin1,INPUT);
  button1.attachPress(halten);
  button1.setPressTicks(3000);
}

void loop() {
 button1.tick();
  delay(10);
}
void halten()
 {
   static int ledState=LOW;
   ledState=!ledState;
   digitalWrite(ledPin,ledState);
   }

[/code]


http://www.makerblog.at/2015/01/arduino-und-pushbuttons-drucktaster-einbinden-mit-der-onebutton-library/







DIN A4  ausdrucken
********************************************************I*
Impressum: Fritz Prenninger, Haidestr. 11A, A-4600 Wels, Ober-Österreich, mailto:[email protected]
ENDE