Project showcase

Automated Snake Enclosure with Camera © GPL3+

Interactive snake enclosure that is temperature and humidity controlled and uses lat-long to mimic natural light cycles, with an online cam.

  • 5,389 views
  • 9 comments
  • 16 respects

Components and supplies

Apps and online services

About this project

Background

I wanted to create a snake enclosure that I did not have to monitor 24/7 and tend to all change from daylight to night. It started out as a project to switch from day to night and it grew from there. I wanted to mirror their natural habitat in temperature that changes daily to replicate the changing of the seasons with fans and various heat elements, sunrise and set to match their natural habitat, humidity to keep them healthy. But I also wanted to be able to manipulate these settings for various reasons.

How It Works

It uses a RTC to save the date and time at restarts (happens every hour to prevent SRAM fill up from the webserver). Then it reads the SD from the TFT touch screen by Seeed, for any data that is not preset in order to maintain different settings (like increased humidity for shedding).

Reads the ambient temperature and humidity from the DHT 22.

Two temperature sensors read each rock to make sure they do not overheat.

Using the data received it will control two relay shields enclosed in a project box

These relays control the Night light, Day Light, Heat Lamp, Heat rocks 1 & 2, fogger and the fans.

The fogger needed to be hacked so I could monitor water levels remotely. fist you need to take the wires off the float switch and connect them to each other ( this will make the fogger believe it is always full). connect two wires to the float switch one will go to the 5v pin and the other will go to the selected input pin (mine is pin 31) with a 220 resistor to the ground (dont know how important the resistor number is as long as you have one, I have tested a few and they all work),

Not going to go into too much detail on the relays as I have a diagram and it is not that important on placement.

These are the screens I made to show me the readouts. (My snakes names are Harold and Kumar.) The Home screen just shows data about the snakes like Latin name and native countries. The Temperature screen shows current temperatures and set temperatures and a switch button that shows the same screen but with the opposite time (Day/Night). The Humidity screen shows the current and set humidity. The Sunrise/set screen shows daily sunrise and set times. The Setting Page shows what sensors are active and what devices are on. if any variable is changed it will also have a correlating days variable for each, this is subtracted by one at midnight.

I added a camera for remote monitoring

The Ethernet has a web-server the gives me the ability to read current readouts above is an example.

Here are some other photos...

here is a diagram:

The full code is attached.

Code

Harold and Kumar w/out IP codeC/C++
Arduino
#include <SD.h>
#include <stdint.h>
#include <SeeedTouchScreen.h>
#include <TFTv2.h>
#include <SPI.h>
#include <Time.h>
#include <TimeLib.h>
#include <DHT.h>
#include <DHT_U.h>
#include <OneWire.h>
#include <DS3232RTC.h>
#include <Adafruit_Sensor.h>
#include <TimeLord.h>
#include <Wire.h>
#include "DHT.h"
#include <DallasTemperature.h>
#include <EthernetV2_0.h>
#include "TFTv2.h"
int page;
int firsttimeon = 1;
//time veriables
int daynow;
int monthnow;
int yearnow;
int minutenow;
int hournow;
int tpage;
int npage;
int dnchan;
float const LONGITUDE = -1.41503959;
float const LATITUDE = 8.528874379;
//temp and humid veriables
float humidmin;
float humidminset;
int humidday;
#define DHTPIN 22 // temp/humidity sensor 
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
float hkhr1temp;
float hkhr2temp;
float hkdaytemp;
float hknighttemp;
float ambitempcur;
float ambitempdisp;
float hkdaytempdisp;
float hknighttempdisp;
float humidcur;
float humiddisp;
#define hr1 23
#define hr2 24
OneWire oneWire_hr1(hr1);
OneWire oneWire_hr2(hr2);
DallasTemperature sensor_hr1(&oneWire_hr1);
DallasTemperature sensor_hr2(&oneWire_hr2);
float hr1tempcur;
float hr1tempdisp;
float hr2tempcur;
float hr2tempdisp;
int ambitempday;
int ambitempnight;
float roomtemp;
float roomtempdisp;
//light cycle veriables
int srhour;
int srminute;
int srsecond;
int srhourset;
int srminuteset;
int srhoursetdisp;
int srminutesetdisp;
int srsecondset;
int srday;
int sshour;
int ssminute;
int sssecond;
int sshourset;
int ssminuteset;
int sssecondset;
int ssminutesetdisp;
int sshoursetdisp;
int ssday = 0;
int night;
byte todaysr[] = {0, 0, 0, 0, 0, 0};
byte todayss[] = {0, 0, 0, 0, 0, 0};
byte dlstime[] = {0, 0, hour(), day(), month(), year()};
long timenow;
long timess;
long timesr;
//pin variables
//ambient heat/humidity is pin 22
// heat rock 1 temp is pin 23
// heat rock 2 temp is pin 24
// ds3231rtc SCL is on analog pin A5
// ds3231rtc SDA is on analog pin A4
const int dnlamp = 25;
const int fogger = 26;
const int hrock1 = 27;
const int hrock2 = 28;
const int fan = 29;
const int foggerwater = 31;
const int hlamp = 30;
const int rset = 41;
// sensor quality veriables
int ambithsen;
int hr1sen;
int hr2sen;
int foggersen;
//power on veriables
int dlpwr;
int hlpwr;
int hr1pwr;
int hr2pwr;
int fogpwr;
int fanpwr;
int foggerpwr;
TouchScreen ts = TouchScreen(XP, YP, XM, YM); //init TouchScreen port pins
// file varieables
String myData;
String myDoc;
File myFile;
/*Cat5 wires
  Red Taped ---- Relay Box
  Solid Brown = 5v
  White Brown = Ground
  Solid Green = Pin 7 of always on relay -- Heat Rock 2 Power -- Arduino Pin = 28
  White Green = Pin 6 of always on relay -- Heat Rock 1 Power -- Arduino Pin = 27
  Solid Blue = Pin 5 of always on relay -- Heat Lamp Power -- Arduino Pin = 30
  White Blue = Pin 4 of always on relay -- Day/Night Lights Power -- Arduino Pin = 25
  Solid Orange = Pin 5 of power save relay -- Fogger Power -- Arduino Pin = 26
  White Orange = Pin 4 of power save relay -- Unused
  //
  White Taped ---- Relay Box
  Solid Green = Pin 7 of power save relay -- Fan Relay -- Arduino Pin = 29
  White Green = Unused
  Solid Blue = J1 Open Fan relay
  White Blue = J1 Common Fan relay
  Solid Brown = Unused
  White Brown = Unused
  Solid Orange = 5v
  White Orange = Ground
  //
  Yellow Tape ---- Sensors
  Solid Brown = Fan Power
  White Brown = Fan Ground
  Solid Green = Ambiant Temperature/Humidity Sensor -- Arduino Pin = 22
  White Green = Heat Rock 1 Sensor -- Arduino Pin = 23
  Solid Blue = Heat Rock 2 Sensor -- Arduino Pin = 24
  White Blue = UNUSED
  Solid Orange = 5v
  White Orange = Ground
  //
  Red Yellow Tape ---- Touch Screen
  Solid Brown = Top Right ICSP
  White Brown = Analog 3
  Solid Green = Analog 2
  White Green = Analog 1
  Solid Blue = Analog 0
  White Blue = Reset
  Solid Orange = 5v
  White Orange = Ground
  //
  Red White Tape ---- Touch Screen
  Solid Brown = Digital 7
  White Brown = Digital 6
  Solid Green = Digital 5
  White Green = Bottom Left ICSP
  Solid Blue = Top Left ICSP
  White Blue = Bottom Middle ICSP
  Solid Orange = Top MiddleICSP
  White Orange = Bottom Right ICSP
*/
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 109);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(6113);
#define W5200_CS 10
#define SDCARD_CS 4
//Camera definitions
#define VC0706_PROTOCOL_SIGN       0x56
#define VC0706_Serial2_NUMBER       0x00
#define VC0706_COMMAND_RESET      0x26
#define VC0706_COMMAND_GEN_VERSION    0x11
#define VC0706_COMMAND_TV_OUT_CTRL    0x44
#define VC0706_COMMAND_OSD_ADD_CHAR   0x45
#define VC0706_COMMAND_DOWNSIZE_SIZE    0x53
#define VC0706_COMMAND_READ_FBUF    0x32
#define FBUF_CURRENT_FRAME      0
#define FBUF_NEXT_FRAME       0
#define VC0706_COMMAND_FBUF_CTRL    0x36
#define VC0706_COMMAND_COMM_MOTION_CTRL   0x37
#define VC0706_COMMAND_COMM_MOTION_DETECTED 0x39
#define VC0706_COMMAND_POWER_SAVE_CTRL    0x3E
#define VC0706_COMMAND_COLOR_CTRL   0x3C
#define VC0706_COMMAND_MOTION_CTRL    0x42
#define VC0706_COMMAND_WRITE_DATA   0x31
#define VC0706_COMMAND_GET_FBUF_LEN   0x34
#define READ_DATA_BLOCK_NO      56
unsigned char   tx_counter;
unsigned char   tx_vcbuffer[20];
bool    tx_ready;
bool    rx_ready;
unsigned char   rx_counter;
unsigned char   VC0706_rx_buffer[80];
uint32_t  frame_length = 0;
uint32_t  vc_frame_address = 0;
uint32_t  last_data_length = 0;
// one Integer Variable to count for photo
// increase if you have difficulties conenctiong
// but it then will refresh less often
int waitForPhoto = 4;
int waitCount;
//////////////////////
void setup() {
  // reset w5100
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  // open Serial2 connection to the camera
  Serial2.begin(115200);
  // set the jpeg compression of the camera
  // smaller number means smaller file, but less quality
  VC0706_compression_ratio(15);
  delay(100);
  pinMode(SDCARD_CS, OUTPUT);
  Sd2Card card;
  card.init(SPI_FULL_SPEED, SDCARD_CS);
  if (!SD.begin(SDCARD_CS)) {
    rsetFunc();
  }
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  // put your setup code here, to run once:
  TFT_BL_ON;
  Tft.TFTinit();
  setSyncProvider(RTC.get);
  page = 1;
  monthnow = month();
  yearnow = year();
  minutenow = minute();
  hournow = hour();
  npage = 1;
  humidmin = 50.00;
  dht.begin();
  sensor_hr1.begin();
  sensor_hr2.begin();
  TimeLord tardis;
  tardis.TimeZone(0);
  tardis.Position(LATITUDE, LONGITUDE);
  // pins
  pinMode(dnlamp, OUTPUT);
  pinMode(fogger, OUTPUT);
  pinMode(hlamp, OUTPUT);
  pinMode(hrock1, OUTPUT);
  pinMode(hrock2, OUTPUT);
  pinMode(fan, OUTPUT);
  pinMode(foggerwater, INPUT);
  myDoc = "daynow.txt";
  readsd();
  daynow = myData.toInt();
  myDoc = "hd.txt";
  readsd();
  humidday = myData.toInt();
  myDoc = "hs.txt";
  readsd();
  humidminset = myData.toFloat();
  myDoc = "atd.txt";
  readsd();
  ambitempday = myData.toInt();
  myDoc = "atdset.txt";
  readsd();
  hkdaytempdisp = myData.toFloat();
  myDoc = "atn.txt";
  readsd();
  ambitempnight = myData.toInt();
  myDoc = "atnset.txt";
  readsd();
  hknighttempdisp = myData.toFloat();
  myDoc = "ssetday.txt";
  readsd();
  ssday = myData.toInt();
  myDoc = "sriseday.txt";
  readsd();
  srday = myData.toInt();
  myDoc = "ssetmin.txt";
  readsd();
  ssminutesetdisp = myData.toInt();
  myDoc = "srisemin.txt";
  readsd();
  srminutesetdisp = myData.toInt();
  myDoc = "sriseh.txt";
  readsd();
  srhoursetdisp = myData.toInt();
  myDoc = "ssethour.txt";
  readsd();
  sshoursetdisp = myData.toInt();
}
//////////////////////
void loop() {
  // put your main code here, to run repeatedly:
  TimeLord tardis;
  tardis.DstRules(3, 2, 11, 1, 60);
  if (firsttimeon == 1) {
    tardis.TimeZone(-5 * 60);
    tardis.Position(LATITUDE, LONGITUDE);
    dlstime[5] = (year() - 2000);
    dlstime[4] = month();
    dlstime[3] = day();
    dlstime[2] = hour();
    dlstime[1] = minute();
    tardis.DST(dlstime);
    firsttimeon = 0;
  }
  // count down for photo time
  waitCount = waitCount - 1;
  if (waitCount < 2) {
    capture_photo("live.jpg");
    waitCount = waitForPhoto;
  }
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    int pos = 0;
    char clientReq[100];
    while (client.connected()) {
      if (client.available()) {
        // read what the client is requesting
        char c = client.read();
        if (c != '\n' && c != '\r') {
          clientReq[pos] = c;
          pos++;
          if (pos >= 100) pos = 99; // dont let the buffer overflow...
          continue;
        }
        // send a jpeg file or send html to display files
        // if there is a character after the 'GET /' request
        // send the jpeg file
        if ( clientReq[5] != ' ' ) {
          // ###### FIND OUT WHICH FILE THE CLIENT REQUEST HERE !!!
          File myFile = SD.open("live.jpg");
          // try to open file
          // if successfull, send header and jpeg data
          if (myFile) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: image/jpg");
            client.println();
            byte clientBuf[64];
            int clientCount = 0;
            while (myFile.available())
            {
              clientBuf[clientCount] = myFile.read();
              clientCount++;
              if (clientCount > 63) {
                client.write(clientBuf, 64);
                clientCount = 0;
              }
            }
            if (clientCount > 0) {
              client.write(clientBuf, clientCount);
            }
            myFile.close();
          }
        } else {
          // there is no character after the 'GET /'
          // send HTML site
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 2");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.print("Harold & Kumar's Enclosure");
          client.println("<br />");
          client.print(dayStr(weekday(now())));
          client.print(", ");
          client.print(monthStr(dlstime[4]));
          client.print(" ");
          client.print(dlstime[3]);
          client.print(", ");
          client.print(year());
          client.print(" at ");
          if (dlstime[2] < 10) {
            client.print("0");
          }
          client.print(dlstime[2]);
          client.print(":");
          if (minute() < 10) {
            client.print("0");
          }
          client.print(minute());
          client.print(":");
          if (second() < 10) {
            client.print("0");
          }
          client.print(second());
          client.println("<br />");
          client.println("<br />");
          client.print("Room Temperature = ");
          client.print(roomtemp);
          client.print(" ");
          client.print(char(176));
          client.print("F");
          client.println("<br />");
          client.println("<br />");
          client.print("Ambient Temperature = ");
          client.print(ambitempdisp);
          client.print(" ");
          client.print(char(176));
          client.print("F");
          client.println("<br />");
          client.print(" Range = ");
          if (night == 0) {
            client.print(hkdaytempdisp - .5);
          } else {
            client.print(hknighttempdisp - .5);
          }
          client.print(" ");
          client.print(char(176));
          client.print("F - ");
          if (night == 0) {
            client.print(hkdaytempdisp + .5);
          } else {
            client.print(hknighttempdisp + .5);
          }
          client.print(" ");
          client.print(char(176));
          client.print("F ");
          if (night == 0 && ambitempday > 0) {
            client.print("For ");
            client.print(ambitempday);
            client.print(" Day(s)");
          }
          if (night == 1 && ambitempnight > 0) {
            client.print(" For ");
            client.print(ambitempnight);
            client.print(" Day(s)");
          }
          client.println("<br />");
          client.println("<br />");
          client.print("Basking Temperature = ");
          client.print(hr1tempdisp);
          client.print(" ");
          client.print(char(176));
          client.print("F");
          client.println("<br />");
          client.print(" Range = ");
          client.print(88);
          client.print(" ");
          client.print(char(176));
          client.print("F - ");
          client.print(96);
          client.print(" ");
          client.print(char(176));
          client.print("F");
          client.println("<br />");
          client.println("<br />");
          client.print("Borrow Temperature = ");
          client.print(hr2tempdisp);
          client.print(" ");
          client.print(char(176));
          client.print("F");
          client.println("<br />");
          client.print(" Range = ");
          if (night == 0) {
            client.print(hkdaytempdisp - .5);
          } else {
            client.print(hknighttempdisp - .5);
          }
          client.print(" ");
          client.print(char(176));
          client.print("F - ");
          if (night == 0) {
            client.print(hkdaytempdisp + .5);
          } else {
            client.print(hknighttempdisp + .5);
          }
          client.print(" ");
          client.print(char(176));
          client.print("F");
          if (night == 0 && ambitempday > 0) {
            client.print(" For ");
            client.print(ambitempday);
            client.print(" Day(s)");
          }
          if (night == 1 && ambitempnight > 0) {
            client.print(" For ");
            client.print(ambitempnight);
            client.print(" Day(s)");
          }
          client.println("<br />");
          client.println("<br />");
          client.print("Humidity = ");
          client.print(humiddisp);
          client.print("%");
          client.println("<br />");
          client.print(" Range = ");
          client.print(humidminset);
          client.print("% - ");
          client.print(humidminset + 10);
          client.print("% ");
          if ( humidday > 0) {
            client.print("For ");
            client.print(humidday);
            client.print(" Day(s)");
          }
          client.println("<br />");
          client.println("<br />");
          client.print("Water Level = ");
          if (digitalRead(foggerwater) == HIGH) {
            client.print("Good");
          } else {
            client.print("Fill Now!");
          }
          client.println("<br />");
          client.print("Time = ");
          if (night == 0) {
            client.print("Day");
          } else {
            client.print("Night");
          }
          client.println("<br />");
          client.print("Sunrise Time = ");
          if (srhoursetdisp < 10) {
            client.print("0");
          }
          client.print(srhoursetdisp);
          client.print(":");
          if (srminutesetdisp < 10) {
            client.print("0");
          }
          client.print(srminutesetdisp);
          if (srday > 0) {
            client.print(" For ");
            client.print(srday);
            client.print(" Day(s)");
          }
          client.println("<br />");
          client.print("Sunset Time = ");
          if (sshoursetdisp < 10) {
            client.print("0");
          }
          client.print(sshoursetdisp);
          client.print(":");
          if (ssminutesetdisp < 10) {
            client.print("0");
          }
          client.print(ssminutesetdisp);
          if (ssday > 0) {
            client.print(" For ");
            client.print(ssday);
            client.print(" Day(s)");
          }
          client.println("<br />");
          client.println("<br />");
          client.print("Heat Lamp = ");
          if (hlpwr == 1) {
            client.print("ON");
          } else {
            client.print("OFF");
          }
          client.println("<br />");
          client.print("Fans = ");
          if (fanpwr == 1) {
            client.print("ON");
          } else {
            client.print("OFF");
          }
          client.println("<br />");
          client.print("Basking Rock = ");
          if (hr1pwr == 1) {
            client.print("ON");
          } else {
            client.print("OFF");
          }
          client.println("<br />");
          client.print("Borrow Rock = ");
          if (hr2pwr == 1) {
            client.print("ON");
          } else {
            client.print("OFF");
          }
          client.println("<br />");
          client.print("Fogger = ");
          if (foggerpwr == 1) {
            client.print("ON");
          } else {
            client.print("OFF");
          }
          client.println("<br />");
          client.println("<div align=center><img src='live.jpg' width='640' height='480'>");
          client.println("<p>");
          client.println("Live from Harold & Kumar</div>");
          client.println("</html>");
        }
        delay(1);
        //stopping client
        client.stop();
      }
    }
  }
  //new touch point
  Point p = ts.getPoint();
  p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240);
  p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320);
  if (p.z > __PRESURE) {
    // New Page
    if ((p.x < 120) && (p.y > 40) && (p.y < 70)) {
      if (page == 1) {
        page = 2;
        npage = 1;
      } else {
        page = 1;
        npage = 1;
      }
    }
    if ((p.x > 120) && (p.y > 40) && (p.y < 70)) {
      if (page > 2) {
        page = 2;
        npage = 1;
      } else {
        page = 3;
        npage = 1;
      }
    }
    if ((p.x < 120) && (p.y > 70) && (p.y < 100)) {
      if (page > 3) {
        page = 3;
        npage = 1;
      } else {
        page = 4;
        npage = 1;
      }
    }
    if ((p.x > 120) && (p.y > 70) && (p.y < 100)) {
      if (page == 5) {
        page = 4;
        npage = 1;
      } else {
        page = 5;
        npage = 1;
      }
    }
    if (page == 2) {
      if ((p.x > 140) && (p.x < 170) && (p.y > 220) && (p.y < 250)) { //+ set
        if (night == 1) {
          if (dnchan == 0) {
            hknighttempdisp = hknighttempdisp + .5;
            Tft.fillRectangle(48, 230, 72, 15, BLACK);
            Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN);
            if (ambitempnight == 0 ) {
              ambitempnight = ambitempnight + 1;
              Tft.fillRectangle(84, 270, 36, 15, BLACK);
              Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN);
            }
          } else {
            hkdaytempdisp = hkdaytempdisp + .5;
            Tft.fillRectangle(48, 230, 72, 15, BLACK);
            Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN);
            if (ambitempday == 0 ) {
              ambitempday = ambitempday + 1;
              Tft.fillRectangle(84, 270, 36, 15, BLACK);
              Tft.drawNumber(ambitempday, 84, 270, 2, CYAN);
            }
          }
        } else {
          if (dnchan == 0) {
            hkdaytempdisp = hkdaytempdisp + .5;
            Tft.fillRectangle(48, 230, 72, 15, BLACK);
            Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN);
            if (ambitempday == 0 ) {
              ambitempday = ambitempday + 1;
              Tft.fillRectangle(84, 270, 36, 15, BLACK);
              Tft.drawNumber(ambitempday, 84, 270, 2, CYAN);
            }
          } else {
            hknighttempdisp = hknighttempdisp + .5;
            Tft.fillRectangle(48, 230, 72, 15, BLACK);
            Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN);
            if (ambitempnight == 0 ) {
              ambitempnight = ambitempnight + 1;
              Tft.fillRectangle(84, 270, 36, 15, BLACK);
              Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN);
            }
          }
        }
      }
      if ((p.x > 200) && (p.x < 230) && (p.y > 220) && (p.y < 250)) { //- set
        if (night == 1) {
          if (dnchan == 0) {
            hknighttempdisp = hknighttempdisp - .5;
            Tft.fillRectangle(48, 230, 72, 15, BLACK);
            Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN);
            if (ambitempnight == 0 ) {
              ambitempnight = ambitempnight + 1;
              Tft.fillRectangle(84, 270, 36, 15, BLACK);
              Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN);
            }
          } else {
            hkdaytempdisp = hkdaytempdisp - .5;
            Tft.fillRectangle(48, 230, 72, 15, BLACK);
            Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN);
            if (ambitempday == 0 ) {
              ambitempday = ambitempday + 1;
              Tft.fillRectangle(84, 270, 36, 15, BLACK);
              Tft.drawNumber(ambitempday, 84, 270, 2, CYAN);
            }
          }
        } else {
          if (dnchan == 0) {
            hkdaytempdisp = hkdaytempdisp * .5;
            Tft.fillRectangle(48, 230, 72, 15, BLACK);
            Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN);
            if (ambitempday == 0 ) {
              ambitempday = ambitempday + 1;
              Tft.fillRectangle(84, 270, 36, 15, BLACK);
              Tft.drawNumber(ambitempday, 84, 270, 2, CYAN);
            }
          } else {
            hknighttempdisp = hknighttempdisp - .5;
            Tft.fillRectangle(48, 230, 72, 15, BLACK);
            Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN);
            if (ambitempnight == 0 ) {
              ambitempnight = ambitempnight + 1;
              Tft.fillRectangle(84, 270, 36, 15, BLACK);
              Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN);
            }
          }
        }
      }
      if ((p.x > 140) && (p.x < 170) && (p.y > 260) && (p.y < 290)) { //+ day
        if (night == 1) {
          if (dnchan == 0) {
            ambitempnight = ambitempnight + 1;
            Tft.fillRectangle(84, 270, 36, 15, BLACK);
            Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN);
          } else {
            ambitempday = ambitempday + 1;
            Tft.fillRectangle(84, 270, 36, 15, BLACK);
            Tft.drawNumber(ambitempday, 84, 270, 2, CYAN);
          }
        } else {
          if (dnchan == 0) {
            ambitempday = ambitempday + 1;
            Tft.fillRectangle(84, 270, 36, 15, BLACK);
            Tft.drawNumber(ambitempday, 84, 270, 2, CYAN);
          } else {
            ambitempnight = ambitempnight + 1;
            Tft.fillRectangle(84, 270, 36, 15, BLACK);
            Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN);
          }
        }
      }
      if ((p.x > 200) && (p.x < 230) && (p.y > 260) && (p.y < 290)) { //- day
        if (night == 1) {
          if (dnchan == 0) {
            ambitempnight = ambitempnight - 1;
            Tft.fillRectangle(84, 270, 36, 15, BLACK);
            Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN);
          } else {
            ambitempday = ambitempday - 1;
            Tft.fillRectangle(84, 270, 36, 15, BLACK);
            Tft.drawNumber(ambitempday, 84, 270, 2, CYAN);
          }
        } else {
          if (dnchan == 0) {
            ambitempday = ambitempday - 1;
            Tft.fillRectangle(84, 270, 36, 15, BLACK);
            Tft.drawNumber(ambitempday, 84, 270, 2, CYAN);
          } else {
            ambitempnight = ambitempnight - 1;
            Tft.fillRectangle(84, 270, 36, 15, BLACK);
            Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN);
          }
        }
      }
      if ((p.x > 60) && (p.x < 180) && (p.y > 300) && (p.y < 330)) {
        if (dnchan == 0) {
          dnchan = 1;
        } else {
          dnchan = 0;
        }
        npage = 1;
      }
    }
    if (page == 3) {
      if ((p.x > 60) && (p.x < 90) && (p.y > 170) && (p.y < 200)) { //+ humidity
        humidminset = humidminset + 1;
        if (humidday == 0) {
          humidday = 1;
          Tft.fillRectangle(60, 210, 36, 15, BLACK);
          Tft.drawNumber(humidday, 60, 210, 2, CYAN);
        }
        Tft.fillRectangle(72, 150, 60, 15, BLACK);
        Tft.drawFloat(humidminset, 72, 150, 2, CYAN);
        Tft.fillRectangle(146, 150, 60, 15, BLACK);
        Tft.drawFloat(humidminset + 10, 146, 150, 2, CYAN);
      }
      if ((p.x > 120) && (p.x < 150) && (p.y > 170) && (p.y < 200)) { // - Humidity
        humidminset = humidminset - 1;
        if (humidday == 0) {
          humidday = 1;
          Tft.fillRectangle(60, 210, 36, 15, BLACK);
          Tft.drawNumber(humidday, 60, 210, 2, CYAN);
        }
        Tft.fillRectangle(72, 150, 60, 15, BLACK);
        Tft.drawFloat(humidminset, 72, 150, 2, CYAN);
        Tft.fillRectangle(146, 150, 60, 15, BLACK);
        Tft.drawFloat(humidminset + 10, 146, 150, 2, CYAN);
      }
      if ((p.x > 60) && (p.x < 90) && (p.y > 230) && (p.y < 260)) { // + humid day
        humidday = humidday + 1;
        Tft.fillRectangle(60, 210, 36, 15, BLACK);
        Tft.drawNumber(humidday, 60, 210, 2, CYAN);
      }
      if ((p.x > 120) && (p.x < 150) && (p.y > 230) && (p.y < 260)) { // - humid day
        humidday = humidday - 1;
        if (humidday < 0) {
          humidday = 0;
        }
        Tft.fillRectangle(60, 210, 36, 15, BLACK);
        Tft.drawNumber(humidday, 60, 210, 2, CYAN);
      }
    }
    if (page == 4) {
      if ((p.x > 60) && (p.x < 90) && (p.y > 130) && (p.y < 160)) { // + min on sunrise
        srminutesetdisp = srminutesetdisp + 1;
        if (srminutesetdisp > 59) {
          srminutesetdisp = 0;
          srhoursetdisp = srhoursetdisp + 1;
          if (srhoursetdisp > 24) {
            srhoursetdisp = 0;
          }
        }
        if (srday == 0) {
          srday = 1;
          Tft.fillRectangle(60, 170, 36, 15, BLACK);
          Tft.drawNumber(srday, 60, 170, 2, CYAN);
        }
        Tft.fillRectangle(110, 110, 24, 15, BLACK);
        if (srhoursetdisp > 9) {
          Tft.drawNumber(srhoursetdisp, 110, 110, 2, CYAN);
        } else {
          Tft.drawNumber(0, 110, 110, 2, CYAN);
          Tft.drawNumber(srhoursetdisp, 122, 110, 2, CYAN);
        }
        Tft.fillRectangle(146, 110, 24, 15, BLACK);
        if (srminutesetdisp > 9) {
          Tft.drawNumber(srminutesetdisp, 146, 110, 2, CYAN);
        } else {
          Tft.drawNumber(0, 146, 110, 2, CYAN);
          Tft.drawNumber(srminutesetdisp, 158, 110, 2, CYAN);
        }
      }
      if ((p.x > 120) && (p.x < 150) && (p.y > 130) && (p.y < 160)) { // - min on sunrise
        srminutesetdisp = srminutesetdisp - 1;
        if (srminutesetdisp < 0) {
          srminutesetdisp = 59;
          srhoursetdisp = srhoursetdisp - 1;
          if (srhoursetdisp < 0) {
            srhoursetdisp = 24;
          }
        }
        if (srday == 0) {
          srday = 1;
          Tft.fillRectangle(60, 170, 36, 15, BLACK);
          Tft.drawNumber(srday, 60, 170, 2, CYAN);
        }
        Tft.fillRectangle(110, 110, 24, 15, BLACK);
        if (srhoursetdisp > 9) {
          Tft.drawNumber(srhoursetdisp, 110, 110, 2, CYAN);
        } else {
          Tft.drawNumber(0, 110, 110, 2, CYAN);
          Tft.drawNumber(srhoursetdisp, 122, 110, 2, CYAN);
        }
        Tft.fillRectangle(146, 110, 24, 15, BLACK);
        if (srminutesetdisp > 9) {
          Tft.drawNumber(srminutesetdisp, 146, 110, 2, CYAN);
        } else {
          Tft.drawNumber(0, 146, 110, 2, CYAN);
          Tft.drawNumber(srminutesetdisp, 158, 110, 2, CYAN);
        }
      }
      if ((p.x > 110) && (p.x < 140) && (p.y > 170) && (p.y < 200)) { // +day set for sunrise
        srday = srday + 1;
        Tft.fillRectangle(60, 170, 36, 15, BLACK);
        Tft.drawNumber(srday, 60, 170, 2, CYAN);
      }
      if ((p.x > 170) && (p.x < 200) && (p.y > 170) && (p.y < 200)) { // - day set for sunrise
        srday = srday - 1;
        if (srday < 0) {
          srday = 0;
        }
        Tft.fillRectangle(60, 170, 36, 15, BLACK);
        Tft.drawNumber(srday, 60, 170, 2, CYAN);
      }
      if ((p.x > 60) && (p.x < 90) && (p.y > 230) && (p.y < 260)) { // + min sunset
        ssminutesetdisp = ssminutesetdisp + 1;
        if (ssminutesetdisp > 59) {
          ssminutesetdisp = 0;
          sshoursetdisp = sshoursetdisp + 1;
          if (sshoursetdisp > 24) {
            sshoursetdisp = 0;
          }
        }
        if (ssday == 0) {
          ssday = 1;
          Tft.fillRectangle(60, 270, 36, 15, BLACK);
          Tft.drawNumber(ssday, 60, 270, 2, CYAN);
        }
        Tft.fillRectangle(110, 210, 24, 15, BLACK);
        if (sshoursetdisp > 9) {
          Tft.drawNumber(sshoursetdisp, 110, 210, 2, CYAN);
        } else {
          Tft.drawNumber(0, 110, 210, 2, CYAN);
          Tft.drawNumber(sshoursetdisp, 122, 210, 2, CYAN);
        }
        Tft.fillRectangle(146, 210, 24, 15, BLACK);
        if (ssminutesetdisp > 9) {
          Tft.drawNumber(ssminutesetdisp, 146, 210, 2, CYAN);
        } else {
          Tft.drawNumber(0, 146, 210, 2, CYAN);
          Tft.drawNumber(ssminutesetdisp, 158, 210, 2, CYAN);
        }
      }
      if ((p.x > 120) && (p.x < 150) && (p.y > 230) && (p.y < 260)) { //- min for sunset
        ssminutesetdisp = ssminutesetdisp - 1;
        if (ssminutesetdisp < 0) {
          ssminutesetdisp = 59;
          sshoursetdisp = sshoursetdisp - 1;
          if (sshoursetdisp < 0) {
            sshoursetdisp = 24;
          }
        }
        if (ssday == 0) {
          ssday = 1;
          Tft.fillRectangle(60, 270, 36, 15, BLACK);
          Tft.drawNumber(ssday, 60, 270, 2, CYAN);
        }
        Tft.fillRectangle(110, 210, 24, 15, BLACK);
        if (sshoursetdisp > 9) {
          Tft.drawNumber(sshoursetdisp, 110, 210, 2, CYAN);
        } else {
          Tft.drawNumber(0, 110, 210, 2, CYAN);
          Tft.drawNumber(sshoursetdisp, 122, 210, 2, CYAN);
        }
        Tft.fillRectangle(146, 210, 24, 15, BLACK);
        if (ssminutesetdisp > 9) {
          Tft.drawNumber(ssminutesetdisp, 146, 210, 2, CYAN);
        } else {
          Tft.drawNumber(0, 146, 210, 2, CYAN);
          Tft.drawNumber(ssminutesetdisp, 158, 210, 2, CYAN);
        }
      }
      if ((p.x > 110) && (p.x < 140) && (p.y > 270) && (p.y < 300)) { //+ day for sunset
        ssday = ssday + 1;
        Tft.fillRectangle(60, 270, 36, 15, BLACK);
        Tft.drawNumber(ssday, 60, 270, 2, CYAN);
      }
      if ((p.x > 170) && (p.x < 200) && (p.y > 270) && (p.y < 300)) { //- day set for sunset
        ssday = ssday - 1;
        if (ssday < 0) {
          ssday = 0;
        }
        Tft.fillRectangle(60, 270, 36, 15, BLACK);
        Tft.drawNumber(ssday, 60, 270, 2, CYAN);
      }
    }
    tpage = minute() + 5;
    if (tpage > 59) {
      tpage = tpage - 60;
    }
  }
  //page change
  if (npage == 1) {
    if (page == 1) {
      allpage();
      pageone();
    }
    if (page == 2) {
      allpage();
      pagetwo();
    }
    if (page == 3) {
      allpage();
      pagethree();
    }
    if (page == 4) {
      allpage();
      pagefour();
    }
    if (page == 5) {
      allpage();
      pagefive();
    }
...

This file has been truncated, please download it to see its full contents.

Schematics

Harold and Kumar w/out IP
Fritzing
harold_and_kumar_final_internet_LQkZshP3hp.fzz

Comments

Similar projects you might like

Arduino Bluetooth Basic Tutorial

by Mayoogh Girish

  • 454,928 views
  • 42 comments
  • 239 respects

Home Automation Using Raspberry Pi 2 And Windows 10 IoT

Project tutorial by Anurag S. Vasanwala

  • 285,722 views
  • 95 comments
  • 672 respects

Security Access Using RFID Reader

by Aritro Mukherjee

  • 231,178 views
  • 38 comments
  • 241 respects

OpenCat

Project in progress by Team Petoi

  • 196,386 views
  • 154 comments
  • 1,364 respects
Add projectSign up / Login