http://sites.schaltungen.at/arduino-uno-r3/stiegenhauslicht
DIN A3 oder DIN A4 quer ausdrucken ~015_b_PrennIng-a_arduino.uno.r3-stiegenhauslicht (63 Seiten)_1a.pdf
*******************************************************************************I** DIN A4 ausdrucken siehe********************************************************I*
http://sites.schaltungen.at/elektronik/bausaetze/electronicum/karton-bausaetze
Das Arduino-QuizPrüfe Dein ARDUINO Wissenhttp://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*
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*
arduino schieberegister 74hc595
arduino schieberegister programmieren arduino schieberegister sketch arduino 74hc595 7 segment arduino 74hc595 7 segment 4 digit arduino lauflicht schieberegister 74hc595 datasheet 74hc595 beispiel
********************************************************I*
Stiegenhauslicht / Stiegenhausschalter / Treppenhauslicht /
Treppenlicht-Zeitschalter / Treppenhaus-Schaltung / Flurbeleuchtung
********************************************************I*
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 Schieberegister5V 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.}
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
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*
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.
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.
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.
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.
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.
//**************************************************************//// 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);}
Wenn man diesen Code mit dem ähnlichen Code aus Beispiel 1 vergleicht, sieht man, dass sich ein bisschen mehr ändern musste.
//**************************************************************//// 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,
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); }}
– 8 Widerstände 200 Ohm
– 8 LEDs (Farbe egal)
– 1 Potentiometer
– und ein Breadboard samt einigen Steckbrücken oder Kabel
// 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); }}
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:
- Arduino Diecimila, UNO, oder einen anderen
- Steckprett oder Lochrasterplatine
- LED, 16 Stk.
- Widerstand, 220 Ohm, 1 Stk.
- Widerstand, 470 Ohm, 1 Stk.
- Ein paar Kabel
- 1 Taster
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
}}
}
2x Ultraschall-Entfernungssensoren SRF02
1x LDR zur Bestimmung der Umgebungs-Helligkeit
45x weiße LEDs.
/* * 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;}
Den Code gibt es als .pde hier zum runterladen:
http://dl.dropbox.com/u/2014602/dbmdb...
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.
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);
}
}
- 1 X Arduino Uno (e-Bay)
- 2 X PIR-Bewegungs-Sensoren (e-Bay)
- 10M WS2812B LED Light Strip (Länge hängt wie Sie wollen, es rücke. Jede Treppe ist anders!) (e-Bay)
- 5V 60A Switching Power supply (e-Bay)
- 100ft 18AWG Datenkabel (grün) (e-Bay)
- 100ft 18AWG Stromkabel (rot, schwarz) (e-Bay)
- Verlängerungskabel oder ein standard-Netzkabel für einen Computer (alte Teile)
- Lötkolben + Löt Draht, etc. (vorher gekauft)
- Schrumpffolie (e-Bay)
- Klebeband (big Box speichern)
- Klaren Silikon (big Box speichern)
PIR Motion Sensor
- /*
- * PIR sensor tester
- */
- int ledPin = 13; // choose the pin for the LED
- int inputPin = 2; // choose the input pin (for PIR sensor)
- int pirState = LOW; // we start, assuming no motion detected
- int val = 0; // variable for reading the pin status
- void setup() {
- pinMode(ledPin, OUTPUT); // declare LED as output
- pinMode(inputPin, INPUT); // declare sensor as input
- Serial.begin(9600);
- }
- void loop(){
- val = digitalRead(inputPin); // read input value
- if (val == HIGH) { // check if the input is HIGH
- digitalWrite(ledPin, HIGH); // turn LED ON
- if (pirState == LOW) {
- // we have just turned on
- Serial.println("Motion detected!");
- // We only want to print on the output change, not state
- pirState = HIGH;
- }
- } else {
- digitalWrite(ledPin, LOW); // turn LED OFF
- if (pirState == HIGH){
- // we have just turned of
- Serial.println("Motion ended!");
- // We only want to print on the output change, not state
- pirState = LOW;
- }
- }
- }
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,
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
''' 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.
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: 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 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.
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.
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!
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 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.
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.
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
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*
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.
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.
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.#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/
ENDE