Advertisement
vulture2600

Roomate Pinger

Jan 10th, 2016
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.16 KB | None | 0 0
  1. /*
  2. This sketch pings two IP addresses which are the static IPs assigned to my roommate's phone and my phone and reads temps from an indoor and outdoor sensor
  3. and displays all data to an LCD Shield. GET requests are sent to this Arduino from another web page and it responds with current data to display on that page.
  4. steve.a.mccluskey@gmail.com
  5.  
  6. Hardware used:
  7. Arduino Uno.
  8. Generic Ethernet Shield.                        
  9. Adafruit I2C LCD Shield.
  10. DS18B20 OneWire digital waterproof temp sensor.
  11. Adafruit MCP9808 I2C temp sensor breakout board.
  12.  
  13. Pin layout as follows:
  14. 0  : Hardware serial RX.
  15. 1  : Hardware serial TX.
  16. 2  : OneWire bus.
  17. 3 ~: OneWire power.
  18. 4  : OneWire ground.
  19. 5 ~:
  20. 6 ~:
  21. 7  :
  22. 8  :
  23. 9 ~:
  24. 10~: Ethernet CS.
  25. 11~: SPI MOSI.
  26. 12 : SPI MISO.
  27. 13 : SPI Clock.
  28.  
  29. A0 :
  30. A1 :
  31. A2 : I2C temp sensor power.
  32. A3 : I2C temp sensor ground.
  33. A4 : I2C SDA.
  34. A5 : I2C SCL.
  35.  */
  36.  
  37.  
  38. #include <Wire.h>
  39. #include <Adafruit_MCP23017.h>
  40. #include <Adafruit_RGBLCDShield.h>
  41. #include <SPI.h>        
  42. #include <Ethernet.h>
  43. #include <ICMPPing.h>
  44. #include <OneWire.h>
  45. #include "Adafruit_MCP9808.h"
  46.  
  47.  
  48. #define RED 0x1
  49. #define YELLOW 0x3
  50. #define GREEN 0x2
  51. #define TEAL 0x6
  52. #define BLUE 0x4
  53. #define VIOLET 0x5
  54. #define WHITE 0x7
  55.  
  56. #define ONE_WIRE_BUS 2
  57. #define ONE_WIRE_PWR 3
  58. #define ONE_WIRE_GND 4
  59.  
  60. #define pingTimeout 60000 // how long to keep home status active.
  61. #define REQ_BUF_SZ     60 // size of buffer used to capture HTTP requests.
  62.  
  63. Adafruit_RGBLCDShield lcd        = Adafruit_RGBLCDShield();
  64. Adafruit_MCP9808      tempSensor = Adafruit_MCP9808();
  65.  
  66. OneWire   oneWire(ONE_WIRE_BUS);
  67. byte      addr[8];
  68.  
  69. byte      mac[]   =   {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // mac address for ethernet shield
  70. byte      ip []   =   {192, 168, 1, 178};                   // ip address for ethernet shield
  71. IPAddress pingAddr    (192, 168, 1, 5);                     // steve's iphone
  72. IPAddress pingAddr2   (192, 168, 1, 6);                     // karl's android.
  73. EthernetServer server (80);
  74.  
  75. char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string.
  76. char req_index            =  0;  // index into HTTP_req buffer.
  77. EthernetClient client;
  78.  
  79. SOCKET    pingSocket = 0;
  80.  
  81. ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
  82. unsigned long timeNow, timeTemp, timePing, steveTime, karlTime;
  83.  
  84. float tempIn, tempOut;
  85.  
  86. boolean steveHome = false,
  87.         karlHome  = false;
  88.  
  89. void setup() {
  90.   pinMode     (ONE_WIRE_PWR, OUTPUT);
  91.   pinMode     (ONE_WIRE_GND, OUTPUT);
  92.   digitalWrite(ONE_WIRE_PWR, HIGH);
  93.   digitalWrite(ONE_WIRE_GND, LOW);
  94.   pinMode     (A2,           OUTPUT);
  95.   pinMode     (A3,           OUTPUT);
  96.   digitalWrite(A2,           HIGH);
  97.   digitalWrite(A3,           LOW);
  98.   // start Ethernet
  99.   Ethernet.begin(mac, ip);
  100.   Serial.begin  (19200);
  101.   lcd.begin     (16, 2);
  102.   lcd.print     ("Ping Test!");
  103.   delay         (1000);
  104.   lcd.clear();
  105.   oneWire.search(addr);
  106.   tempSensor.begin(0x18);
  107.   server.begin();
  108. } // end setup().
  109.  
  110. void loop() {
  111.   timeNow = millis();
  112.   client = server.available();
  113.  
  114.   if (client) {
  115.     boolean currentLineIsBlank = true;
  116.     while (client.connected()) {
  117.       if (client.available()) {
  118.         char d = client.read();
  119.         if (req_index < (REQ_BUF_SZ - 1)) {
  120.           HTTP_req[req_index] = d;
  121.           req_index ++;
  122.         } // end if.
  123.        
  124.         if (d == '\n' && currentLineIsBlank) {
  125.           client.println(F("HTTP/1.1 200 OK"));
  126.           client.println(F("Access-Control-Allow-Origin: *"));
  127.           if (StrContains(HTTP_req, "getTemp")){
  128.             client.println(F("Content-Type: text/xml\r\nConnection: keep-alive\r\n"));
  129.             client.print  (F("<?xml version = \"1.0\" ?><inputs><tIn>"));
  130.             client.print  (tempIn);
  131.             client.print  (F("</tIn><tOut>"));
  132.             client.print  (tempOut);
  133.             client.print  (F("</tOut><sHome>"));
  134.             if (steveHome) {
  135.               client.print(F("1"));
  136.             }
  137.             else {
  138.               client.print(F("0"));
  139.             }
  140.             client.print  (F("</sHome><kHome>"));
  141.             if (karlHome) {
  142.               client.print(F("1"));
  143.             }
  144.             else {
  145.               client.print(F("0"));
  146.             }
  147.             client.print(F("</kHome></inputs>"));
  148.           } // end if.
  149.        
  150.           req_index = 0;
  151.           StrClear(HTTP_req, REQ_BUF_SZ); // clear the buffer.
  152.           break;
  153.         } // end if.
  154.        
  155.         if (d == '\n') {
  156.           currentLineIsBlank = true;
  157.         } // end if.
  158.        
  159.         else if (d != '\r') {
  160.           currentLineIsBlank = false;
  161.         } // end else if.
  162.       } // end if client.available().
  163.     } // end while.
  164.     client.stop();
  165.   } //end if client.    
  166.  
  167.   if (timeNow - timeTemp > 1000) { // update temps once per second.
  168.     tempIn   = round(cToF(tempSensor.readTempC()));
  169.     tempOut  = round(cToF(getOneWireTemp(addr)));
  170.     timeTemp = timeNow;
  171.   } // end if.
  172.  
  173.   if (timeNow - timePing > 5000) { // ping phones every 5 seconds.
  174.     ICMPEchoReply echoReply  = ping(pingAddr,  1);
  175.     ICMPEchoReply echoReply2 = ping(pingAddr2, 1);
  176.     if (echoReply.status == SUCCESS) {
  177.       steveTime = timeNow;
  178.       // Serial.println("Steve is home.");
  179.       steveHome = true;
  180.     } // end if.
  181.     else if (timeNow - steveTime > pingTimeout) { // show home for 60 seconds after no ping response.
  182.       // Serial.println("Steve's iPhone offline.");
  183.       steveHome = false;
  184.     } // end else.
  185.    
  186.     if (echoReply2.status == SUCCESS) {
  187.       karlTime = timeNow;
  188.       // Serial.println("Karl  is home.");
  189.       karlHome = true;
  190.     } // end if.
  191.     else if (timeNow - karlTime > pingTimeout) {
  192.       // Serial.println("Karl's Android offline.");
  193.       karlHome = false;
  194.     } // end else.
  195.     timePing = timeNow;
  196.   } // end if.
  197.  
  198.   if (steveHome && !karlHome) {
  199.     lcd.setBacklight(YELLOW);
  200.     lcd.setCursor(0, 0);
  201.     lcd.print(F("Steve:HOME!"));
  202.     lcd.setCursor(0, 1);
  203.     lcd.print(F("Karl :Away."));
  204.   } // end if.
  205.  
  206.   else if (!steveHome && karlHome) {
  207.     lcd.setBacklight(GREEN);
  208.     lcd.setCursor(0, 0);
  209.     lcd.print(F("Steve:Away."));
  210.     lcd.setCursor(0, 1);
  211.     lcd.print(F("Karl :HOME!"));
  212.   } // end else if.
  213.  
  214.   else if (steveHome && karlHome) {
  215.     lcd.setBacklight(RED);
  216.     lcd.setCursor(0, 0);
  217.     lcd.print(F("Steve:HOME!"));
  218.     lcd.setCursor(0, 1);
  219.     lcd.print(F("Karl :HOME!"));
  220.   } // end else if.
  221.  
  222.   else {
  223.     lcd.setBacklight(WHITE);
  224.     lcd.setCursor(0, 0);
  225.     lcd.print(F("Steve:Away."));
  226.     lcd.setCursor(0, 1);
  227.     lcd.print(F("Karl :Away."));
  228.   }
  229.  
  230.   lcd.setCursor(12, 0);
  231.   lcd.print    (F("I:"));
  232.   lcd.print    (tempIn);
  233.   lcd.print    (F("F"));
  234.   lcd.setCursor(12, 1);
  235.   lcd.print    (F("O:"));
  236.   lcd.print    (tempOut);
  237.   lcd.print    (F("F"));
  238. } // end loop().
  239.  
  240. float cToF(float c) { // convert float C to int F.
  241.   return (1.8 * c) + 32.0;
  242. } // end cToF().
  243.  
  244. float getOneWireTemp(byte *str) { // get OneWire temp.
  245.   byte data[2]; // array to store data retrieved from sensor.
  246.   oneWire.reset();
  247.   oneWire.select(str);
  248.   oneWire.write(0x44, 1); // start conversion.
  249.   oneWire.reset();
  250.   oneWire.select(str);
  251.   oneWire.write(0xBE); // read scratchpad.
  252.  
  253.   for (byte i = 0; i < 2; i ++) {
  254.     data[i] = oneWire.read(); // collect data.
  255.   } // end for.
  256.  
  257.   int16_t raw = (data[1] << 8) | data[0]; // convert raw data to C.
  258.  
  259.   return (float)raw / 16.0;
  260. } // end getOneWireTemp().
  261.  
  262. void StrClear(char *str, char length) {
  263.   for (uint8_t i = 0; i < length; i ++) {
  264.     str[i] = 0;
  265.   } // end for.
  266. } // end StrClear().
  267.  
  268. // searches for the string sfind in the string str
  269. // returns 1 if string found
  270. // returns 0 if string not found
  271. char StrContains(char *str, char *sfind) {
  272.   char found = 0;
  273.   char index = 0;
  274.   char len;
  275.  
  276.   len = strlen(str);
  277.  
  278.   if (strlen(sfind) > len) {
  279.     return 0;
  280.   } // end if.
  281.   while (index < len) {
  282.     if (str[index] == sfind[found]) {
  283.       found ++;
  284.       if (strlen(sfind) == found) {
  285.         return 1;
  286.       } // end if.
  287.     } // end if.
  288.     else {
  289.       found = 0;
  290.     } // end else.
  291.     index ++;
  292.   } // end while.
  293.   return 0;
  294. } // end StrContains().
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement