The program is part of the assignment of CE713 Internet of Things. It provides a simple solution to activate an Escalator only when it really needs to be done by using a Sonar Sensor.

Dependencies:   EthernetNetIf HTTPServer TextLCD mbed

main.cpp

Committer:
Elleppi
Date:
2018-01-13
Revision:
0:e0539419df78

File content as of revision 0:e0539419df78:

#include "mbed.h"
#include "TextLCD.h"
#include "EthernetNetIf.h"
#include "HTTPServer.h"

TextLCD lcd(p15, p16, p17, p18, p19, p20);            // LCD: RS, E, D4-D7
SPI spi(p5, p6, p7);                                  // SPI: MOSI, MISO, SCLK (MISO not used with LCD)
DigitalOut lat(p8);                                   // data latch for LED driver TLC59281
DigitalOut Sel0(p26);                                 // input select bits:
DigitalOut Sel1(p25);                                 //  "
DigitalOut Sel2(p24);                                 //  "
DigitalIn In0(p14);                                   // input from switches, keypad etc
DigitalIn In1(p13);                                   //  "
DigitalIn In2(p12);                                   //  "
DigitalIn In3(p11);                                   //  "
I2C i2c(p9, p10);                                     // I2C: SDA, SCL pins
DigitalOut Trigger(p28);                              // Ultrasonic rangefinder trigger pin
DigitalIn  Echo(p27);                                 // Ultrasonic rangefinder echo pin
Timer Sonar;                                          // Ultrasonic timer
DigitalOut led1(LED1);                                
Serial out(USBTX, USBRX);                             
short LEDbits = 0;                                    // global led status used for readback

/*Functions used to initialize the Internet connection*/
/*LocalFileSystem fs("webfs");                         
EthernetNetIf eth;                                    
HTTPServer svr;                                       
Ticker WebUpdate;                                     // Interrupt timer to update web page                      //
                             
extern "C" void mbed_mac_address(char *mac);          

void WebServerPoll () {
    Net::poll();
    led1=!led1; //Show that we are alive
}

int InitWebServer() {
  EthernetErr ethErr = eth.setup();
  if(ethErr) {
    return -1;
  }

  FILE *fp = fopen("/webfs/index.htm", "w");          // Open "out.txt" on the local file system for writing
  fprintf(fp, "<html><head><title>Hello World online</title></head><body><h1>Hello World from Mbed NXP LPC1768!</h1></body></html>");
  fclose(fp);                                         // Close file
  FSHandler::mount("/webfs", "/files");               // Mount /webfs path on /files web path
  FSHandler::mount("/webfs", "/");                    // Mount /webfs path on web root path
  svr.addHandler<SimpleHandler>("/hello");
  svr.addHandler<RPCHandler>("/rpc");
  svr.addHandler<FSHandler>("/files");
  svr.addHandler<FSHandler>("/");                     // Default handler
  svr.bind(80);                                       // Example : http://155.245.21.144
  WebUpdate.attach(&WebServerPoll, 0.1);              // update webserver every 100ms
  return 0;                                           // return without error
}

void HTTPText(char t[4000]) {
  FILE *fp = fopen("/webfs/index.htm", "w");          // Open "out.txt" on the local file system for writing
  fprintf(fp, t);
  fclose(fp);
}*/

/*Function used to initialize the board sensors and actuators*/
int ReadSonar() {
    Trigger = 1;                                      // set sonar trigger pulse high
    Sonar.reset();                                    // reset sonar timer
    wait_us(10.0);                                    // 10 us pulse
    Trigger = 0;                                      // set sonar trigger pulse low
    while (Echo == 0) {};                             // wait for echo high (8 cycles have been transmitted)
    Sonar.start();                                    // echo high so start timer
    while (Echo == 1) {};                             // wait for echo low
    Sonar.stop();                                     // echo low so stop timer
    return (Sonar.read_us()*10)/58;                   // read timer and scale to mm
}

void InitLEDs() {
    lat = 0;                                          // latch must start low
    spi.format(16,0);                                 // SPI 16 bit data, low state, high going clock
    spi.frequency(1000000);                           // 1MHz clock rate
}

void SetLEDs(short ledall) {
    LEDbits = ledall;                                 // update global led status
    spi.write((LEDbits & 0x03ff) | ((LEDbits & 0xa800) >> 1) | ((LEDbits & 0x5400) << 1));
    lat = 1;                                          // latch pulse start 
    lat = 0;                                          // latch pulse end
}

void SetLED(short LEDNo, short LEDState) {
    LEDNo = ((LEDNo - 1) & 0x0007) + 1;               // limit led number
    LEDState = LEDState & 0x0003;                     // limit led state
    LEDNo = (8 - LEDNo) * 2;                          // offset of led state in 'LEDbits'
    LEDState = LEDState << LEDNo;
    short statemask = ((0x0003 << LEDNo) ^ 0xffff);   // mask used to clear led state
    LEDbits = ((LEDbits & statemask) | LEDState);     // clear and set led state
    SetLEDs(LEDbits);
}

void SelInput(short Input) {
    Sel0 = Input & 0x0001;                            // set sel[0:2] pins
    Sel1 = (Input >> 1) & 0x0001;                     //
    Sel2 = (Input >> 2) & 0x0001;                     //
}

short ReadSwitches() {
    SelInput(5);                                      // select least significant 4 switches in[3:0]
    short Switches = In0 + (In1 << 1) + (In2 << 2) + (In3 << 3);
    SelInput(4);                                      // select most significant 4 switches in[3:0]
    return (Switches + (In0 << 4) + (In1 << 5) + (In2 << 6) + (In3 << 7));
}

short ReadSwitch(short SwitchNo) {
    SwitchNo = ((SwitchNo - 1) & 0x0007) + 1;         // limit switch number
    SwitchNo = 8 - SwitchNo;                          // offset of switch state in ReadSwitches()
    short SwitchState = ReadSwitches();               // read switch states
    SwitchState = SwitchState >> SwitchNo;            // shift selected switch state into ls bit
    return (SwitchState & 0x0001);                    // mask out and return switch state 
}

/*Set reference distance:
if the distance sensed by the sonar is the same for 9 seconds,
it will be the reference distance, otherwise restart the cycle*/
int setDistance() {
    int D_temp = ReadSonar();
    int D;
    
    lcd.cls();
    lcd.printf("setting distance");

    SetLEDs(0);

    for(int i=0; i<9; i++) {
        D = ReadSonar();

        /*Allow an extra range of 10 mm for setting the distance*/
        if(D_temp - 10 < D && D_temp + 10 > D) {
            D_temp = D; //reset D_temp
            i = 0; //restart setting the distance
            SetLEDs(0);
        }
        else {
            wait(1);
            SetLED(i%9, 1);
        }
    }

    lcd.cls();
    lcd.printf("distance set at\n%d", D);
    wait(2);

    return D;
}

int main() {
    InitLEDs();                                      
    //InitWebServer();                             
    int D = setDistance();
    int D1;
    int T_ON = 0; //Time (seconds) the escalator is ON
    int T_tot = 0; //Time (seconds) since the system started working
    int timeSaved; //Time saved (seconds)
    int energySaved = 0; //Percentage of energy saved
    char ON = 0;
    
    //char Buffer[4000];
  
    while(1) {        
        D1 = ReadSonar();
        
        /*ESCALATOR_POWER_ON*/
        if(D1 < D - 10) { //Allow an extra range of 10 mm when sensing the distance
            T_ON++;
            ON = 1;
        }

        /*ESCALATOR_POWER_OFF*/
        else
            ON = 0;
        
        T_tot++;
        energySaved = 100 - ((100*T_ON)/T_tot); //(previously the escalator was always ON)
        timeSaved = T_tot - T_ON;
        
        int firstOnSwitch = 0; //used to identify the switch
        
        for (int a= 1; a < 9; a++ ) {                     // map Switch states to led's
            SetLED (a,(ReadSwitch(a) + 1));           
            
            if(ReadSwitch(a) == 1) {
                firstOnSwitch = a; 
            }
        }
        
        /*Display the data collected on the LCD of the board*/
        switch(firstOnSwitch)
        {
            /*Switch 1: percentage of energy saved*/
            case 1:
                lcd.cls();
                lcd.printf("Energy Saved =\n%d%c", energySaved, '%');
                break;

            /*Switch 2: total elapsed time since the system started working*/
            case 2:
                lcd.cls();
                lcd.printf("T_tot:\n%d", T_tot);
                break;

            /*Switch 3: amount of time the escalator has been ON*/
            case 3:
                lcd.cls();
                lcd.printf("T_ON =\n%d", T_ON);
                break;

            /*Switch 4: amount of time saved (time the escalator has been OFF)*/
            case 4:
                lcd.cls();
                lcd.printf("Time saved =\n%d", timeSaved);
                break;

            /*No Switch: current state of the escalator (ON/OFF)*/
            default:
                if(ON == 1) {
                    lcd.cls();
                    lcd.printf("Escalator\nON");
                }
                else {
                    lcd.cls();
                    lcd.printf("Escalator\nOFF");
                }
        }
        
        /*HTML and CSS code to be sent to the dedicated Web Page (MAC Address)*/
        /*sprintf(Buffer, "<!DOCTYPE html><html><head><title>Escalator Smart Switch</title></head><body><style type=\"text/css\">.tg  {border-collapse:collapse;border-spacing:0;border-color:#aabcfe;margin:0px auto;}.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#aabcfe;color:#669;background-color:#e8edff;}.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#aabcfe;color:#039;background-color:#b9c9fe;}.tg .tg-wfog{font-weight:bold;font-size:22px;color:#f56b00;text-align:center;vertical-align:top}.tg .tg-3v14{background-color:#D2E4FC;font-weight:bold;font-size:18px;text-align:center;vertical-align:top}.tg .tg-5frq{font-style:italic;text-align:center;vertical-align:top}.tg .tg-xqmu{background-color:#D2E4FC;font-style:italic;text-align:center;vertical-align:top}</style>");
        sprintf(Buffer + strlen(Buffer), "<table class=\"tg\"><tr><th class=\"tg-wfog\" colspan=\"3\">Escalator MAC ADDRESS</th></tr><tr><td class=\"tg-3v14\">Value</td><td class=\"tg-3v14\">Currently</td><td class=\"tg-3v14\">Previously</td></tr>");
        sprintf(Buffer + strlen(Buffer), "<tr><td class=\"tg-5frq\">Working Time</td><td class=\"tg-5frq\">%d seconds</td><td class=\"tg-5frq\">%d seconds</td></tr>", T_ON, T_tot);
        sprintf(Buffer + strlen(Buffer), "<tr><td class=\"tg-xqmu\">Working Time Saved</td><td class=\"tg-xqmu\" colspan=\"2\">%d seconds</td></tr>", timeSaved);
        sprintf(Buffer + strlen(Buffer), "<tr><td class=\"tg-5frq\">Energy Saved</td><td class=\"tg-5frq\" colspan=\"2\">%f</td></tr></table></body></html>", energySaved);
        HTTPText(Buffer);*/                             // write to index.htm
        
        wait(1);        
    }
}