Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Christmas lights 2013 */
- /* Andy Brown */
- /* define inputs (14 is analog0 15 is analog1) */
- #include <avr/wdt.h>
- int pir[] = {14,15,16,17,18};
- int led[] = {7,8,9,10,11,12,6};
- long ledstate[] = {0,0,0,0,0,0,0};
- int curstate[] = {LOW,LOW,LOW,LOW,LOW,LOW,LOW};
- int val = 0; // variable for reading the pin status
- int movement_trigger = 0;
- int normal_sequence = 0;
- int anymovement = 0;
- long loopcounter = 0;
- long sequence_trigger = 0;
- void setup() {
- pinMode(led[0], OUTPUT);
- pinMode(led[1], OUTPUT);
- pinMode(led[2], OUTPUT);
- pinMode(led[3], OUTPUT);
- pinMode(led[4], OUTPUT);
- pinMode(led[5], OUTPUT);
- pinMode(led[6], OUTPUT);
- pinMode(pir[0], INPUT); // declare sensor as input
- pinMode(pir[1], INPUT);
- pinMode(pir[2], INPUT);
- pinMode(pir[3], INPUT);
- pinMode(pir[4], INPUT);
- curstate[0] = LOW;
- curstate[1] = LOW;
- curstate[2] = LOW;
- curstate[3] = LOW;
- curstate[4] = LOW;
- curstate[5] = LOW;
- curstate[6] = LOW;
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], LOW);
- Serial.begin(9600);
- Serial.println("Setup init");
- wdt_enable(WDTO_4S);
- }
- void loop(){
- /* Check each PIR */
- for (int i=0; i <= 4; i++){
- val = digitalRead(pir[i]);
- wdt_reset();
- if (val == HIGH) {
- digitalWrite(led[i], LOW);
- digitalWrite(led[6], LOW);
- curstate[i]=HIGH;
- sequence_trigger=0;
- normal_sequence=0;
- ledstate[i]=loopcounter+700; // set loopcounter to when light went on
- Serial.println("PIR detected as on");
- Serial.println(i);
- } else {
- // check loopcounter, so we turn off only after a preset time
- if ((ledstate[i] <= loopcounter) && (curstate[i] == HIGH)) {
- digitalWrite(led[i], HIGH);
- ledstate[i]=0;
- curstate[i]=LOW;
- sequence_trigger=0;
- Serial.println("PIR switched off");
- Serial.println(i);
- };
- };
- };
- wdt_reset();
- if (sequence_trigger == 0) {
- for (int z=0; z <= 4; z++) {
- if (curstate[z] == LOW) {
- digitalWrite(led[z], HIGH);
- };
- };
- };
- loopcounter += 1;
- // Just to handle overflow here - reset things
- if (loopcounter > 1000000000) {
- loopcounter=0;
- for (int y=0; y <= 4; y++){
- ledstate[y] = 0;
- };
- sequence_trigger=0;
- Serial.println("Resetting all loops");
- };
- // Check to do sequencer
- if (ledstate[0] == 0 && ledstate[1] == 0 && ledstate[2] == 0 && ledstate[3] == 0 && ledstate[4] == 0) {
- if (sequence_trigger == 0) {
- sequence_trigger=loopcounter+3000;
- Serial.println("setting sequencer trigger values");
- };
- };
- if ((sequence_trigger < loopcounter) && (sequence_trigger != 0)) {
- sequencer();
- };
- wdt_reset();
- delay(2);
- wdt_reset();
- }
- void sequencer() {
- /* Do the sequence */
- /* normal_sequence = 0 all on
- 1 = 0 2 4
- 2 = 1 3 5
- 3 = 0 5 3
- 4 = 2 1 4
- 5 = 012345 flicker */
- wdt_reset();
- if (normal_sequence >= 6810 && normal_sequence <=7200) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], LOW);
- digitalWrite(led[2], LOW);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], LOW);
- digitalWrite(led[5], HIGH);
- digitalWrite(led[6], LOW);
- };
- if (normal_sequence >=6410 && normal_sequence <=6800) {
- digitalWrite(led[0], LOW);
- digitalWrite(led[1], LOW);
- digitalWrite(led[2], LOW);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], LOW);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], HIGH);
- };
- if (normal_sequence >=6010 && normal_sequence <=6400) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], LOW);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], LOW);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], HIGH);
- };
- if (normal_sequence >=5610 && normal_sequence <=6000) {
- digitalWrite(led[0], LOW);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], LOW);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], LOW);
- digitalWrite(led[5], HIGH);
- digitalWrite(led[6], LOW);
- };
- if (normal_sequence >=5210 && normal_sequence <=5600) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], LOW);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], LOW);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], HIGH);
- };
- if (normal_sequence >=4810 && normal_sequence <=5200) {
- digitalWrite(led[0], LOW);
- digitalWrite(led[1], LOW);
- digitalWrite(led[2], LOW);
- digitalWrite(led[3], LOW);
- digitalWrite(led[4], LOW);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], LOW);
- };
- if (normal_sequence >=4410 && normal_sequence <=4800) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], LOW);
- digitalWrite(led[2], LOW);
- digitalWrite(led[3], LOW);
- digitalWrite(led[4], LOW);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], LOW);
- };
- if (normal_sequence >=4010 && normal_sequence <=4400) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], LOW);
- digitalWrite(led[3], LOW);
- digitalWrite(led[4], LOW);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], LOW);
- };
- if (normal_sequence >=3610 && normal_sequence <=4000) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], LOW);
- digitalWrite(led[4], LOW);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], LOW);
- };
- if (normal_sequence >=3210 && normal_sequence <=3600) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], LOW);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], LOW);
- };
- if (normal_sequence >=2810 && normal_sequence <=3200) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], LOW);
- };
- if (normal_sequence >=2410 && normal_sequence <=2800) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], HIGH);
- digitalWrite(led[6], LOW);
- };
- if (normal_sequence >=2010 && normal_sequence <=2400) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], LOW);
- digitalWrite(led[6], HIGH);
- };
- if (normal_sequence >=1610 && normal_sequence <=2000) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], LOW);
- digitalWrite(led[5], HIGH);
- digitalWrite(led[6], HIGH);
- };
- if (normal_sequence >=1210 && normal_sequence <=1600) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], LOW);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], HIGH);
- digitalWrite(led[6], HIGH);
- };
- if (normal_sequence >=810 && normal_sequence <=1200) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], LOW);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], HIGH);
- digitalWrite(led[6], HIGH);
- };
- if (normal_sequence >=410 && normal_sequence <=800) {
- digitalWrite(led[0], HIGH);
- digitalWrite(led[1], LOW);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], HIGH);
- digitalWrite(led[6], HIGH);
- };
- if (normal_sequence >=0 && normal_sequence <=400) {
- digitalWrite(led[0], LOW);
- digitalWrite(led[1], HIGH);
- digitalWrite(led[2], HIGH);
- digitalWrite(led[3], HIGH);
- digitalWrite(led[4], HIGH);
- digitalWrite(led[5], HIGH);
- digitalWrite(led[6], HIGH);
- };
- normal_sequence++;
- if (normal_sequence > 7200) {normal_sequence=0;};
- wdt_reset();
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement