Snack dispenser that is triggered by SMS over the internet
Dependencies: EthernetNetIf TextLCD mbed AX12
Diff: main.cpp
- Revision:
- 0:529c89c58910
- Child:
- 1:051c84fbac55
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Apr 11 23:02:19 2011 +0000 @@ -0,0 +1,192 @@ +#include "mbed.h" +#include "EthernetNetIf.h" +#include "HTTPClient.h" +#include "AX12.h" +#include "TextLCD.h" + +TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7 + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + +AX12 sm1 (p9, p10, 1); +AX12 sm2 (p9, p10, 2); + +EthernetNetIf eth; +HTTPClient http; + +void DeliverSnack1 () { + + float pos = 0.0; + float goal = 0.0; + + led1 = 1; + + // read the position of the servo + pos = sm1.GetPosition(); + + // work out where we need to position the servo + // we always align to 60^ boundary + + sm1.SetCRSpeed(0.7); + if ((pos > 0.0) && (pos < 60.0)) { + goal = 60.0; + } else if ((pos > 60.0) && (pos < 120.0)) { + goal = 120.0; + } else if ((pos > 120.0) && (pos < 180.0)) { + goal = 180.0; + } else if ((pos > 180.0) && (pos < 240.0)) { + goal = 240.0; + } else if ((pos > 240.0) && (pos < 295.0)) { + goal = 295.0; + } else { + goal = 2.0; + } + + do { + pos = sm1.GetPosition(); + // there is a quirk in the 300-360 dead band of the AX12 + // where it reads ~120^, briefly + if ((goal == 2.0) && (pos > 50.0)) { + pos = 0.0; + } + printf("%.2f\n",pos); + } while (pos < goal); + + + sm1.SetCRSpeed(0.0); + + wait (2.0); + led1 = 0; +} + +void DeliverSnack2 () { + + float pos = 0.0; + float goal = 0.0; + + led2 = 1; + + // read the position of the servo + pos = sm2.GetPosition(); + + // work out where we need to position the servo + // we always align to 60^ boundary + sm2.SetCRSpeed(0.7); + if ((pos > 0.0) && (pos < 60.0)) { + goal = 60.0; + } else if ((pos > 60.0) && (pos < 120.0)) { + goal = 120.0; + } else if ((pos > 120.0) && (pos < 180.0)) { + goal = 180.0; + } else if ((pos > 180.0) && (pos < 240.0)) { + goal = 240.0; + } else if ((pos > 240.0) && (pos < 295.0)) { + goal = 295.0; + } else { + goal = 2.0; + } + + do { + pos = sm2.GetPosition(); + // there is a quirk in the 300-360 dead band of the AX12 + // where it reads ~120^, briefly + if ((goal == 2.0) && (pos > 50.0)) { + pos = 0.0; + } + printf("%.2f\n",pos); + } while (pos < goal); + + sm2.SetCRSpeed(0.0); + + wait (2.0); + led2 = 0; +} + + +int main() { + + lcd.cls(); + lcd.locate(0,0); + lcd.printf("Snack-o-tron"); + lcd.locate(0,1); + + // set Servo to continusous rotation + lcd.printf(" Init Motors"); + //sm1.SetMode(1); + wait(0.5); + + lcd.locate(0,1); + lcd.printf(" Done "); + wait(0.5); + + lcd.locate(0,1); + lcd.printf(" Init Network"); + + printf("Setting up...\n"); + EthernetErr ethErr = eth.setup(); + if (ethErr) { + printf("Error %d in setup.\n", ethErr); + lcd.locate(0,1); + lcd.printf("Network Error %d",ethErr); + return -1; + } + + // let the world know all is well! + printf("Setup OK\n"); + lcd.locate(0,1); + lcd.printf(" Done "); + wait (2.0); + lcd.cls(); + + HTTPText txt; + + while (1) { + + lcd.cls(); + lcd.locate(0,0); + lcd.printf("Ready"); + + led4 = 1; // this LED flashed with every HTTP request, for sanity + HTTPResult r = http.get("http://danros.org.uk/py/snacks.py/snackcheck", &txt); + + if (r==HTTP_OK) { + + char sender[20]; + char snack[20]; + + sscanf(txt.gets(),"%s\n%s\n",sender,snack); + + if ( (strcmp ("0",sender)) == 0) { + printf("No snacks today\n"); + } else { + + printf("Sender : %s, Snack : %s\n", sender, snack); + lcd.cls(); + lcd.locate(0,0); + lcd.printf("%s",sender); + lcd.locate(0,1); + lcd.printf("Snack %s",snack); + + // What to do if snack 1 is ordered + if ( (strcmp ("1",snack)) == 0) { + DeliverSnack1(); + } + // what to do if snack 2 is ordered + else if ( (strcmp ("2",snack)) == 0) { + DeliverSnack2(); + } + } + + } else { + // HTTP error + printf("Error %d\n", r); + } + + // clear LEDs + led4 = 0; + wait (1.0); + } +}