AC and lights remotely controlled over Wifi, or set to automatic

Dependencies:   DS1820 mbed

Fork of ACandLightsandWifi by Joe Zacaroli

Committer:
jzacaroli
Date:
Fri Jun 17 15:35:04 2016 +0000
Revision:
1:7fff8f0dce62
Parent:
0:e5aa1648b1c5
AC/Lights over Wifi

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jzacaroli 1:7fff8f0dce62 1 /* Simpler prog based on the serial passthrough code to enable a command line driven test of esp8266
jzacaroli 1:7fff8f0dce62 2 * wifi modules.
jzacaroli 1:7fff8f0dce62 3 * NB this uses the mbed sleep() command to form a low power system but on some MCUs this is a problem
jzacaroli 1:7fff8f0dce62 4 * this works fine on an lpc1768 but not as yet on the KL25Z
jzacaroli 1:7fff8f0dce62 5 */
wadh4587 0:e5aa1648b1c5 6
jzacaroli 1:7fff8f0dce62 7 #include "mbed.h"
jzacaroli 1:7fff8f0dce62 8 #include "DS1820.h"
jzacaroli 1:7fff8f0dce62 9
wadh4587 0:e5aa1648b1c5 10 Serial pc(USBTX, USBRX); // serial terminal for the pc connection
wadh4587 0:e5aa1648b1c5 11 Serial dev(PTE0,PTE1); // for KL25Z... asuming one can't use the PTA1 version which is the stdio
jzacaroli 1:7fff8f0dce62 12 DigitalOut led1(LED1); // two leds
jzacaroli 1:7fff8f0dce62 13 DigitalOut led2(LED2); // to allow visual check of bidirectional comms
jzacaroli 1:7fff8f0dce62 14 DigitalOut led3(LED3); //third led to check status of loading
jzacaroli 1:7fff8f0dce62 15 DigitalOut rst(PTD7); // single digital pin to drive the esp8266 reset line
jzacaroli 1:7fff8f0dce62 16
jzacaroli 1:7fff8f0dce62 17
jzacaroli 1:7fff8f0dce62 18 PwmOut Lights(PTE31); // Output to the lighting system
jzacaroli 1:7fff8f0dce62 19 AnalogIn V1(PTB0); // Input from the LDR voltage level telling us brightness information
jzacaroli 1:7fff8f0dce62 20
jzacaroli 1:7fff8f0dce62 21 const int MAX_PROBES = 1;
jzacaroli 1:7fff8f0dce62 22 DS1820* probe[MAX_PROBES];
jzacaroli 1:7fff8f0dce62 23 DigitalOut fan(PTB11);
jzacaroli 1:7fff8f0dce62 24
jzacaroli 1:7fff8f0dce62 25 bool AUTO = false; //Sets whether we are sending data to the server or not
jzacaroli 1:7fff8f0dce62 26 float Temp = 0;
jzacaroli 1:7fff8f0dce62 27 int Dummy = 0;
jzacaroli 1:7fff8f0dce62 28 float intensity = 0;
jzacaroli 1:7fff8f0dce62 29 int LightStatus = 0;
jzacaroli 1:7fff8f0dce62 30 int START = 0;
jzacaroli 1:7fff8f0dce62 31
jzacaroli 1:7fff8f0dce62 32 // subroutine to run anytime a serial interrupt arrives from the device
jzacaroli 1:7fff8f0dce62 33 // this basically passes everything thatthe device produces on to the pc terminal screen
jzacaroli 1:7fff8f0dce62 34 /*void dev_recv()
jzacaroli 1:7fff8f0dce62 35 {
jzacaroli 1:7fff8f0dce62 36
jzacaroli 1:7fff8f0dce62 37 led1 = !led1;
jzacaroli 1:7fff8f0dce62 38 while(dev.readable()) {
jzacaroli 1:7fff8f0dce62 39 pc.putc(dev.getc());
jzacaroli 1:7fff8f0dce62 40
jzacaroli 1:7fff8f0dce62 41 }
jzacaroli 1:7fff8f0dce62 42 }*/
jzacaroli 1:7fff8f0dce62 43 // subroutine to service the serial interrupt on the pc connection
jzacaroli 1:7fff8f0dce62 44 // this is a bit more complex - it takes what the use sends on the pc and copies it on to the device
jzacaroli 1:7fff8f0dce62 45 // the esp should echo these straight back to the the pc if all is well
jzacaroli 1:7fff8f0dce62 46 // this also detects the end of command character which is ascii 13 (0x0d) adn adds a linefeed after it =asscii 10 (0x0a)
jzacaroli 1:7fff8f0dce62 47 /*void pc_recv()
jzacaroli 1:7fff8f0dce62 48 {
jzacaroli 1:7fff8f0dce62 49 char c;
jzacaroli 1:7fff8f0dce62 50 led2 = !led2;
jzacaroli 1:7fff8f0dce62 51 while(pc.readable()) {
jzacaroli 1:7fff8f0dce62 52 c = pc.getc();
jzacaroli 1:7fff8f0dce62 53 dev.putc(c);
jzacaroli 1:7fff8f0dce62 54 // pc.putc(c); // echo back
jzacaroli 1:7fff8f0dce62 55 if(c==13) {
jzacaroli 1:7fff8f0dce62 56 dev.putc(10); // send the linefeed to complement the carriage return generated by return key on the pc
jzacaroli 1:7fff8f0dce62 57 pc.putc(10);
jzacaroli 1:7fff8f0dce62 58 }
jzacaroli 1:7fff8f0dce62 59 }
jzacaroli 1:7fff8f0dce62 60 }
jzacaroli 1:7fff8f0dce62 61 */
jzacaroli 1:7fff8f0dce62 62 void NEWMESSAGE()
jzacaroli 1:7fff8f0dce62 63 {
jzacaroli 1:7fff8f0dce62 64 char message;
jzacaroli 1:7fff8f0dce62 65 pc.putc('#');
jzacaroli 1:7fff8f0dce62 66 while (dev.readable()) {
jzacaroli 1:7fff8f0dce62 67 message= (char)dev.getc();
jzacaroli 1:7fff8f0dce62 68 pc.putc(message);
jzacaroli 1:7fff8f0dce62 69 if(message==':') {
jzacaroli 1:7fff8f0dce62 70 message= (char)dev.getc();
jzacaroli 1:7fff8f0dce62 71 break;
jzacaroli 1:7fff8f0dce62 72 }
jzacaroli 1:7fff8f0dce62 73 }
jzacaroli 1:7fff8f0dce62 74 if(message == 'G') {
jzacaroli 1:7fff8f0dce62 75 START = 1;
jzacaroli 1:7fff8f0dce62 76 }
jzacaroli 1:7fff8f0dce62 77 if(message == 'Q') {
jzacaroli 1:7fff8f0dce62 78 AUTO=!AUTO;
jzacaroli 1:7fff8f0dce62 79 pc.printf("AUTO=!AUTO\r\n",AUTO);
jzacaroli 1:7fff8f0dce62 80 pc.putc(message);
jzacaroli 1:7fff8f0dce62 81 }
jzacaroli 1:7fff8f0dce62 82 if(message == 'K') {
jzacaroli 1:7fff8f0dce62 83 fan = 1;
jzacaroli 1:7fff8f0dce62 84 pc.putc(message);
jzacaroli 1:7fff8f0dce62 85 }
jzacaroli 1:7fff8f0dce62 86 if(message == 'L') {
jzacaroli 1:7fff8f0dce62 87 fan = 0;
jzacaroli 1:7fff8f0dce62 88 pc.putc(message);
jzacaroli 1:7fff8f0dce62 89 }
jzacaroli 1:7fff8f0dce62 90 if(message == 'Z') {
jzacaroli 1:7fff8f0dce62 91 Lights = 0;
jzacaroli 1:7fff8f0dce62 92 LightStatus = 0;
jzacaroli 1:7fff8f0dce62 93 pc.putc(message);
jzacaroli 1:7fff8f0dce62 94 }
jzacaroli 1:7fff8f0dce62 95 if(message == 'X') {
jzacaroli 1:7fff8f0dce62 96 Lights = 0.1;
jzacaroli 1:7fff8f0dce62 97 LightStatus = 1;
jzacaroli 1:7fff8f0dce62 98 pc.putc(message);
jzacaroli 1:7fff8f0dce62 99 }
jzacaroli 1:7fff8f0dce62 100 if(message == 'Y') {
jzacaroli 1:7fff8f0dce62 101 Lights = 0.5;
jzacaroli 1:7fff8f0dce62 102 LightStatus = 2;
jzacaroli 1:7fff8f0dce62 103 pc.putc(message);
jzacaroli 1:7fff8f0dce62 104 }
jzacaroli 1:7fff8f0dce62 105 if(message == 'W') {
jzacaroli 1:7fff8f0dce62 106 Lights = 1;
jzacaroli 1:7fff8f0dce62 107 LightStatus = 3;
jzacaroli 1:7fff8f0dce62 108 pc.putc(message);
jzacaroli 1:7fff8f0dce62 109 }
jzacaroli 1:7fff8f0dce62 110 }
jzacaroli 1:7fff8f0dce62 111
wadh4587 0:e5aa1648b1c5 112 int main()
wadh4587 0:e5aa1648b1c5 113 {
wadh4587 0:e5aa1648b1c5 114 pc.baud(115200);
jzacaroli 1:7fff8f0dce62 115 dev.baud(115200);
jzacaroli 1:7fff8f0dce62 116 printf("Start \r\n");
jzacaroli 1:7fff8f0dce62 117 rst=0;
jzacaroli 1:7fff8f0dce62 118 wait(3);
jzacaroli 1:7fff8f0dce62 119 rst = 1; // send the esp8266 reset
jzacaroli 1:7fff8f0dce62 120 wait(1);
jzacaroli 1:7fff8f0dce62 121
wadh4587 0:e5aa1648b1c5 122
jzacaroli 1:7fff8f0dce62 123 // pc.attach(&pc_recv, Serial::RxIrq); // attach the two interrupt services
jzacaroli 1:7fff8f0dce62 124 // dev.attach(&dev_recv, Serial::RxIrq);
jzacaroli 1:7fff8f0dce62 125 wait(5);
jzacaroli 1:7fff8f0dce62 126 dev.printf("AT+RST\r\n");
jzacaroli 1:7fff8f0dce62 127 wait(10);
jzacaroli 1:7fff8f0dce62 128 dev.printf("AT+CWJAP=\"BTHub3-WXWX\",\"fdd6f7c682\"\r\n"); //Don't necessarily need this line as it already should connect
jzacaroli 1:7fff8f0dce62 129 wait(10);
jzacaroli 1:7fff8f0dce62 130 dev.printf("AT+CIPMUX=1\r\n");
jzacaroli 1:7fff8f0dce62 131 wait(1);
jzacaroli 1:7fff8f0dce62 132 dev.printf("AT+CIPSTART=4,\"TCP\",\"192.168.1.95\",333\r\n");
jzacaroli 1:7fff8f0dce62 133 wait(2);
jzacaroli 1:7fff8f0dce62 134 /*dev.printf("AT+CIPSEND=4,4\r\n");
jzacaroli 1:7fff8f0dce62 135 wait(1);
jzacaroli 1:7fff8f0dce62 136 dev.printf("TEST\r\n");
jzacaroli 1:7fff8f0dce62 137 wait(1);*/
jzacaroli 1:7fff8f0dce62 138
jzacaroli 1:7fff8f0dce62 139 dev.attach(&NEWMESSAGE); //Interrupts and tells us to carry on sending data or not
jzacaroli 1:7fff8f0dce62 140
jzacaroli 1:7fff8f0dce62 141
jzacaroli 1:7fff8f0dce62 142
jzacaroli 1:7fff8f0dce62 143
jzacaroli 1:7fff8f0dce62 144
wadh4587 0:e5aa1648b1c5 145 while(1) {
jzacaroli 1:7fff8f0dce62 146 if(START == 0) {
jzacaroli 1:7fff8f0dce62 147 Dummy = 1 - Dummy;
jzacaroli 1:7fff8f0dce62 148 //pc.printf("Off");
jzacaroli 1:7fff8f0dce62 149 }
jzacaroli 1:7fff8f0dce62 150
jzacaroli 1:7fff8f0dce62 151 else if(START == 1) {
jzacaroli 1:7fff8f0dce62 152 pc.printf("Start = 1\r\n");
jzacaroli 1:7fff8f0dce62 153
jzacaroli 1:7fff8f0dce62 154 if(AUTO) {//***************AUTOMATIC MODE***********************//
jzacaroli 1:7fff8f0dce62 155
jzacaroli 1:7fff8f0dce62 156 pc.printf("AUTO\r\n");
jzacaroli 1:7fff8f0dce62 157 //Code which reads temperature and sets fan on/off accordingly
jzacaroli 1:7fff8f0dce62 158 int i;
jzacaroli 1:7fff8f0dce62 159 int devices_found=0;
jzacaroli 1:7fff8f0dce62 160 // Initialize the probe array to DS1820 objects
jzacaroli 1:7fff8f0dce62 161 for (i = 0; i < MAX_PROBES; i++)
jzacaroli 1:7fff8f0dce62 162 probe[i] = new DS1820(D0);
jzacaroli 1:7fff8f0dce62 163 // Initialize global state variables
jzacaroli 1:7fff8f0dce62 164 probe[0]->search_Rom_setup();
jzacaroli 1:7fff8f0dce62 165 // Loop to find all devices on the data line
jzacaroli 1:7fff8f0dce62 166 while (probe[devices_found]->search_Rom() and devices_found<MAX_PROBES-1)
jzacaroli 1:7fff8f0dce62 167 devices_found++;
jzacaroli 1:7fff8f0dce62 168 // If maximum number of probes are found,
jzacaroli 1:7fff8f0dce62 169 // bump the counter to include the last array entry
jzacaroli 1:7fff8f0dce62 170 if (probe[devices_found]->Rom[0] != 0xFF)
jzacaroli 1:7fff8f0dce62 171 devices_found++;
jzacaroli 1:7fff8f0dce62 172
jzacaroli 1:7fff8f0dce62 173 if (devices_found==0)
jzacaroli 1:7fff8f0dce62 174 printf("No devices found");
jzacaroli 1:7fff8f0dce62 175 else {
jzacaroli 1:7fff8f0dce62 176
jzacaroli 1:7fff8f0dce62 177 probe[0]->convert_temperature(DS1820::all_devices);
jzacaroli 1:7fff8f0dce62 178 for (i=0; i<devices_found; i++) {
jzacaroli 1:7fff8f0dce62 179 Temp = probe[i]->temperature('c');
jzacaroli 1:7fff8f0dce62 180 if(Temp>27) {
jzacaroli 1:7fff8f0dce62 181 fan = 1;
jzacaroli 1:7fff8f0dce62 182 } else {
jzacaroli 1:7fff8f0dce62 183 fan = 0;
jzacaroli 1:7fff8f0dce62 184 }
jzacaroli 1:7fff8f0dce62 185 }
jzacaroli 1:7fff8f0dce62 186 }
jzacaroli 1:7fff8f0dce62 187
jzacaroli 1:7fff8f0dce62 188
jzacaroli 1:7fff8f0dce62 189
jzacaroli 1:7fff8f0dce62 190 // Code reads a voltage from an LDR and sets brightness of inside lighting accordingly
jzacaroli 1:7fff8f0dce62 191
jzacaroli 1:7fff8f0dce62 192 float v = 3.3*V1.read();
jzacaroli 1:7fff8f0dce62 193
jzacaroli 1:7fff8f0dce62 194 if(v<1) {
jzacaroli 1:7fff8f0dce62 195 intensity = 0.1;
jzacaroli 1:7fff8f0dce62 196 LightStatus = 1;
jzacaroli 1:7fff8f0dce62 197 } else if(v<1.6) {
jzacaroli 1:7fff8f0dce62 198 intensity = 0.5;
jzacaroli 1:7fff8f0dce62 199 LightStatus = 2;
jzacaroli 1:7fff8f0dce62 200 } else if(v<2.2) {
jzacaroli 1:7fff8f0dce62 201 intensity = 1;
jzacaroli 1:7fff8f0dce62 202 LightStatus = 3;
jzacaroli 1:7fff8f0dce62 203 } else {
jzacaroli 1:7fff8f0dce62 204 intensity = 0;
jzacaroli 1:7fff8f0dce62 205 LightStatus = 0;
jzacaroli 1:7fff8f0dce62 206 }
jzacaroli 1:7fff8f0dce62 207 Lights = intensity;
jzacaroli 1:7fff8f0dce62 208
jzacaroli 1:7fff8f0dce62 209 pc.printf("reached here");
jzacaroli 1:7fff8f0dce62 210
jzacaroli 1:7fff8f0dce62 211
jzacaroli 1:7fff8f0dce62 212 // if(AUTO) { //This is here to make sure that we're still on AutoMode before sending back data
jzacaroli 1:7fff8f0dce62 213 pc.printf("ALights = %d\r\n",LightStatus);
jzacaroli 1:7fff8f0dce62 214 pc.printf("ATemp = %3.1f\r\n",Temp);
jzacaroli 1:7fff8f0dce62 215 pc.printf("AFan = %d\r\n",fan.read());
jzacaroli 1:7fff8f0dce62 216
jzacaroli 1:7fff8f0dce62 217 char msg[80];
jzacaroli 1:7fff8f0dce62 218 sprintf(msg,"Temp %3.1f\r\nFan %d\r\nLights %d\r\n",Temp,fan.read(),LightStatus);
jzacaroli 1:7fff8f0dce62 219 dev.printf("AT+CIPSEND=4,%d\r\n",strlen(msg));
jzacaroli 1:7fff8f0dce62 220 wait(0.2);
jzacaroli 1:7fff8f0dce62 221 dev.printf("%s",msg);
jzacaroli 1:7fff8f0dce62 222 wait(5);
jzacaroli 1:7fff8f0dce62 223 // }
jzacaroli 1:7fff8f0dce62 224
jzacaroli 1:7fff8f0dce62 225
jzacaroli 1:7fff8f0dce62 226 } else { //***********************MANUAL MODE**************************//
jzacaroli 1:7fff8f0dce62 227 Dummy = 1-Dummy;
jzacaroli 1:7fff8f0dce62 228 pc.printf("MANUAL\r\n");
jzacaroli 1:7fff8f0dce62 229
jzacaroli 1:7fff8f0dce62 230 int i;
jzacaroli 1:7fff8f0dce62 231 int devices_found=0;
jzacaroli 1:7fff8f0dce62 232 // Initialize the probe array to DS1820 objects
jzacaroli 1:7fff8f0dce62 233 for (i = 0; i < MAX_PROBES; i++)
jzacaroli 1:7fff8f0dce62 234 probe[i] = new DS1820(D0);
jzacaroli 1:7fff8f0dce62 235 // Initialize global state variables
jzacaroli 1:7fff8f0dce62 236 probe[0]->search_Rom_setup();
jzacaroli 1:7fff8f0dce62 237 // Loop to find all devices on the data line
jzacaroli 1:7fff8f0dce62 238 while (probe[devices_found]->search_Rom() and devices_found<MAX_PROBES-1)
jzacaroli 1:7fff8f0dce62 239 devices_found++;
jzacaroli 1:7fff8f0dce62 240 // If maximum number of probes are found,
jzacaroli 1:7fff8f0dce62 241 // bump the counter to include the last array entry
jzacaroli 1:7fff8f0dce62 242 if (probe[devices_found]->Rom[0] != 0xFF)
jzacaroli 1:7fff8f0dce62 243 devices_found++;
jzacaroli 1:7fff8f0dce62 244 if (devices_found==0)
jzacaroli 1:7fff8f0dce62 245 printf("No devices found");
jzacaroli 1:7fff8f0dce62 246 else {
jzacaroli 1:7fff8f0dce62 247 probe[0]->convert_temperature(DS1820::all_devices);
jzacaroli 1:7fff8f0dce62 248 for (i=0; i<devices_found; i++) {
jzacaroli 1:7fff8f0dce62 249 Temp = probe[i]->temperature('c');
jzacaroli 1:7fff8f0dce62 250 }
jzacaroli 1:7fff8f0dce62 251 }
jzacaroli 1:7fff8f0dce62 252 pc.printf("mLights = %d\r\n",LightStatus);
jzacaroli 1:7fff8f0dce62 253 pc.printf("mTemp = %3.1f\r\n",Temp);
jzacaroli 1:7fff8f0dce62 254 pc.printf("mFan = %d\r\n",fan.read());
jzacaroli 1:7fff8f0dce62 255
jzacaroli 1:7fff8f0dce62 256 char msg[80];
jzacaroli 1:7fff8f0dce62 257 sprintf(msg,"Temp %3.1f\r\nFan %d\r\nLights %d\r\n",Temp,fan.read(),LightStatus);
jzacaroli 1:7fff8f0dce62 258 dev.printf("AT+CIPSEND=4,%d\r\n",strlen(msg));
jzacaroli 1:7fff8f0dce62 259 wait(0.2);
jzacaroli 1:7fff8f0dce62 260 dev.printf("%s",msg);
jzacaroli 1:7fff8f0dce62 261 wait(5);
jzacaroli 1:7fff8f0dce62 262 }
jzacaroli 1:7fff8f0dce62 263 }
jzacaroli 1:7fff8f0dce62 264
wadh4587 0:e5aa1648b1c5 265 }
jzacaroli 1:7fff8f0dce62 266 }