« Paper for Applications class: M5 bus ride | Main | Getting started with Arduino Mini »

Code for Intelligent Restaurant Lamp

Here is the Arduino code for the Physical Computing Midterm, the Intelligent Restaurant Lamp.

It is based on three major code blocks: an event detection routine, an implementation of a finite state processor, and a state-dependent display routine.

/* Intelligent Restaurant Lamp v1.0

Physical Computing Midterm Project
October 17, 2006
revised: October 19, 2006

Younghyun Chung
Shinyoung Park
Gian Pablo Villamil

description here...

*/

// constants

#define numberLEDs 6
#define numberSensors 3
//#define thresholdValue1 0
//#define thresholdValue2 100
#define thresholdgestureTimeOut 3000
#define thresholdurgentTimeOut 5000 // 5 sec

// state definitions

#define Wait 0
#define BeginOrder 1
#define ContinueOrder 2
#define Order 3
#define OrderUrgent 4
#define BeginCheck 11
#define ContinueCheck 12
#define Check 13
#define CheckUrgent 14

// event definitions

#define sensor1 0
#define sensor2 1
#define sensor3 2
#define cancel 4
#define gestureTimeOut 5
#define urgentTimeOut 6

#define LED11 2
#define LED12 3
#define LED21 4
#define LED22 5
#define LED31 6
#define LED32 7


// variables

int currentState;
int currentEvent;
boolean switchState=false;//rona
int sensorValue[3];
int thresholdValue[3] = {100, 100, 100};
long lastTime = 0;

void setup() {
for(int i=2; i

pinMode(8, INPUT);

currentState = Wait;
currentEvent = -1;
Serial.begin(9600);
}

void loop() {
GetInput();
ProcessState();
DisplayStatus();
}

// Scans the sensors, looking for a change
// Returns a new currentEvent

void GetInput() {
for(int i=0;i

//DebugSensorValue();
for(int i=0;i if( (sensorValue[i] > thresholdValue[i]) && (currentEvent != i) ) {
currentEvent = i;
lastTime = millis();
}
}
/*
for(int i=0;i if
if( (sensorValue[1] > thresholdValue1) && (currentEvent != 1) ) {
currentEvent = 1;
lastTime = millis();
}
if( (sensorValue[2] > thresholdValue2) && (currentEvent != 2) ) {
currentEvent = 1;
lastTime = millis();
}
}*/

if (digitalRead(8) && !switchState) {
switchState = true;
currentEvent = cancel;
}
else if (!digitalRead(8) && switchState) {
switchState = false;
lastTime = millis();
}
if((millis() - lastTime) >= thresholdurgentTimeOut && (currentState==Order || currentState==Check)) {
currentEvent = urgentTimeOut;
lastTime = millis();
}
if((millis() - lastTime) >= thresholdgestureTimeOut && !(currentState==Order || currentState==Check)) {
currentEvent = gestureTimeOut;
// currentEvent = urgentTimeOut;
lastTime = millis();
}

//Serial.println(millis()-lastTime);
debug();

}
// Based on the currentState and the currentEvent, updates the state

void ProcessState() {
switch(currentState) {
case Wait:
switch(currentEvent) {
case sensor1:
currentState = BeginOrder;
break;
case sensor3:
currentState = BeginCheck;
break;
}
currentEvent = -1;
break;

case BeginOrder:
switch(currentEvent) {
case sensor2:
currentState = ContinueOrder;
break;
case sensor3:
case cancel:
case gestureTimeOut:
currentState = Wait;
break;
}
currentEvent = -1;
break;

case ContinueOrder:
switch(currentEvent) {
case sensor3:
currentState = Order;
break;
case sensor1:
case cancel:
case gestureTimeOut:
currentState = Wait;
break;
}
currentEvent = -1;
break;

case Order:
switch(currentEvent) {
case urgentTimeOut:
currentState = OrderUrgent;
break;
case cancel:
currentState = Wait;
break;
}
currentEvent = -1;
break;

case BeginCheck:
switch(currentEvent) {
case sensor2:
currentState = ContinueCheck;
break;
case sensor1:
case cancel:
case gestureTimeOut:
currentState = Wait;
break;
}
currentEvent = -1;
break;

case ContinueCheck:
switch(currentEvent) {
case sensor1:
currentState = Check;
break;
case sensor3:
case cancel:
case gestureTimeOut:
currentState = Wait;
break;
}
currentEvent = -1;
break;

case Check: // 13
switch(currentEvent) {
case cancel:
currentState = Wait;
break;
case urgentTimeOut:
currentState = CheckUrgent;
break;
}
currentEvent = -1;
break;

case OrderUrgent:
switch(currentEvent) {
case cancel:
currentState = Order;
break;
}
currentEvent = -1;
break;

case CheckUrgent:
switch(currentEvent) {
case cancel:
currentState = Check;
break;
}
currentEvent = -1;
break;

}
}

// Based on currentState, updates the display of the lamps

void DisplayStatus () {
switch(currentState) { // LED11-2 12-3 21-4 22-5 31-6 32-7
case Wait:
for(int i=0;i break;

case BeginOrder:
digitalWrite(LED11, HIGH);
break;

case ContinueOrder:
digitalWrite(LED11, HIGH);
digitalWrite(LED21, HIGH);
break;

case Order:

digitalWrite(LED11, HIGH);
digitalWrite(LED21, HIGH);
digitalWrite(LED31, HIGH);
break;

case BeginCheck:
digitalWrite(LED32, HIGH);
break;

case ContinueCheck:
digitalWrite(LED32, HIGH);
digitalWrite(LED22, HIGH);
break;


case Check:
digitalWrite(LED32, HIGH);
digitalWrite(LED22, HIGH);
digitalWrite(LED12, HIGH);
break;

case OrderUrgent:
Serial.println("OrderUrgent");
blink(0);
break;

case CheckUrgent:
blink(1);
break;
}
}

void blink(int Status) { // Status 0: UrgentOrder, Status 1: UrgentCheck
int BlinkTime = 250;
if (millis() % BlinkTime > (BlinkTime / 2)) {
for(int i=2+Status;i<=7;i+=2) { // if Status = 0 : i = 2 4 6, if 1: i = 3 5 7
digitalWrite(i, LOW);
}
}

else {
for(int i=2+Status;i<=7;i+=2) {
digitalWrite(i, HIGH);
}
}

}
void debug(){
Serial.print("currentState: ");
Serial.print(currentState);
Serial.print("\t");
Serial.print("currentEvent: ");
Serial.print(currentEvent);
Serial.print("\t");
Serial.println(millis() - lastTime);
}

TrackBack

TrackBack URL for this entry:
http://itp.nyu.edu/~gpv206/cgi-bin/mt/mt-tb.cgi/39

Post a comment

(If you haven't left a comment here before, you may need to be approved by the site owner before your comment will appear. Until then, it won't appear on the entry. Thanks for waiting.)