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() { pinMode(8, INPUT); currentState = Wait; void loop() { // Scans the sensors, looking for a change void GetInput() { //DebugSensorValue(); if (digitalRead(8) && !switchState) { //Serial.println(millis()-lastTime); } void ProcessState() { case BeginOrder: case ContinueOrder: case Order: case BeginCheck: case ContinueCheck: case Check: // 13 case OrderUrgent: case CheckUrgent: } // Based on currentState, updates the display of the lamps void DisplayStatus () { case BeginOrder: case ContinueOrder: case Order: digitalWrite(LED11, HIGH); case BeginCheck: case ContinueCheck: case OrderUrgent: case CheckUrgent: void blink(int Status) { // Status 0: UrgentOrder, Status 1: UrgentCheck else { }
for(int i=2; i
currentEvent = -1;
Serial.begin(9600);
}
GetInput();
ProcessState();
DisplayStatus();
}
// Returns a new currentEvent
for(int i=0;i
for(int i=0;i
currentEvent = i;
lastTime = millis();
}
}
/*
for(int i=0;i
if( (sensorValue[1] > thresholdValue1) && (currentEvent != 1) ) {
currentEvent = 1;
lastTime = millis();
}
if( (sensorValue[2] > thresholdValue2) && (currentEvent != 2) ) {
currentEvent = 1;
lastTime = millis();
}
}*/
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();
}
debug();
// Based on the currentState and the currentEvent, updates the state
switch(currentState) {
case Wait:
switch(currentEvent) {
case sensor1:
currentState = BeginOrder;
break;
case sensor3:
currentState = BeginCheck;
break;
}
currentEvent = -1;
break;
switch(currentEvent) {
case sensor2:
currentState = ContinueOrder;
break;
case sensor3:
case cancel:
case gestureTimeOut:
currentState = Wait;
break;
}
currentEvent = -1;
break;
switch(currentEvent) {
case sensor3:
currentState = Order;
break;
case sensor1:
case cancel:
case gestureTimeOut:
currentState = Wait;
break;
}
currentEvent = -1;
break;
switch(currentEvent) {
case urgentTimeOut:
currentState = OrderUrgent;
break;
case cancel:
currentState = Wait;
break;
}
currentEvent = -1;
break;
switch(currentEvent) {
case sensor2:
currentState = ContinueCheck;
break;
case sensor1:
case cancel:
case gestureTimeOut:
currentState = Wait;
break;
}
currentEvent = -1;
break;
switch(currentEvent) {
case sensor1:
currentState = Check;
break;
case sensor3:
case cancel:
case gestureTimeOut:
currentState = Wait;
break;
}
currentEvent = -1;
break;
switch(currentEvent) {
case cancel:
currentState = Wait;
break;
case urgentTimeOut:
currentState = CheckUrgent;
break;
}
currentEvent = -1;
break;
switch(currentEvent) {
case cancel:
currentState = Order;
break;
}
currentEvent = -1;
break;
switch(currentEvent) {
case cancel:
currentState = Check;
break;
}
currentEvent = -1;
break;
}
switch(currentState) { // LED11-2 12-3 21-4 22-5 31-6 32-7
case Wait:
for(int i=0;i
digitalWrite(LED11, HIGH);
break;
digitalWrite(LED11, HIGH);
digitalWrite(LED21, HIGH);
break;
digitalWrite(LED21, HIGH);
digitalWrite(LED31, HIGH);
break;
digitalWrite(LED32, HIGH);
break;
digitalWrite(LED32, HIGH);
digitalWrite(LED22, HIGH);
break;
case Check:
digitalWrite(LED32, HIGH);
digitalWrite(LED22, HIGH);
digitalWrite(LED12, HIGH);
break;
Serial.println("OrderUrgent");
blink(0);
break;
blink(1);
break;
}
}
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);
}
}
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);
}