Automated Snake Enclosure with Camera
Interactive snake enclosure that is temperature and humidity controlled and uses lat-long to mimic natural light cycles, with an online cam.
Components and supplies
1
w5200 Ethernet Shield
1
DHT22 Temperature Sensor
1
2.8 TFT Touch Shield V2.0
1
Arduino Mega 2560
2
SEEED Studio Relay Shield
2
Temperature Sensor
1
Pmod RTCC
Apps and platforms
1
Arduino IDE
Project description
Code
Harold and Kumar w/out IP code
c_cpp
Arduino
1#include <SD.h> 2#include <stdint.h> 3#include <SeeedTouchScreen.h> 4#include <TFTv2.h> 5#include <SPI.h> 6#include <Time.h> 7#include <TimeLib.h> 8#include <DHT.h> 9#include <DHT_U.h> 10#include <OneWire.h> 11#include <DS3232RTC.h> 12#include <Adafruit_Sensor.h> 13#include <TimeLord.h> 14#include <Wire.h> 15#include "DHT.h" 16#include <DallasTemperature.h> 17#include <EthernetV2_0.h> 18#include "TFTv2.h" 19int page; 20int firsttimeon = 1; 21//time veriables 22int daynow; 23int monthnow; 24int yearnow; 25int minutenow; 26int hournow; 27int tpage; 28int npage; 29int dnchan; 30float const LONGITUDE = -1.41503959; 31float const LATITUDE = 8.528874379; 32//temp and humid veriables 33float humidmin; 34float humidminset; 35int humidday; 36#define DHTPIN 22 // temp/humidity sensor 37#define DHTTYPE DHT22 38DHT dht(DHTPIN, DHTTYPE); 39float hkhr1temp; 40float hkhr2temp; 41float hkdaytemp; 42float hknighttemp; 43float ambitempcur; 44float ambitempdisp; 45float hkdaytempdisp; 46float hknighttempdisp; 47float humidcur; 48float humiddisp; 49#define hr1 23 50#define hr2 24 51OneWire oneWire_hr1(hr1); 52OneWire oneWire_hr2(hr2); 53DallasTemperature sensor_hr1(&oneWire_hr1); 54DallasTemperature sensor_hr2(&oneWire_hr2); 55float hr1tempcur; 56float hr1tempdisp; 57float hr2tempcur; 58float hr2tempdisp; 59int ambitempday; 60int ambitempnight; 61float roomtemp; 62float roomtempdisp; 63//light cycle veriables 64int srhour; 65int srminute; 66int srsecond; 67int srhourset; 68int srminuteset; 69int srhoursetdisp; 70int srminutesetdisp; 71int srsecondset; 72int srday; 73int sshour; 74int ssminute; 75int sssecond; 76int sshourset; 77int ssminuteset; 78int sssecondset; 79int ssminutesetdisp; 80int sshoursetdisp; 81int ssday = 0; 82int night; 83byte todaysr[] = {0, 0, 0, 0, 0, 0}; 84byte todayss[] = {0, 0, 0, 0, 0, 0}; 85byte dlstime[] = {0, 0, hour(), day(), month(), year()}; 86long timenow; 87long timess; 88long timesr; 89//pin variables 90//ambient heat/humidity is pin 22 91// heat rock 1 temp is pin 23 92// heat rock 2 temp is pin 24 93// ds3231rtc SCL is on analog pin A5 94// ds3231rtc SDA is on analog pin A4 95const int dnlamp = 25; 96const int fogger = 26; 97const int hrock1 = 27; 98const int hrock2 = 28; 99const int fan = 29; 100const int foggerwater = 31; 101const int hlamp = 30; 102const int rset = 41; 103// sensor quality veriables 104int ambithsen; 105int hr1sen; 106int hr2sen; 107int foggersen; 108//power on veriables 109int dlpwr; 110int hlpwr; 111int hr1pwr; 112int hr2pwr; 113int fogpwr; 114int fanpwr; 115int foggerpwr; 116TouchScreen ts = TouchScreen(XP, YP, XM, YM); //init TouchScreen port pins 117// file varieables 118String myData; 119String myDoc; 120File myFile; 121/*Cat5 wires 122 Red Taped ---- Relay Box 123 Solid Brown = 5v 124 White Brown = Ground 125 Solid Green = Pin 7 of always on relay -- Heat Rock 2 Power -- Arduino Pin = 28 126 White Green = Pin 6 of always on relay -- Heat Rock 1 Power -- Arduino Pin = 27 127 Solid Blue = Pin 5 of always on relay -- Heat Lamp Power -- Arduino Pin = 30 128 White Blue = Pin 4 of always on relay -- Day/Night Lights Power -- Arduino Pin = 25 129 Solid Orange = Pin 5 of power save relay -- Fogger Power -- Arduino Pin = 26 130 White Orange = Pin 4 of power save relay -- Unused 131 // 132 White Taped ---- Relay Box 133 Solid Green = Pin 7 of power save relay -- Fan Relay -- Arduino Pin = 29 134 White Green = Unused 135 Solid Blue = J1 Open Fan relay 136 White Blue = J1 Common Fan relay 137 Solid Brown = Unused 138 White Brown = Unused 139 Solid Orange = 5v 140 White Orange = Ground 141 // 142 Yellow Tape ---- Sensors 143 Solid Brown = Fan Power 144 White Brown = Fan Ground 145 Solid Green = Ambiant Temperature/Humidity Sensor -- Arduino Pin = 22 146 White Green = Heat Rock 1 Sensor -- Arduino Pin = 23 147 Solid Blue = Heat Rock 2 Sensor -- Arduino Pin = 24 148 White Blue = UNUSED 149 Solid Orange = 5v 150 White Orange = Ground 151 // 152 Red Yellow Tape ---- Touch Screen 153 Solid Brown = Top Right ICSP 154 White Brown = Analog 3 155 Solid Green = Analog 2 156 White Green = Analog 1 157 Solid Blue = Analog 0 158 White Blue = Reset 159 Solid Orange = 5v 160 White Orange = Ground 161 // 162 Red White Tape ---- Touch Screen 163 Solid Brown = Digital 7 164 White Brown = Digital 6 165 Solid Green = Digital 5 166 White Green = Bottom Left ICSP 167 Solid Blue = Top Left ICSP 168 White Blue = Bottom Middle ICSP 169 Solid Orange = Top MiddleICSP 170 White Orange = Bottom Right ICSP 171*/ 172// Enter a MAC address and IP address for your controller below. 173// The IP address will be dependent on your local network: 174byte mac[] = { 175 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED 176}; 177IPAddress ip(192, 168, 1, 109); 178// Initialize the Ethernet server library 179// with the IP address and port you want to use 180// (port 80 is default for HTTP): 181EthernetServer server(6113); 182#define W5200_CS 10 183#define SDCARD_CS 4 184//Camera definitions 185#define VC0706_PROTOCOL_SIGN 0x56 186#define VC0706_Serial2_NUMBER 0x00 187#define VC0706_COMMAND_RESET 0x26 188#define VC0706_COMMAND_GEN_VERSION 0x11 189#define VC0706_COMMAND_TV_OUT_CTRL 0x44 190#define VC0706_COMMAND_OSD_ADD_CHAR 0x45 191#define VC0706_COMMAND_DOWNSIZE_SIZE 0x53 192#define VC0706_COMMAND_READ_FBUF 0x32 193#define FBUF_CURRENT_FRAME 0 194#define FBUF_NEXT_FRAME 0 195#define VC0706_COMMAND_FBUF_CTRL 0x36 196#define VC0706_COMMAND_COMM_MOTION_CTRL 0x37 197#define VC0706_COMMAND_COMM_MOTION_DETECTED 0x39 198#define VC0706_COMMAND_POWER_SAVE_CTRL 0x3E 199#define VC0706_COMMAND_COLOR_CTRL 0x3C 200#define VC0706_COMMAND_MOTION_CTRL 0x42 201#define VC0706_COMMAND_WRITE_DATA 0x31 202#define VC0706_COMMAND_GET_FBUF_LEN 0x34 203#define READ_DATA_BLOCK_NO 56 204unsigned char tx_counter; 205unsigned char tx_vcbuffer[20]; 206bool tx_ready; 207bool rx_ready; 208unsigned char rx_counter; 209unsigned char VC0706_rx_buffer[80]; 210uint32_t frame_length = 0; 211uint32_t vc_frame_address = 0; 212uint32_t last_data_length = 0; 213// one Integer Variable to count for photo 214// increase if you have difficulties conenctiong 215// but it then will refresh less often 216int waitForPhoto = 4; 217int waitCount; 218////////////////////// 219void setup() { 220 // reset w5100 221 pinMode(10, OUTPUT); 222 digitalWrite(10, HIGH); 223 // open Serial2 connection to the camera 224 Serial2.begin(115200); 225 // set the jpeg compression of the camera 226 // smaller number means smaller file, but less quality 227 VC0706_compression_ratio(15); 228 delay(100); 229 pinMode(SDCARD_CS, OUTPUT); 230 Sd2Card card; 231 card.init(SPI_FULL_SPEED, SDCARD_CS); 232 if (!SD.begin(SDCARD_CS)) { 233 rsetFunc(); 234 } 235 // start the Ethernet connection and the server: 236 Ethernet.begin(mac, ip); 237 server.begin(); 238 // put your setup code here, to run once: 239 TFT_BL_ON; 240 Tft.TFTinit(); 241 setSyncProvider(RTC.get); 242 page = 1; 243 monthnow = month(); 244 yearnow = year(); 245 minutenow = minute(); 246 hournow = hour(); 247 npage = 1; 248 humidmin = 50.00; 249 dht.begin(); 250 sensor_hr1.begin(); 251 sensor_hr2.begin(); 252 TimeLord tardis; 253 tardis.TimeZone(0); 254 tardis.Position(LATITUDE, LONGITUDE); 255 // pins 256 pinMode(dnlamp, OUTPUT); 257 pinMode(fogger, OUTPUT); 258 pinMode(hlamp, OUTPUT); 259 pinMode(hrock1, OUTPUT); 260 pinMode(hrock2, OUTPUT); 261 pinMode(fan, OUTPUT); 262 pinMode(foggerwater, INPUT); 263 myDoc = "daynow.txt"; 264 readsd(); 265 daynow = myData.toInt(); 266 myDoc = "hd.txt"; 267 readsd(); 268 humidday = myData.toInt(); 269 myDoc = "hs.txt"; 270 readsd(); 271 humidminset = myData.toFloat(); 272 myDoc = "atd.txt"; 273 readsd(); 274 ambitempday = myData.toInt(); 275 myDoc = "atdset.txt"; 276 readsd(); 277 hkdaytempdisp = myData.toFloat(); 278 myDoc = "atn.txt"; 279 readsd(); 280 ambitempnight = myData.toInt(); 281 myDoc = "atnset.txt"; 282 readsd(); 283 hknighttempdisp = myData.toFloat(); 284 myDoc = "ssetday.txt"; 285 readsd(); 286 ssday = myData.toInt(); 287 myDoc = "sriseday.txt"; 288 readsd(); 289 srday = myData.toInt(); 290 myDoc = "ssetmin.txt"; 291 readsd(); 292 ssminutesetdisp = myData.toInt(); 293 myDoc = "srisemin.txt"; 294 readsd(); 295 srminutesetdisp = myData.toInt(); 296 myDoc = "sriseh.txt"; 297 readsd(); 298 srhoursetdisp = myData.toInt(); 299 myDoc = "ssethour.txt"; 300 readsd(); 301 sshoursetdisp = myData.toInt(); 302} 303////////////////////// 304void loop() { 305 // put your main code here, to run repeatedly: 306 TimeLord tardis; 307 tardis.DstRules(3, 2, 11, 1, 60); 308 if (firsttimeon == 1) { 309 tardis.TimeZone(-5 * 60); 310 tardis.Position(LATITUDE, LONGITUDE); 311 dlstime[5] = (year() - 2000); 312 dlstime[4] = month(); 313 dlstime[3] = day(); 314 dlstime[2] = hour(); 315 dlstime[1] = minute(); 316 tardis.DST(dlstime); 317 firsttimeon = 0; 318 } 319 // count down for photo time 320 waitCount = waitCount - 1; 321 if (waitCount < 2) { 322 capture_photo("live.jpg"); 323 waitCount = waitForPhoto; 324 } 325 // Create a client connection 326 EthernetClient client = server.available(); 327 if (client) { 328 int pos = 0; 329 char clientReq[100]; 330 while (client.connected()) { 331 if (client.available()) { 332 // read what the client is requesting 333 char c = client.read(); 334 if (c != '\n' && c != '\r') { 335 clientReq[pos] = c; 336 pos++; 337 if (pos >= 100) pos = 99; // dont let the buffer overflow... 338 continue; 339 } 340 // send a jpeg file or send html to display files 341 // if there is a character after the 'GET /' request 342 // send the jpeg file 343 if ( clientReq[5] != ' ' ) { 344 // ###### FIND OUT WHICH FILE THE CLIENT REQUEST HERE !!! 345 File myFile = SD.open("live.jpg"); 346 // try to open file 347 // if successfull, send header and jpeg data 348 if (myFile) { 349 client.println("HTTP/1.1 200 OK"); 350 client.println("Content-Type: image/jpg"); 351 client.println(); 352 byte clientBuf[64]; 353 int clientCount = 0; 354 while (myFile.available()) 355 { 356 clientBuf[clientCount] = myFile.read(); 357 clientCount++; 358 if (clientCount > 63) { 359 client.write(clientBuf, 64); 360 clientCount = 0; 361 } 362 } 363 if (clientCount > 0) { 364 client.write(clientBuf, clientCount); 365 } 366 myFile.close(); 367 } 368 } else { 369 // there is no character after the 'GET /' 370 // send HTML site 371 client.println("HTTP/1.1 200 OK"); 372 client.println("Content-Type: text/html"); 373 client.println("Connection: close"); 374 client.println("Refresh: 2"); 375 client.println(); 376 client.println("<!DOCTYPE HTML>"); 377 client.println("<html>"); 378 client.print("Harold & Kumar's Enclosure"); 379 client.println("<br />"); 380 client.print(dayStr(weekday(now()))); 381 client.print(", "); 382 client.print(monthStr(dlstime[4])); 383 client.print(" "); 384 client.print(dlstime[3]); 385 client.print(", "); 386 client.print(year()); 387 client.print(" at "); 388 if (dlstime[2] < 10) { 389 client.print("0"); 390 } 391 client.print(dlstime[2]); 392 client.print(":"); 393 if (minute() < 10) { 394 client.print("0"); 395 } 396 client.print(minute()); 397 client.print(":"); 398 if (second() < 10) { 399 client.print("0"); 400 } 401 client.print(second()); 402 client.println("<br />"); 403 client.println("<br />"); 404 client.print("Room Temperature = "); 405 client.print(roomtemp); 406 client.print(" "); 407 client.print(char(176)); 408 client.print("F"); 409 client.println("<br />"); 410 client.println("<br />"); 411 client.print("Ambient Temperature = "); 412 client.print(ambitempdisp); 413 client.print(" "); 414 client.print(char(176)); 415 client.print("F"); 416 client.println("<br />"); 417 client.print(" Range = "); 418 if (night == 0) { 419 client.print(hkdaytempdisp - .5); 420 } else { 421 client.print(hknighttempdisp - .5); 422 } 423 client.print(" "); 424 client.print(char(176)); 425 client.print("F - "); 426 if (night == 0) { 427 client.print(hkdaytempdisp + .5); 428 } else { 429 client.print(hknighttempdisp + .5); 430 } 431 client.print(" "); 432 client.print(char(176)); 433 client.print("F "); 434 if (night == 0 && ambitempday > 0) { 435 client.print("For "); 436 client.print(ambitempday); 437 client.print(" Day(s)"); 438 } 439 if (night == 1 && ambitempnight > 0) { 440 client.print(" For "); 441 client.print(ambitempnight); 442 client.print(" Day(s)"); 443 } 444 client.println("<br />"); 445 client.println("<br />"); 446 client.print("Basking Temperature = "); 447 client.print(hr1tempdisp); 448 client.print(" "); 449 client.print(char(176)); 450 client.print("F"); 451 client.println("<br />"); 452 client.print(" Range = "); 453 client.print(88); 454 client.print(" "); 455 client.print(char(176)); 456 client.print("F - "); 457 client.print(96); 458 client.print(" "); 459 client.print(char(176)); 460 client.print("F"); 461 client.println("<br />"); 462 client.println("<br />"); 463 client.print("Borrow Temperature = "); 464 client.print(hr2tempdisp); 465 client.print(" "); 466 client.print(char(176)); 467 client.print("F"); 468 client.println("<br />"); 469 client.print(" Range = "); 470 if (night == 0) { 471 client.print(hkdaytempdisp - .5); 472 } else { 473 client.print(hknighttempdisp - .5); 474 } 475 client.print(" "); 476 client.print(char(176)); 477 client.print("F - "); 478 if (night == 0) { 479 client.print(hkdaytempdisp + .5); 480 } else { 481 client.print(hknighttempdisp + .5); 482 } 483 client.print(" "); 484 client.print(char(176)); 485 client.print("F"); 486 if (night == 0 && ambitempday > 0) { 487 client.print(" For "); 488 client.print(ambitempday); 489 client.print(" Day(s)"); 490 } 491 if (night == 1 && ambitempnight > 0) { 492 client.print(" For "); 493 client.print(ambitempnight); 494 client.print(" Day(s)"); 495 } 496 client.println("<br />"); 497 client.println("<br />"); 498 client.print("Humidity = "); 499 client.print(humiddisp); 500 client.print("%"); 501 client.println("<br />"); 502 client.print(" Range = "); 503 client.print(humidminset); 504 client.print("% - "); 505 client.print(humidminset + 10); 506 client.print("% "); 507 if ( humidday > 0) { 508 client.print("For "); 509 client.print(humidday); 510 client.print(" Day(s)"); 511 } 512 client.println("<br />"); 513 client.println("<br />"); 514 client.print("Water Level = "); 515 if (digitalRead(foggerwater) == HIGH) { 516 client.print("Good"); 517 } else { 518 client.print("Fill Now!"); 519 } 520 client.println("<br />"); 521 client.print("Time = "); 522 if (night == 0) { 523 client.print("Day"); 524 } else { 525 client.print("Night"); 526 } 527 client.println("<br />"); 528 client.print("Sunrise Time = "); 529 if (srhoursetdisp < 10) { 530 client.print("0"); 531 } 532 client.print(srhoursetdisp); 533 client.print(":"); 534 if (srminutesetdisp < 10) { 535 client.print("0"); 536 } 537 client.print(srminutesetdisp); 538 if (srday > 0) { 539 client.print(" For "); 540 client.print(srday); 541 client.print(" Day(s)"); 542 } 543 client.println("<br />"); 544 client.print("Sunset Time = "); 545 if (sshoursetdisp < 10) { 546 client.print("0"); 547 } 548 client.print(sshoursetdisp); 549 client.print(":"); 550 if (ssminutesetdisp < 10) { 551 client.print("0"); 552 } 553 client.print(ssminutesetdisp); 554 if (ssday > 0) { 555 client.print(" For "); 556 client.print(ssday); 557 client.print(" Day(s)"); 558 } 559 client.println("<br />"); 560 client.println("<br />"); 561 client.print("Heat Lamp = "); 562 if (hlpwr == 1) { 563 client.print("ON"); 564 } else { 565 client.print("OFF"); 566 } 567 client.println("<br />"); 568 client.print("Fans = "); 569 if (fanpwr == 1) { 570 client.print("ON"); 571 } else { 572 client.print("OFF"); 573 } 574 client.println("<br />"); 575 client.print("Basking Rock = "); 576 if (hr1pwr == 1) { 577 client.print("ON"); 578 } else { 579 client.print("OFF"); 580 } 581 client.println("<br />"); 582 client.print("Borrow Rock = "); 583 if (hr2pwr == 1) { 584 client.print("ON"); 585 } else { 586 client.print("OFF"); 587 } 588 client.println("<br />"); 589 client.print("Fogger = "); 590 if (foggerpwr == 1) { 591 client.print("ON"); 592 } else { 593 client.print("OFF"); 594 } 595 client.println("<br />"); 596 client.println("<div align=center><img src='live.jpg' width='640' height='480'>"); 597 client.println("<p>"); 598 client.println("Live from Harold & Kumar</div>"); 599 client.println("</html>"); 600 } 601 delay(1); 602 //stopping client 603 client.stop(); 604 } 605 } 606 } 607 //new touch point 608 Point p = ts.getPoint(); 609 p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240); 610 p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320); 611 if (p.z > __PRESURE) { 612 // New Page 613 if ((p.x < 120) && (p.y > 40) && (p.y < 70)) { 614 if (page == 1) { 615 page = 2; 616 npage = 1; 617 } else { 618 page = 1; 619 npage = 1; 620 } 621 } 622 if ((p.x > 120) && (p.y > 40) && (p.y < 70)) { 623 if (page > 2) { 624 page = 2; 625 npage = 1; 626 } else { 627 page = 3; 628 npage = 1; 629 } 630 } 631 if ((p.x < 120) && (p.y > 70) && (p.y < 100)) { 632 if (page > 3) { 633 page = 3; 634 npage = 1; 635 } else { 636 page = 4; 637 npage = 1; 638 } 639 } 640 if ((p.x > 120) && (p.y > 70) && (p.y < 100)) { 641 if (page == 5) { 642 page = 4; 643 npage = 1; 644 } else { 645 page = 5; 646 npage = 1; 647 } 648 } 649 if (page == 2) { 650 if ((p.x > 140) && (p.x < 170) && (p.y > 220) && (p.y < 250)) { //+ set 651 if (night == 1) { 652 if (dnchan == 0) { 653 hknighttempdisp = hknighttempdisp + .5; 654 Tft.fillRectangle(48, 230, 72, 15, BLACK); 655 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 656 if (ambitempnight == 0 ) { 657 ambitempnight = ambitempnight + 1; 658 Tft.fillRectangle(84, 270, 36, 15, BLACK); 659 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 660 } 661 } else { 662 hkdaytempdisp = hkdaytempdisp + .5; 663 Tft.fillRectangle(48, 230, 72, 15, BLACK); 664 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 665 if (ambitempday == 0 ) { 666 ambitempday = ambitempday + 1; 667 Tft.fillRectangle(84, 270, 36, 15, BLACK); 668 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 669 } 670 } 671 } else { 672 if (dnchan == 0) { 673 hkdaytempdisp = hkdaytempdisp + .5; 674 Tft.fillRectangle(48, 230, 72, 15, BLACK); 675 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 676 if (ambitempday == 0 ) { 677 ambitempday = ambitempday + 1; 678 Tft.fillRectangle(84, 270, 36, 15, BLACK); 679 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 680 } 681 } else { 682 hknighttempdisp = hknighttempdisp + .5; 683 Tft.fillRectangle(48, 230, 72, 15, BLACK); 684 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 685 if (ambitempnight == 0 ) { 686 ambitempnight = ambitempnight + 1; 687 Tft.fillRectangle(84, 270, 36, 15, BLACK); 688 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 689 } 690 } 691 } 692 } 693 if ((p.x > 200) && (p.x < 230) && (p.y > 220) && (p.y < 250)) { //- set 694 if (night == 1) { 695 if (dnchan == 0) { 696 hknighttempdisp = hknighttempdisp - .5; 697 Tft.fillRectangle(48, 230, 72, 15, BLACK); 698 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 699 if (ambitempnight == 0 ) { 700 ambitempnight = ambitempnight + 1; 701 Tft.fillRectangle(84, 270, 36, 15, BLACK); 702 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 703 } 704 } else { 705 hkdaytempdisp = hkdaytempdisp - .5; 706 Tft.fillRectangle(48, 230, 72, 15, BLACK); 707 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 708 if (ambitempday == 0 ) { 709 ambitempday = ambitempday + 1; 710 Tft.fillRectangle(84, 270, 36, 15, BLACK); 711 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 712 } 713 } 714 } else { 715 if (dnchan == 0) { 716 hkdaytempdisp = hkdaytempdisp * .5; 717 Tft.fillRectangle(48, 230, 72, 15, BLACK); 718 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 719 if (ambitempday == 0 ) { 720 ambitempday = ambitempday + 1; 721 Tft.fillRectangle(84, 270, 36, 15, BLACK); 722 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 723 } 724 } else { 725 hknighttempdisp = hknighttempdisp - .5; 726 Tft.fillRectangle(48, 230, 72, 15, BLACK); 727 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 728 if (ambitempnight == 0 ) { 729 ambitempnight = ambitempnight + 1; 730 Tft.fillRectangle(84, 270, 36, 15, BLACK); 731 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 732 } 733 } 734 } 735 } 736 if ((p.x > 140) && (p.x < 170) && (p.y > 260) && (p.y < 290)) { //+ day 737 if (night == 1) { 738 if (dnchan == 0) { 739 ambitempnight = ambitempnight + 1; 740 Tft.fillRectangle(84, 270, 36, 15, BLACK); 741 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 742 } else { 743 ambitempday = ambitempday + 1; 744 Tft.fillRectangle(84, 270, 36, 15, BLACK); 745 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 746 } 747 } else { 748 if (dnchan == 0) { 749 ambitempday = ambitempday + 1; 750 Tft.fillRectangle(84, 270, 36, 15, BLACK); 751 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 752 } else { 753 ambitempnight = ambitempnight + 1; 754 Tft.fillRectangle(84, 270, 36, 15, BLACK); 755 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 756 } 757 } 758 } 759 if ((p.x > 200) && (p.x < 230) && (p.y > 260) && (p.y < 290)) { //- day 760 if (night == 1) { 761 if (dnchan == 0) { 762 ambitempnight = ambitempnight - 1; 763 Tft.fillRectangle(84, 270, 36, 15, BLACK); 764 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 765 } else { 766 ambitempday = ambitempday - 1; 767 Tft.fillRectangle(84, 270, 36, 15, BLACK); 768 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 769 } 770 } else { 771 if (dnchan == 0) { 772 ambitempday = ambitempday - 1; 773 Tft.fillRectangle(84, 270, 36, 15, BLACK); 774 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 775 } else { 776 ambitempnight = ambitempnight - 1; 777 Tft.fillRectangle(84, 270, 36, 15, BLACK); 778 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 779 } 780 } 781 } 782 if ((p.x > 60) && (p.x < 180) && (p.y > 300) && (p.y < 330)) { 783 if (dnchan == 0) { 784 dnchan = 1; 785 } else { 786 dnchan = 0; 787 } 788 npage = 1; 789 } 790 } 791 if (page == 3) { 792 if ((p.x > 60) && (p.x < 90) && (p.y > 170) && (p.y < 200)) { //+ humidity 793 humidminset = humidminset + 1; 794 if (humidday == 0) { 795 humidday = 1; 796 Tft.fillRectangle(60, 210, 36, 15, BLACK); 797 Tft.drawNumber(humidday, 60, 210, 2, CYAN); 798 } 799 Tft.fillRectangle(72, 150, 60, 15, BLACK); 800 Tft.drawFloat(humidminset, 72, 150, 2, CYAN); 801 Tft.fillRectangle(146, 150, 60, 15, BLACK); 802 Tft.drawFloat(humidminset + 10, 146, 150, 2, CYAN); 803 } 804 if ((p.x > 120) && (p.x < 150) && (p.y > 170) && (p.y < 200)) { // - Humidity 805 humidminset = humidminset - 1; 806 if (humidday == 0) { 807 humidday = 1; 808 Tft.fillRectangle(60, 210, 36, 15, BLACK); 809 Tft.drawNumber(humidday, 60, 210, 2, CYAN); 810 } 811 Tft.fillRectangle(72, 150, 60, 15, BLACK); 812 Tft.drawFloat(humidminset, 72, 150, 2, CYAN); 813 Tft.fillRectangle(146, 150, 60, 15, BLACK); 814 Tft.drawFloat(humidminset + 10, 146, 150, 2, CYAN); 815 } 816 if ((p.x > 60) && (p.x < 90) && (p.y > 230) && (p.y < 260)) { // + humid day 817 humidday = humidday + 1; 818 Tft.fillRectangle(60, 210, 36, 15, BLACK); 819 Tft.drawNumber(humidday, 60, 210, 2, CYAN); 820 } 821 if ((p.x > 120) && (p.x < 150) && (p.y > 230) && (p.y < 260)) { // - humid day 822 humidday = humidday - 1; 823 if (humidday < 0) { 824 humidday = 0; 825 } 826 Tft.fillRectangle(60, 210, 36, 15, BLACK); 827 Tft.drawNumber(humidday, 60, 210, 2, CYAN); 828 } 829 } 830 if (page == 4) { 831 if ((p.x > 60) && (p.x < 90) && (p.y > 130) && (p.y < 160)) { // + min on sunrise 832 srminutesetdisp = srminutesetdisp + 1; 833 if (srminutesetdisp > 59) { 834 srminutesetdisp = 0; 835 srhoursetdisp = srhoursetdisp + 1; 836 if (srhoursetdisp > 24) { 837 srhoursetdisp = 0; 838 } 839 } 840 if (srday == 0) { 841 srday = 1; 842 Tft.fillRectangle(60, 170, 36, 15, BLACK); 843 Tft.drawNumber(srday, 60, 170, 2, CYAN); 844 } 845 Tft.fillRectangle(110, 110, 24, 15, BLACK); 846 if (srhoursetdisp > 9) { 847 Tft.drawNumber(srhoursetdisp, 110, 110, 2, CYAN); 848 } else { 849 Tft.drawNumber(0, 110, 110, 2, CYAN); 850 Tft.drawNumber(srhoursetdisp, 122, 110, 2, CYAN); 851 } 852 Tft.fillRectangle(146, 110, 24, 15, BLACK); 853 if (srminutesetdisp > 9) { 854 Tft.drawNumber(srminutesetdisp, 146, 110, 2, CYAN); 855 } else { 856 Tft.drawNumber(0, 146, 110, 2, CYAN); 857 Tft.drawNumber(srminutesetdisp, 158, 110, 2, CYAN); 858 } 859 } 860 if ((p.x > 120) && (p.x < 150) && (p.y > 130) && (p.y < 160)) { // - min on sunrise 861 srminutesetdisp = srminutesetdisp - 1; 862 if (srminutesetdisp < 0) { 863 srminutesetdisp = 59; 864 srhoursetdisp = srhoursetdisp - 1; 865 if (srhoursetdisp < 0) { 866 srhoursetdisp = 24; 867 } 868 } 869 if (srday == 0) { 870 srday = 1; 871 Tft.fillRectangle(60, 170, 36, 15, BLACK); 872 Tft.drawNumber(srday, 60, 170, 2, CYAN); 873 } 874 Tft.fillRectangle(110, 110, 24, 15, BLACK); 875 if (srhoursetdisp > 9) { 876 Tft.drawNumber(srhoursetdisp, 110, 110, 2, CYAN); 877 } else { 878 Tft.drawNumber(0, 110, 110, 2, CYAN); 879 Tft.drawNumber(srhoursetdisp, 122, 110, 2, CYAN); 880 } 881 Tft.fillRectangle(146, 110, 24, 15, BLACK); 882 if (srminutesetdisp > 9) { 883 Tft.drawNumber(srminutesetdisp, 146, 110, 2, CYAN); 884 } else { 885 Tft.drawNumber(0, 146, 110, 2, CYAN); 886 Tft.drawNumber(srminutesetdisp, 158, 110, 2, CYAN); 887 } 888 } 889 if ((p.x > 110) && (p.x < 140) && (p.y > 170) && (p.y < 200)) { // +day set for sunrise 890 srday = srday + 1; 891 Tft.fillRectangle(60, 170, 36, 15, BLACK); 892 Tft.drawNumber(srday, 60, 170, 2, CYAN); 893 } 894 if ((p.x > 170) && (p.x < 200) && (p.y > 170) && (p.y < 200)) { // - day set for sunrise 895 srday = srday - 1; 896 if (srday < 0) { 897 srday = 0; 898 } 899 Tft.fillRectangle(60, 170, 36, 15, BLACK); 900 Tft.drawNumber(srday, 60, 170, 2, CYAN); 901 } 902 if ((p.x > 60) && (p.x < 90) && (p.y > 230) && (p.y < 260)) { // + min sunset 903 ssminutesetdisp = ssminutesetdisp + 1; 904 if (ssminutesetdisp > 59) { 905 ssminutesetdisp = 0; 906 sshoursetdisp = sshoursetdisp + 1; 907 if (sshoursetdisp > 24) { 908 sshoursetdisp = 0; 909 } 910 } 911 if (ssday == 0) { 912 ssday = 1; 913 Tft.fillRectangle(60, 270, 36, 15, BLACK); 914 Tft.drawNumber(ssday, 60, 270, 2, CYAN); 915 } 916 Tft.fillRectangle(110, 210, 24, 15, BLACK); 917 if (sshoursetdisp > 9) { 918 Tft.drawNumber(sshoursetdisp, 110, 210, 2, CYAN); 919 } else { 920 Tft.drawNumber(0, 110, 210, 2, CYAN); 921 Tft.drawNumber(sshoursetdisp, 122, 210, 2, CYAN); 922 } 923 Tft.fillRectangle(146, 210, 24, 15, BLACK); 924 if (ssminutesetdisp > 9) { 925 Tft.drawNumber(ssminutesetdisp, 146, 210, 2, CYAN); 926 } else { 927 Tft.drawNumber(0, 146, 210, 2, CYAN); 928 Tft.drawNumber(ssminutesetdisp, 158, 210, 2, CYAN); 929 } 930 } 931 if ((p.x > 120) && (p.x < 150) && (p.y > 230) && (p.y < 260)) { //- min for sunset 932 ssminutesetdisp = ssminutesetdisp - 1; 933 if (ssminutesetdisp < 0) { 934 ssminutesetdisp = 59; 935 sshoursetdisp = sshoursetdisp - 1; 936 if (sshoursetdisp < 0) { 937 sshoursetdisp = 24; 938 } 939 } 940 if (ssday == 0) { 941 ssday = 1; 942 Tft.fillRectangle(60, 270, 36, 15, BLACK); 943 Tft.drawNumber(ssday, 60, 270, 2, CYAN); 944 } 945 Tft.fillRectangle(110, 210, 24, 15, BLACK); 946 if (sshoursetdisp > 9) { 947 Tft.drawNumber(sshoursetdisp, 110, 210, 2, CYAN); 948 } else { 949 Tft.drawNumber(0, 110, 210, 2, CYAN); 950 Tft.drawNumber(sshoursetdisp, 122, 210, 2, CYAN); 951 } 952 Tft.fillRectangle(146, 210, 24, 15, BLACK); 953 if (ssminutesetdisp > 9) { 954 Tft.drawNumber(ssminutesetdisp, 146, 210, 2, CYAN); 955 } else { 956 Tft.drawNumber(0, 146, 210, 2, CYAN); 957 Tft.drawNumber(ssminutesetdisp, 158, 210, 2, CYAN); 958 } 959 } 960 if ((p.x > 110) && (p.x < 140) && (p.y > 270) && (p.y < 300)) { //+ day for sunset 961 ssday = ssday + 1; 962 Tft.fillRectangle(60, 270, 36, 15, BLACK); 963 Tft.drawNumber(ssday, 60, 270, 2, CYAN); 964 } 965 if ((p.x > 170) && (p.x < 200) && (p.y > 270) && (p.y < 300)) { //- day set for sunset 966 ssday = ssday - 1; 967 if (ssday < 0) { 968 ssday = 0; 969 } 970 Tft.fillRectangle(60, 270, 36, 15, BLACK); 971 Tft.drawNumber(ssday, 60, 270, 2, CYAN); 972 } 973 } 974 tpage = minute() + 5; 975 if (tpage > 59) { 976 tpage = tpage - 60; 977 } 978 } 979 //page change 980 if (npage == 1) { 981 if (page == 1) { 982 allpage(); 983 pageone(); 984 } 985 if (page == 2) { 986 allpage(); 987 pagetwo(); 988 } 989 if (page == 3) { 990 allpage(); 991 pagethree(); 992 } 993 if (page == 4) { 994 allpage(); 995 pagefour(); 996 } 997 if (page == 5) { 998 allpage(); 999 pagefive(); 1000 } 1001 npage = 0; 1002 tpage = minute() + 5; 1003 if (tpage > 59) { 1004 tpage = tpage - 60; 1005 } 1006 } 1007 if (tpage == minute()) { 1008 page = page + 1; 1009 dnchan = 0; 1010 if (page > 5) { 1011 page = 1; 1012 } 1013 npage = 1; 1014 } 1015 //time change 1016 if (minutenow != minute()) { 1017 Tft.fillRectangle(56, 20, 25, 15, BLACK); 1018 if (minute() > 9) { 1019 Tft.drawNumber(minute(), 56, 20, 2, CYAN); 1020 } else { 1021 Tft.drawNumber(0, 56, 20, 2, CYAN); 1022 Tft.drawNumber(minute(), 68, 20, 2, CYAN); 1023 } 1024 minutenow = minute(); 1025 } 1026 if (daynow != day()) { 1027 settemp(); 1028 daynow = day(); 1029 //temp day - 1 1030 if (ambitempday > 0) { 1031 ambitempday = ambitempday - 1; 1032 } 1033 if (ambitempnight > 0) { 1034 ambitempnight = ambitempnight - 1; 1035 } 1036 //humid day - 1 1037 if (humidday > 0) { 1038 humidday = humidday - 1; 1039 } 1040 //SR/SS day - 1 1041 if (ssday > 0) { 1042 ssday = ssday - 1; 1043 } 1044 if (srday > 0) { 1045 srday = srday - 1; 1046 } 1047 } 1048 if (hournow != hour()) { 1049 dlstime[5] = (year() - 2000); 1050 dlstime[4] = month(); 1051 dlstime[3] = day(); 1052 dlstime[2] = hour(); 1053 tardis.DST(dlstime); 1054 Tft.fillRectangle(20, 20, 25, 15, BLACK); 1055 if (dlstime[2] > 9) { 1056 Tft.drawNumber(dlstime[2], 20, 20, 2, CYAN); 1057 } else { 1058 Tft.drawNumber(0, 20, 20, 2, CYAN); 1059 Tft.drawNumber(dlstime[2], 32, 20, 2, CYAN); 1060 Tft.fillRectangle(144, 20, 25, 15, BLACK); 1061 } 1062 if (day() > 9) { 1063 Tft.drawNumber(day(), 144, 20, 2, CYAN); 1064 } else { 1065 Tft.drawNumber(0, 144, 20, 2, CYAN); 1066 Tft.drawNumber(day(), 156, 20, 2, CYAN); 1067 } 1068 hournow = hour(); 1069 myDoc = "daynow.txt"; 1070 myData = String(daynow); 1071 writesd(); 1072 myDoc = "hd.txt"; 1073 myData = String(humidday); 1074 writesd(); 1075 myDoc = "hs.txt"; 1076 myData = String(humidminset); 1077 writesd(); 1078 myDoc = "atd.txt"; 1079 myData = String(ambitempday); 1080 writesd(); 1081 myDoc = "atdset.txt"; 1082 myData = String(hkdaytempdisp); 1083 writesd(); 1084 myDoc = "atn.txt"; 1085 myData = String(ambitempnight); 1086 writesd(); 1087 myDoc = "atnset.txt"; 1088 myData = String(hknighttempdisp); 1089 writesd(); 1090 myDoc = "ssetday.txt"; 1091 myData = String(ssday); 1092 writesd(); 1093 myDoc = "sriseday.txt"; 1094 myData = String(srday); 1095 writesd(); 1096 myDoc = "ssetmin.txt"; 1097 myData = String(ssminutesetdisp); 1098 writesd(); 1099 myDoc = "srisemin.txt"; 1100 myData = String(srminutesetdisp); 1101 writesd(); 1102 myDoc = "ssethour.txt"; 1103 myData = String(sshoursetdisp); 1104 writesd(); 1105 myDoc = "sriseh.txt"; 1106 myData = String(srhoursetdisp); 1107 writesd(); 1108 delay(10); 1109 rsetFunc(); 1110 } 1111 if (monthnow != month()) { 1112 Tft.fillRectangle(120, 20, 25, 15, BLACK); 1113 if (month() > 9) { 1114 Tft.drawNumber(month(), 108, 20, 2, CYAN); 1115 } else { 1116 Tft.drawNumber(0, 108, 20, 2, CYAN); 1117 Tft.drawNumber(month(), 120, 20, 2, CYAN); 1118 } 1119 monthnow = month(); 1120 } 1121 if (yearnow != year()) { 1122 Tft.fillRectangle(180, 20, 48, 15, BLACK); 1123 Tft.drawNumber(year(), 180, 20, 2, CYAN); 1124 yearnow = year(); 1125 } 1126 //ambient temp and humid 1127 ambitempcur = dht.readTemperature(true); 1128 if (ambitempcur != ambitempdisp) { 1129 ambitempdisp = ambitempcur; 1130 if (page == 2) { 1131 Tft.fillRectangle(0, 110, 72, 25, BLACK); 1132 Tft.drawFloat(ambitempdisp, 0, 115, 2, CYAN); 1133 } 1134 } 1135 humidcur = dht.readHumidity(); 1136 if (humidcur != humiddisp) { 1137 humiddisp = humidcur; 1138 if (page == 3) { 1139 Tft.fillRectangle(0, 110, 92, 30, BLACK); 1140 Tft.drawFloat(humiddisp, 0, 115, 3, CYAN); 1141 } 1142 } 1143 sensor_hr1.requestTemperatures(); 1144 hr1tempcur = 32 + (sensor_hr1.getTempCByIndex(0) * 1.8); 1145 if (hr1tempcur != hr1tempdisp) { 1146 hr1tempdisp = hr1tempcur; 1147 if (page == 2) { 1148 Tft.fillRectangle(0, 150, 72, 25, BLACK); 1149 Tft.drawFloat(hr1tempdisp, 0, 155, 2, CYAN - 8); 1150 } 1151 } 1152 roomtemp = (RTC.temperature() / 4) * 9 / 5 + 32; 1153 if (roomtemp != roomtempdisp) { 1154 roomtempdisp = roomtemp; 1155 if (page == 5) { 1156 Tft.fillRectangle(120, 255, 62, 25, BLACK); 1157 Tft.drawFloat(roomtempdisp, 120, 255, 2, CYAN); 1158 } 1159 } 1160 if ((hr1tempdisp < 88) && (hr1sen == 0)) { 1161 digitalWrite(hrock1, HIGH); 1162 if ((page == 5) && (hr1pwr == 0)) { 1163 Tft.fillRectangle(0, 223, 110, 12, GREEN); 1164 Tft.drawString("Heat Rock 1: ON", 0, 225, 1, BLACK); 1165 } 1166 hr1pwr = 1; 1167 } 1168 if ((hr1tempdisp > 96) || (hr1sen == 1)) { 1169 digitalWrite(hrock1, LOW); 1170 if ((page == 5) && (hr1pwr == 1)) { 1171 Tft.fillRectangle(0, 223, 110, 12, RED); 1172 Tft.drawString("Heat Rock 1: OFF", 0, 225, 1, CYAN); 1173 } 1174 hr1pwr = 0; 1175 } 1176 sensor_hr2.requestTemperatures(); 1177 hr2tempcur = 32 + (sensor_hr2.getTempCByIndex(0) * 1.8); 1178 if (hr2tempcur != hr2tempdisp) { 1179 hr2tempdisp = hr2tempcur; 1180 if (page == 2) { 1181 Tft.fillRectangle(0, 190, 72, 25, BLACK); 1182 Tft.drawFloat(hr2tempdisp, 0, 195, 2, CYAN); 1183 } 1184 } 1185 if (night == 1) { 1186 if ((hr2tempdisp < hknighttempdisp - .5) && (hr2sen == 0)) { 1187 digitalWrite(hrock2, HIGH); 1188 if ((page == 5) && (hr2pwr == 0)) { 1189 Tft.fillRectangle(115, 223, 110, 12, GREEN); 1190 Tft.drawString("Heat Rock 2: ON", 115, 225, 1, BLACK); 1191 } 1192 hr2pwr = 1; 1193 } 1194 if ((hr2tempdisp > hknighttempdisp + .5) || (hr2sen == 1)) { 1195 digitalWrite(hrock2, LOW); 1196 if ((page == 5) && (hr2pwr == 1)) { 1197 Tft.fillRectangle(115, 223, 110, 12, RED); 1198 Tft.drawString("Heat Rock 2: OFF", 115, 225, 1, CYAN); 1199 } 1200 hr2pwr = 0; 1201 } 1202 } else { 1203 if ((hr2tempdisp < hkdaytempdisp - .5) && (hr2sen == 0)) { 1204 digitalWrite(hrock2, HIGH); 1205 if ((page == 5) && (hr2pwr == 0)) { 1206 Tft.fillRectangle(115, 223, 110, 12, GREEN); 1207 Tft.drawString("Heat Rock 2: ON", 115, 225, 1, BLACK); 1208 } 1209 hr2pwr = 1; 1210 } 1211 if ((hr2tempdisp > hkdaytempdisp + .5) || (hr2sen == 1)) { 1212 digitalWrite(hrock2, LOW); 1213 if ((page == 5) && (hr2pwr == 1)) { 1214 Tft.fillRectangle(115, 223, 110, 12, RED); 1215 Tft.drawString("Heat Rock 2: OFF", 115, 225, 1, CYAN); 1216 } 1217 hr2pwr = 0; 1218 } 1219 } 1220 if (ambitempday == 0) { 1221 settemp(); 1222 if (hkdaytemp != hkdaytempdisp) { 1223 hkdaytempdisp = hkdaytemp; 1224 if ((page == 2) && (night == 0)) { 1225 Tft.fillRectangle(48, 230, 72, 30, BLACK); 1226 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 1227 } 1228 } 1229 } 1230 if (ambitempnight == 0) { 1231 settemp(); 1232 if (hknighttemp != hknighttempdisp) { 1233 hknighttempdisp = hknighttemp; 1234 if ((page == 2) && (night == 1)) { 1235 Tft.fillRectangle(48, 230, 72, 30, BLACK); 1236 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 1237 } 1238 } 1239 } 1240 if (humidday == 0) { 1241 if ((page == 3) && (humidminset != humidmin)) { 1242 Tft.fillRectangle(72, 150, 60, 15, BLACK); 1243 Tft.fillRectangle(146, 150, 60, 15, BLACK); 1244 Tft.drawFloat (humidminset, 72, 150, 2, CYAN); 1245 Tft.drawFloat(humidminset + 10, 146, 150, 2, CYAN); 1246 } 1247 humidminset = humidmin; 1248 } 1249 if (ambithsen == 0) { 1250 if (night == 0) { 1251 if (ambitempdisp < (hkdaytempdisp - .5)) { 1252 digitalWrite(hlamp, HIGH); 1253 if ((page == 5) && (hlpwr == 0)) { 1254 Tft.fillRectangle(0, 208, 110, 12, GREEN); 1255 Tft.drawString("Heat Lamp: ON", 0, 210, 1, BLACK); 1256 } 1257 hlpwr = 1; 1258 } 1259 if (ambitempdisp > (hkdaytempdisp + .5)) { 1260 digitalWrite(hlamp, LOW); 1261 if ((page == 5) && (hlpwr == 1)) { 1262 Tft.fillRectangle(0, 208, 110, 12, RED); 1263 Tft.drawString("Heat Lamp: OFF", 0, 210, 1, CYAN); 1264 } 1265 hlpwr = 0; 1266 } 1267 if (ambitempdisp < (hkdaytempdisp + 2)) { 1268 digitalWrite(fan, LOW); 1269 if ((page == 5) && (fanpwr == 1)) { 1270 Tft.fillRectangle(115, 208, 110, 12, RED); 1271 Tft.drawString("Fan: OFF", 115, 210, 1, CYAN); 1272 } 1273 fanpwr = 0; 1274 } 1275 if (ambitempdisp > (hkdaytempdisp + 5)) { 1276 digitalWrite(fan, HIGH); 1277 if ((page == 5) && (fanpwr == 0)) { 1278 Tft.fillRectangle(115, 208, 110, 12, GREEN); 1279 Tft.drawString("Fan: ON", 115, 210, 1, BLACK); 1280 } 1281 fanpwr = 1; 1282 } 1283 } else { 1284 if (ambitempdisp < (hknighttempdisp - .5)) { 1285 digitalWrite(hlamp, HIGH); 1286 if ((page == 5) && (hlpwr == 0)) { 1287 Tft.fillRectangle(0, 208, 110, 12, GREEN); 1288 Tft.drawString("Heat Lamp: ON", 0, 210, 1, BLACK); 1289 } 1290 hlpwr = 1; 1291 } 1292 if (ambitempdisp > (hknighttempdisp + .5)) { 1293 digitalWrite(hlamp, LOW); 1294 if ((page == 5) && (hlpwr == 1)) { 1295 Tft.fillRectangle(0, 208, 110, 12, RED); 1296 Tft.drawString("Heat Lamp: OFF", 0, 210, 1, CYAN); 1297 } 1298 hlpwr = 0; 1299 } 1300 if (ambitempdisp < (hknighttempdisp + 2)) { 1301 digitalWrite(fan, LOW); 1302 if ((page == 5) && (fanpwr == 1)) { 1303 Tft.fillRectangle(115, 208, 110, 12, RED); 1304 Tft.drawString("Fan: OFF", 115, 210, 1, CYAN); 1305 } 1306 fanpwr = 0; 1307 } 1308 if (ambitempdisp > (hknighttempdisp + 5)) { 1309 digitalWrite(fan, HIGH); 1310 if ((page == 5) && (fanpwr == 0)) { 1311 Tft.fillRectangle(115, 208, 110, 12, GREEN); 1312 Tft.drawString("Fan: ON", 115, 210, 1, BLACK); 1313 } 1314 fanpwr = 1; 1315 } 1316 } 1317 if ((humiddisp < humidminset) && (fanpwr == 0) && (foggersen == 0)) { 1318 digitalWrite(fogger, HIGH); 1319 if ((page == 5) && (foggerpwr == 0)) { 1320 Tft.fillRectangle(0, 238, 110, 12, GREEN); 1321 Tft.drawString("Fogger: ON", 0 1322 , 240, 1, BLACK); 1323 } 1324 foggerpwr = 1; 1325 } 1326 if ((humiddisp > (humidminset + 10)) || (fanpwr == 1) || (foggersen == 1)) { 1327 digitalWrite(fogger, LOW); 1328 if ((page == 5) && (foggerpwr == 1)) { 1329 Tft.fillRectangle(0, 238, 110, 12, RED); 1330 Tft.drawString("Fogger: OFF", 0, 240, 1, CYAN); 1331 } 1332 foggerpwr = 0; 1333 } 1334 } else { 1335 digitalWrite(hlamp, LOW); 1336 digitalWrite(fogger, LOW); 1337 if ((page == 5) && ((hlpwr == 1) || (foggerpwr == 1))) { 1338 Tft.fillRectangle(0, 208, 110, 12, RED); 1339 Tft.drawString("Heat Lamp: OFF", 0, 210, 1, CYAN); 1340 Tft.fillRectangle(115, 238, 110, 12, RED); 1341 Tft.drawString("Fogger: OFF", 115, 240, 1, CYAN); 1342 } 1343 foggerpwr = 0; 1344 hlpwr = 0; 1345 } 1346 //light cycle set 1347 if (srday == 0) { 1348 todaysr[3] = day(); 1349 todaysr[4] = month(); 1350 todaysr[5] = year(); 1351 tardis.SunRise(todaysr); 1352 tardis.DST(todaysr); 1353 srhourset = todaysr[2]; 1354 srminuteset = todaysr[1]; 1355 if (page == 4) { 1356 if (srhoursetdisp != srhourset) { 1357 Tft.fillRectangle(110, 110, 25, 14, BLACK); 1358 if (srhourset > 9) { 1359 Tft.drawNumber(srhourset, 110, 110, 2, CYAN); 1360 } else { 1361 Tft.drawNumber(0, 110, 110, 2, CYAN); 1362 Tft.drawNumber(srhourset, 122, 110, 2, CYAN); 1363 } 1364 } 1365 if (srminutesetdisp != srminuteset) { 1366 Tft.fillRectangle(146, 110, 25, 14, BLACK); 1367 if (srminuteset > 9) { 1368 Tft.drawNumber(srminuteset, 146, 110, 2, CYAN); 1369 } else { 1370 Tft.drawNumber(0, 146, 110, 2, CYAN); 1371 Tft.drawNumber(srminuteset, 158, 110, 2, CYAN); 1372 } 1373 } 1374 } 1375 srhoursetdisp = srhourset; 1376 srminutesetdisp = srminuteset; 1377 } 1378 if (ssday == 0) { 1379 todayss[3] = day(); 1380 todayss[4] = month(); 1381 todayss[5] = year(); 1382 tardis.SunSet(todayss); 1383 tardis.DST(todayss); 1384 sshourset = todayss[2]; 1385 ssminuteset = todayss[1]; 1386 if (page == 4) { 1387 if (sshoursetdisp != sshourset) { 1388 Tft.fillRectangle(110, 210, 25, 14, BLACK); 1389 if (sshourset > 9) { 1390 Tft.drawNumber(sshourset, 110, 210, 2, CYAN); 1391 } else { 1392 Tft.drawNumber(0, 110, 210, 2, CYAN); 1393 Tft.drawNumber(sshourset, 122, 210, 2, CYAN); 1394 } 1395 } 1396 if (ssminutesetdisp != ssminuteset) { 1397 Tft.fillRectangle(146, 210, 25, 14, BLACK); 1398 if (ssminuteset > 9) { 1399 Tft.drawNumber(ssminuteset, 146, 210, 2, CYAN); 1400 } else { 1401 Tft.drawNumber(0, 146, 210, 2, CYAN); 1402 Tft.drawNumber(ssminuteset, 158, 210, 2, CYAN); 1403 } 1404 } 1405 } 1406 sshoursetdisp = sshourset; 1407 ssminutesetdisp = ssminuteset; 1408 } 1409 timenow = (100 * dlstime[2]) + dlstime[1]; 1410 timesr = (100 * srhoursetdisp) + srminutesetdisp; 1411 timess = (100 * sshoursetdisp) + ssminutesetdisp; 1412 if ((timenow > timesr) && (timenow < timess)) { 1413 night = 0; 1414 digitalWrite(dnlamp, HIGH); 1415 if ((page == 5) && (dlpwr == 0)) { 1416 Tft.fillRectangle(0, 193, 110, 12, GREEN); 1417 Tft.drawString("Day Light: ON", 0, 195, 1, BLACK); 1418 Tft.fillRectangle(115, 193, 110, 12, RED); 1419 Tft.drawString("Night Light: OFF", 115, 195, 1, CYAN); 1420 } 1421 dlpwr = 1; 1422 } else { 1423 night = 1; 1424 digitalWrite(dnlamp, LOW); 1425 if ((page == 5) && (dlpwr == 1)) { 1426 Tft.fillRectangle(0, 193, 110, 12, RED); 1427 Tft.drawString("Day Light: OFF", 0, 195, 1, CYAN); 1428 Tft.fillRectangle(115, 193, 110, 12, GREEN); 1429 Tft.drawString("Night Light: ON", 115, 195, 1, BLACK); 1430 } 1431 dlpwr = 0; 1432 } 1433 //water level low or high 1434 if (digitalRead(foggerwater) == HIGH) { 1435 if ((page == 5) && (foggersen == 1)) { 1436 Tft.fillRectangle(135, 128, 130, 12, GREEN); 1437 Tft.drawString("Water Level: GOOD", 135, 130, 1, BLACK); 1438 Tft.fillRectangle(0, 238, 110, 12, GREEN); 1439 Tft.drawString("Water Level OK", 0, 240, 1, BLACK); 1440 } 1441 foggersen = 0; 1442 } else { 1443 if ((page == 5) && (foggersen == 0)) { 1444 Tft.fillRectangle(135, 128, 130, 12, RED); 1445 Tft.drawString("Water Level: LOW", 135, 130, 1, CYAN); 1446 Tft.fillRectangle(0, 238, 110, 12, RED); 1447 Tft.drawString("Fill Fogger", 0, 240, 1, CYAN); 1448 } 1449 foggersen = 1; 1450 } 1451 //sensor quality check 1452 if ((isnan(dht.readTemperature(true))) || (isnan(dht.readHumidity()))) { 1453 if ((ambithsen == 0) && (page == 5)) { 1454 Tft.fillRectangle(0, 128, 130, 12, RED); 1455 Tft.drawString("Ambient Temp: BAD", 0, 130, 1, CYAN); 1456 } 1457 ambithsen = 1; 1458 } else { 1459 if ((ambithsen == 1) && (page == 5)) { 1460 Tft.fillRectangle(0, 128, 130, 12, GREEN); 1461 Tft.drawString("Ambient Temp: GOOD", 0, 130, 1, BLACK); 1462 } 1463 ambithsen = 0; 1464 } 1465 if ( hr1tempdisp < -196) { 1466 if ((hr1sen == 0) && (page == 5)) { 1467 Tft.fillRectangle(0, 143, 130, 12, RED); 1468 Tft.drawString("Heatrock 1 Temp: BAD", 0, 145, 1, CYAN); 1469 } 1470 hr1sen = 1; 1471 } else { 1472 if ((hr1sen == 1) && (page == 5)) { 1473 Tft.fillRectangle(0, 143, 130, 12, GREEN); 1474 Tft.drawString("Heatrock 1 Temp: GOOD", 0, 145, 1, BLACK); 1475 } 1476 hr1sen = 0; 1477 } 1478 if (hr2tempdisp < -196) { 1479 if ((hr2sen == 0) && (page == 5)) { 1480 Tft.fillRectangle(0, 158, 130, 12, RED); 1481 Tft.drawString("Heatrock 2 Temp: BAD", 0, 160, 1, CYAN); 1482 } 1483 hr2sen = 1; 1484 } else { 1485 if ((hr2sen == 1) && (page == 5)) { 1486 Tft.fillRectangle(0, 158, 130, 12, GREEN); 1487 Tft.drawString("Heatrock 2 Temp: GOOD", 0, 160, 1, BLACK); 1488 } 1489 hr2sen = 0; 1490 } 1491} 1492////////////////////// 1493void settemp() { 1494 if (month() == 1) { 1495 hkdaytemp = 82.17647059 + (day() * -0.125237192); 1496 hknighttemp = 69.28571429 + (day() * -0.061443932); 1497 } 1498 if (month() == 2) { 1499 hkdaytemp = 78.29411765 + (day() * -0.046218487); 1500 hknighttemp = 67.38095238 + (day() * -0.013605442); 1501 }//end of day/night temps 1502 if (month() == 3) { 1503 hkdaytemp = 77 + (day() * 0.146110057); 1504 hknighttemp = 67 + (day() * 0.061443932); 1505 } 1506 if (month() == 4) { 1507 hkdaytemp = 81.52941176 + (day() * 0.129411765); 1508 hknighttemp = 68.9047619 + (day() * 0.088888889); 1509 } 1510 if (month() == 5) { 1511 hkdaytemp = 85.41176471 + (day() * 0.083491461); 1512 hknighttemp = 71.57142857 + (day() * 0.086021505); 1513 } 1514 if (month() == 6) { 1515 hkdaytemp = 88 + (day() * -0.021568627); 1516 hknighttemp = 74.23809524 + (day() * 0.025396825); 1517 } 1518 if (month() == 7) { 1519 hkdaytemp = 87.35294118 + (day() * -0.104364326); 1520 hknighttemp = 75 + (day() * -0.049155146); 1521 } 1522 if (month() == 8) { 1523 hkdaytemp = 84.11764706 + (day() * -0.146110057); 1524 hknighttemp = 73.47619048 + (day() * -0.036866359); 1525 } 1526 if (month() == 9) { 1527 hkdaytemp = 79.58823529 + (day() * -0.064705882); 1528 hknighttemp = 72.33333333 + (day() * -0.025396825); 1529 } 1530 if (month() == 10) { 1531 hkdaytemp = 77.64705882 + (day() * 0.083491461); 1532 hknighttemp = 71.57142857 + (day() * 0.012288786); 1533 } 1534 if (month() == 11) { 1535 hkdaytemp = 80.23529412 + (day() * 0.107843137); 1536 hknighttemp = 71.95238095 + (day() * 0.012698413); 1537 } 1538 if (month() == 12) { 1539 hkdaytemp = 83.47058824 + (day() * -0.041745731); 1540 hknighttemp = 72.33333333 + (day() * -0.098310292); 1541 } 1542 return hkdaytemp, hknighttemp; 1543} 1544////////////////////// 1545void allpage() { 1546 Tft.fillScreen(0, 240, 0, 320, BLACK); 1547 Tft.drawString("Harold & Kumar", 0, 0, 2, CYAN); 1548 if (dlstime[2] > 9) { 1549 Tft.drawNumber(dlstime[2], 20, 20, 2, CYAN); 1550 } else { 1551 Tft.drawNumber(0, 20, 20, 2, CYAN); 1552 Tft.drawNumber(dlstime[2], 32, 20, 2, CYAN); 1553 } 1554 Tft.drawChar(':', 44, 20, 2, CYAN); 1555 if (minute() > 9) { 1556 Tft.drawNumber(minute(), 56, 20, 2, CYAN); 1557 } else { 1558 Tft.drawNumber(0, 56, 20, 2, CYAN); 1559 Tft.drawNumber(minute(), 68, 20, 2, CYAN); 1560 } 1561 if (month() > 9) { 1562 Tft.drawNumber(month(), 108, 20, 2, CYAN); 1563 } else { 1564 Tft.drawNumber(0, 108, 20, 2, CYAN); 1565 Tft.drawNumber(month(), 120, 20, 2, CYAN); 1566 } 1567 Tft.drawChar('/', 132, 20, 2, CYAN); 1568 if (day() > 9) { 1569 Tft.drawNumber(day(), 144, 20, 2, CYAN); 1570 } else { 1571 Tft.drawNumber(0, 144, 20, 2, CYAN); 1572 Tft.drawNumber(day(), 156, 20, 2, CYAN); 1573 } 1574 Tft.drawChar('/', 168, 20, 2, CYAN); 1575 Tft.drawNumber(year(), 180, 20, 2, CYAN); 1576 Tft.drawRectangle(0, 40, 120, 30, CYAN); 1577 Tft.drawRectangle(0, 70, 120, 30, CYAN); 1578 Tft.drawRectangle(120, 40, 120, 30, CYAN); 1579 Tft.drawRectangle(120, 70, 120, 30, CYAN); 1580 return; 1581} 1582////////////////////// 1583void pageone() { //Main 1584 Tft.fillRectangle(180, 0, 61, 15, BLACK); 1585 Tft.drawString("Main", 180, 0, 2, CYAN); 1586 Tft.drawString("Temperature", 24, 50, 1, CYAN); 1587 Tft.drawString("Light Cycle", 24, 80, 1, CYAN); 1588 Tft.drawString("Humidity", 144, 50, 1, CYAN); 1589 Tft.drawString("Settings", 144, 80, 1, CYAN); 1590 Tft.drawString("Harold & Kumar", 0, 110, 2, CYAN); 1591 Tft.drawString("Python Regius", 0, 140, 2, CYAN); 1592 Tft.drawString("Ball or Royal Python", 0, 170, 2, CYAN); 1593 Tft.drawString("Native Countries:", 0, 200, 2, CYAN); 1594 Tft.drawString("Niger, Chad, Guinea, Sierra Leone,", 0, 220, 1, CYAN); 1595 Tft.drawString("Liberia, Ivory Coast, Ghana, Togo,", 0, 235, 1, CYAN); 1596 Tft.drawString("Burkina Faso, Nigeria,", 0, 250, 1, CYAN); 1597 Tft.drawString("Benin and Cameroon", 0, 265, 1, CYAN); 1598 return; 1599} 1600////////////////////// 1601void pagetwo() { //Temperature 1602 Tft.fillRectangle(180, 0, 61, 15, BLACK); 1603 Tft.drawString("Temp", 180, 0, 2, CYAN); 1604 Tft.drawString("Main", 24, 50, 1, CYAN); 1605 Tft.drawString("Light Cycle", 24, 80, 1, CYAN); 1606 Tft.drawString("Humidity", 144, 50, 1, CYAN); 1607 Tft.drawString("Settings", 144, 80, 1, CYAN); 1608 Tft.drawFloat(ambitempdisp, 0, 115, 2, CYAN); 1609 Tft.drawChar('o', 85, 110, 1, CYAN); 1610 Tft.drawChar('F', 89, 110, 3, CYAN); 1611 Tft.drawString("Ambient", 110, 110, 3, CYAN); 1612 Tft.drawFloat(hr1tempdisp, 0, 155, 2, CYAN); 1613 Tft.drawChar('o', 85, 150, 1, CYAN); 1614 Tft.drawChar('F', 89, 150, 3, CYAN); 1615 Tft.drawString("Basking", 110, 150, 3, CYAN); 1616 Tft.drawFloat(hr2tempdisp, 0, 195, 2, CYAN); 1617 Tft.drawChar('o', 85, 190, 1, CYAN); 1618 Tft.drawChar('F', 89, 190, 3, CYAN); 1619 Tft.drawString("Burrow", 110, 190, 3, CYAN); 1620 Tft.drawString("Set", 0, 230, 2, CYAN); 1621 Tft.drawChar('o', 120, 230, 1, CYAN); 1622 Tft.drawChar('F', 125, 230, 2, CYAN); 1623 Tft.drawRectangle(140, 220, 30, 30, CYAN); 1624 Tft.drawChar('+', 148, 228, 2, CYAN); 1625 Tft.drawRectangle(200, 220, 30, 30, CYAN); 1626 Tft.drawChar('-', 208, 228, 2, CYAN); 1627 if (dnchan == 0) { 1628 if (night == 1) { 1629 Tft.drawString("Nights", 0, 270, 2, CYAN); 1630 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 1631 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 1632 } else { 1633 Tft.drawString("Days", 0, 270, 2, CYAN); 1634 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 1635 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 1636 } 1637 } else { 1638 if (night == 0) { 1639 Tft.drawString("Nights", 0, 270, 2, CYAN); 1640 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 1641 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 1642 } else { 1643 Tft.drawString("Days", 0, 270, 2, CYAN); 1644 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 1645 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 1646 } 1647 } 1648 Tft.drawRectangle(140, 260, 30, 30, CYAN); 1649 Tft.drawChar('+', 148, 268, 2, CYAN); 1650 Tft.drawRectangle(200, 260, 30, 30, CYAN); 1651 Tft.drawChar('-', 208, 268, 2, CYAN); 1652 Tft.drawRectangle(60, 300, 120, 30, CYAN); 1653 Tft.drawString("Switch", 105, 304, 1, CYAN); 1654 return; 1655} 1656////////////////////// 1657void pagethree() { //Humidity 1658 Tft.fillRectangle(180, 0, 61, 15, BLACK); 1659 Tft.drawString("Humid", 180, 0, 2, CYAN); 1660 Tft.drawString("Main", 24, 50, 1, CYAN); 1661 Tft.drawString("Light Cycle", 24, 80, 1, CYAN); 1662 Tft.drawString("Temperature", 144, 50, 1, CYAN); 1663 Tft.drawString("Settings", 144, 80, 1, CYAN); 1664 Tft.drawFloat(humiddisp, 0, 115, 3, CYAN); 1665 Tft.drawChar('O', 147, 113, 1, CYAN); 1666 Tft.drawChar('/', 144, 110, 4, CYAN); 1667 Tft.drawChar('O', 162, 128, 1, CYAN); 1668 Tft.drawString("Range", 0, 150, 2, CYAN); 1669 Tft.drawFloat (humidminset, 72, 150, 2, CYAN); 1670 Tft.drawChar('-', 133, 150, 2, CYAN); 1671 Tft.drawFloat(humidminset + 10, 146, 150, 2, CYAN); 1672 Tft.drawChar('%', 207, 150, 2, CYAN); 1673 Tft.drawRectangle(60, 170, 30, 30, CYAN); 1674 Tft.drawChar('+', 68, 178, 2, CYAN); 1675 Tft.drawRectangle(120, 170, 30, 30, CYAN); 1676 Tft.drawChar('-', 128, 178, 2, CYAN); 1677 Tft.drawString("Days", 0, 210, 2, CYAN); 1678 Tft.drawNumber(humidday, 60, 210, 2, CYAN); 1679 Tft.drawRectangle(60, 230, 30, 30, CYAN); 1680 Tft.drawChar('+', 68, 238, 2, CYAN); 1681 Tft.drawRectangle(120, 230, 30, 30, CYAN); 1682 Tft.drawChar('-', 128, 238, 2, CYAN); 1683 return; 1684} 1685////////////////////// 1686void pagefour() { //Light Cycle 1687 Tft.fillRectangle(180, 0, 61, 15, BLACK); 1688 Tft.drawString("Light", 180, 0, 2, CYAN); 1689 Tft.drawString("Main", 24, 50, 1, CYAN); 1690 Tft.drawString("Humidity", 24, 80, 1, CYAN); 1691 Tft.drawString("Temperature", 144, 50, 1, CYAN); 1692 Tft.drawString("Settings", 144, 80, 1, CYAN); 1693 Tft.drawString("Sunrise", 0, 110, 2, CYAN); 1694 if (srhoursetdisp > 9) { 1695 Tft.drawNumber(srhoursetdisp, 110, 110, 2, CYAN); 1696 } else { 1697 Tft.drawNumber(0, 110, 110, 2, CYAN); 1698 Tft.drawNumber(srhoursetdisp, 122, 110, 2, CYAN); 1699 } 1700 Tft.drawChar(':', 134, 110, 2, CYAN); 1701 if (srminutesetdisp > 9) { 1702 Tft.drawNumber(srminutesetdisp, 146, 110, 2, CYAN); 1703 } else { 1704 Tft.drawNumber(0, 146, 110, 2, CYAN); 1705 Tft.drawNumber(srminutesetdisp, 158, 110, 2, CYAN); 1706 } 1707 Tft.drawChar(':', 170, 110, 2, CYAN); 1708 if (srsecondset > 9) { 1709 Tft.drawNumber(srsecondset, 182, 110, 2, CYAN); 1710 } else { 1711 Tft.drawNumber(0, 182, 110, 2, CYAN); 1712 Tft.drawNumber(srsecondset, 194, 110, 2, CYAN); 1713 } 1714 Tft.drawRectangle(60, 130, 30, 30, CYAN); 1715 Tft.drawChar('+', 68, 138, 2, CYAN); 1716 Tft.drawRectangle(120, 130, 30, 30, CYAN); 1717 Tft.drawChar('-', 128, 138, 2, CYAN); 1718 Tft.drawString("Days", 0, 170, 2, CYAN); 1719 Tft.drawNumber(srday, 60, 170, 2, CYAN); 1720 Tft.drawRectangle(110, 170, 30, 30, CYAN); 1721 Tft.drawChar('+', 118, 178, 2, CYAN); 1722 Tft.drawRectangle(170, 170, 30, 30, CYAN); 1723 Tft.drawChar('-', 178, 178, 2, CYAN); 1724 Tft.drawString("Sunset", 0, 210, 2, CYAN); 1725 if (sshoursetdisp > 9) { 1726 Tft.drawNumber(sshoursetdisp, 110, 210, 2, CYAN); 1727 } else { 1728 Tft.drawNumber(0, 110, 210, 2, CYAN); 1729 Tft.drawNumber(sshoursetdisp, 122, 210, 2, CYAN); 1730 } 1731 Tft.drawChar(':', 134, 210, 2, CYAN); 1732 if (ssminutesetdisp > 9) { 1733 Tft.drawNumber(ssminutesetdisp, 146, 210, 2, CYAN); 1734 } else { 1735 Tft.drawNumber(0, 146, 210, 2, CYAN); 1736 Tft.drawNumber(ssminutesetdisp, 158, 210, 2, CYAN); 1737 } 1738 Tft.drawChar(':', 170, 210, 2, CYAN); 1739 if (sssecondset > 9) { 1740 Tft.drawNumber(sssecondset, 182, 210, 2, CYAN); 1741 } else { 1742 Tft.drawNumber(0, 182, 210, 2, CYAN); 1743 Tft.drawNumber(sssecondset, 194, 210, 2, CYAN); 1744 } 1745 Tft.drawRectangle(60, 230, 30, 30, CYAN); 1746 Tft.drawChar('+', 68, 238, 2, CYAN); 1747 Tft.drawRectangle(120, 230, 30, 30, CYAN); 1748 Tft.drawChar('-', 128, 238, 2, CYAN); 1749 Tft.drawString("Days", 0, 270, 2, CYAN); 1750 Tft.drawNumber(ssday, 60, 270, 2, CYAN); 1751 Tft.drawRectangle(110, 270, 30, 30, CYAN); 1752 Tft.drawChar('+', 118, 278, 2, CYAN); 1753 Tft.drawRectangle(170, 270, 30, 30, CYAN); 1754 Tft.drawChar('-', 178, 278, 2, CYAN); 1755 return; 1756} 1757////////////////////// 1758void pagefive() { //Settings 1759 Tft.fillRectangle(180, 0, 61, 15, BLACK); 1760 Tft.drawString("Setup", 180, 0, 2, CYAN); 1761 Tft.drawString("Main", 24, 50, 1, CYAN); 1762 Tft.drawString("Humidity", 24, 80, 1, CYAN); 1763 Tft.drawString("Temperature", 144, 50, 1, CYAN); 1764 Tft.drawString("Light Cycle", 144, 80, 1, CYAN); 1765 Tft.drawString("Sensors:", 0, 110, 2, CYAN); 1766 if (ambithsen == 1) { 1767 Tft.fillRectangle(0, 128, 130, 12, RED); 1768 Tft.drawString("Ambient Temp: BAD", 0, 130, 1, CYAN); 1769 } else { 1770 Tft.fillRectangle(0, 128, 130, 12, GREEN); 1771 Tft.drawString("Ambient Temp: GOOD", 0, 130, 1, BLACK); 1772 } 1773 if (foggersen == 1) { 1774 Tft.fillRectangle(135, 128, 130, 12, RED); 1775 Tft.drawString("Water Level: LOW", 135, 130, 1, CYAN); 1776 } else { 1777 Tft.fillRectangle(135, 128, 130, 12, GREEN); 1778 Tft.drawString("Water Level: GOOD", 135, 130, 1, BLACK); 1779 } 1780 if (hr1sen == 1) { 1781 Tft.fillRectangle(0, 143, 130, 12, RED); 1782 Tft.drawString("Heatrock 1 Temp: BAD", 0, 145, 1, CYAN); 1783 } else { 1784 Tft.fillRectangle(0, 143, 130, 12, GREEN); 1785 Tft.drawString("Heatrock 1 Temp: GOOD", 0, 145, 1, BLACK); 1786 } 1787 if (hr2sen == 1) { 1788 Tft.fillRectangle(0, 158, 130, 12, RED); 1789 Tft.drawString("Heatrock 2 Temp: BAD", 0, 160, 1, CYAN); 1790 } else { 1791 Tft.fillRectangle(0, 158, 130, 12, GREEN); 1792 Tft.drawString("Heatrock 2 Temp: GOOD", 0, 160, 1, BLACK); 1793 } 1794 Tft.drawString("Power:", 0, 175, 2, CYAN); 1795 if (dlpwr == 0) { 1796 Tft.fillRectangle(0, 193, 110, 12, RED); 1797 Tft.drawString("Day Light: OFF", 0, 195, 1, CYAN); 1798 Tft.fillRectangle(115, 193, 110, 12, GREEN); 1799 Tft.drawString("Night Light: ON", 115, 195, 1, BLACK); 1800 } else { 1801 Tft.fillRectangle(0, 193, 110, 12, GREEN); 1802 Tft.drawString("Day Light: ON", 0, 195, 1, BLACK); 1803 Tft.fillRectangle(115, 193, 110, 12, RED); 1804 Tft.drawString("Night Light: OFF", 115, 195, 1, CYAN); 1805 } 1806 if (hlpwr == 0) { 1807 Tft.fillRectangle(0, 208, 110, 12, RED); 1808 Tft.drawString("Heat Lamp: OFF", 0, 210, 1, CYAN); 1809 } else { 1810 Tft.fillRectangle(0, 208, 110, 12, GREEN); 1811 Tft.drawString("Heat Lamp: ON", 0, 210, 1, BLACK); 1812 } 1813 if (fanpwr == 0) { 1814 Tft.fillRectangle(115, 208, 110, 12, RED); 1815 Tft.drawString("Fan: OFF", 115, 210, 1, CYAN); 1816 } else { 1817 Tft.fillRectangle(115, 208, 110, 12, GREEN); 1818 Tft.drawString("Fan: ON", 115, 210, 1, BLACK); 1819 } 1820 if (hr1pwr == 0) { 1821 Tft.fillRectangle(0, 223, 110, 12, RED); 1822 Tft.drawString("Heat Rock 1: OFF", 0, 225, 1, CYAN); 1823 } else { 1824 Tft.fillRectangle(0, 223, 110, 12, GREEN); 1825 Tft.drawString("Heat Rock 1: ON", 0, 225, 1, BLACK); 1826 } 1827 if (hr2pwr == 0) { 1828 Tft.fillRectangle(115, 223, 110, 12, RED); 1829 Tft.drawString("Heat Rock 2: OFF", 115, 225, 1, CYAN); 1830 } else { 1831 Tft.fillRectangle(115, 223, 110, 12, GREEN); 1832 Tft.drawString("Heat Rock 2: ON", 115, 225, 1, BLACK); 1833 } 1834 if (foggerpwr == 0) { 1835 Tft.fillRectangle(0, 238, 110, 12, RED); 1836 Tft.drawString("Fogger: OFF", 0, 240, 1, CYAN); 1837 } else { 1838 Tft.fillRectangle(0, 238, 110, 12, GREEN); 1839 Tft.drawString("Fogger: ON", 0, 240, 1, BLACK); 1840 } 1841 Tft.drawString("Room Temp:", 0, 255, 2, CYAN); 1842 Tft.drawFloat(roomtemp, 120, 255, 2, CYAN); 1843 Tft.drawChar('o', 185, 255, 1, CYAN); 1844 Tft.drawChar('F', 190, 255, 2, CYAN); 1845 return; 1846} 1847////////////////////// 1848void readsd() { 1849 myData = ""; 1850 digitalWrite(W5200_CS, HIGH); 1851 myFile = SD.open(myDoc); 1852 if (myFile) { 1853 // read all data from the file 1854 while (myFile.available()) { 1855 //send the content onto the serial monitor 1856 myData += char(myFile.read()); 1857 } 1858 // close the file 1859 myFile.close(); 1860 } 1861 digitalWrite(SDCARD_CS, HIGH); //Deselect the SD card 1862} 1863////////////////////// 1864void writesd() { 1865 digitalWrite(W5200_CS, HIGH); 1866 SD.remove(myDoc); 1867 myFile = SD.open(myDoc, FILE_WRITE); 1868 //write to the file after it's successfully opened or created: 1869 if (myFile) { 1870 myFile.print(myData); 1871 // close the file 1872 myFile.close(); 1873 } 1874 digitalWrite(SDCARD_CS, HIGH); //Deselect the SD card 1875} 1876////////////////////// 1877void rsetFunc() { 1878 pinMode(rset, OUTPUT); 1879 digitalWrite(rset, LOW); 1880} 1881////////////////////// 1882/******************************************************************************* 1883 Function Name: capture_photo 1884 Description: capture a photo and store the file named temp.jpg into SD 1885 Input: None 1886 Output : None 1887 Return : None 1888 *******************************************************************************/ 1889void capture_photo(char myFileName[]) { 1890 VC0706_frame_control(3); 1891 delay(10); 1892 // Check to see if the file exists: 1893 // if exists,delete the file: 1894 if (SD.exists(myFileName)) SD.remove(myFileName); 1895 VC0706_frame_control(0); 1896 delay(10); 1897 rx_ready = false; 1898 rx_counter = 0; 1899 Serial2.end();// clear all rx buffer 1900 delay(5); 1901 Serial2.begin(115200); 1902 //get frame buffer length 1903 VC0706_get_framebuffer_length(0); 1904 delay(10); 1905 buffer_read(); 1906 // store frame buffer length for coming reading 1907 frame_length = (VC0706_rx_buffer[5] << 8) + VC0706_rx_buffer[6]; 1908 frame_length = frame_length << 16; 1909 frame_length = frame_length + (0x0ff00 & (VC0706_rx_buffer[7] << 8)) + VC0706_rx_buffer[8]; 1910 vc_frame_address = READ_DATA_BLOCK_NO; 1911 myFile = SD.open(myFileName, FILE_WRITE); 1912 while (vc_frame_address < frame_length) { 1913 VC0706_read_frame_buffer(vc_frame_address - READ_DATA_BLOCK_NO, READ_DATA_BLOCK_NO); 1914 delay(9); 1915 //get the data with length=READ_DATA_BLOCK_NObytes 1916 rx_ready = false; 1917 rx_counter = 0; 1918 buffer_read(); 1919 // write data to file 1920 myFile.write(VC0706_rx_buffer + 5, READ_DATA_BLOCK_NO); 1921 //read next READ_DATA_BLOCK_NO bytes from frame buffer 1922 vc_frame_address = vc_frame_address + READ_DATA_BLOCK_NO; 1923 } 1924 // get the last data 1925 vc_frame_address = vc_frame_address - READ_DATA_BLOCK_NO; 1926 last_data_length = frame_length - vc_frame_address; 1927 VC0706_read_frame_buffer(vc_frame_address, last_data_length); 1928 delay(9); 1929 //get the data 1930 rx_ready = false; 1931 rx_counter = 0; 1932 buffer_read(); 1933 myFile.write(VC0706_rx_buffer + 5, last_data_length); 1934 myFile.close(); 1935 VC0706_frame_control(3); 1936 delay(10); 1937} 1938/******************************************************************************* 1939 Function Name: VC0706_read_frame_buffer 1940 Description: read image data from FBUF 1941 Input: buffer_address(4 bytes); buffer_length(4 bytes) ******YO!****** 1942 Output : None 1943 Return : None 1944 *******************************************************************************/ 1945void VC0706_read_frame_buffer(unsigned long buffer_address, unsigned long buffer_length) { 1946 tx_vcbuffer[0] = VC0706_PROTOCOL_SIGN; 1947 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 1948 tx_vcbuffer[2] = VC0706_COMMAND_READ_FBUF; 1949 tx_vcbuffer[3] = 0x0c; 1950 tx_vcbuffer[4] = FBUF_CURRENT_FRAME; 1951 tx_vcbuffer[5] = 0x0a; // 0x0a=data transfer by MCU mode; 0x0f=data transfer by SPI interface 1952 tx_vcbuffer[6] = buffer_address >> 24; //starting address 1953 tx_vcbuffer[7] = buffer_address >> 16; 1954 tx_vcbuffer[8] = buffer_address >> 8; 1955 tx_vcbuffer[9] = buffer_address & 0x0ff; 1956 tx_vcbuffer[10] = buffer_length >> 24; // data length 1957 tx_vcbuffer[11] = buffer_length >> 16; 1958 tx_vcbuffer[12] = buffer_length >> 8; 1959 tx_vcbuffer[13] = buffer_length & 0x0ff; 1960 tx_vcbuffer[14] = 0x00; // delay time 1961 tx_vcbuffer[15] = 0x0a; 1962 tx_counter = 16; 1963 buffer_send(); 1964} 1965/******************************************************************************* 1966 Function Name: VC0706_frame_control 1967 Description: control frame buffer register ******YO!****** 1968 Input: frame_control=control flag(1byte) 1969 : 0 = stop current frame ; 1= stop next frame;2=step frame;3 =resume frame; 1970 Output : None 1971 Return : None 1972 *******************************************************************************/ 1973void VC0706_frame_control(byte frame_control) { 1974 if (frame_control > 3)frame_control = 3; 1975 tx_vcbuffer[0] = VC0706_PROTOCOL_SIGN; 1976 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 1977 tx_vcbuffer[2] = VC0706_COMMAND_FBUF_CTRL; 1978 tx_vcbuffer[3] = 0x01; 1979 tx_vcbuffer[4] = frame_control; 1980 tx_counter = 5; 1981 buffer_send(); 1982} 1983/******************************************************************************* 1984 Function Name: VC0706_get_framebuffer_length 1985 Description: get byte-lengths in FBUF 1986 Input: fbuf_type =current or next frame 1987 0 =current frame ******YO!****** 1988 1 =next frame 1989 Output : None 1990 Return : None 1991 *******************************************************************************/ 1992void VC0706_get_framebuffer_length(byte fbuf_type) { 1993 if (fbuf_type > 1)fbuf_type = 1; 1994 tx_vcbuffer[0] = VC0706_PROTOCOL_SIGN; 1995 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 1996 tx_vcbuffer[2] = VC0706_COMMAND_GET_FBUF_LEN; 1997 tx_vcbuffer[3] = 0x01; 1998 tx_vcbuffer[4] = fbuf_type; 1999 tx_counter = 5; 2000 buffer_send(); 2001} 2002/******************************************************************************* 2003 Function Name: VC0706_uart_power_save 2004 Description: stop current frame for reading 2005 Input: power_on =1start power-save 2006 = 0stop power-save 2007 Output : None 2008 Return : None 2009 *******************************************************************************/ 2010void VC0706_uart_power_save(byte power_save_on) { 2011 tx_vcbuffer[0] = VC0706_PROTOCOL_SIGN; 2012 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 2013 tx_vcbuffer[2] = VC0706_COMMAND_POWER_SAVE_CTRL; 2014 tx_vcbuffer[3] = 0x03; 2015 tx_vcbuffer[4] = 00; //power save control mode 2016 tx_vcbuffer[5] = 01; // control by UART 2017 tx_vcbuffer[6] = power_save_on; //start power save 2018 tx_counter = 7; 2019 buffer_send(); 2020} 2021/******************************************************************************* 2022 Function Name: VC0706_compression_ratio 2023 Description: stop current frame for reading 2024 Input: ration>13(minimum) ******YO!****** 2025 <63(max) 2026 Output : None 2027 Return : None 2028 *******************************************************************************/ 2029void VC0706_compression_ratio(int ratio) { 2030 if (ratio > 63)ratio = 63; 2031 if (ratio < 13)ratio = 13; 2032 int vc_comp_ratio = (ratio - 13) * 4 + 53; 2033 tx_vcbuffer[0] = VC0706_PROTOCOL_SIGN; 2034 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 2035 tx_vcbuffer[2] = VC0706_COMMAND_WRITE_DATA; 2036 tx_vcbuffer[3] = 0x05; 2037 tx_vcbuffer[4] = 01; //chip register 2038 tx_vcbuffer[5] = 0x01; //data num ready to write 2039 tx_vcbuffer[6] = 0x12; //register address 2040 tx_vcbuffer[7] = 0x04; 2041 tx_vcbuffer[8] = vc_comp_ratio; //data 2042 tx_counter = 9; 2043 buffer_send(); 2044} 2045/******************************************************************************* 2046 Function Name: buffer_send 2047 Description: Transmit buffer to VC0706 2048 Input: tx_vcbuffer 2049 Output : None 2050 Return : None 2051 *******************************************************************************/ 2052void buffer_send() { 2053 int i = 0; 2054 for (i = 0; i < tx_counter; i++) 2055 Serial2.write(tx_vcbuffer[i]); 2056 tx_ready = true; 2057} 2058/******************************************************************************* 2059 Function Name: buffer_read 2060 Description: Receive buffer from VC0706 2061 Input: None 2062 Output : rx_buffer, rx_ready 2063 Return : None 2064 *******************************************************************************/ 2065void buffer_read() { 2066 bool validity = true; 2067 if (rx_ready) // if something unread in buffer, just quit 2068 return; 2069 rx_counter = 0; 2070 VC0706_rx_buffer[0] = 0; 2071 while (Serial2.available() > 0) 2072 { 2073 VC0706_rx_buffer[rx_counter++] = Serial2.read(); 2074 //delay(1); 2075 } 2076 if (VC0706_rx_buffer[0] != 0x76) 2077 validity = false; 2078 if (VC0706_rx_buffer[1] != VC0706_Serial2_NUMBER) 2079 validity = false; 2080 if (validity) rx_ready = true; 2081}
Harold and Kumar w/out IP code
c_cpp
Arduino
1#include <SD.h> 2#include <stdint.h> 3#include <SeeedTouchScreen.h> 4#include 5 <TFTv2.h> 6#include <SPI.h> 7#include <Time.h> 8#include <TimeLib.h> 9#include 10 <DHT.h> 11#include <DHT_U.h> 12#include <OneWire.h> 13#include <DS3232RTC.h> 14#include 15 <Adafruit_Sensor.h> 16#include <TimeLord.h> 17#include <Wire.h> 18#include "DHT.h" 19#include 20 <DallasTemperature.h> 21#include <EthernetV2_0.h> 22#include "TFTv2.h" 23int 24 page; 25int firsttimeon = 1; 26//time veriables 27int daynow; 28int monthnow; 29int 30 yearnow; 31int minutenow; 32int hournow; 33int tpage; 34int npage; 35int dnchan; 36float 37 const LONGITUDE = -1.41503959; 38float const LATITUDE = 8.528874379; 39//temp 40 and humid veriables 41float humidmin; 42float humidminset; 43int humidday; 44#define 45 DHTPIN 22 // temp/humidity sensor 46#define DHTTYPE DHT22 47DHT dht(DHTPIN, DHTTYPE); 48float 49 hkhr1temp; 50float hkhr2temp; 51float hkdaytemp; 52float hknighttemp; 53float 54 ambitempcur; 55float ambitempdisp; 56float hkdaytempdisp; 57float hknighttempdisp; 58float 59 humidcur; 60float humiddisp; 61#define hr1 23 62#define hr2 24 63OneWire oneWire_hr1(hr1); 64OneWire 65 oneWire_hr2(hr2); 66DallasTemperature sensor_hr1(&oneWire_hr1); 67DallasTemperature 68 sensor_hr2(&oneWire_hr2); 69float hr1tempcur; 70float hr1tempdisp; 71float hr2tempcur; 72float 73 hr2tempdisp; 74int ambitempday; 75int ambitempnight; 76float roomtemp; 77float 78 roomtempdisp; 79//light cycle veriables 80int srhour; 81int srminute; 82int 83 srsecond; 84int srhourset; 85int srminuteset; 86int srhoursetdisp; 87int srminutesetdisp; 88int 89 srsecondset; 90int srday; 91int sshour; 92int ssminute; 93int sssecond; 94int 95 sshourset; 96int ssminuteset; 97int sssecondset; 98int ssminutesetdisp; 99int 100 sshoursetdisp; 101int ssday = 0; 102int night; 103byte todaysr[] = {0, 0, 0, 0, 104 0, 0}; 105byte todayss[] = {0, 0, 0, 0, 0, 0}; 106byte dlstime[] = {0, 0, hour(), 107 day(), month(), year()}; 108long timenow; 109long timess; 110long timesr; 111//pin 112 variables 113//ambient heat/humidity is pin 22 114// heat rock 1 temp is pin 23 115// 116 heat rock 2 temp is pin 24 117// ds3231rtc SCL is on analog pin A5 118// ds3231rtc 119 SDA is on analog pin A4 120const int dnlamp = 25; 121const int fogger = 26; 122const 123 int hrock1 = 27; 124const int hrock2 = 28; 125const int fan = 29; 126const int foggerwater 127 = 31; 128const int hlamp = 30; 129const int rset = 41; 130// sensor quality veriables 131int 132 ambithsen; 133int hr1sen; 134int hr2sen; 135int foggersen; 136//power on veriables 137int 138 dlpwr; 139int hlpwr; 140int hr1pwr; 141int hr2pwr; 142int fogpwr; 143int fanpwr; 144int 145 foggerpwr; 146TouchScreen ts = TouchScreen(XP, YP, XM, YM); //init TouchScreen port 147 pins 148// file varieables 149String myData; 150String myDoc; 151File myFile; 152/*Cat5 153 wires 154 Red Taped ---- Relay Box 155 Solid Brown = 5v 156 White Brown = Ground 157 158 Solid Green = Pin 7 of always on relay -- Heat Rock 2 Power -- Arduino Pin = 28 159 160 White Green = Pin 6 of always on relay -- Heat Rock 1 Power -- Arduino Pin = 27 161 162 Solid Blue = Pin 5 of always on relay -- Heat Lamp Power -- Arduino Pin = 30 163 164 White Blue = Pin 4 of always on relay -- Day/Night Lights Power -- Arduino Pin 165 = 25 166 Solid Orange = Pin 5 of power save relay -- Fogger Power -- Arduino Pin 167 = 26 168 White Orange = Pin 4 of power save relay -- Unused 169 // 170 White 171 Taped ---- Relay Box 172 Solid Green = Pin 7 of power save relay -- Fan Relay -- 173 Arduino Pin = 29 174 White Green = Unused 175 Solid Blue = J1 Open Fan relay 176 177 White Blue = J1 Common Fan relay 178 Solid Brown = Unused 179 White Brown = 180 Unused 181 Solid Orange = 5v 182 White Orange = Ground 183 // 184 Yellow Tape 185 ---- Sensors 186 Solid Brown = Fan Power 187 White Brown = Fan Ground 188 Solid 189 Green = Ambiant Temperature/Humidity Sensor -- Arduino Pin = 22 190 White Green 191 = Heat Rock 1 Sensor -- Arduino Pin = 23 192 Solid Blue = Heat Rock 2 Sensor -- 193 Arduino Pin = 24 194 White Blue = UNUSED 195 Solid Orange = 5v 196 White Orange 197 = Ground 198 // 199 Red Yellow Tape ---- Touch Screen 200 Solid Brown = Top Right 201 ICSP 202 White Brown = Analog 3 203 Solid Green = Analog 2 204 White Green = 205 Analog 1 206 Solid Blue = Analog 0 207 White Blue = Reset 208 Solid Orange = 209 5v 210 White Orange = Ground 211 // 212 Red White Tape ---- Touch Screen 213 214 Solid Brown = Digital 7 215 White Brown = Digital 6 216 Solid Green = Digital 217 5 218 White Green = Bottom Left ICSP 219 Solid Blue = Top Left ICSP 220 White 221 Blue = Bottom Middle ICSP 222 Solid Orange = Top MiddleICSP 223 White Orange = 224 Bottom Right ICSP 225*/ 226// Enter a MAC address and IP address for your controller 227 below. 228// The IP address will be dependent on your local network: 229byte mac[] 230 = { 231 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED 232}; 233IPAddress ip(192, 168, 1, 109); 234// 235 Initialize the Ethernet server library 236// with the IP address and port you want 237 to use 238// (port 80 is default for HTTP): 239EthernetServer server(6113); 240#define 241 W5200_CS 10 242#define SDCARD_CS 4 243//Camera definitions 244#define VC0706_PROTOCOL_SIGN 245 0x56 246#define VC0706_Serial2_NUMBER 0x00 247#define VC0706_COMMAND_RESET 248 0x26 249#define VC0706_COMMAND_GEN_VERSION 0x11 250#define VC0706_COMMAND_TV_OUT_CTRL 251 0x44 252#define VC0706_COMMAND_OSD_ADD_CHAR 0x45 253#define VC0706_COMMAND_DOWNSIZE_SIZE 254 0x53 255#define VC0706_COMMAND_READ_FBUF 0x32 256#define FBUF_CURRENT_FRAME 257 0 258#define FBUF_NEXT_FRAME 0 259#define VC0706_COMMAND_FBUF_CTRL 0x36 260#define 261 VC0706_COMMAND_COMM_MOTION_CTRL 0x37 262#define VC0706_COMMAND_COMM_MOTION_DETECTED 263 0x39 264#define VC0706_COMMAND_POWER_SAVE_CTRL 0x3E 265#define VC0706_COMMAND_COLOR_CTRL 266 0x3C 267#define VC0706_COMMAND_MOTION_CTRL 0x42 268#define VC0706_COMMAND_WRITE_DATA 269 0x31 270#define VC0706_COMMAND_GET_FBUF_LEN 0x34 271#define READ_DATA_BLOCK_NO 272 56 273unsigned char tx_counter; 274unsigned char tx_vcbuffer[20]; 275bool 276 tx_ready; 277bool rx_ready; 278unsigned char rx_counter; 279unsigned char 280 VC0706_rx_buffer[80]; 281uint32_t frame_length = 0; 282uint32_t vc_frame_address 283 = 0; 284uint32_t last_data_length = 0; 285// one Integer Variable to count for 286 photo 287// increase if you have difficulties conenctiong 288// but it then will 289 refresh less often 290int waitForPhoto = 4; 291int waitCount; 292////////////////////// 293void 294 setup() { 295 // reset w5100 296 pinMode(10, OUTPUT); 297 digitalWrite(10, HIGH); 298 299 // open Serial2 connection to the camera 300 Serial2.begin(115200); 301 // set 302 the jpeg compression of the camera 303 // smaller number means smaller file, but 304 less quality 305 VC0706_compression_ratio(15); 306 delay(100); 307 pinMode(SDCARD_CS, 308 OUTPUT); 309 Sd2Card card; 310 card.init(SPI_FULL_SPEED, SDCARD_CS); 311 if (!SD.begin(SDCARD_CS)) 312 { 313 rsetFunc(); 314 } 315 // start the Ethernet connection and the server: 316 317 Ethernet.begin(mac, ip); 318 server.begin(); 319 // put your setup code here, 320 to run once: 321 TFT_BL_ON; 322 Tft.TFTinit(); 323 setSyncProvider(RTC.get); 324 325 page = 1; 326 monthnow = month(); 327 yearnow = year(); 328 minutenow = minute(); 329 330 hournow = hour(); 331 npage = 1; 332 humidmin = 50.00; 333 dht.begin(); 334 335 sensor_hr1.begin(); 336 sensor_hr2.begin(); 337 TimeLord tardis; 338 tardis.TimeZone(0); 339 340 tardis.Position(LATITUDE, LONGITUDE); 341 // pins 342 pinMode(dnlamp, OUTPUT); 343 344 pinMode(fogger, OUTPUT); 345 pinMode(hlamp, OUTPUT); 346 pinMode(hrock1, OUTPUT); 347 348 pinMode(hrock2, OUTPUT); 349 pinMode(fan, OUTPUT); 350 pinMode(foggerwater, 351 INPUT); 352 myDoc = "daynow.txt"; 353 readsd(); 354 daynow = myData.toInt(); 355 356 myDoc = "hd.txt"; 357 readsd(); 358 humidday = myData.toInt(); 359 myDoc 360 = "hs.txt"; 361 readsd(); 362 humidminset = myData.toFloat(); 363 myDoc = "atd.txt"; 364 365 readsd(); 366 ambitempday = myData.toInt(); 367 myDoc = "atdset.txt"; 368 369 readsd(); 370 hkdaytempdisp = myData.toFloat(); 371 myDoc = "atn.txt"; 372 373 readsd(); 374 ambitempnight = myData.toInt(); 375 myDoc = "atnset.txt"; 376 377 readsd(); 378 hknighttempdisp = myData.toFloat(); 379 myDoc = "ssetday.txt"; 380 381 readsd(); 382 ssday = myData.toInt(); 383 myDoc = "sriseday.txt"; 384 readsd(); 385 386 srday = myData.toInt(); 387 myDoc = "ssetmin.txt"; 388 readsd(); 389 ssminutesetdisp 390 = myData.toInt(); 391 myDoc = "srisemin.txt"; 392 readsd(); 393 srminutesetdisp 394 = myData.toInt(); 395 myDoc = "sriseh.txt"; 396 readsd(); 397 srhoursetdisp 398 = myData.toInt(); 399 myDoc = "ssethour.txt"; 400 readsd(); 401 sshoursetdisp 402 = myData.toInt(); 403} 404////////////////////// 405void loop() { 406 // put your 407 main code here, to run repeatedly: 408 TimeLord tardis; 409 tardis.DstRules(3, 410 2, 11, 1, 60); 411 if (firsttimeon == 1) { 412 tardis.TimeZone(-5 * 60); 413 414 tardis.Position(LATITUDE, LONGITUDE); 415 dlstime[5] = (year() - 2000); 416 417 dlstime[4] = month(); 418 dlstime[3] = day(); 419 dlstime[2] = hour(); 420 421 dlstime[1] = minute(); 422 tardis.DST(dlstime); 423 firsttimeon = 0; 424 425 } 426 // count down for photo time 427 waitCount = waitCount - 1; 428 if (waitCount 429 < 2) { 430 capture_photo("live.jpg"); 431 waitCount = waitForPhoto; 432 433 } 434 // Create a client connection 435 EthernetClient client = server.available(); 436 437 if (client) { 438 int pos = 0; 439 char clientReq[100]; 440 while (client.connected()) 441 { 442 if (client.available()) { 443 // read what the client is requesting 444 445 char c = client.read(); 446 if (c != '\ 447' && c != '\ ') { 448 clientReq[pos] 449 = c; 450 pos++; 451 if (pos >= 100) pos = 99; // dont let the 452 buffer overflow... 453 continue; 454 } 455 // send a jpeg 456 file or send html to display files 457 // if there is a character after the 458 'GET /' request 459 // send the jpeg file 460 if ( clientReq[5] != 461 ' ' ) { 462 // ###### FIND OUT WHICH FILE THE CLIENT REQUEST HERE !!! 463 464 File myFile = SD.open("live.jpg"); 465 // try to open file 466 467 // if successfull, send header and jpeg data 468 if (myFile) 469 { 470 client.println("HTTP/1.1 200 OK"); 471 client.println("Content-Type: 472 image/jpg"); 473 client.println(); 474 byte clientBuf[64]; 475 476 int clientCount = 0; 477 while (myFile.available()) 478 { 479 480 clientBuf[clientCount] = myFile.read(); 481 clientCount++; 482 483 if (clientCount > 63) { 484 client.write(clientBuf, 485 64); 486 clientCount = 0; 487 } 488 } 489 490 if (clientCount > 0) { 491 client.write(clientBuf, clientCount); 492 493 } 494 myFile.close(); 495 } 496 } else { 497 498 // there is no character after the 'GET /' 499 // send HTML site 500 501 client.println("HTTP/1.1 200 OK"); 502 client.println("Content-Type: 503 text/html"); 504 client.println("Connection: close"); 505 client.println("Refresh: 506 2"); 507 client.println(); 508 client.println("<!DOCTYPE HTML>"); 509 510 client.println("<html>"); 511 client.print("Harold & Kumar's 512 Enclosure"); 513 client.println("<br />"); 514 client.print(dayStr(weekday(now()))); 515 516 client.print(", "); 517 client.print(monthStr(dlstime[4])); 518 519 client.print(" "); 520 client.print(dlstime[3]); 521 client.print(", 522 "); 523 client.print(year()); 524 client.print(" at "); 525 526 if (dlstime[2] < 10) { 527 client.print("0"); 528 } 529 530 client.print(dlstime[2]); 531 client.print(":"); 532 if 533 (minute() < 10) { 534 client.print("0"); 535 } 536 client.print(minute()); 537 538 client.print(":"); 539 if (second() < 10) { 540 client.print("0"); 541 542 } 543 client.print(second()); 544 client.println("<br 545 />"); 546 client.println("<br />"); 547 client.print("Room 548 Temperature = "); 549 client.print(roomtemp); 550 client.print(" 551 "); 552 client.print(char(176)); 553 client.print("F"); 554 555 client.println("<br />"); 556 client.println("<br />"); 557 558 client.print("Ambient Temperature = "); 559 client.print(ambitempdisp); 560 561 client.print(" "); 562 client.print(char(176)); 563 client.print("F"); 564 565 client.println("<br />"); 566 client.print(" Range = "); 567 568 if (night == 0) { 569 client.print(hkdaytempdisp - .5); 570 571 } else { 572 client.print(hknighttempdisp - .5); 573 } 574 575 client.print(" "); 576 client.print(char(176)); 577 client.print("F 578 - "); 579 if (night == 0) { 580 client.print(hkdaytempdisp 581 + .5); 582 } else { 583 client.print(hknighttempdisp + .5); 584 585 } 586 client.print(" "); 587 client.print(char(176)); 588 589 client.print("F "); 590 if (night == 0 && ambitempday > 0) 591 { 592 client.print("For "); 593 client.print(ambitempday); 594 595 client.print(" Day(s)"); 596 } 597 if (night == 598 1 && ambitempnight > 0) { 599 client.print(" For "); 600 client.print(ambitempnight); 601 602 client.print(" Day(s)"); 603 } 604 client.println("<br 605 />"); 606 client.println("<br />"); 607 client.print("Basking 608 Temperature = "); 609 client.print(hr1tempdisp); 610 client.print(" 611 "); 612 client.print(char(176)); 613 client.print("F"); 614 615 client.println("<br />"); 616 client.print(" Range = "); 617 618 client.print(88); 619 client.print(" "); 620 client.print(char(176)); 621 622 client.print("F - "); 623 client.print(96); 624 client.print(" 625 "); 626 client.print(char(176)); 627 client.print("F"); 628 629 client.println("<br />"); 630 client.println("<br />"); 631 632 client.print("Borrow Temperature = "); 633 client.print(hr2tempdisp); 634 635 client.print(" "); 636 client.print(char(176)); 637 client.print("F"); 638 639 client.println("<br />"); 640 client.print(" Range = "); 641 642 if (night == 0) { 643 client.print(hkdaytempdisp - .5); 644 645 } else { 646 client.print(hknighttempdisp - .5); 647 } 648 649 client.print(" "); 650 client.print(char(176)); 651 client.print("F 652 - "); 653 if (night == 0) { 654 client.print(hkdaytempdisp 655 + .5); 656 } else { 657 client.print(hknighttempdisp + .5); 658 659 } 660 client.print(" "); 661 client.print(char(176)); 662 663 client.print("F"); 664 if (night == 0 && ambitempday > 0) { 665 666 client.print(" For "); 667 client.print(ambitempday); 668 669 client.print(" Day(s)"); 670 } 671 if (night == 672 1 && ambitempnight > 0) { 673 client.print(" For "); 674 client.print(ambitempnight); 675 676 client.print(" Day(s)"); 677 } 678 client.println("<br 679 />"); 680 client.println("<br />"); 681 client.print("Humidity 682 = "); 683 client.print(humiddisp); 684 client.print("%"); 685 686 client.println("<br />"); 687 client.print(" Range = "); 688 689 client.print(humidminset); 690 client.print("% - "); 691 client.print(humidminset 692 + 10); 693 client.print("% "); 694 if ( humidday > 0) { 695 696 client.print("For "); 697 client.print(humidday); 698 client.print(" 699 Day(s)"); 700 } 701 client.println("<br />"); 702 client.println("<br 703 />"); 704 client.print("Water Level = "); 705 if (digitalRead(foggerwater) 706 == HIGH) { 707 client.print("Good"); 708 } else { 709 client.print("Fill 710 Now!"); 711 } 712 client.println("<br />"); 713 client.print("Time 714 = "); 715 if (night == 0) { 716 client.print("Day"); 717 718 } else { 719 client.print("Night"); 720 } 721 client.println("<br 722 />"); 723 client.print("Sunrise Time = "); 724 if (srhoursetdisp 725 < 10) { 726 client.print("0"); 727 } 728 client.print(srhoursetdisp); 729 730 client.print(":"); 731 if (srminutesetdisp < 10) { 732 client.print("0"); 733 734 } 735 client.print(srminutesetdisp); 736 if (srday > 737 0) { 738 client.print(" For "); 739 client.print(srday); 740 741 client.print(" Day(s)"); 742 } 743 client.println("<br 744 />"); 745 client.print("Sunset Time = "); 746 if (sshoursetdisp 747 < 10) { 748 client.print("0"); 749 } 750 client.print(sshoursetdisp); 751 752 client.print(":"); 753 if (ssminutesetdisp < 10) { 754 client.print("0"); 755 756 } 757 client.print(ssminutesetdisp); 758 if (ssday > 759 0) { 760 client.print(" For "); 761 client.print(ssday); 762 763 client.print(" Day(s)"); 764 } 765 client.println("<br 766 />"); 767 client.println("<br />"); 768 client.print("Heat 769 Lamp = "); 770 if (hlpwr == 1) { 771 client.print("ON"); 772 773 } else { 774 client.print("OFF"); 775 } 776 client.println("<br 777 />"); 778 client.print("Fans = "); 779 if (fanpwr == 1) { 780 781 client.print("ON"); 782 } else { 783 client.print("OFF"); 784 785 } 786 client.println("<br />"); 787 client.print("Basking 788 Rock = "); 789 if (hr1pwr == 1) { 790 client.print("ON"); 791 792 } else { 793 client.print("OFF"); 794 } 795 client.println("<br 796 />"); 797 client.print("Borrow Rock = "); 798 if (hr2pwr == 799 1) { 800 client.print("ON"); 801 } else { 802 client.print("OFF"); 803 804 } 805 client.println("<br />"); 806 client.print("Fogger 807 = "); 808 if (foggerpwr == 1) { 809 client.print("ON"); 810 811 } else { 812 client.print("OFF"); 813 } 814 client.println("<br 815 />"); 816 client.println("<div align=center><img src='live.jpg' width='640' 817 height='480'>"); 818 client.println("<p>"); 819 client.println("Live 820 from Harold & Kumar</div>"); 821 client.println("</html>"); 822 } 823 824 delay(1); 825 //stopping client 826 client.stop(); 827 } 828 829 } 830 } 831 //new touch point 832 Point p = ts.getPoint(); 833 p.x = map(p.x, 834 TS_MINX, TS_MAXX, 0, 240); 835 p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320); 836 if 837 (p.z > __PRESURE) { 838 // New Page 839 if ((p.x < 120) && (p.y > 40) && (p.y 840 < 70)) { 841 if (page == 1) { 842 page = 2; 843 npage = 1; 844 845 } else { 846 page = 1; 847 npage = 1; 848 } 849 } 850 851 if ((p.x > 120) && (p.y > 40) && (p.y < 70)) { 852 if (page > 2) { 853 854 page = 2; 855 npage = 1; 856 } else { 857 page = 3; 858 859 npage = 1; 860 } 861 } 862 if ((p.x < 120) && (p.y > 70) && (p.y 863 < 100)) { 864 if (page > 3) { 865 page = 3; 866 npage = 1; 867 868 } else { 869 page = 4; 870 npage = 1; 871 } 872 } 873 874 if ((p.x > 120) && (p.y > 70) && (p.y < 100)) { 875 if (page == 5) { 876 877 page = 4; 878 npage = 1; 879 } else { 880 page = 5; 881 882 npage = 1; 883 } 884 } 885 if (page == 2) { 886 if ((p.x 887 > 140) && (p.x < 170) && (p.y > 220) && (p.y < 250)) { //+ set 888 if (night 889 == 1) { 890 if (dnchan == 0) { 891 hknighttempdisp = hknighttempdisp 892 + .5; 893 Tft.fillRectangle(48, 230, 72, 15, BLACK); 894 Tft.drawFloat(hknighttempdisp, 895 48, 230, 2, CYAN); 896 if (ambitempnight == 0 ) { 897 ambitempnight 898 = ambitempnight + 1; 899 Tft.fillRectangle(84, 270, 36, 15, BLACK); 900 901 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 902 } 903 904 } else { 905 hkdaytempdisp = hkdaytempdisp + .5; 906 Tft.fillRectangle(48, 907 230, 72, 15, BLACK); 908 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 909 910 if (ambitempday == 0 ) { 911 ambitempday = ambitempday 912 + 1; 913 Tft.fillRectangle(84, 270, 36, 15, BLACK); 914 Tft.drawNumber(ambitempday, 915 84, 270, 2, CYAN); 916 } 917 } 918 } else { 919 if 920 (dnchan == 0) { 921 hkdaytempdisp = hkdaytempdisp + .5; 922 Tft.fillRectangle(48, 923 230, 72, 15, BLACK); 924 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 925 926 if (ambitempday == 0 ) { 927 ambitempday = ambitempday 928 + 1; 929 Tft.fillRectangle(84, 270, 36, 15, BLACK); 930 Tft.drawNumber(ambitempday, 931 84, 270, 2, CYAN); 932 } 933 } else { 934 hknighttempdisp 935 = hknighttempdisp + .5; 936 Tft.fillRectangle(48, 230, 72, 15, BLACK); 937 938 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 939 if 940 (ambitempnight == 0 ) { 941 ambitempnight = ambitempnight + 1; 942 943 Tft.fillRectangle(84, 270, 36, 15, BLACK); 944 Tft.drawNumber(ambitempnight, 945 84, 270, 2, CYAN); 946 } 947 } 948 } 949 } 950 if 951 ((p.x > 200) && (p.x < 230) && (p.y > 220) && (p.y < 250)) { //- set 952 if 953 (night == 1) { 954 if (dnchan == 0) { 955 hknighttempdisp = 956 hknighttempdisp - .5; 957 Tft.fillRectangle(48, 230, 72, 15, BLACK); 958 959 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 960 if 961 (ambitempnight == 0 ) { 962 ambitempnight = ambitempnight + 1; 963 964 Tft.fillRectangle(84, 270, 36, 15, BLACK); 965 Tft.drawNumber(ambitempnight, 966 84, 270, 2, CYAN); 967 } 968 } else { 969 hkdaytempdisp 970 = hkdaytempdisp - .5; 971 Tft.fillRectangle(48, 230, 72, 15, BLACK); 972 973 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 974 if (ambitempday 975 == 0 ) { 976 ambitempday = ambitempday + 1; 977 Tft.fillRectangle(84, 978 270, 36, 15, BLACK); 979 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 980 981 } 982 } 983 } else { 984 if (dnchan == 0) { 985 986 hkdaytempdisp = hkdaytempdisp * .5; 987 Tft.fillRectangle(48, 988 230, 72, 15, BLACK); 989 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 990 991 if (ambitempday == 0 ) { 992 ambitempday = ambitempday 993 + 1; 994 Tft.fillRectangle(84, 270, 36, 15, BLACK); 995 Tft.drawNumber(ambitempday, 996 84, 270, 2, CYAN); 997 } 998 } else { 999 hknighttempdisp 1000 = hknighttempdisp - .5; 1001 Tft.fillRectangle(48, 230, 72, 15, BLACK); 1002 1003 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 1004 if 1005 (ambitempnight == 0 ) { 1006 ambitempnight = ambitempnight + 1; 1007 1008 Tft.fillRectangle(84, 270, 36, 15, BLACK); 1009 Tft.drawNumber(ambitempnight, 1010 84, 270, 2, CYAN); 1011 } 1012 } 1013 } 1014 } 1015 if 1016 ((p.x > 140) && (p.x < 170) && (p.y > 260) && (p.y < 290)) { //+ day 1017 if 1018 (night == 1) { 1019 if (dnchan == 0) { 1020 ambitempnight = ambitempnight 1021 + 1; 1022 Tft.fillRectangle(84, 270, 36, 15, BLACK); 1023 Tft.drawNumber(ambitempnight, 1024 84, 270, 2, CYAN); 1025 } else { 1026 ambitempday = ambitempday 1027 + 1; 1028 Tft.fillRectangle(84, 270, 36, 15, BLACK); 1029 Tft.drawNumber(ambitempday, 1030 84, 270, 2, CYAN); 1031 } 1032 } else { 1033 if (dnchan == 1034 0) { 1035 ambitempday = ambitempday + 1; 1036 Tft.fillRectangle(84, 1037 270, 36, 15, BLACK); 1038 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 1039 1040 } else { 1041 ambitempnight = ambitempnight + 1; 1042 Tft.fillRectangle(84, 1043 270, 36, 15, BLACK); 1044 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 1045 1046 } 1047 } 1048 } 1049 if ((p.x > 200) && (p.x < 230) && (p.y 1050 > 260) && (p.y < 290)) { //- day 1051 if (night == 1) { 1052 if (dnchan 1053 == 0) { 1054 ambitempnight = ambitempnight - 1; 1055 Tft.fillRectangle(84, 1056 270, 36, 15, BLACK); 1057 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 1058 1059 } else { 1060 ambitempday = ambitempday - 1; 1061 Tft.fillRectangle(84, 1062 270, 36, 15, BLACK); 1063 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 1064 1065 } 1066 } else { 1067 if (dnchan == 0) { 1068 ambitempday 1069 = ambitempday - 1; 1070 Tft.fillRectangle(84, 270, 36, 15, BLACK); 1071 1072 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 1073 } else { 1074 1075 ambitempnight = ambitempnight - 1; 1076 Tft.fillRectangle(84, 1077 270, 36, 15, BLACK); 1078 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 1079 1080 } 1081 } 1082 } 1083 if ((p.x > 60) && (p.x < 180) && (p.y 1084 > 300) && (p.y < 330)) { 1085 if (dnchan == 0) { 1086 dnchan = 1; 1087 1088 } else { 1089 dnchan = 0; 1090 } 1091 npage = 1; 1092 1093 } 1094 } 1095 if (page == 3) { 1096 if ((p.x > 60) && (p.x < 90) && 1097 (p.y > 170) && (p.y < 200)) { //+ humidity 1098 humidminset = humidminset 1099 + 1; 1100 if (humidday == 0) { 1101 humidday = 1; 1102 Tft.fillRectangle(60, 1103 210, 36, 15, BLACK); 1104 Tft.drawNumber(humidday, 60, 210, 2, CYAN); 1105 1106 } 1107 Tft.fillRectangle(72, 150, 60, 15, BLACK); 1108 Tft.drawFloat(humidminset, 1109 72, 150, 2, CYAN); 1110 Tft.fillRectangle(146, 150, 60, 15, BLACK); 1111 Tft.drawFloat(humidminset 1112 + 10, 146, 150, 2, CYAN); 1113 } 1114 if ((p.x > 120) && (p.x < 150) && 1115 (p.y > 170) && (p.y < 200)) { // - Humidity 1116 humidminset = humidminset 1117 - 1; 1118 if (humidday == 0) { 1119 humidday = 1; 1120 Tft.fillRectangle(60, 1121 210, 36, 15, BLACK); 1122 Tft.drawNumber(humidday, 60, 210, 2, CYAN); 1123 1124 } 1125 Tft.fillRectangle(72, 150, 60, 15, BLACK); 1126 Tft.drawFloat(humidminset, 1127 72, 150, 2, CYAN); 1128 Tft.fillRectangle(146, 150, 60, 15, BLACK); 1129 Tft.drawFloat(humidminset 1130 + 10, 146, 150, 2, CYAN); 1131 } 1132 if ((p.x > 60) && (p.x < 90) && (p.y 1133 > 230) && (p.y < 260)) { // + humid day 1134 humidday = humidday + 1; 1135 1136 Tft.fillRectangle(60, 210, 36, 15, BLACK); 1137 Tft.drawNumber(humidday, 1138 60, 210, 2, CYAN); 1139 } 1140 if ((p.x > 120) && (p.x < 150) && (p.y > 1141 230) && (p.y < 260)) { // - humid day 1142 humidday = humidday - 1; 1143 if 1144 (humidday < 0) { 1145 humidday = 0; 1146 } 1147 Tft.fillRectangle(60, 1148 210, 36, 15, BLACK); 1149 Tft.drawNumber(humidday, 60, 210, 2, CYAN); 1150 1151 } 1152 } 1153 if (page == 4) { 1154 if ((p.x > 60) && (p.x < 90) && 1155 (p.y > 130) && (p.y < 160)) { // + min on sunrise 1156 srminutesetdisp = srminutesetdisp 1157 + 1; 1158 if (srminutesetdisp > 59) { 1159 srminutesetdisp = 0; 1160 1161 srhoursetdisp = srhoursetdisp + 1; 1162 if (srhoursetdisp > 24) 1163 { 1164 srhoursetdisp = 0; 1165 } 1166 } 1167 if (srday 1168 == 0) { 1169 srday = 1; 1170 Tft.fillRectangle(60, 170, 36, 15, 1171 BLACK); 1172 Tft.drawNumber(srday, 60, 170, 2, CYAN); 1173 } 1174 Tft.fillRectangle(110, 1175 110, 24, 15, BLACK); 1176 if (srhoursetdisp > 9) { 1177 Tft.drawNumber(srhoursetdisp, 1178 110, 110, 2, CYAN); 1179 } else { 1180 Tft.drawNumber(0, 110, 110, 1181 2, CYAN); 1182 Tft.drawNumber(srhoursetdisp, 122, 110, 2, CYAN); 1183 } 1184 1185 Tft.fillRectangle(146, 110, 24, 15, BLACK); 1186 if (srminutesetdisp 1187 > 9) { 1188 Tft.drawNumber(srminutesetdisp, 146, 110, 2, CYAN); 1189 } 1190 else { 1191 Tft.drawNumber(0, 146, 110, 2, CYAN); 1192 Tft.drawNumber(srminutesetdisp, 1193 158, 110, 2, CYAN); 1194 } 1195 } 1196 if ((p.x > 120) && (p.x < 150) 1197 && (p.y > 130) && (p.y < 160)) { // - min on sunrise 1198 srminutesetdisp 1199 = srminutesetdisp - 1; 1200 if (srminutesetdisp < 0) { 1201 srminutesetdisp 1202 = 59; 1203 srhoursetdisp = srhoursetdisp - 1; 1204 if (srhoursetdisp 1205 < 0) { 1206 srhoursetdisp = 24; 1207 } 1208 } 1209 if 1210 (srday == 0) { 1211 srday = 1; 1212 Tft.fillRectangle(60, 170, 36, 1213 15, BLACK); 1214 Tft.drawNumber(srday, 60, 170, 2, CYAN); 1215 } 1216 1217 Tft.fillRectangle(110, 110, 24, 15, BLACK); 1218 if (srhoursetdisp 1219 > 9) { 1220 Tft.drawNumber(srhoursetdisp, 110, 110, 2, CYAN); 1221 } 1222 else { 1223 Tft.drawNumber(0, 110, 110, 2, CYAN); 1224 Tft.drawNumber(srhoursetdisp, 1225 122, 110, 2, CYAN); 1226 } 1227 Tft.fillRectangle(146, 110, 24, 15, 1228 BLACK); 1229 if (srminutesetdisp > 9) { 1230 Tft.drawNumber(srminutesetdisp, 1231 146, 110, 2, CYAN); 1232 } else { 1233 Tft.drawNumber(0, 146, 110, 1234 2, CYAN); 1235 Tft.drawNumber(srminutesetdisp, 158, 110, 2, CYAN); 1236 } 1237 1238 } 1239 if ((p.x > 110) && (p.x < 140) && (p.y > 170) && (p.y < 200)) { 1240 // +day set for sunrise 1241 srday = srday + 1; 1242 Tft.fillRectangle(60, 1243 170, 36, 15, BLACK); 1244 Tft.drawNumber(srday, 60, 170, 2, CYAN); 1245 } 1246 1247 if ((p.x > 170) && (p.x < 200) && (p.y > 170) && (p.y < 200)) { // - day set 1248 for sunrise 1249 srday = srday - 1; 1250 if (srday < 0) { 1251 srday 1252 = 0; 1253 } 1254 Tft.fillRectangle(60, 170, 36, 15, BLACK); 1255 Tft.drawNumber(srday, 1256 60, 170, 2, CYAN); 1257 } 1258 if ((p.x > 60) && (p.x < 90) && (p.y > 230) 1259 && (p.y < 260)) { // + min sunset 1260 ssminutesetdisp = ssminutesetdisp + 1261 1; 1262 if (ssminutesetdisp > 59) { 1263 ssminutesetdisp = 0; 1264 1265 sshoursetdisp = sshoursetdisp + 1; 1266 if (sshoursetdisp > 24) 1267 { 1268 sshoursetdisp = 0; 1269 } 1270 } 1271 if (ssday 1272 == 0) { 1273 ssday = 1; 1274 Tft.fillRectangle(60, 270, 36, 15, 1275 BLACK); 1276 Tft.drawNumber(ssday, 60, 270, 2, CYAN); 1277 } 1278 Tft.fillRectangle(110, 1279 210, 24, 15, BLACK); 1280 if (sshoursetdisp > 9) { 1281 Tft.drawNumber(sshoursetdisp, 1282 110, 210, 2, CYAN); 1283 } else { 1284 Tft.drawNumber(0, 110, 210, 1285 2, CYAN); 1286 Tft.drawNumber(sshoursetdisp, 122, 210, 2, CYAN); 1287 } 1288 1289 Tft.fillRectangle(146, 210, 24, 15, BLACK); 1290 if (ssminutesetdisp 1291 > 9) { 1292 Tft.drawNumber(ssminutesetdisp, 146, 210, 2, CYAN); 1293 } 1294 else { 1295 Tft.drawNumber(0, 146, 210, 2, CYAN); 1296 Tft.drawNumber(ssminutesetdisp, 1297 158, 210, 2, CYAN); 1298 } 1299 } 1300 if ((p.x > 120) && (p.x < 150) 1301 && (p.y > 230) && (p.y < 260)) { //- min for sunset 1302 ssminutesetdisp = 1303 ssminutesetdisp - 1; 1304 if (ssminutesetdisp < 0) { 1305 ssminutesetdisp 1306 = 59; 1307 sshoursetdisp = sshoursetdisp - 1; 1308 if (sshoursetdisp 1309 < 0) { 1310 sshoursetdisp = 24; 1311 } 1312 } 1313 if 1314 (ssday == 0) { 1315 ssday = 1; 1316 Tft.fillRectangle(60, 270, 36, 1317 15, BLACK); 1318 Tft.drawNumber(ssday, 60, 270, 2, CYAN); 1319 } 1320 1321 Tft.fillRectangle(110, 210, 24, 15, BLACK); 1322 if (sshoursetdisp 1323 > 9) { 1324 Tft.drawNumber(sshoursetdisp, 110, 210, 2, CYAN); 1325 } 1326 else { 1327 Tft.drawNumber(0, 110, 210, 2, CYAN); 1328 Tft.drawNumber(sshoursetdisp, 1329 122, 210, 2, CYAN); 1330 } 1331 Tft.fillRectangle(146, 210, 24, 15, 1332 BLACK); 1333 if (ssminutesetdisp > 9) { 1334 Tft.drawNumber(ssminutesetdisp, 1335 146, 210, 2, CYAN); 1336 } else { 1337 Tft.drawNumber(0, 146, 210, 1338 2, CYAN); 1339 Tft.drawNumber(ssminutesetdisp, 158, 210, 2, CYAN); 1340 } 1341 1342 } 1343 if ((p.x > 110) && (p.x < 140) && (p.y > 270) && (p.y < 300)) { 1344 //+ day for sunset 1345 ssday = ssday + 1; 1346 Tft.fillRectangle(60, 1347 270, 36, 15, BLACK); 1348 Tft.drawNumber(ssday, 60, 270, 2, CYAN); 1349 } 1350 1351 if ((p.x > 170) && (p.x < 200) && (p.y > 270) && (p.y < 300)) { //- day set 1352 for sunset 1353 ssday = ssday - 1; 1354 if (ssday < 0) { 1355 ssday 1356 = 0; 1357 } 1358 Tft.fillRectangle(60, 270, 36, 15, BLACK); 1359 Tft.drawNumber(ssday, 1360 60, 270, 2, CYAN); 1361 } 1362 } 1363 tpage = minute() + 5; 1364 if (tpage 1365 > 59) { 1366 tpage = tpage - 60; 1367 } 1368 } 1369 //page change 1370 if 1371 (npage == 1) { 1372 if (page == 1) { 1373 allpage(); 1374 pageone(); 1375 1376 } 1377 if (page == 2) { 1378 allpage(); 1379 pagetwo(); 1380 } 1381 1382 if (page == 3) { 1383 allpage(); 1384 pagethree(); 1385 } 1386 if 1387 (page == 4) { 1388 allpage(); 1389 pagefour(); 1390 } 1391 if (page 1392 == 5) { 1393 allpage(); 1394 pagefive(); 1395 } 1396 npage = 0; 1397 1398 tpage = minute() + 5; 1399 if (tpage > 59) { 1400 tpage = tpage - 60; 1401 1402 } 1403 } 1404 if (tpage == minute()) { 1405 page = page + 1; 1406 dnchan 1407 = 0; 1408 if (page > 5) { 1409 page = 1; 1410 } 1411 npage = 1; 1412 } 1413 1414 //time change 1415 if (minutenow != minute()) { 1416 Tft.fillRectangle(56, 20, 1417 25, 15, BLACK); 1418 if (minute() > 9) { 1419 Tft.drawNumber(minute(), 56, 1420 20, 2, CYAN); 1421 } else { 1422 Tft.drawNumber(0, 56, 20, 2, CYAN); 1423 Tft.drawNumber(minute(), 1424 68, 20, 2, CYAN); 1425 } 1426 minutenow = minute(); 1427 } 1428 if (daynow != 1429 day()) { 1430 settemp(); 1431 daynow = day(); 1432 //temp day - 1 1433 if 1434 (ambitempday > 0) { 1435 ambitempday = ambitempday - 1; 1436 } 1437 if (ambitempnight 1438 > 0) { 1439 ambitempnight = ambitempnight - 1; 1440 } 1441 //humid day - 1442 1 1443 if (humidday > 0) { 1444 humidday = humidday - 1; 1445 } 1446 //SR/SS 1447 day - 1 1448 if (ssday > 0) { 1449 ssday = ssday - 1; 1450 } 1451 if (srday 1452 > 0) { 1453 srday = srday - 1; 1454 } 1455 } 1456 if (hournow != hour()) { 1457 1458 dlstime[5] = (year() - 2000); 1459 dlstime[4] = month(); 1460 dlstime[3] 1461 = day(); 1462 dlstime[2] = hour(); 1463 tardis.DST(dlstime); 1464 Tft.fillRectangle(20, 1465 20, 25, 15, BLACK); 1466 if (dlstime[2] > 9) { 1467 Tft.drawNumber(dlstime[2], 1468 20, 20, 2, CYAN); 1469 } else { 1470 Tft.drawNumber(0, 20, 20, 2, CYAN); 1471 1472 Tft.drawNumber(dlstime[2], 32, 20, 2, CYAN); 1473 Tft.fillRectangle(144, 1474 20, 25, 15, BLACK); 1475 } 1476 if (day() > 9) { 1477 Tft.drawNumber(day(), 1478 144, 20, 2, CYAN); 1479 } else { 1480 Tft.drawNumber(0, 144, 20, 2, CYAN); 1481 1482 Tft.drawNumber(day(), 156, 20, 2, CYAN); 1483 } 1484 hournow = hour(); 1485 1486 myDoc = "daynow.txt"; 1487 myData = String(daynow); 1488 writesd(); 1489 1490 myDoc = "hd.txt"; 1491 myData = String(humidday); 1492 writesd(); 1493 1494 myDoc = "hs.txt"; 1495 myData = String(humidminset); 1496 writesd(); 1497 1498 myDoc = "atd.txt"; 1499 myData = String(ambitempday); 1500 writesd(); 1501 1502 myDoc = "atdset.txt"; 1503 myData = String(hkdaytempdisp); 1504 writesd(); 1505 1506 myDoc = "atn.txt"; 1507 myData = String(ambitempnight); 1508 writesd(); 1509 1510 myDoc = "atnset.txt"; 1511 myData = String(hknighttempdisp); 1512 writesd(); 1513 1514 myDoc = "ssetday.txt"; 1515 myData = String(ssday); 1516 writesd(); 1517 1518 myDoc = "sriseday.txt"; 1519 myData = String(srday); 1520 writesd(); 1521 1522 myDoc = "ssetmin.txt"; 1523 myData = String(ssminutesetdisp); 1524 writesd(); 1525 1526 myDoc = "srisemin.txt"; 1527 myData = String(srminutesetdisp); 1528 writesd(); 1529 1530 myDoc = "ssethour.txt"; 1531 myData = String(sshoursetdisp); 1532 writesd(); 1533 1534 myDoc = "sriseh.txt"; 1535 myData = String(srhoursetdisp); 1536 writesd(); 1537 1538 delay(10); 1539 rsetFunc(); 1540 } 1541 if (monthnow != month()) { 1542 Tft.fillRectangle(120, 1543 20, 25, 15, BLACK); 1544 if (month() > 9) { 1545 Tft.drawNumber(month(), 108, 1546 20, 2, CYAN); 1547 } else { 1548 Tft.drawNumber(0, 108, 20, 2, CYAN); 1549 1550 Tft.drawNumber(month(), 120, 20, 2, CYAN); 1551 } 1552 monthnow = month(); 1553 1554 } 1555 if (yearnow != year()) { 1556 Tft.fillRectangle(180, 20, 48, 15, BLACK); 1557 1558 Tft.drawNumber(year(), 180, 20, 2, CYAN); 1559 yearnow = year(); 1560 } 1561 1562 //ambient temp and humid 1563 ambitempcur = dht.readTemperature(true); 1564 if 1565 (ambitempcur != ambitempdisp) { 1566 ambitempdisp = ambitempcur; 1567 if (page 1568 == 2) { 1569 Tft.fillRectangle(0, 110, 72, 25, BLACK); 1570 Tft.drawFloat(ambitempdisp, 1571 0, 115, 2, CYAN); 1572 } 1573 } 1574 humidcur = dht.readHumidity(); 1575 if (humidcur 1576 != humiddisp) { 1577 humiddisp = humidcur; 1578 if (page == 3) { 1579 Tft.fillRectangle(0, 1580 110, 92, 30, BLACK); 1581 Tft.drawFloat(humiddisp, 0, 115, 3, CYAN); 1582 } 1583 1584 } 1585 sensor_hr1.requestTemperatures(); 1586 hr1tempcur = 32 + (sensor_hr1.getTempCByIndex(0) 1587 * 1.8); 1588 if (hr1tempcur != hr1tempdisp) { 1589 hr1tempdisp = hr1tempcur; 1590 1591 if (page == 2) { 1592 Tft.fillRectangle(0, 150, 72, 25, BLACK); 1593 Tft.drawFloat(hr1tempdisp, 1594 0, 155, 2, CYAN - 8); 1595 } 1596 } 1597 roomtemp = (RTC.temperature() / 4) * 1598 9 / 5 + 32; 1599 if (roomtemp != roomtempdisp) { 1600 roomtempdisp = roomtemp; 1601 1602 if (page == 5) { 1603 Tft.fillRectangle(120, 255, 62, 25, BLACK); 1604 Tft.drawFloat(roomtempdisp, 1605 120, 255, 2, CYAN); 1606 } 1607 } 1608 if ((hr1tempdisp < 88) && (hr1sen == 0)) 1609 { 1610 digitalWrite(hrock1, HIGH); 1611 if ((page == 5) && (hr1pwr == 0)) { 1612 1613 Tft.fillRectangle(0, 223, 110, 12, GREEN); 1614 Tft.drawString("Heat 1615 Rock 1: ON", 0, 225, 1, BLACK); 1616 } 1617 hr1pwr = 1; 1618 } 1619 if ((hr1tempdisp 1620 > 96) || (hr1sen == 1)) { 1621 digitalWrite(hrock1, LOW); 1622 if ((page == 1623 5) && (hr1pwr == 1)) { 1624 Tft.fillRectangle(0, 223, 110, 12, RED); 1625 Tft.drawString("Heat 1626 Rock 1: OFF", 0, 225, 1, CYAN); 1627 } 1628 hr1pwr = 0; 1629 } 1630 sensor_hr2.requestTemperatures(); 1631 1632 hr2tempcur = 32 + (sensor_hr2.getTempCByIndex(0) * 1.8); 1633 if (hr2tempcur != 1634 hr2tempdisp) { 1635 hr2tempdisp = hr2tempcur; 1636 if (page == 2) { 1637 Tft.fillRectangle(0, 1638 190, 72, 25, BLACK); 1639 Tft.drawFloat(hr2tempdisp, 0, 195, 2, CYAN); 1640 } 1641 1642 } 1643 if (night == 1) { 1644 if ((hr2tempdisp < hknighttempdisp - .5) && (hr2sen 1645 == 0)) { 1646 digitalWrite(hrock2, HIGH); 1647 if ((page == 5) && (hr2pwr 1648 == 0)) { 1649 Tft.fillRectangle(115, 223, 110, 12, GREEN); 1650 Tft.drawString("Heat 1651 Rock 2: ON", 115, 225, 1, BLACK); 1652 } 1653 hr2pwr = 1; 1654 } 1655 1656 if ((hr2tempdisp > hknighttempdisp + .5) || (hr2sen == 1)) { 1657 digitalWrite(hrock2, 1658 LOW); 1659 if ((page == 5) && (hr2pwr == 1)) { 1660 Tft.fillRectangle(115, 1661 223, 110, 12, RED); 1662 Tft.drawString("Heat Rock 2: OFF", 115, 225, 1, 1663 CYAN); 1664 } 1665 hr2pwr = 0; 1666 } 1667 } else { 1668 if ((hr2tempdisp 1669 < hkdaytempdisp - .5) && (hr2sen == 0)) { 1670 digitalWrite(hrock2, HIGH); 1671 1672 if ((page == 5) && (hr2pwr == 0)) { 1673 Tft.fillRectangle(115, 223, 1674 110, 12, GREEN); 1675 Tft.drawString("Heat Rock 2: ON", 115, 225, 1, BLACK); 1676 1677 } 1678 hr2pwr = 1; 1679 } 1680 if ((hr2tempdisp > hkdaytempdisp + 1681 .5) || (hr2sen == 1)) { 1682 digitalWrite(hrock2, LOW); 1683 if ((page == 1684 5) && (hr2pwr == 1)) { 1685 Tft.fillRectangle(115, 223, 110, 12, RED); 1686 1687 Tft.drawString("Heat Rock 2: OFF", 115, 225, 1, CYAN); 1688 } 1689 1690 hr2pwr = 0; 1691 } 1692 } 1693 if (ambitempday == 0) { 1694 settemp(); 1695 1696 if (hkdaytemp != hkdaytempdisp) { 1697 hkdaytempdisp = hkdaytemp; 1698 if 1699 ((page == 2) && (night == 0)) { 1700 Tft.fillRectangle(48, 230, 72, 30, BLACK); 1701 1702 Tft.drawFloat(hkdaytempdisp, 48, 230, 2, CYAN); 1703 } 1704 } 1705 1706 } 1707 if (ambitempnight == 0) { 1708 settemp(); 1709 if (hknighttemp != hknighttempdisp) 1710 { 1711 hknighttempdisp = hknighttemp; 1712 if ((page == 2) && (night == 1713 1)) { 1714 Tft.fillRectangle(48, 230, 72, 30, BLACK); 1715 Tft.drawFloat(hknighttempdisp, 1716 48, 230, 2, CYAN); 1717 } 1718 } 1719 } 1720 if (humidday == 0) { 1721 if 1722 ((page == 3) && (humidminset != humidmin)) { 1723 Tft.fillRectangle(72, 150, 1724 60, 15, BLACK); 1725 Tft.fillRectangle(146, 150, 60, 15, BLACK); 1726 Tft.drawFloat 1727 (humidminset, 72, 150, 2, CYAN); 1728 Tft.drawFloat(humidminset + 10, 146, 150, 1729 2, CYAN); 1730 } 1731 humidminset = humidmin; 1732 } 1733 if (ambithsen == 0) 1734 { 1735 if (night == 0) { 1736 if (ambitempdisp < (hkdaytempdisp - .5)) { 1737 1738 digitalWrite(hlamp, HIGH); 1739 if ((page == 5) && (hlpwr == 0)) { 1740 1741 Tft.fillRectangle(0, 208, 110, 12, GREEN); 1742 Tft.drawString("Heat 1743 Lamp: ON", 0, 210, 1, BLACK); 1744 } 1745 hlpwr = 1; 1746 } 1747 1748 if (ambitempdisp > (hkdaytempdisp + .5)) { 1749 digitalWrite(hlamp, 1750 LOW); 1751 if ((page == 5) && (hlpwr == 1)) { 1752 Tft.fillRectangle(0, 1753 208, 110, 12, RED); 1754 Tft.drawString("Heat Lamp: OFF", 0, 210, 1, CYAN); 1755 1756 } 1757 hlpwr = 0; 1758 } 1759 if (ambitempdisp < (hkdaytempdisp 1760 + 2)) { 1761 digitalWrite(fan, LOW); 1762 if ((page == 5) && (fanpwr 1763 == 1)) { 1764 Tft.fillRectangle(115, 208, 110, 12, RED); 1765 Tft.drawString("Fan: 1766 OFF", 115, 210, 1, CYAN); 1767 } 1768 fanpwr = 0; 1769 } 1770 if 1771 (ambitempdisp > (hkdaytempdisp + 5)) { 1772 digitalWrite(fan, HIGH); 1773 if 1774 ((page == 5) && (fanpwr == 0)) { 1775 Tft.fillRectangle(115, 208, 110, 12, 1776 GREEN); 1777 Tft.drawString("Fan: ON", 115, 210, 1, BLACK); 1778 } 1779 1780 fanpwr = 1; 1781 } 1782 } else { 1783 if (ambitempdisp < (hknighttempdisp 1784 - .5)) { 1785 digitalWrite(hlamp, HIGH); 1786 if ((page == 5) && (hlpwr 1787 == 0)) { 1788 Tft.fillRectangle(0, 208, 110, 12, GREEN); 1789 Tft.drawString("Heat 1790 Lamp: ON", 0, 210, 1, BLACK); 1791 } 1792 hlpwr = 1; 1793 } 1794 1795 if (ambitempdisp > (hknighttempdisp + .5)) { 1796 digitalWrite(hlamp, 1797 LOW); 1798 if ((page == 5) && (hlpwr == 1)) { 1799 Tft.fillRectangle(0, 1800 208, 110, 12, RED); 1801 Tft.drawString("Heat Lamp: OFF", 0, 210, 1, CYAN); 1802 1803 } 1804 hlpwr = 0; 1805 } 1806 if (ambitempdisp < (hknighttempdisp 1807 + 2)) { 1808 digitalWrite(fan, LOW); 1809 if ((page == 5) && (fanpwr 1810 == 1)) { 1811 Tft.fillRectangle(115, 208, 110, 12, RED); 1812 Tft.drawString("Fan: 1813 OFF", 115, 210, 1, CYAN); 1814 } 1815 fanpwr = 0; 1816 } 1817 if 1818 (ambitempdisp > (hknighttempdisp + 5)) { 1819 digitalWrite(fan, HIGH); 1820 1821 if ((page == 5) && (fanpwr == 0)) { 1822 Tft.fillRectangle(115, 1823 208, 110, 12, GREEN); 1824 Tft.drawString("Fan: ON", 115, 210, 1, BLACK); 1825 1826 } 1827 fanpwr = 1; 1828 } 1829 } 1830 if ((humiddisp < humidminset) 1831 && (fanpwr == 0) && (foggersen == 0)) { 1832 digitalWrite(fogger, HIGH); 1833 1834 if ((page == 5) && (foggerpwr == 0)) { 1835 Tft.fillRectangle(0, 238, 1836 110, 12, GREEN); 1837 Tft.drawString("Fogger: ON", 0 1838 , 1839 240, 1, BLACK); 1840 } 1841 foggerpwr = 1; 1842 } 1843 if ((humiddisp 1844 > (humidminset + 10)) || (fanpwr == 1) || (foggersen == 1)) { 1845 digitalWrite(fogger, 1846 LOW); 1847 if ((page == 5) && (foggerpwr == 1)) { 1848 Tft.fillRectangle(0, 1849 238, 110, 12, RED); 1850 Tft.drawString("Fogger: OFF", 0, 240, 1, CYAN); 1851 1852 } 1853 foggerpwr = 0; 1854 } 1855 } else { 1856 digitalWrite(hlamp, 1857 LOW); 1858 digitalWrite(fogger, LOW); 1859 if ((page == 5) && ((hlpwr == 1) 1860 || (foggerpwr == 1))) { 1861 Tft.fillRectangle(0, 208, 110, 12, RED); 1862 Tft.drawString("Heat 1863 Lamp: OFF", 0, 210, 1, CYAN); 1864 Tft.fillRectangle(115, 238, 110, 12, RED); 1865 1866 Tft.drawString("Fogger: OFF", 115, 240, 1, CYAN); 1867 } 1868 foggerpwr 1869 = 0; 1870 hlpwr = 0; 1871 } 1872 //light cycle set 1873 if (srday == 0) { 1874 1875 todaysr[3] = day(); 1876 todaysr[4] = month(); 1877 todaysr[5] = year(); 1878 1879 tardis.SunRise(todaysr); 1880 tardis.DST(todaysr); 1881 srhourset = todaysr[2]; 1882 1883 srminuteset = todaysr[1]; 1884 if (page == 4) { 1885 if (srhoursetdisp 1886 != srhourset) { 1887 Tft.fillRectangle(110, 110, 25, 14, BLACK); 1888 if 1889 (srhourset > 9) { 1890 Tft.drawNumber(srhourset, 110, 110, 2, CYAN); 1891 1892 } else { 1893 Tft.drawNumber(0, 110, 110, 2, CYAN); 1894 Tft.drawNumber(srhourset, 1895 122, 110, 2, CYAN); 1896 } 1897 } 1898 if (srminutesetdisp != srminuteset) 1899 { 1900 Tft.fillRectangle(146, 110, 25, 14, BLACK); 1901 if (srminuteset 1902 > 9) { 1903 Tft.drawNumber(srminuteset, 146, 110, 2, CYAN); 1904 } 1905 else { 1906 Tft.drawNumber(0, 146, 110, 2, CYAN); 1907 Tft.drawNumber(srminuteset, 1908 158, 110, 2, CYAN); 1909 } 1910 } 1911 } 1912 srhoursetdisp = srhourset; 1913 1914 srminutesetdisp = srminuteset; 1915 } 1916 if (ssday == 0) { 1917 todayss[3] 1918 = day(); 1919 todayss[4] = month(); 1920 todayss[5] = year(); 1921 tardis.SunSet(todayss); 1922 1923 tardis.DST(todayss); 1924 sshourset = todayss[2]; 1925 ssminuteset = todayss[1]; 1926 1927 if (page == 4) { 1928 if (sshoursetdisp != sshourset) { 1929 Tft.fillRectangle(110, 1930 210, 25, 14, BLACK); 1931 if (sshourset > 9) { 1932 Tft.drawNumber(sshourset, 1933 110, 210, 2, CYAN); 1934 } else { 1935 Tft.drawNumber(0, 110, 210, 1936 2, CYAN); 1937 Tft.drawNumber(sshourset, 122, 210, 2, CYAN); 1938 } 1939 1940 } 1941 if (ssminutesetdisp != ssminuteset) { 1942 Tft.fillRectangle(146, 1943 210, 25, 14, BLACK); 1944 if (ssminuteset > 9) { 1945 Tft.drawNumber(ssminuteset, 1946 146, 210, 2, CYAN); 1947 } else { 1948 Tft.drawNumber(0, 146, 210, 1949 2, CYAN); 1950 Tft.drawNumber(ssminuteset, 158, 210, 2, CYAN); 1951 } 1952 1953 } 1954 } 1955 sshoursetdisp = sshourset; 1956 ssminutesetdisp = ssminuteset; 1957 1958 } 1959 timenow = (100 * dlstime[2]) + dlstime[1]; 1960 timesr = (100 * srhoursetdisp) 1961 + srminutesetdisp; 1962 timess = (100 * sshoursetdisp) + ssminutesetdisp; 1963 if 1964 ((timenow > timesr) && (timenow < timess)) { 1965 night = 0; 1966 digitalWrite(dnlamp, 1967 HIGH); 1968 if ((page == 5) && (dlpwr == 0)) { 1969 Tft.fillRectangle(0, 193, 1970 110, 12, GREEN); 1971 Tft.drawString("Day Light: ON", 0, 195, 1, BLACK); 1972 1973 Tft.fillRectangle(115, 193, 110, 12, RED); 1974 Tft.drawString("Night 1975 Light: OFF", 115, 195, 1, CYAN); 1976 } 1977 dlpwr = 1; 1978 } else { 1979 night 1980 = 1; 1981 digitalWrite(dnlamp, LOW); 1982 if ((page == 5) && (dlpwr == 1)) { 1983 1984 Tft.fillRectangle(0, 193, 110, 12, RED); 1985 Tft.drawString("Day Light: 1986 OFF", 0, 195, 1, CYAN); 1987 Tft.fillRectangle(115, 193, 110, 12, GREEN); 1988 1989 Tft.drawString("Night Light: ON", 115, 195, 1, BLACK); 1990 } 1991 dlpwr 1992 = 0; 1993 } 1994 //water level low or high 1995 if (digitalRead(foggerwater) == 1996 HIGH) { 1997 if ((page == 5) && (foggersen == 1)) { 1998 Tft.fillRectangle(135, 1999 128, 130, 12, GREEN); 2000 Tft.drawString("Water Level: GOOD", 135, 130, 1, 2001 BLACK); 2002 Tft.fillRectangle(0, 238, 110, 12, GREEN); 2003 Tft.drawString("Water 2004 Level OK", 0, 240, 1, BLACK); 2005 } 2006 foggersen = 0; 2007 } else { 2008 2009 if ((page == 5) && (foggersen == 0)) { 2010 Tft.fillRectangle(135, 128, 2011 130, 12, RED); 2012 Tft.drawString("Water Level: LOW", 135, 130, 1, CYAN); 2013 2014 Tft.fillRectangle(0, 238, 110, 12, RED); 2015 Tft.drawString("Fill Fogger", 2016 0, 240, 1, CYAN); 2017 } 2018 foggersen = 1; 2019 } 2020 //sensor quality check 2021 2022 if ((isnan(dht.readTemperature(true))) || (isnan(dht.readHumidity()))) { 2023 if 2024 ((ambithsen == 0) && (page == 5)) { 2025 Tft.fillRectangle(0, 128, 130, 12, 2026 RED); 2027 Tft.drawString("Ambient Temp: BAD", 0, 130, 1, CYAN); 2028 } 2029 2030 ambithsen = 1; 2031 } else { 2032 if ((ambithsen == 1) && (page == 5)) { 2033 2034 Tft.fillRectangle(0, 128, 130, 12, GREEN); 2035 Tft.drawString("Ambient 2036 Temp: GOOD", 0, 130, 1, BLACK); 2037 } 2038 ambithsen = 0; 2039 } 2040 if ( 2041 hr1tempdisp < -196) { 2042 if ((hr1sen == 0) && (page == 5)) { 2043 Tft.fillRectangle(0, 2044 143, 130, 12, RED); 2045 Tft.drawString("Heatrock 1 Temp: BAD", 0, 145, 1, 2046 CYAN); 2047 } 2048 hr1sen = 1; 2049 } else { 2050 if ((hr1sen == 1) && (page 2051 == 5)) { 2052 Tft.fillRectangle(0, 143, 130, 12, GREEN); 2053 Tft.drawString("Heatrock 2054 1 Temp: GOOD", 0, 145, 1, BLACK); 2055 } 2056 hr1sen = 0; 2057 } 2058 if (hr2tempdisp 2059 < -196) { 2060 if ((hr2sen == 0) && (page == 5)) { 2061 Tft.fillRectangle(0, 2062 158, 130, 12, RED); 2063 Tft.drawString("Heatrock 2 Temp: BAD", 0, 160, 1, 2064 CYAN); 2065 } 2066 hr2sen = 1; 2067 } else { 2068 if ((hr2sen == 1) && (page 2069 == 5)) { 2070 Tft.fillRectangle(0, 158, 130, 12, GREEN); 2071 Tft.drawString("Heatrock 2072 2 Temp: GOOD", 0, 160, 1, BLACK); 2073 } 2074 hr2sen = 0; 2075 } 2076} 2077////////////////////// 2078void 2079 settemp() { 2080 if (month() == 1) { 2081 hkdaytemp = 82.17647059 + (day() * -0.125237192); 2082 2083 hknighttemp = 69.28571429 + (day() * -0.061443932); 2084 } 2085 if (month() 2086 == 2) { 2087 hkdaytemp = 78.29411765 + (day() * -0.046218487); 2088 hknighttemp 2089 = 67.38095238 + (day() * -0.013605442); 2090 }//end of day/night temps 2091 if (month() 2092 == 3) { 2093 hkdaytemp = 77 + (day() * 0.146110057); 2094 hknighttemp = 67 + 2095 (day() * 0.061443932); 2096 } 2097 if (month() == 4) { 2098 hkdaytemp = 81.52941176 2099 + (day() * 0.129411765); 2100 hknighttemp = 68.9047619 + (day() * 0.088888889); 2101 2102 } 2103 if (month() == 5) { 2104 hkdaytemp = 85.41176471 + (day() * 0.083491461); 2105 2106 hknighttemp = 71.57142857 + (day() * 0.086021505); 2107 } 2108 if (month() == 2109 6) { 2110 hkdaytemp = 88 + (day() * -0.021568627); 2111 hknighttemp = 74.23809524 2112 + (day() * 0.025396825); 2113 } 2114 if (month() == 7) { 2115 hkdaytemp = 87.35294118 2116 + (day() * -0.104364326); 2117 hknighttemp = 75 + (day() * -0.049155146); 2118 2119 } 2120 if (month() == 8) { 2121 hkdaytemp = 84.11764706 + (day() * -0.146110057); 2122 2123 hknighttemp = 73.47619048 + (day() * -0.036866359); 2124 } 2125 if (month() 2126 == 9) { 2127 hkdaytemp = 79.58823529 + (day() * -0.064705882); 2128 hknighttemp 2129 = 72.33333333 + (day() * -0.025396825); 2130 } 2131 if (month() == 10) { 2132 hkdaytemp 2133 = 77.64705882 + (day() * 0.083491461); 2134 hknighttemp = 71.57142857 + (day() 2135 * 0.012288786); 2136 } 2137 if (month() == 11) { 2138 hkdaytemp = 80.23529412 2139 + (day() * 0.107843137); 2140 hknighttemp = 71.95238095 + (day() * 0.012698413); 2141 2142 } 2143 if (month() == 12) { 2144 hkdaytemp = 83.47058824 + (day() * -0.041745731); 2145 2146 hknighttemp = 72.33333333 + (day() * -0.098310292); 2147 } 2148 return hkdaytemp, 2149 hknighttemp; 2150} 2151////////////////////// 2152void allpage() { 2153 Tft.fillScreen(0, 2154 240, 0, 320, BLACK); 2155 Tft.drawString("Harold & Kumar", 0, 0, 2, CYAN); 2156 2157 if (dlstime[2] > 9) { 2158 Tft.drawNumber(dlstime[2], 20, 20, 2, CYAN); 2159 2160 } else { 2161 Tft.drawNumber(0, 20, 20, 2, CYAN); 2162 Tft.drawNumber(dlstime[2], 2163 32, 20, 2, CYAN); 2164 } 2165 Tft.drawChar(':', 44, 20, 2, CYAN); 2166 if (minute() 2167 > 9) { 2168 Tft.drawNumber(minute(), 56, 20, 2, CYAN); 2169 } else { 2170 Tft.drawNumber(0, 2171 56, 20, 2, CYAN); 2172 Tft.drawNumber(minute(), 68, 20, 2, CYAN); 2173 } 2174 if 2175 (month() > 9) { 2176 Tft.drawNumber(month(), 108, 20, 2, CYAN); 2177 } else { 2178 2179 Tft.drawNumber(0, 108, 20, 2, CYAN); 2180 Tft.drawNumber(month(), 120, 20, 2181 2, CYAN); 2182 } 2183 Tft.drawChar('/', 132, 20, 2, CYAN); 2184 if (day() > 9) { 2185 2186 Tft.drawNumber(day(), 144, 20, 2, CYAN); 2187 } else { 2188 Tft.drawNumber(0, 2189 144, 20, 2, CYAN); 2190 Tft.drawNumber(day(), 156, 20, 2, CYAN); 2191 } 2192 Tft.drawChar('/', 2193 168, 20, 2, CYAN); 2194 Tft.drawNumber(year(), 180, 20, 2, CYAN); 2195 Tft.drawRectangle(0, 2196 40, 120, 30, CYAN); 2197 Tft.drawRectangle(0, 70, 120, 30, CYAN); 2198 Tft.drawRectangle(120, 2199 40, 120, 30, CYAN); 2200 Tft.drawRectangle(120, 70, 120, 30, CYAN); 2201 return; 2202} 2203////////////////////// 2204void 2205 pageone() { //Main 2206 Tft.fillRectangle(180, 0, 61, 15, BLACK); 2207 Tft.drawString("Main", 2208 180, 0, 2, CYAN); 2209 Tft.drawString("Temperature", 24, 50, 1, CYAN); 2210 Tft.drawString("Light 2211 Cycle", 24, 80, 1, CYAN); 2212 Tft.drawString("Humidity", 144, 50, 1, CYAN); 2213 2214 Tft.drawString("Settings", 144, 80, 1, CYAN); 2215 Tft.drawString("Harold & 2216 Kumar", 0, 110, 2, CYAN); 2217 Tft.drawString("Python Regius", 0, 140, 2, CYAN); 2218 2219 Tft.drawString("Ball or Royal Python", 0, 170, 2, CYAN); 2220 Tft.drawString("Native 2221 Countries:", 0, 200, 2, CYAN); 2222 Tft.drawString("Niger, Chad, Guinea, Sierra 2223 Leone,", 0, 220, 1, CYAN); 2224 Tft.drawString("Liberia, Ivory Coast, Ghana, Togo,", 2225 0, 235, 1, CYAN); 2226 Tft.drawString("Burkina Faso, Nigeria,", 0, 250, 1, CYAN); 2227 2228 Tft.drawString("Benin and Cameroon", 0, 265, 1, CYAN); 2229 return; 2230} 2231////////////////////// 2232void 2233 pagetwo() { //Temperature 2234 Tft.fillRectangle(180, 0, 61, 15, BLACK); 2235 Tft.drawString("Temp", 2236 180, 0, 2, CYAN); 2237 Tft.drawString("Main", 24, 50, 1, CYAN); 2238 Tft.drawString("Light 2239 Cycle", 24, 80, 1, CYAN); 2240 Tft.drawString("Humidity", 144, 50, 1, CYAN); 2241 2242 Tft.drawString("Settings", 144, 80, 1, CYAN); 2243 Tft.drawFloat(ambitempdisp, 2244 0, 115, 2, CYAN); 2245 Tft.drawChar('o', 85, 110, 1, CYAN); 2246 Tft.drawChar('F', 2247 89, 110, 3, CYAN); 2248 Tft.drawString("Ambient", 110, 110, 3, CYAN); 2249 Tft.drawFloat(hr1tempdisp, 2250 0, 155, 2, CYAN); 2251 Tft.drawChar('o', 85, 150, 1, CYAN); 2252 Tft.drawChar('F', 2253 89, 150, 3, CYAN); 2254 Tft.drawString("Basking", 110, 150, 3, CYAN); 2255 Tft.drawFloat(hr2tempdisp, 2256 0, 195, 2, CYAN); 2257 Tft.drawChar('o', 85, 190, 1, CYAN); 2258 Tft.drawChar('F', 2259 89, 190, 3, CYAN); 2260 Tft.drawString("Burrow", 110, 190, 3, CYAN); 2261 Tft.drawString("Set", 2262 0, 230, 2, CYAN); 2263 Tft.drawChar('o', 120, 230, 1, CYAN); 2264 Tft.drawChar('F', 2265 125, 230, 2, CYAN); 2266 Tft.drawRectangle(140, 220, 30, 30, CYAN); 2267 Tft.drawChar('+', 2268 148, 228, 2, CYAN); 2269 Tft.drawRectangle(200, 220, 30, 30, CYAN); 2270 Tft.drawChar('-', 2271 208, 228, 2, CYAN); 2272 if (dnchan == 0) { 2273 if (night == 1) { 2274 Tft.drawString("Nights", 2275 0, 270, 2, CYAN); 2276 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 2277 2278 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 2279 } else { 2280 Tft.drawString("Days", 2281 0, 270, 2, CYAN); 2282 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 2283 Tft.drawFloat(hkdaytempdisp, 2284 48, 230, 2, CYAN); 2285 } 2286 } else { 2287 if (night == 0) { 2288 Tft.drawString("Nights", 2289 0, 270, 2, CYAN); 2290 Tft.drawNumber(ambitempnight, 84, 270, 2, CYAN); 2291 2292 Tft.drawFloat(hknighttempdisp, 48, 230, 2, CYAN); 2293 } else { 2294 Tft.drawString("Days", 2295 0, 270, 2, CYAN); 2296 Tft.drawNumber(ambitempday, 84, 270, 2, CYAN); 2297 Tft.drawFloat(hkdaytempdisp, 2298 48, 230, 2, CYAN); 2299 } 2300 } 2301 Tft.drawRectangle(140, 260, 30, 30, CYAN); 2302 2303 Tft.drawChar('+', 148, 268, 2, CYAN); 2304 Tft.drawRectangle(200, 260, 30, 30, 2305 CYAN); 2306 Tft.drawChar('-', 208, 268, 2, CYAN); 2307 Tft.drawRectangle(60, 300, 2308 120, 30, CYAN); 2309 Tft.drawString("Switch", 105, 304, 1, CYAN); 2310 return; 2311} 2312////////////////////// 2313void 2314 pagethree() { //Humidity 2315 Tft.fillRectangle(180, 0, 61, 15, BLACK); 2316 Tft.drawString("Humid", 2317 180, 0, 2, CYAN); 2318 Tft.drawString("Main", 24, 50, 1, CYAN); 2319 Tft.drawString("Light 2320 Cycle", 24, 80, 1, CYAN); 2321 Tft.drawString("Temperature", 144, 50, 1, CYAN); 2322 2323 Tft.drawString("Settings", 144, 80, 1, CYAN); 2324 Tft.drawFloat(humiddisp, 2325 0, 115, 3, CYAN); 2326 Tft.drawChar('O', 147, 113, 1, CYAN); 2327 Tft.drawChar('/', 2328 144, 110, 4, CYAN); 2329 Tft.drawChar('O', 162, 128, 1, CYAN); 2330 Tft.drawString("Range", 2331 0, 150, 2, CYAN); 2332 Tft.drawFloat (humidminset, 72, 150, 2, CYAN); 2333 Tft.drawChar('-', 2334 133, 150, 2, CYAN); 2335 Tft.drawFloat(humidminset + 10, 146, 150, 2, CYAN); 2336 2337 Tft.drawChar('%', 207, 150, 2, CYAN); 2338 Tft.drawRectangle(60, 170, 30, 30, 2339 CYAN); 2340 Tft.drawChar('+', 68, 178, 2, CYAN); 2341 Tft.drawRectangle(120, 170, 2342 30, 30, CYAN); 2343 Tft.drawChar('-', 128, 178, 2, CYAN); 2344 Tft.drawString("Days", 2345 0, 210, 2, CYAN); 2346 Tft.drawNumber(humidday, 60, 210, 2, CYAN); 2347 Tft.drawRectangle(60, 2348 230, 30, 30, CYAN); 2349 Tft.drawChar('+', 68, 238, 2, CYAN); 2350 Tft.drawRectangle(120, 2351 230, 30, 30, CYAN); 2352 Tft.drawChar('-', 128, 238, 2, CYAN); 2353 return; 2354} 2355////////////////////// 2356void 2357 pagefour() { //Light Cycle 2358 Tft.fillRectangle(180, 0, 61, 15, BLACK); 2359 Tft.drawString("Light", 2360 180, 0, 2, CYAN); 2361 Tft.drawString("Main", 24, 50, 1, CYAN); 2362 Tft.drawString("Humidity", 2363 24, 80, 1, CYAN); 2364 Tft.drawString("Temperature", 144, 50, 1, CYAN); 2365 Tft.drawString("Settings", 2366 144, 80, 1, CYAN); 2367 Tft.drawString("Sunrise", 0, 110, 2, CYAN); 2368 if (srhoursetdisp 2369 > 9) { 2370 Tft.drawNumber(srhoursetdisp, 110, 110, 2, CYAN); 2371 } else { 2372 2373 Tft.drawNumber(0, 110, 110, 2, CYAN); 2374 Tft.drawNumber(srhoursetdisp, 122, 2375 110, 2, CYAN); 2376 } 2377 Tft.drawChar(':', 134, 110, 2, CYAN); 2378 if (srminutesetdisp 2379 > 9) { 2380 Tft.drawNumber(srminutesetdisp, 146, 110, 2, CYAN); 2381 } else { 2382 2383 Tft.drawNumber(0, 146, 110, 2, CYAN); 2384 Tft.drawNumber(srminutesetdisp, 2385 158, 110, 2, CYAN); 2386 } 2387 Tft.drawChar(':', 170, 110, 2, CYAN); 2388 if (srsecondset 2389 > 9) { 2390 Tft.drawNumber(srsecondset, 182, 110, 2, CYAN); 2391 } else { 2392 2393 Tft.drawNumber(0, 182, 110, 2, CYAN); 2394 Tft.drawNumber(srsecondset, 194, 2395 110, 2, CYAN); 2396 } 2397 Tft.drawRectangle(60, 130, 30, 30, CYAN); 2398 Tft.drawChar('+', 2399 68, 138, 2, CYAN); 2400 Tft.drawRectangle(120, 130, 30, 30, CYAN); 2401 Tft.drawChar('-', 2402 128, 138, 2, CYAN); 2403 Tft.drawString("Days", 0, 170, 2, CYAN); 2404 Tft.drawNumber(srday, 2405 60, 170, 2, CYAN); 2406 Tft.drawRectangle(110, 170, 30, 30, CYAN); 2407 Tft.drawChar('+', 2408 118, 178, 2, CYAN); 2409 Tft.drawRectangle(170, 170, 30, 30, CYAN); 2410 Tft.drawChar('-', 2411 178, 178, 2, CYAN); 2412 Tft.drawString("Sunset", 0, 210, 2, CYAN); 2413 if (sshoursetdisp 2414 > 9) { 2415 Tft.drawNumber(sshoursetdisp, 110, 210, 2, CYAN); 2416 } else { 2417 2418 Tft.drawNumber(0, 110, 210, 2, CYAN); 2419 Tft.drawNumber(sshoursetdisp, 122, 2420 210, 2, CYAN); 2421 } 2422 Tft.drawChar(':', 134, 210, 2, CYAN); 2423 if (ssminutesetdisp 2424 > 9) { 2425 Tft.drawNumber(ssminutesetdisp, 146, 210, 2, CYAN); 2426 } else { 2427 2428 Tft.drawNumber(0, 146, 210, 2, CYAN); 2429 Tft.drawNumber(ssminutesetdisp, 2430 158, 210, 2, CYAN); 2431 } 2432 Tft.drawChar(':', 170, 210, 2, CYAN); 2433 if (sssecondset 2434 > 9) { 2435 Tft.drawNumber(sssecondset, 182, 210, 2, CYAN); 2436 } else { 2437 2438 Tft.drawNumber(0, 182, 210, 2, CYAN); 2439 Tft.drawNumber(sssecondset, 194, 2440 210, 2, CYAN); 2441 } 2442 Tft.drawRectangle(60, 230, 30, 30, CYAN); 2443 Tft.drawChar('+', 2444 68, 238, 2, CYAN); 2445 Tft.drawRectangle(120, 230, 30, 30, CYAN); 2446 Tft.drawChar('-', 2447 128, 238, 2, CYAN); 2448 Tft.drawString("Days", 0, 270, 2, CYAN); 2449 Tft.drawNumber(ssday, 2450 60, 270, 2, CYAN); 2451 Tft.drawRectangle(110, 270, 30, 30, CYAN); 2452 Tft.drawChar('+', 2453 118, 278, 2, CYAN); 2454 Tft.drawRectangle(170, 270, 30, 30, CYAN); 2455 Tft.drawChar('-', 2456 178, 278, 2, CYAN); 2457 return; 2458} 2459////////////////////// 2460void pagefive() 2461 { //Settings 2462 Tft.fillRectangle(180, 0, 61, 15, BLACK); 2463 Tft.drawString("Setup", 2464 180, 0, 2, CYAN); 2465 Tft.drawString("Main", 24, 50, 1, CYAN); 2466 Tft.drawString("Humidity", 2467 24, 80, 1, CYAN); 2468 Tft.drawString("Temperature", 144, 50, 1, CYAN); 2469 Tft.drawString("Light 2470 Cycle", 144, 80, 1, CYAN); 2471 Tft.drawString("Sensors:", 0, 110, 2, CYAN); 2472 2473 if (ambithsen == 1) { 2474 Tft.fillRectangle(0, 128, 130, 12, RED); 2475 Tft.drawString("Ambient 2476 Temp: BAD", 0, 130, 1, CYAN); 2477 } else { 2478 Tft.fillRectangle(0, 128, 130, 2479 12, GREEN); 2480 Tft.drawString("Ambient Temp: GOOD", 0, 130, 1, BLACK); 2481 2482 } 2483 if (foggersen == 1) { 2484 Tft.fillRectangle(135, 128, 130, 12, RED); 2485 2486 Tft.drawString("Water Level: LOW", 135, 130, 1, CYAN); 2487 } else { 2488 Tft.fillRectangle(135, 2489 128, 130, 12, GREEN); 2490 Tft.drawString("Water Level: GOOD", 135, 130, 1, 2491 BLACK); 2492 } 2493 if (hr1sen == 1) { 2494 Tft.fillRectangle(0, 143, 130, 12, 2495 RED); 2496 Tft.drawString("Heatrock 1 Temp: BAD", 0, 145, 1, CYAN); 2497 } else 2498 { 2499 Tft.fillRectangle(0, 143, 130, 12, GREEN); 2500 Tft.drawString("Heatrock 2501 1 Temp: GOOD", 0, 145, 1, BLACK); 2502 } 2503 if (hr2sen == 1) { 2504 Tft.fillRectangle(0, 2505 158, 130, 12, RED); 2506 Tft.drawString("Heatrock 2 Temp: BAD", 0, 160, 1, CYAN); 2507 2508 } else { 2509 Tft.fillRectangle(0, 158, 130, 12, GREEN); 2510 Tft.drawString("Heatrock 2511 2 Temp: GOOD", 0, 160, 1, BLACK); 2512 } 2513 Tft.drawString("Power:", 0, 175, 2514 2, CYAN); 2515 if (dlpwr == 0) { 2516 Tft.fillRectangle(0, 193, 110, 12, RED); 2517 2518 Tft.drawString("Day Light: OFF", 0, 195, 1, CYAN); 2519 Tft.fillRectangle(115, 2520 193, 110, 12, GREEN); 2521 Tft.drawString("Night Light: ON", 115, 195, 1, BLACK); 2522 2523 } else { 2524 Tft.fillRectangle(0, 193, 110, 12, GREEN); 2525 Tft.drawString("Day 2526 Light: ON", 0, 195, 1, BLACK); 2527 Tft.fillRectangle(115, 193, 110, 12, RED); 2528 2529 Tft.drawString("Night Light: OFF", 115, 195, 1, CYAN); 2530 } 2531 if (hlpwr 2532 == 0) { 2533 Tft.fillRectangle(0, 208, 110, 12, RED); 2534 Tft.drawString("Heat 2535 Lamp: OFF", 0, 210, 1, CYAN); 2536 } else { 2537 Tft.fillRectangle(0, 208, 110, 2538 12, GREEN); 2539 Tft.drawString("Heat Lamp: ON", 0, 210, 1, BLACK); 2540 } 2541 2542 if (fanpwr == 0) { 2543 Tft.fillRectangle(115, 208, 110, 12, RED); 2544 Tft.drawString("Fan: 2545 OFF", 115, 210, 1, CYAN); 2546 } else { 2547 Tft.fillRectangle(115, 208, 110, 2548 12, GREEN); 2549 Tft.drawString("Fan: ON", 115, 210, 1, BLACK); 2550 } 2551 if 2552 (hr1pwr == 0) { 2553 Tft.fillRectangle(0, 223, 110, 12, RED); 2554 Tft.drawString("Heat 2555 Rock 1: OFF", 0, 225, 1, CYAN); 2556 } else { 2557 Tft.fillRectangle(0, 223, 2558 110, 12, GREEN); 2559 Tft.drawString("Heat Rock 1: ON", 0, 225, 1, BLACK); 2560 2561 } 2562 if (hr2pwr == 0) { 2563 Tft.fillRectangle(115, 223, 110, 12, RED); 2564 2565 Tft.drawString("Heat Rock 2: OFF", 115, 225, 1, CYAN); 2566 } else { 2567 Tft.fillRectangle(115, 2568 223, 110, 12, GREEN); 2569 Tft.drawString("Heat Rock 2: ON", 115, 225, 1, BLACK); 2570 2571 } 2572 if (foggerpwr == 0) { 2573 Tft.fillRectangle(0, 238, 110, 12, RED); 2574 2575 Tft.drawString("Fogger: OFF", 0, 240, 1, CYAN); 2576 } else { 2577 Tft.fillRectangle(0, 2578 238, 110, 12, GREEN); 2579 Tft.drawString("Fogger: ON", 0, 240, 1, BLACK); 2580 2581 } 2582 Tft.drawString("Room Temp:", 0, 255, 2, CYAN); 2583 Tft.drawFloat(roomtemp, 2584 120, 255, 2, CYAN); 2585 Tft.drawChar('o', 185, 255, 1, CYAN); 2586 Tft.drawChar('F', 2587 190, 255, 2, CYAN); 2588 return; 2589} 2590////////////////////// 2591void readsd() 2592 { 2593 myData = ""; 2594 digitalWrite(W5200_CS, HIGH); 2595 myFile = SD.open(myDoc); 2596 2597 if (myFile) { 2598 // read all data from the file 2599 while (myFile.available()) 2600 { 2601 //send the content onto the serial monitor 2602 myData += char(myFile.read()); 2603 2604 } 2605 // close the file 2606 myFile.close(); 2607 } 2608 digitalWrite(SDCARD_CS, 2609 HIGH); //Deselect the SD card 2610} 2611////////////////////// 2612void writesd() { 2613 2614 digitalWrite(W5200_CS, HIGH); 2615 SD.remove(myDoc); 2616 myFile = SD.open(myDoc, 2617 FILE_WRITE); 2618 //write to the file after it's successfully opened or created: 2619 2620 if (myFile) { 2621 myFile.print(myData); 2622 // close the file 2623 myFile.close(); 2624 2625 } 2626 digitalWrite(SDCARD_CS, HIGH); //Deselect the SD card 2627} 2628////////////////////// 2629void 2630 rsetFunc() { 2631 pinMode(rset, OUTPUT); 2632 digitalWrite(rset, LOW); 2633} 2634////////////////////// 2635/******************************************************************************* 2636 2637 Function Name: capture_photo 2638 Description: capture a photo and store the 2639 file named temp.jpg into SD 2640 Input: None 2641 Output : None 2642 Return : 2643 None 2644 *******************************************************************************/ 2645void 2646 capture_photo(char myFileName[]) { 2647 VC0706_frame_control(3); 2648 delay(10); 2649 2650 // Check to see if the file exists: 2651 // if exists,delete the file: 2652 if 2653 (SD.exists(myFileName)) SD.remove(myFileName); 2654 VC0706_frame_control(0); 2655 2656 delay(10); 2657 rx_ready = false; 2658 rx_counter = 0; 2659 Serial2.end();// clear 2660 all rx buffer 2661 delay(5); 2662 Serial2.begin(115200); 2663 //get frame buffer 2664 length 2665 VC0706_get_framebuffer_length(0); 2666 delay(10); 2667 buffer_read(); 2668 2669 // store frame buffer length for coming reading 2670 frame_length = (VC0706_rx_buffer[5] 2671 << 8) + VC0706_rx_buffer[6]; 2672 frame_length = frame_length << 16; 2673 frame_length 2674 = frame_length + (0x0ff00 & (VC0706_rx_buffer[7] << 8)) + VC0706_rx_buffer[8]; 2675 2676 vc_frame_address = READ_DATA_BLOCK_NO; 2677 myFile = SD.open(myFileName, FILE_WRITE); 2678 2679 while (vc_frame_address < frame_length) { 2680 VC0706_read_frame_buffer(vc_frame_address 2681 - READ_DATA_BLOCK_NO, READ_DATA_BLOCK_NO); 2682 delay(9); 2683 //get the data 2684 with length=READ_DATA_BLOCK_NObytes 2685 rx_ready = false; 2686 rx_counter = 2687 0; 2688 buffer_read(); 2689 // write data to file 2690 myFile.write(VC0706_rx_buffer 2691 + 5, READ_DATA_BLOCK_NO); 2692 //read next READ_DATA_BLOCK_NO bytes from frame 2693 buffer 2694 vc_frame_address = vc_frame_address + READ_DATA_BLOCK_NO; 2695 } 2696 2697 // get the last data 2698 vc_frame_address = vc_frame_address - READ_DATA_BLOCK_NO; 2699 2700 last_data_length = frame_length - vc_frame_address; 2701 VC0706_read_frame_buffer(vc_frame_address, 2702 last_data_length); 2703 delay(9); 2704 //get the data 2705 rx_ready = false; 2706 2707 rx_counter = 0; 2708 buffer_read(); 2709 myFile.write(VC0706_rx_buffer + 5, last_data_length); 2710 2711 myFile.close(); 2712 VC0706_frame_control(3); 2713 delay(10); 2714} 2715/******************************************************************************* 2716 2717 Function Name: VC0706_read_frame_buffer 2718 Description: read image data from 2719 FBUF 2720 Input: buffer_address(4 bytes); buffer_length(4 bytes) ******YO!****** 2721 2722 Output : None 2723 Return : None 2724 *******************************************************************************/ 2725void 2726 VC0706_read_frame_buffer(unsigned long buffer_address, unsigned long buffer_length) 2727 { 2728 tx_vcbuffer[0] = VC0706_PROTOCOL_SIGN; 2729 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 2730 2731 tx_vcbuffer[2] = VC0706_COMMAND_READ_FBUF; 2732 tx_vcbuffer[3] = 0x0c; 2733 tx_vcbuffer[4] 2734 = FBUF_CURRENT_FRAME; 2735 tx_vcbuffer[5] = 0x0a; // 0x0a=data transfer by MCU mode; 2736 0x0f=data transfer by SPI interface 2737 tx_vcbuffer[6] = buffer_address >> 24; 2738 //starting address 2739 tx_vcbuffer[7] = buffer_address >> 16; 2740 tx_vcbuffer[8] 2741 = buffer_address >> 8; 2742 tx_vcbuffer[9] = buffer_address & 0x0ff; 2743 tx_vcbuffer[10] 2744 = buffer_length >> 24; // data length 2745 tx_vcbuffer[11] = buffer_length >> 16; 2746 2747 tx_vcbuffer[12] = buffer_length >> 8; 2748 tx_vcbuffer[13] = buffer_length & 0x0ff; 2749 2750 tx_vcbuffer[14] = 0x00; // delay time 2751 tx_vcbuffer[15] = 0x0a; 2752 tx_counter 2753 = 16; 2754 buffer_send(); 2755} 2756/******************************************************************************* 2757 2758 Function Name: VC0706_frame_control 2759 Description: control frame buffer register 2760 ******YO!****** 2761 Input: frame_control=control flag(1byte) 2762 : 0 = stop current 2763 frame ; 1= stop next frame;2=step frame;3 =resume frame; 2764 Output : None 2765 2766 Return : None 2767 *******************************************************************************/ 2768void 2769 VC0706_frame_control(byte frame_control) { 2770 if (frame_control > 3)frame_control 2771 = 3; 2772 tx_vcbuffer[0] = VC0706_PROTOCOL_SIGN; 2773 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 2774 2775 tx_vcbuffer[2] = VC0706_COMMAND_FBUF_CTRL; 2776 tx_vcbuffer[3] = 0x01; 2777 tx_vcbuffer[4] 2778 = frame_control; 2779 tx_counter = 5; 2780 buffer_send(); 2781} 2782/******************************************************************************* 2783 2784 Function Name: VC0706_get_framebuffer_length 2785 Description: get byte-lengths 2786 in FBUF 2787 Input: fbuf_type =current or next frame 2788 0 =current frame ******YO!****** 2789 2790 1 =next frame 2791 Output : None 2792 Return : None 2793 *******************************************************************************/ 2794void 2795 VC0706_get_framebuffer_length(byte fbuf_type) { 2796 if (fbuf_type > 1)fbuf_type 2797 = 1; 2798 tx_vcbuffer[0] = VC0706_PROTOCOL_SIGN; 2799 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 2800 2801 tx_vcbuffer[2] = VC0706_COMMAND_GET_FBUF_LEN; 2802 tx_vcbuffer[3] = 0x01; 2803 2804 tx_vcbuffer[4] = fbuf_type; 2805 tx_counter = 5; 2806 buffer_send(); 2807} 2808/******************************************************************************* 2809 2810 Function Name: VC0706_uart_power_save 2811 Description: stop current frame for 2812 reading 2813 Input: power_on =1start power-save 2814 = 0stop power-save 2815 Output 2816 : None 2817 Return : None 2818 *******************************************************************************/ 2819void 2820 VC0706_uart_power_save(byte power_save_on) { 2821 tx_vcbuffer[0] = VC0706_PROTOCOL_SIGN; 2822 2823 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 2824 tx_vcbuffer[2] = VC0706_COMMAND_POWER_SAVE_CTRL; 2825 2826 tx_vcbuffer[3] = 0x03; 2827 tx_vcbuffer[4] = 00; //power save control mode 2828 2829 tx_vcbuffer[5] = 01; // control by UART 2830 tx_vcbuffer[6] = power_save_on; //start 2831 power save 2832 tx_counter = 7; 2833 buffer_send(); 2834} 2835/******************************************************************************* 2836 2837 Function Name: VC0706_compression_ratio 2838 Description: stop current frame 2839 for reading 2840 Input: ration>13(minimum) ******YO!****** 2841 <63(max) 2842 Output 2843 : None 2844 Return : None 2845 *******************************************************************************/ 2846void 2847 VC0706_compression_ratio(int ratio) { 2848 if (ratio > 63)ratio = 63; 2849 if (ratio 2850 < 13)ratio = 13; 2851 int vc_comp_ratio = (ratio - 13) * 4 + 53; 2852 tx_vcbuffer[0] 2853 = VC0706_PROTOCOL_SIGN; 2854 tx_vcbuffer[1] = VC0706_Serial2_NUMBER; 2855 tx_vcbuffer[2] 2856 = VC0706_COMMAND_WRITE_DATA; 2857 tx_vcbuffer[3] = 0x05; 2858 tx_vcbuffer[4] = 01; 2859 //chip register 2860 tx_vcbuffer[5] = 0x01; //data num ready to write 2861 tx_vcbuffer[6] 2862 = 0x12; //register address 2863 tx_vcbuffer[7] = 0x04; 2864 tx_vcbuffer[8] = vc_comp_ratio; 2865 //data 2866 tx_counter = 9; 2867 buffer_send(); 2868} 2869/******************************************************************************* 2870 2871 Function Name: buffer_send 2872 Description: Transmit buffer to VC0706 2873 Input: 2874 tx_vcbuffer 2875 Output : None 2876 Return : None 2877 *******************************************************************************/ 2878void 2879 buffer_send() { 2880 int i = 0; 2881 for (i = 0; i < tx_counter; i++) 2882 Serial2.write(tx_vcbuffer[i]); 2883 2884 tx_ready = true; 2885} 2886/******************************************************************************* 2887 2888 Function Name: buffer_read 2889 Description: Receive buffer from VC0706 2890 2891 Input: None 2892 Output : rx_buffer, rx_ready 2893 Return : 2894 None 2895 *******************************************************************************/ 2896void 2897 buffer_read() { 2898 bool validity = true; 2899 if (rx_ready) // if something 2900 unread in buffer, just quit 2901 return; 2902 rx_counter = 0; 2903 VC0706_rx_buffer[0] 2904 = 0; 2905 while (Serial2.available() > 0) 2906 { 2907 VC0706_rx_buffer[rx_counter++] 2908 = Serial2.read(); 2909 //delay(1); 2910 } 2911 if (VC0706_rx_buffer[0] != 0x76) 2912 2913 validity = false; 2914 if (VC0706_rx_buffer[1] != VC0706_Serial2_NUMBER) 2915 2916 validity = false; 2917 if (validity) rx_ready = true; 2918}
Downloadable files
Harold and Kumar w/out IP
Fritzing
Harold and Kumar w/out IP
Comments
Only logged in users can leave comments