Hardware components | ||||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 2 | ||||
| × | 1 | ||||
Software apps and online services | ||||||
|
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.
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.
#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.
Comments