Connections to Xively working; has 5 channels on Xively (axl_x, axl_y, axl_z, heater_status, temperature)

Dependencies:   C12832_lcd EthernetInterface LM75B MMA7660 NTPClient libxively mbed-rtos mbed

Committer:
wren301
Date:
Sun May 18 02:24:22 2014 +0000
Revision:
1:0d467ac74808
Parent:
0:785d351db1ad
Child:
2:cf992d90396e
HW2 with SMS messages, before dismantling for HW5;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wren301 0:785d351db1ad 1 #include "mbed.h"
wren301 0:785d351db1ad 2 #include "EthernetInterface.h"
wren301 0:785d351db1ad 3 #include "NTPClient.h"
wren301 0:785d351db1ad 4 #include "C12832_lcd.h"
wren301 0:785d351db1ad 5 #include "LM75B.h"
wren301 0:785d351db1ad 6 #include "MMA7660.h"
wren301 1:0d467ac74808 7 #include "SimpleSMTPClient.h"
wren301 0:785d351db1ad 8
wren301 1:0d467ac74808 9 #define DOMAIN "comcast.net" //gmail.com
wren301 1:0d467ac74808 10 #define SERVER "smtp.comcast.net" //smtp.gmail.com
wren301 1:0d467ac74808 11 #define PORT "587" //25 or 587,465(OutBound Port25 Blocking ) 465
wren301 1:0d467ac74808 12 #define USER "patkionkar" //bhakti.kulkarni08
wren301 1:0d467ac74808 13 #define PWD "book#jungle" //bhakti0887
wren301 1:0d467ac74808 14 #define FROM_ADDRESS "patkionkar@comcast.net" //bhakti.kulkarni08
wren301 1:0d467ac74808 15 // TO_ADDRESS (Of some address is possible.)
wren301 1:0d467ac74808 16 // to-user1@domain, to-user2@domain, to-user3@domain ....
wren301 1:0d467ac74808 17 // The TO_ADDRESS are less than 128 characters.
wren301 1:0d467ac74808 18 #define TO_ADDRESS "wren301@gmail.com"
wren301 1:0d467ac74808 19 #define SUBJECT "Test Mail"
wren301 0:785d351db1ad 20 #define PST_OFFSET 7*60*60
wren301 0:785d351db1ad 21
wren301 0:785d351db1ad 22 Ticker timer;
wren301 0:785d351db1ad 23 C12832_LCD lcd; //Graphics LCD
wren301 0:785d351db1ad 24 EthernetInterface eth; //Networking functions
wren301 0:785d351db1ad 25 NTPClient ntp; //NTP client
wren301 0:785d351db1ad 26 LM75B tmp(p28,p27);
wren301 0:785d351db1ad 27 float setTemp = 74;
wren301 0:785d351db1ad 28 float temp;
wren301 0:785d351db1ad 29 int heaterOn = 0;
wren301 0:785d351db1ad 30 DigitalIn leftButton(p13);
wren301 0:785d351db1ad 31 DigitalIn rightButton(p16);
wren301 0:785d351db1ad 32 #define DEBOUNCE_DELAY 3
wren301 0:785d351db1ad 33 #define LOOP_DELAY_MS 100
wren301 0:785d351db1ad 34 #define TEMP_HYSTERESIS 2
wren301 0:785d351db1ad 35 //update time every 10 minutes
wren301 0:785d351db1ad 36 #define UPDATE_TIME 60*1
wren301 1:0d467ac74808 37 //temperature to send an sms to users at
wren301 1:0d467ac74808 38 #define ALERT_TEMP 95
wren301 1:0d467ac74808 39 //The alert will go off when it first crosses 90, and only reset in two
wren301 1:0d467ac74808 40 //cases:
wren301 1:0d467ac74808 41 //1. The temperature drops again to below ALERT_TEMP - ALERT_HYSTERESIS_TEMP
wren301 1:0d467ac74808 42 //2. ALERT_HYSTERESIS_TIME minutes pass after the first alert and the
wren301 1:0d467ac74808 43 //temperature is still over ALERT_TEMP
wren301 1:0d467ac74808 44 #define ALERT_HYSTERESIS_TEMP 2
wren301 1:0d467ac74808 45 #define ALERT_HYSTERESIS_TIME 2
wren301 1:0d467ac74808 46 int timeSinceLastSMS = ALERT_HYSTERESIS_TIME;
wren301 1:0d467ac74808 47 bool alertActive = true;
wren301 1:0d467ac74808 48
wren301 0:785d351db1ad 49 int pressed = 0;
wren301 0:785d351db1ad 50 int debounceCount = 0;
wren301 0:785d351db1ad 51 float avgTemp = 0;
wren301 0:785d351db1ad 52 MMA7660 MMA(p28, p27);
wren301 0:785d351db1ad 53 int updateTimeFromServer = 1;
wren301 0:785d351db1ad 54
wren301 0:785d351db1ad 55 void debouncedButtonCheck() {
wren301 0:785d351db1ad 56 if (leftButton || rightButton || pressed) {
wren301 0:785d351db1ad 57 if (leftButton && !pressed) {setTemp -= 2;}
wren301 0:785d351db1ad 58 if (rightButton && !pressed) {setTemp += 2;}
wren301 0:785d351db1ad 59 pressed = 1;
wren301 0:785d351db1ad 60 debounceCount++;
wren301 0:785d351db1ad 61 if (debounceCount >= DEBOUNCE_DELAY) {
wren301 0:785d351db1ad 62 debounceCount = 0;
wren301 0:785d351db1ad 63 pressed = 0;
wren301 0:785d351db1ad 64 printf("New set temp: %.0f\n\r", setTemp);
wren301 0:785d351db1ad 65 lcd.locate(0,0);
wren301 0:785d351db1ad 66 lcd.printf("\n\rTemp: %.0f F Set: %.0f\n\r", avgTemp, setTemp);
wren301 0:785d351db1ad 67 }
wren301 0:785d351db1ad 68 }
wren301 1:0d467ac74808 69 }
wren301 1:0d467ac74808 70
wren301 0:785d351db1ad 71 void connectToTheInternet() {
wren301 0:785d351db1ad 72 eth.init(); //Init and use DHCP
wren301 0:785d351db1ad 73 wait(2);
wren301 0:785d351db1ad 74 lcd.cls();
wren301 0:785d351db1ad 75 lcd.printf("Getting IP Address\r\n");
wren301 0:785d351db1ad 76 printf("Getting IP Address\r\n");
wren301 0:785d351db1ad 77 if(eth.connect(60000)!=0) {
wren301 0:785d351db1ad 78 lcd.printf("DHCP error - No IP");
wren301 0:785d351db1ad 79 wait(10);
wren301 0:785d351db1ad 80 } else {
wren301 0:785d351db1ad 81 lcd.printf("IP is %s\n", eth.getIPAddress());
wren301 0:785d351db1ad 82 printf("IP is %s\n", eth.getIPAddress());
wren301 0:785d351db1ad 83 wait(2);
wren301 0:785d351db1ad 84 }
wren301 0:785d351db1ad 85 lcd.cls();
wren301 0:785d351db1ad 86 }
wren301 0:785d351db1ad 87
wren301 1:0d467ac74808 88 void updateTimeRoutine() {
wren301 1:0d467ac74808 89 if (ntp.setTime("0.pool.ntp.org") == 0) {
wren301 1:0d467ac74808 90 printf("Time updated!");
wren301 1:0d467ac74808 91 } else {
wren301 1:0d467ac74808 92 lcd.locate(0,0);
wren301 1:0d467ac74808 93 printf("Time update failed \n\r");
wren301 1:0d467ac74808 94 lcd.printf("Time update failed");
wren301 1:0d467ac74808 95 }
wren301 1:0d467ac74808 96 updateTimeFromServer = 0;
wren301 1:0d467ac74808 97 }
wren301 1:0d467ac74808 98
wren301 0:785d351db1ad 99 void updateTime() {
wren301 0:785d351db1ad 100 updateTimeFromServer = 1;
wren301 0:785d351db1ad 101 }
wren301 0:785d351db1ad 102
wren301 1:0d467ac74808 103 void sendSMS() {
wren301 1:0d467ac74808 104 printf("SENDING SMS\n\r");
wren301 1:0d467ac74808 105 SimpleSMTPClient smtp;
wren301 1:0d467ac74808 106 int ret;
wren301 1:0d467ac74808 107 char msg[]="Hello SimpleSMTPClient ";
wren301 1:0d467ac74808 108 smtp.setFromAddress(FROM_ADDRESS);
wren301 1:0d467ac74808 109 smtp.setToAddress("6502700054@txt.att.net");
wren301 1:0d467ac74808 110 smtp.setMessage(SUBJECT,msg);
wren301 1:0d467ac74808 111 smtp.addMessage("TEST TEST TEST\r\n");
wren301 1:0d467ac74808 112 ret = smtp.sendmail(SERVER, USER, PWD, DOMAIN,PORT,SMTP_AUTH_PLAIN);
wren301 1:0d467ac74808 113 if (ret) {
wren301 1:0d467ac74808 114 printf("SMS Transmission Error\r\n");
wren301 1:0d467ac74808 115 } else {
wren301 1:0d467ac74808 116 printf("SMS Transmission OK\r\n");
wren301 1:0d467ac74808 117 }
wren301 1:0d467ac74808 118 timeSinceLastSMS = 0;
wren301 1:0d467ac74808 119 alertActive = 0;
wren301 1:0d467ac74808 120 }
wren301 1:0d467ac74808 121
wren301 0:785d351db1ad 122 int main()
wren301 0:785d351db1ad 123 {
wren301 0:785d351db1ad 124 connectToTheInternet();
wren301 0:785d351db1ad 125 //Variable to hold the current minute so we only update the display when the minute changes
wren301 0:785d351db1ad 126 char currentMinute[2];
wren301 0:785d351db1ad 127 currentMinute[1] = 'a';
wren301 0:785d351db1ad 128 char minute[2];
wren301 0:785d351db1ad 129 //float zaxis = MMA.z();
wren301 0:785d351db1ad 130
wren301 0:785d351db1ad 131 float currentTemp = -200;
wren301 0:785d351db1ad 132 lcd.printf("Updating time...\r\n");
wren301 0:785d351db1ad 133 printf("Updating time...\r\n");
wren301 0:785d351db1ad 134 if (ntp.setTime("0.pool.ntp.org") == 0) {
wren301 0:785d351db1ad 135 printf("Set time successfully\r\n");
wren301 0:785d351db1ad 136 lcd.cls();
wren301 0:785d351db1ad 137 timer.attach(&updateTime, UPDATE_TIME);
wren301 0:785d351db1ad 138 lcd.printf("\n\r\n\rHEATER OFF");
wren301 0:785d351db1ad 139
wren301 1:0d467ac74808 140 while(1) {
wren301 0:785d351db1ad 141 if(updateTimeFromServer) {
wren301 1:0d467ac74808 142 updateTimeRoutine();
wren301 0:785d351db1ad 143 }
wren301 0:785d351db1ad 144 //Checks button and sets setTemp accordingly
wren301 0:785d351db1ad 145 debouncedButtonCheck();
wren301 0:785d351db1ad 146 //Fetch the time
wren301 1:0d467ac74808 147 time_t ctTime;
wren301 0:785d351db1ad 148 ctTime = time(NULL)- PST_OFFSET;
wren301 0:785d351db1ad 149 char timeBuffer[32];
wren301 0:785d351db1ad 150
wren301 0:785d351db1ad 151 //See if the minute has changed; set an update display flag if it has
wren301 0:785d351db1ad 152 strftime(minute, 8, "%M", localtime(&ctTime));
wren301 0:785d351db1ad 153 if ( (minute[1] != currentMinute[1]) ) {
wren301 0:785d351db1ad 154 //Formats the time for display
wren301 0:785d351db1ad 155 strftime(timeBuffer, 32, "%a %b %d %I:%M%p\n\r", localtime(&ctTime));
wren301 0:785d351db1ad 156 printf("%s\r", timeBuffer);
wren301 0:785d351db1ad 157 lcd.locate(0,0);
wren301 0:785d351db1ad 158 lcd.printf("%s\r", timeBuffer);
wren301 0:785d351db1ad 159 currentMinute[1] = minute[1];
wren301 1:0d467ac74808 160 timeSinceLastSMS++;
wren301 0:785d351db1ad 161 }
wren301 1:0d467ac74808 162
wren301 0:785d351db1ad 163 //Update the temperature display if the temperature, set temp has changed
wren301 0:785d351db1ad 164 temp = tmp.read()*9.0/5.0 + 32.0;
wren301 0:785d351db1ad 165 //checks if the temperature (rounded to the nearest whole number) has changed
wren301 0:785d351db1ad 166 if (floor(temp+.5) != floor(currentTemp+.5)) {
wren301 0:785d351db1ad 167 printf("Temp: %.1f F Set: %.0f\n\r", temp, setTemp);
wren301 0:785d351db1ad 168 currentTemp = temp;
wren301 0:785d351db1ad 169 avgTemp = (temp+currentTemp)/2.0;
wren301 0:785d351db1ad 170 lcd.locate(0,0);
wren301 0:785d351db1ad 171 lcd.printf("\n\rTemp: %.0f F Set: %.0f\n\r", avgTemp, setTemp);
wren301 1:0d467ac74808 172 }
wren301 1:0d467ac74808 173
wren301 1:0d467ac74808 174 //If the temp has gone over a threshold, sends an SMS to the user
wren301 1:0d467ac74808 175 if ( temp > ALERT_TEMP ) {
wren301 1:0d467ac74808 176 if ((timeSinceLastSMS >= ALERT_HYSTERESIS_TIME) || alertActive ) {
wren301 1:0d467ac74808 177 sendSMS();
wren301 1:0d467ac74808 178 }
wren301 1:0d467ac74808 179 }
wren301 1:0d467ac74808 180 //reactivates SMS alert if temp goes a certain amount
wren301 1:0d467ac74808 181 //below the alert temperature
wren301 1:0d467ac74808 182 if ( !alertActive && (temp < (ALERT_TEMP - ALERT_HYSTERESIS_TEMP) ) ) {
wren301 1:0d467ac74808 183 alertActive = 1;
wren301 1:0d467ac74808 184 printf("Alert reactivated from temp drop");
wren301 1:0d467ac74808 185 }
wren301 1:0d467ac74808 186
wren301 0:785d351db1ad 187 lcd.locate(0,0);
wren301 0:785d351db1ad 188 //Heater logic: turns off if it has gone 2 degrees over the set temp, or on if it's 2 degrees under
wren301 0:785d351db1ad 189 if (heaterOn && (temp > (setTemp + TEMP_HYSTERESIS)) ) {
wren301 0:785d351db1ad 190 printf("Heater turned OFF\n\r");
wren301 0:785d351db1ad 191 heaterOn = 0;
wren301 0:785d351db1ad 192 lcd.locate(0,0);
wren301 0:785d351db1ad 193 lcd.printf("\n\r\n\rHEATER OFF");
wren301 0:785d351db1ad 194 } else if (!heaterOn && (temp < (setTemp - TEMP_HYSTERESIS)) ) {
wren301 0:785d351db1ad 195 printf("Heater turned ON\n\r");
wren301 0:785d351db1ad 196 heaterOn = 1;
wren301 0:785d351db1ad 197 lcd.locate(0,0);
wren301 0:785d351db1ad 198 lcd.printf("\n\r\n\rHEATER ON");
wren301 0:785d351db1ad 199 }
wren301 0:785d351db1ad 200 wait(LOOP_DELAY_MS*.001);
wren301 0:785d351db1ad 201 }
wren301 0:785d351db1ad 202 } else {
wren301 0:785d351db1ad 203 lcd.printf("NTP Error\r\n");
wren301 0:785d351db1ad 204 }
wren301 0:785d351db1ad 205 eth.disconnect();
wren301 0:785d351db1ad 206 }