Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 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
- 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.
- steve.a.mccluskey@gmail.com
- Hardware used:
- Arduino Uno.
- Generic Ethernet Shield.
- Adafruit I2C LCD Shield.
- DS18B20 OneWire digital waterproof temp sensor.
- Adafruit MCP9808 I2C temp sensor breakout board.
- Pin layout as follows:
- 0 : Hardware serial RX.
- 1 : Hardware serial TX.
- 2 : OneWire bus.
- 3 ~: OneWire power.
- 4 : OneWire ground.
- 5 ~:
- 6 ~:
- 7 :
- 8 :
- 9 ~:
- 10~: Ethernet CS.
- 11~: SPI MOSI.
- 12 : SPI MISO.
- 13 : SPI Clock.
- A0 :
- A1 :
- A2 : I2C temp sensor power.
- A3 : I2C temp sensor ground.
- A4 : I2C SDA.
- A5 : I2C SCL.
- */
- #include <Wire.h>
- #include <Adafruit_MCP23017.h>
- #include <Adafruit_RGBLCDShield.h>
- #include <SPI.h>
- #include <Ethernet.h>
- #include <ICMPPing.h>
- #include <OneWire.h>
- #include "Adafruit_MCP9808.h"
- #define RED 0x1
- #define YELLOW 0x3
- #define GREEN 0x2
- #define TEAL 0x6
- #define BLUE 0x4
- #define VIOLET 0x5
- #define WHITE 0x7
- #define ONE_WIRE_BUS 2
- #define ONE_WIRE_PWR 3
- #define ONE_WIRE_GND 4
- #define pingTimeout 60000 // how long to keep home status active.
- #define REQ_BUF_SZ 60 // size of buffer used to capture HTTP requests.
- Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
- Adafruit_MCP9808 tempSensor = Adafruit_MCP9808();
- OneWire oneWire(ONE_WIRE_BUS);
- byte addr[8];
- byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // mac address for ethernet shield
- byte ip [] = {192, 168, 1, 178}; // ip address for ethernet shield
- IPAddress pingAddr (192, 168, 1, 5); // steve's iphone
- IPAddress pingAddr2 (192, 168, 1, 6); // karl's android.
- EthernetServer server (80);
- char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string.
- char req_index = 0; // index into HTTP_req buffer.
- EthernetClient client;
- SOCKET pingSocket = 0;
- ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
- unsigned long timeNow, timeTemp, timePing, steveTime, karlTime;
- float tempIn, tempOut;
- boolean steveHome = false,
- karlHome = false;
- void setup() {
- pinMode (ONE_WIRE_PWR, OUTPUT);
- pinMode (ONE_WIRE_GND, OUTPUT);
- digitalWrite(ONE_WIRE_PWR, HIGH);
- digitalWrite(ONE_WIRE_GND, LOW);
- pinMode (A2, OUTPUT);
- pinMode (A3, OUTPUT);
- digitalWrite(A2, HIGH);
- digitalWrite(A3, LOW);
- // start Ethernet
- Ethernet.begin(mac, ip);
- Serial.begin (19200);
- lcd.begin (16, 2);
- lcd.print ("Ping Test!");
- delay (1000);
- lcd.clear();
- oneWire.search(addr);
- tempSensor.begin(0x18);
- server.begin();
- } // end setup().
- void loop() {
- timeNow = millis();
- client = server.available();
- if (client) {
- boolean currentLineIsBlank = true;
- while (client.connected()) {
- if (client.available()) {
- char d = client.read();
- if (req_index < (REQ_BUF_SZ - 1)) {
- HTTP_req[req_index] = d;
- req_index ++;
- } // end if.
- if (d == '\n' && currentLineIsBlank) {
- client.println(F("HTTP/1.1 200 OK"));
- client.println(F("Access-Control-Allow-Origin: *"));
- if (StrContains(HTTP_req, "getTemp")){
- client.println(F("Content-Type: text/xml\r\nConnection: keep-alive\r\n"));
- client.print (F("<?xml version = \"1.0\" ?><inputs><tIn>"));
- client.print (tempIn);
- client.print (F("</tIn><tOut>"));
- client.print (tempOut);
- client.print (F("</tOut><sHome>"));
- if (steveHome) {
- client.print(F("1"));
- }
- else {
- client.print(F("0"));
- }
- client.print (F("</sHome><kHome>"));
- if (karlHome) {
- client.print(F("1"));
- }
- else {
- client.print(F("0"));
- }
- client.print(F("</kHome></inputs>"));
- } // end if.
- req_index = 0;
- StrClear(HTTP_req, REQ_BUF_SZ); // clear the buffer.
- break;
- } // end if.
- if (d == '\n') {
- currentLineIsBlank = true;
- } // end if.
- else if (d != '\r') {
- currentLineIsBlank = false;
- } // end else if.
- } // end if client.available().
- } // end while.
- client.stop();
- } //end if client.
- if (timeNow - timeTemp > 1000) { // update temps once per second.
- tempIn = round(cToF(tempSensor.readTempC()));
- tempOut = round(cToF(getOneWireTemp(addr)));
- timeTemp = timeNow;
- } // end if.
- if (timeNow - timePing > 5000) { // ping phones every 5 seconds.
- ICMPEchoReply echoReply = ping(pingAddr, 1);
- ICMPEchoReply echoReply2 = ping(pingAddr2, 1);
- if (echoReply.status == SUCCESS) {
- steveTime = timeNow;
- // Serial.println("Steve is home.");
- steveHome = true;
- } // end if.
- else if (timeNow - steveTime > pingTimeout) { // show home for 60 seconds after no ping response.
- // Serial.println("Steve's iPhone offline.");
- steveHome = false;
- } // end else.
- if (echoReply2.status == SUCCESS) {
- karlTime = timeNow;
- // Serial.println("Karl is home.");
- karlHome = true;
- } // end if.
- else if (timeNow - karlTime > pingTimeout) {
- // Serial.println("Karl's Android offline.");
- karlHome = false;
- } // end else.
- timePing = timeNow;
- } // end if.
- if (steveHome && !karlHome) {
- lcd.setBacklight(YELLOW);
- lcd.setCursor(0, 0);
- lcd.print(F("Steve:HOME!"));
- lcd.setCursor(0, 1);
- lcd.print(F("Karl :Away."));
- } // end if.
- else if (!steveHome && karlHome) {
- lcd.setBacklight(GREEN);
- lcd.setCursor(0, 0);
- lcd.print(F("Steve:Away."));
- lcd.setCursor(0, 1);
- lcd.print(F("Karl :HOME!"));
- } // end else if.
- else if (steveHome && karlHome) {
- lcd.setBacklight(RED);
- lcd.setCursor(0, 0);
- lcd.print(F("Steve:HOME!"));
- lcd.setCursor(0, 1);
- lcd.print(F("Karl :HOME!"));
- } // end else if.
- else {
- lcd.setBacklight(WHITE);
- lcd.setCursor(0, 0);
- lcd.print(F("Steve:Away."));
- lcd.setCursor(0, 1);
- lcd.print(F("Karl :Away."));
- }
- lcd.setCursor(12, 0);
- lcd.print (F("I:"));
- lcd.print (tempIn);
- lcd.print (F("F"));
- lcd.setCursor(12, 1);
- lcd.print (F("O:"));
- lcd.print (tempOut);
- lcd.print (F("F"));
- } // end loop().
- float cToF(float c) { // convert float C to int F.
- return (1.8 * c) + 32.0;
- } // end cToF().
- float getOneWireTemp(byte *str) { // get OneWire temp.
- byte data[2]; // array to store data retrieved from sensor.
- oneWire.reset();
- oneWire.select(str);
- oneWire.write(0x44, 1); // start conversion.
- oneWire.reset();
- oneWire.select(str);
- oneWire.write(0xBE); // read scratchpad.
- for (byte i = 0; i < 2; i ++) {
- data[i] = oneWire.read(); // collect data.
- } // end for.
- int16_t raw = (data[1] << 8) | data[0]; // convert raw data to C.
- return (float)raw / 16.0;
- } // end getOneWireTemp().
- void StrClear(char *str, char length) {
- for (uint8_t i = 0; i < length; i ++) {
- str[i] = 0;
- } // end for.
- } // end StrClear().
- // searches for the string sfind in the string str
- // returns 1 if string found
- // returns 0 if string not found
- char StrContains(char *str, char *sfind) {
- char found = 0;
- char index = 0;
- char len;
- len = strlen(str);
- if (strlen(sfind) > len) {
- return 0;
- } // end if.
- while (index < len) {
- if (str[index] == sfind[found]) {
- found ++;
- if (strlen(sfind) == found) {
- return 1;
- } // end if.
- } // end if.
- else {
- found = 0;
- } // end else.
- index ++;
- } // end while.
- return 0;
- } // end StrContains().
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement