/* ----------SOBEaR v0.5b ----------- ¥ 6 LEDs, Green -> Red : DigitalPins 8 - 13 ¥ Alcohol Sensor : Analog5 ¥ Two servos, pour drinks : DigitalPins 2,3 ¥ 3way selector Button : Analog 0 - 2 joe saavedra, april 2009 */ int LED1 = 9; int LED2 = 8; int LED3 = 10; int LED4 = 11; int LED5 = 12; int LED6 = 13; int LEDcoast = 6; int alcSens = 5; int alcStatus = 0; int alcMin = 1000; int amt = 0; //amount to pour //int time; int button1 = 0; //int button2 = 1; //int button3 = 2; int buttonState = 0; int d = 100; //delay time //----- SERVO STUFF #include SoftwareServo servo1; SoftwareServo servo2; unsigned long startTime; boolean breathing = false; int breatheAmt = 0; void setup(){ pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); pinMode(LED6, OUTPUT); pinMode(LEDcoast, OUTPUT); servo1.attach(2); servo2.attach(4); Serial.begin(9600); } void loop(){ if (analogRead(alcSens) < alcMin){ alcMin = analogRead(alcSens); } alcStatus = analogRead(alcSens); Serial.println(alcStatus); if (breathing == true){ if (millis()-startTime < 10000){ if (amt > breatheAmt){ breatheAmt = amt; Serial.print("Higher amt: "); Serial.println(breatheAmt); } } else { amt = breatheAmt; Serial.print("Amt: "); Serial.println(amt); breathing = false; pour(breatheAmt); } } if (alcStatus > (alcMin + 450)){ amt = 6; checkButton(amt); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); digitalWrite(LED6, HIGH); } else if (alcStatus > (alcMin + 375)){ amt = 5; checkButton(amt); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); digitalWrite(LED6, LOW); } else if (alcStatus > (alcMin + 300)){ amt = 4; checkButton(amt); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } else if (alcStatus > (alcMin + 225)){ amt = 3; checkButton(amt); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } else if (alcStatus > (alcMin + 150)){ amt = 2; checkButton(amt); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } else if (alcStatus > (alcMin + 75)){ amt = 1; checkButton(amt); digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } else if (alcStatus > (alcMin) && (breathing == false)){ //----- "breathe" LED1 if alcSens has reached minimum for (int i = 0; i < 255; i+=5){ //analogWrite(LED1, i); analogWrite(LEDcoast, (255-i)); delay(10); checkButton(amt); } for (int i = 255; i > 5; i-=5){ //analogWrite(LED1, i); analogWrite(LEDcoast, (255-i)); delay(10); checkButton(amt); } amt = 0; checkButton(amt); digitalWrite(LED6,LOW); digitalWrite(LED5,LOW); digitalWrite(LED4,LOW); digitalWrite(LED3,LOW); digitalWrite(LED2,LOW); digitalWrite(LED1,LOW); } //Serial.println(alcSens); } void checkButton(int amt){ buttonState = analogRead(button1); //Serial.println(buttonState); if (buttonState > 1000 && breathing == false){ Serial.println("Button Pushed"); amt = 0; breathing = true; startTime = millis(); breatheAmt = 0; } if (buttonState < 1000){ SoftwareServo::refresh(); } } void pour(int amt){ if (amt == 0){ for (int j = 179; j>30; j-=1){ // pour lots of liquor if (j%12 == 0){ digitalWrite(LED1, LOW); // flash appropriate LEDs ON to indicate amount being poured digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); digitalWrite(LEDcoast, HIGH); } servo2.write(j); // write to servo delay(15); SoftwareServo::refresh(); // necessary to do frequently throughout if (j%24 == 0){ digitalWrite(LED1, LOW); // flash appropriate LEDs OFF digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); digitalWrite(LEDcoast, LOW); } } delay(4000); // hold the bottle for 4 seconds == 1 shot servo2Down(30); // return bottle to upright position for (int i = 5; i<5; i+=1){ // not so much mixer if (i%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } servo1.write(i); delay(15); SoftwareServo::refresh(); if (i%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } servo1Down(5); } if (amt == 1){ for (int j = 179; j>40; j-=1){ // pour lots of liquor if (j%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } servo2.write(j); delay(15); SoftwareServo::refresh(); if (j%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(3000); servo2Down(40); for (int i = 5; i<90; i+=1){ // not so much mixer if (i%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } servo1.write(i); delay(15); SoftwareServo::refresh(); if (i%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(1700); servo1Down(60); } if (amt == 2){ for (int j = 179; j>40; j-=1){ // pour liquor if (j%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } servo2.write(j); delay(15); SoftwareServo::refresh(); if (j%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(3000); servo2Down(40); for (int i = 5; i<90; i+=1){ // pour mixer if (i%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } servo1.write(i); delay(15); SoftwareServo::refresh(); if (i%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(3000); servo1Down(60); } if (amt == 3){ for (int j = 179; j>60; j-=1){ // pour liquor if (j%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } servo2.write(j); delay(15); SoftwareServo::refresh(); if (j%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(3000); servo2Down(60); for (int i = 5; i<90; i+=1){ // pour mixer if (i%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } servo1.write(i); delay(15); SoftwareServo::refresh(); if (i%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(3000); servo1Down(90); } if (amt == 4){ for (int j = 179; j>90; j-=1){ // pour liquor if (j%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } servo2.write(j); delay(15); SoftwareServo::refresh(); if (j%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(3000); servo2Down(90); for (int i = 5; i<90; i+=1){ // pour mixer if (i%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } servo1.write(i); delay(15); SoftwareServo::refresh(); if (i%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(3000); servo1Down(90); } if (amt == 5){ for (int j = 179; j>110; j-=1){ // pour liquor if (j%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); digitalWrite(LED6, LOW); } servo2.write(j); delay(15); SoftwareServo::refresh(); if (j%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(3000); servo2Down(110); for (int i = 5; i<120; i+=1){ // pour mixer if (i%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); digitalWrite(LED6, LOW); } servo1.write(i); delay(15); SoftwareServo::refresh(); if (i%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(3000); servo1Down(120); } if (amt == 6){ for (int j = 179; j>179; j-=1){ // pour not so much liquor if (j%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); digitalWrite(LED6, HIGH); } servo2.write(j); delay(15); SoftwareServo::refresh(); if (j%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } servo2Down(179); for (int i = 5; i<140; i+=1){ // lots of mixer if (i%12 == 0){ digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); digitalWrite(LED6, HIGH); } servo1.write(i); delay(15); SoftwareServo::refresh(); if (i%24 == 0){ digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); digitalWrite(LED6, LOW); } } delay(4000); servo1Down(140); } } void servo1Down(int i){ //delay(100); for (int k = i; k>5; k-=1){ servo1.write(k); delay(2); SoftwareServo::refresh(); } } void servo2Down(int j){ //delay(100); for (int l = j; l<179; l+=1){ servo2.write(l); delay(1); SoftwareServo::refresh(); } }