Homework_5_IOT

Dependencies:   C12832_lcd EthernetInterface LCD_fonts LM75B MMA7660 NTPClient SimpleSMTPClient WebSocketClient mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
bhakti08
Date:
Tue May 20 06:18:16 2014 +0000
Commit message:
Websockets

Changed in this revision

C12832_lcd.lib Show annotated file Show diff for this revision Revisions of this file
DebouncedIn.cpp Show annotated file Show diff for this revision Revisions of this file
DebouncedIn.h Show annotated file Show diff for this revision Revisions of this file
EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
LCD_fonts.lib Show annotated file Show diff for this revision Revisions of this file
LM75B.lib Show annotated file Show diff for this revision Revisions of this file
MMA7660.lib Show annotated file Show diff for this revision Revisions of this file
NTPClient.lib Show annotated file Show diff for this revision Revisions of this file
SimpleSMTPClient.lib Show annotated file Show diff for this revision Revisions of this file
WebSocketClient.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/C12832_lcd.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/dreschpe/code/C12832_lcd/#468cdccff7af
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DebouncedIn.cpp	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,93 @@
+#include "DebouncedIn.h"
+#include "mbed.h"
+
+/*
+ * Constructor
+ */
+DebouncedIn::DebouncedIn(PinName in) 
+    : _in(in) {    
+        
+    // reset all the flags and counters    
+    _samples = 0;
+    _output = 0;
+    _output_last = 0;
+    _rising_flag = 0;
+    _falling_flag = 0;
+    _state_counter = 0;
+    
+    // Attach ticker
+    _ticker.attach(this, &DebouncedIn::_sample, 0.005);     
+}
+  
+void DebouncedIn::_sample() {
+
+    // take a sample
+    _samples = _samples >> 1; // shift left
+      
+    if (_in) {
+        _samples |= 0x80;
+    }  
+      
+    // examine the sample window, look for steady state
+    if (_samples == 0x00) {
+        _output = 0;
+    } 
+    else if (_samples == 0xFF) {
+        _output = 1;
+    }
+
+
+    // Rising edge detection
+    if ((_output == 1) && (_output_last == 0)) {
+        _rising_flag++;
+        _state_counter = 0;
+    }
+
+    // Falling edge detection
+    else if ((_output == 0) && (_output_last == 1)) {
+        _falling_flag++;
+        _state_counter = 0;
+    }
+    
+    // steady state
+    else {
+        _state_counter++;
+    }
+    
+   // update the output
+    _output_last = _output;
+    
+}
+
+
+
+// return number of rising edges
+int DebouncedIn::rising(void) {
+    int return_value = _rising_flag; 
+    _rising_flag = 0;
+    return(return_value);
+}
+
+// return number of falling edges
+int DebouncedIn::falling(void) {
+    int return_value = _falling_flag; 
+    _falling_flag = 0;
+    return(return_value);
+}
+
+// return number of ticsk we've bene steady for
+int DebouncedIn::steady(void) {
+return(_state_counter);
+}
+
+// return the debounced status
+int DebouncedIn::read(void) {
+    return(_output);
+}
+
+// shorthand for read()
+DebouncedIn::operator int() {
+    return read();
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DebouncedIn.h	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,31 @@
+#include "mbed.h"
+
+    class DebouncedIn {
+        public:      
+             DebouncedIn(PinName in);
+
+             int read (void);
+             operator int();
+              
+             int rising(void);
+             int falling(void);
+             int steady(void);
+              
+        private :    
+               // objects
+               DigitalIn _in;    
+               Ticker _ticker;
+
+               // function to take a sample, and update flags
+               void _sample(void);
+
+               // counters and flags
+               int _samples;
+               int _output;
+               int _output_last;
+               int _rising_flag;
+               int _falling_flag;
+               int _state_counter;
+
+    };
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/avnisha/code/EthernetInterface/#f0c3337842b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LCD_fonts.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/dreschpe/code/LCD_fonts/#d0b7d7bf1f56
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LM75B.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/chris/code/LM75B/#6a70c9303bbe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA7660.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Sissors/code/MMA7660/#a8e20db7901e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NTPClient.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/donatien/code/NTPClient/#881559865a93
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SimpleSMTPClient.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/sunifu/code/SimpleSMTPClient/#27053679f44b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebSocketClient.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/samux/code/WebSocketClient/#4567996414a5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,245 @@
+/*******************************************************/
+/*              IMPLEMENT THE THERMOSTAT               */
+/*System turned ON/OFF using joystick or Accelerometer */
+/*Temperature Set using Joystick                       */
+/*System Status and heater state shown on LED          */
+/*LCD displays: Time.                                  */
+/*              If system is ON current and set low    */
+/*                 and High Temperature                */
+/*              Heater/Cooler ON                       */
+/*              If system is OFF SYSTEM OFF            */
+/*The timing, current temperature, accelerometer reading*/
+/*are sent periodically to websockets.org/bhakti       */
+/*The duration after which the information is sent is  */
+/*defined by macro SECONDS which is currently set to 10*/
+/*******************************************************/
+
+#include "mbed.h"
+#include "C12832_lcd.h"
+#include "LM75B.h"
+#include "DebouncedIn.h"
+#include "MMA7660.h"
+#include "EthernetInterface.h"
+#include "NTPClient.h"
+#include "SimpleSMTPClient.h"
+#include "Small_6.h"
+#include "Websocket.h"
+
+#define hys 3
+#define HEATER 0
+#define COOLER 1
+#define No_HEAT_COOL 2
+#define SEND 1
+#define DO_NOT_SEND 0
+#define SECONDS 10
+
+DebouncedIn reset(p14);
+C12832_LCD lcd;
+LM75B current(p28,p27);
+MMA7660 MMA(p28, p27);
+Serial pc(USBTX,USBRX);
+AnalogIn max_temp(p19);
+AnalogIn min_temp(p20);
+
+//System ON/OFF
+BusIn heat_on (p16,p13); 
+                                      
+//System ON/OFF LED
+DigitalOut thermostat (LED1);
+
+//Heater/Cooler ON/OFF LED. This can be furthur connected to the relay                                  
+DigitalOut heater (LED2);  
+DigitalOut cooler (LED3);
+
+Ticker check_move;                                    
+Ticker Send_info;
+
+bool no_move;             //This variable is set if no movement is detected
+float acc_x = MMA.x();
+float acc_y = MMA.y();
+float acc_z = MMA.z();
+float acc_x_old,acc_y_old,acc_z_old;
+int heat_cool;     //1: Heater ON , 0:Cooler ON , 2: Heater and Cooler OFF
+bool send_info;    //This variable is used to define when the information is
+                   //to be sent to the web.
+
+/****************************************************************************/
+/*Function name: check: This function is used to detect motion around the   */
+/*thermostat.It sets the variable no move if the previous and current       */
+/*value of the accelerometer value is same. Accelerometer value unchanged   */
+/*indicates that there is no motion around the thermostat                   */
+/****************************************************************************/
+void check()
+{
+    acc_x_old = acc_x;
+    acc_y_old = acc_y;
+    acc_z_old = acc_z;
+    acc_x = MMA.x();
+    acc_y = MMA.y();
+    acc_z = MMA.z();
+    if (acc_x_old == acc_x && acc_y_old == acc_y && acc_z_old == acc_z)
+    {
+        no_move = 1;
+    }
+    else
+        no_move = 0;
+    
+}
+/******************************************************************************/
+
+/******************************************************************************/
+/*Function name: send_ws()                                                    */
+/*This function is used to set a boolean variable to SEND so that the         */
+/*information can be sent over the web. The variable is set to SEND after no. */
+/*of seconds defined by SECONDS(currently 10sec)                              */
+/******************************************************************************/
+void send_ws()
+{
+    send_info = SEND;
+}
+
+/*******************************************************************************/
+
+int main()
+{
+    int ret_msg,ret_msg2,ret_curr_time,eth_ret,ws_ret;
+    EthernetInterface eth;
+    lcd.cls();
+    pc.printf("\n\n/* SimpleMTPClient library demonstration \n");
+
+    pc.printf("Setting up ...\n");
+    eth.init();
+    eth_ret = eth.connect();
+    if (eth_ret != 0)
+    {
+        lcd.cls();
+        lcd.printf("Ethernet not connected");
+        return -1;
+    }
+    pc.printf("Connected OK\n");
+
+    // IP Address 
+    pc.printf("IP Address is %s\n", eth.getIPAddress());
+    lcd.locate(0,1);
+    lcd.printf("%s", eth.getIPAddress());
+    wait(2);
+   
+    
+    NTPClient ntp;
+    ntp.setTime("time.nist.gov");                                     
+    lcd.cls(); 
+    
+    Websocket ws("ws://sockets.mbed.org:443/ws/bhakti/rw");
+    ws_ret = ws.connect();
+    if (!ws_ret)
+    {
+        lcd.cls();
+        lcd.printf("Nor connected to URL");
+        return -1;
+    }
+    
+        /*Messages to be sent over the web*/
+    char msg[100];
+    char msg2[100];
+    char curr_time[100];
+                                                  
+    float min_set;
+    float max_set; 
+    
+    //This variable is used to check if the system is ON or OFF                                            
+    bool status=0;
+        
+    time_t ctTime;                         
+    lcd.cls();                 
+    check_move.attach(&check,120.0);
+    Send_info.attach(&send_ws,SECONDS);
+    while (1) {
+        sprintf(msg,"Temperature is %0.2f",current.read());
+        sprintf(msg2,"Accelerometer readings are X= %0.2f,Y= %0.2f, Z= %0.2f",MMA.x(),MMA.y(),MMA.z());
+              sprintf(curr_time,"Time: %s",ctime(&ctTime));
+        if (send_info == SEND) {
+            ret_msg2 = ws.send(msg2);
+            ret_msg = ws.send(msg);
+            ret_curr_time=ws.send(curr_time);
+            if (ret_msg == -1 || ret_msg2 == -1 || ret_curr_time == -1)
+            {
+                lcd.cls();
+                lcd.printf("One of the messages not sent");
+            }
+            send_info = DO_NOT_SEND;
+        }
+        min_set = min_temp.read() * 50;   //scale the pot value from 0 to 1 -> 0 to 50
+        max_set = max_temp.read() * 50;
+        ctTime = time(NULL) - 25200;      //Adjust time as per local time
+        lcd.set_font((unsigned char*) Small_6);  //set LCD font
+        lcd.locate(1,1);
+        lcd.printf("%s",ctime(&ctTime));                     
+        lcd.locate(1,8);
+          
+        /*If system is ON print current and set temperature*/
+        /*Else print LCD OFF on LCD*/
+                                           
+        if (status) {                                          
+            lcd.printf("Curr:%.2f",current.read());
+            lcd.locate(1,16);
+            lcd.printf("MAX:%0.2f, MIN:%0.2f",max_set,min_set);
+            lcd.locate(1,24);
+            switch (heat_cool) {
+                case HEATER : lcd.printf("Heater ON     ");
+                              break;
+                case COOLER : lcd.printf("Cooler ON     ");
+                              break;
+                case No_HEAT_COOL : lcd.printf("Heat/Cool OFF");
+                              break;
+            }
+            
+        } else {                                               
+            lcd.locate(1,10);
+            lcd.printf("System OFF");
+            wait (0.1);
+        }
+        
+        /*If system is turned ON: Joystick is pushed towards edge of LCD
+          OR movement is detected
+          Turn System ON LED on: LED1 and Set the status variable to 1
+          Else if system is turned OFF by user turn OFF the system status LED
+          and the LED that is connected to the relay*/
+          
+        if (heat_on == 0x2 || !no_move) 
+        {
+            thermostat = 1;                                    
+            status = 1;                                        
+        } else if (heat_on == 0x1 || no_move) {          
+            lcd.cls();                                        
+            thermostat = 0;                                    
+            heater = 0;                                       
+            status = 0;                                       
+        }
+        
+        //Comparison logic and turn Heater/Cooler ON/OFF
+        if ((min_set > (current.read()+ hys)) && thermostat == 1) {
+            heater =  1;
+            cooler = 0;
+            status = 1;
+            heat_cool = HEATER;
+        }
+        else if ((max_set < (current.read()-hys)) && thermostat == 1) {
+            cooler = 1;
+            heater = 0;
+            status = 1;
+            heat_cool = COOLER;    
+        }
+        else if (!thermostat) {
+            heater = 0;
+            cooler = 0;
+            status = 0;
+        }
+        else {
+            heater = 0;
+            cooler = 0;
+            status = 1;
+            heat_cool = No_HEAT_COOL;
+        }
+            
+     }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#88a1a9c26ae3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.lib	Tue May 20 06:18:16 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/bhakti08/code/mbed/#224ee686d3e5