Ich hab aus aktuellem Anlass für ein Flipperautomat eines Kumpels, mithilfe eines ATTiny84A (den ich aus dem Funk-Projekt noch zu genüge hier habe) ein Rundumlicht geschrieben.
Zunächst hatte ich nur einen Modus, wo immer nur eine LED an war und dann nacheinander die nächste LED geschaltet wurde..
Im laufe des ausprobierens hab ich dann noch einen Modus geschrieben bei der jeweils 2 gegenüberliegende LEDs gleichzeitig an sind.
Der ein oder andere kennt das vielleicht dass manche Blaulichter entweder nur einen Spiegel haben welcher sich um die Lampe dreht und somit dem 2.Modus entsprechen würde - aber andere Blaulichter haben 2 Spiegel und lassen das Licht somit sowohl nach vorne als auch nach hinten durch - das wäre dann eben der 1.Modus
Im laufe der Bastel-Session haben wir uns dann dazu entschlossen mithilfe eines einfachen Schalters zwischen den beiden Modis umschalten zu können; da wir uns nicht auf nur einen Modus festlegen konnten - weil beide geil sind
Also hab ich den Sketch dahingegend erweitert das einer der I/O Ports auf ein PinChange-Interrupt reagiert und man in real-time einfach zwischen den beiden Modis hin und her schalten kann
Ich hab die Sketches so geschrieben dass man nur anzugeben brauch wie viele LEDs man nutzen möchte: es könnten mit dem ATtiny84 maximal 11 LEDs genutzt werden - wobei wir letztlich nur 8 nutzen.. (angeordnet in einem 8-Eck)
In dem Sketch gibt es zwei Zeitwerte (Angabe in Millisekunden) die man einstellen kann:
- ledONdelay -> Wie lange die LED an sein soll, also die Brenndauer
- nextDELAY -> Die Pause zwischen den LEDs, also wie viel ms vergehen soll bis die nächste LED an geht
Ein Video folgt später - kam gestern nicht mehr dazu
1. Modus:
Spoiler anzeigen
// Rundumlicht (Blaulicht) - by meigrafd @ 28.05.2014
//------------------------------------------------------------------------------
#include <stdio.h>
//------------------------------------------------------------------------------
#define ledONdelay 35 // how long should the LED be on?
#define nextDELAY 30 // wait this many ms between next LED. 1000ms = 1sec
//------------------------------------------------------------------------------
// LED-Konfiguration
//------------------------------------------------------------------------------
#define USE_LEDS 8 //how many LEDs you want to use? See wiring list below
//if you want to use LED1 till LED4 then you must set USE_LEDS to 4
/* For wiring only:
LED1 --> connected on D0 (ATtiny pin 2)
LED2 --> connected on D1 (ATtiny pin 3)
LED3 --> connected on D2 (ATtiny pin 5)
LED4 --> connected on D3 (ATtiny pin 6)
LED5 --> connected on D4 (ATtiny pin 7)
LED6 --> connected on D5 (ATtiny pin 8)
LED7 --> connected on D6 (ATtiny pin 9)
LED8 --> connected on D7 (ATtiny pin 10)
LED9 --> connected on D8 (ATtiny pin 11)
LED10 --> connected on D9 (ATtiny pin 12)
LED11 --> connected on D10 (ATtiny pin 13)
+-\/-+
VCC 1| |14 GND
(D0) PB0 2| |13 PA0 AREF (D10)
(D1) PB1 3| |12 PA1 (D9)
(RESET) PB3 4| |11 PA2 (D8)
PWM (D2) PB2 5| |10 PA3 (D7)
PWM (D3) PA7 6| |9 PA4 (D6)
PWM (D4) PA6 7| |8 PA5 (D5) PWM
+----+
*/
//##############################################################################
int LED[11]; // stellt Array bereit welches _maximal_ 11 Zeichen aufnehmen kann
//#define ARRAY_SIZE(LED) (sizeof(LED) / sizeof(*LED))
void initLEDS() {
LED[0] = 0; //connected on D0 (ATtiny pin 2)
LED[1] = 1; //connected on D1 (ATtiny pin 3)
LED[2] = 2; //connected on D2 (ATtiny pin 5)
LED[3] = 3; //connected on D3 (ATtiny pin 6)
LED[4] = 4; //connected on D4 (ATtiny pin 7)
LED[5] = 5; //connected on D5 (ATtiny pin 8)
LED[6] = 6; //connected on D6 (ATtiny pin 9)
LED[7] = 7; //connected on D7 (ATtiny pin 10)
LED[8] = 8; //connected on D8 (ATtiny pin 11)
LED[9] = 9; //connected on D9 (ATtiny pin 12)
LED[10] = 10; //connected on D10 (ATtiny pin 13)
int i;
for (i = 0; i < USE_LEDS; i++) {
pinMode(LED[i], OUTPUT); // set LED pin to output
digitalWrite(LED[i], LOW); // turn LED off
}
}
void activityLed (byte pin, byte time) {
pinMode(pin, OUTPUT); // set LED pin to output
digitalWrite(pin, 1);
delay(time);
digitalWrite(pin, !1);
}
//##############################################################################
// init Setup
void setup() {
initLEDS();
}
// Loop
void loop() {
int i;
for (i = 0; i < USE_LEDS; i++) {
activityLed(LED[i], ledONdelay);
delay(nextDELAY);
}
}
Alles anzeigen
1. & 2. Modus:
Spoiler anzeigen
// Rundumlicht (Blaulicht) with 2 Modis and a switch - by meigrafd @ 30.05.2014
//------------------------------------------------------------------------------
#include <stdio.h>
#include <PinChangeInterrupt.h> // http://code.google.com/p/arduino-tiny/downloads/list
//------------------------------------------------------------------------------
#define ledONdelay_ONE 35 // how long should the LED be on? (brenndauer)
#define nextDELAY_ONE 30 // wait this many ms between next LED. 1000ms = 1sec (pause zwischen den LEDs)
#define ledONdelay_TWO 35 // how long should the LED be on?
#define nextDELAY_TWO 85 // wait this many ms between next LED. 1000ms = 1sec
#define USE_LEDS 8 //how many LEDs you want to use? See wiring list below
//if you want to use LED1 till LED4 then you must set USE_LEDS to 4
#define SW_PIN 9 // Switch connected from ground to this pin (D9/ATtiny pin 12)
//------------------------------------------------------------------------------
/*
+-\/-+
VCC 1| |14 GND
(D0) PB0 2| |13 PA0 AREF (D10)
(D1) PB1 3| |12 PA1 (D9)
(RESET) PB3 4| |11 PA2 (D8)
PWM (D2) PB2 5| |10 PA3 (D7)
PWM (D3) PA7 6| |9 PA4 (D6)
PWM (D4) PA6 7| |8 PA5 (D5) PWM
+----+
*/
//##############################################################################
// SwitchState
int switchState;
int LED[11]; // stellt Array bereit welches _maximal_ 11 Zeichen aufnehmen kann
void initLEDS() {
LED[0] = 0; //connected on D0 (ATtiny pin 2)
LED[1] = 1; //connected on D1 (ATtiny pin 3)
LED[2] = 2; //connected on D2 (ATtiny pin 5)
LED[3] = 3; //connected on D3 (ATtiny pin 6)
LED[4] = 4; //connected on D4 (ATtiny pin 7)
LED[5] = 5; //connected on D5 (ATtiny pin 8)
LED[6] = 6; //connected on D6 (ATtiny pin 9)
LED[7] = 7; //connected on D7 (ATtiny pin 10)
LED[8] = 8; //connected on D8 (ATtiny pin 11)
LED[9] = 9; //connected on D9 (ATtiny pin 12)
LED[10] = 10; //connected on D10 (ATtiny pin 13)
int i;
for (i = 0; i < USE_LEDS; i++) {
pinMode(LED[i], OUTPUT); // set LED pin to output
digitalWrite(LED[i], LOW); // turn LED off
}
}
void activityLed (byte pin, byte time) {
pinMode(pin, OUTPUT); // set LED pin to output
digitalWrite(pin, 1);
delay(time);
digitalWrite(pin, !1);
}
//##############################################################################
// init Setup
void setup() {
initLEDS();
pinMode(SW_PIN, INPUT); //set the switch pin to input
digitalWrite(SW_PIN, HIGH); //use the internal pullup resistor
attachPcInterrupt(SW_PIN, wakeUp, FALLING); //attach a PinChange Interrupt on the falling edge
}
void wakeUp(){}
// Loop
void loop() {
int State = digitalRead(SW_PIN); // Read the state of the switch
if (State == LOW) { // Switch is open
switchState = 1; // 1 indicates open
} else { // Switch is closed
switchState = 0; // 0 indicates closed
}
if (switchState == 1) {
int i;
for (i = 0; i < USE_LEDS; i++) {
activityLed(LED[i], ledONdelay_ONE);
delay(nextDELAY_ONE);
}
} else {
digitalWrite(LED[0], 1);
digitalWrite(LED[4], 1);
delay(ledONdelay_TWO);
digitalWrite(LED[0], 0);
digitalWrite(LED[4], 0);
delay(nextDELAY_TWO);
digitalWrite(LED[1], 1);
digitalWrite(LED[5], 1);
delay(ledONdelay_TWO);
digitalWrite(LED[1], 0);
digitalWrite(LED[5], 0);
delay(nextDELAY_TWO);
digitalWrite(LED[2], 1);
digitalWrite(LED[6], 1);
delay(ledONdelay_TWO);
digitalWrite(LED[2], 0);
digitalWrite(LED[6], 0);
delay(nextDELAY_TWO);
digitalWrite(LED[3], 1);
digitalWrite(LED[7], 1);
delay(ledONdelay_TWO);
digitalWrite(LED[3], 0);
digitalWrite(LED[7], 0);
delay(nextDELAY_TWO);
}
}
Alles anzeigen
Viel Spass damit
//EDIT: Final Sketch sowie Video siehe vorletzter bzw letzter Spoiler in Beitrag#13