You are on page 1of 75

//*****************************************************************************

***********************************************//

// BANTAM.EARTH //

// Paludarium Arduino Code //

// https://bantam.earth/ //

//*****************************************************************************
***********************************************//

//---------------------------------------------------

// 1. Libreries

//---------------------------------------------------

#include "Arduino.h"

#include <DFRobotDFPlayerMini.h>

#include <Wire.h>

#include <dht.h>

#include <math.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//----------------------------------------------------

// 2. Pins

//----------------------------------------------------

dht DHT;

DFRobotDFPlayerMini myDFPlayer;

#define xPin A1

#define yPin A2

#define kPin 12
#define DHT11_PIN 11 //assign DHT11 to pin

#define StormLED 10

#define StarsLED 9

#define Fish1LED 8

#define Fish2LED 7

#define SkyL1LED 6

#define SkyL2LED 5

#define SkyL3LED 3

#define SkyL4LED 2

#define RelayPin1 52

#define RelayPin2 50

#define RelayPin3 48

#define RelayPin4 46

#define RelayPin5 44

#define RelayPin6 42

#define RelayPin7 40

#define RelayPin8 38

//----------------------------------------------------

// 3. Variables & commands

//----------------------------------------------------

int buusyPin = 23;// buusyPin = 23; // sound player busy

int bsy = 0;

int sensorPin = A3; // Audio level samples

int sensorValue = 0;
boolean isPlaying = false;

//Bluetooth

byte dataFromBT;

byte State;

int FanState = 0;

int FogState = 0;

int RainState = 0;

int SunState = 0;

int BaskState = 0;

int SkyState = 0;

//String string;

//char command;

//int RESET = 7;

//Read LED values

int StormLEDPos = 0;

int StarsLEDPos = 0;

int FishLED1Pos = 0;

int FishLED2Pos = 0;

int SkyL1LEDPos = 0;

int SkyL2LEDPos = 0;

int SkyL3LEDPos = 0;

int SkyL4LEDPos = 0;

//Store LED values

int StormLEDSet = 0;

int StarsLEDSet = 0;
int FishLED1Set = 0;

int FishLED2Set = 0;

int SkyL1LEDSet = 0;

int SkyL2LEDSet = 0;

int SkyL3LEDSet = 0;

int SkyL4LEDSet = 0;

//Storm Values

unsigned long previousCloudMillis = 0;

unsigned long CloudInterval = 2000; //Desired wait time

unsigned long CloudreadTime = 0;

int CloudBrightness = 0;

int StormSpeed = 1;

int CloudBrightnessMax = 35;

int CloudBrightnessMin = 10;

//Variables for auto scroll

unsigned long previousMillis = 0;

unsigned long interval = 10000; //Desired wait time 10 seconds

unsigned long readTime;

//Assign thermistor to pin

int ThermistorPin = 0;

int Vo;

float R1 = 10000;

float logR2, R2, WaterTemp, AirTemp;

float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;

int tCount1;
bool refresh;//lcd clear On/Of

//ReadJoystick

int joyRead;

int joyPos;

int lastJoyPos;

int joyButtonPushed;

long lastDebounceTime = 0;

long debounceDelay = 70; //user define

int pushedTime = 0;

//Counters to change positions of pages and sub-menus

int pages=7 ; //number of pages

int page_counter=1 ; //To move between pages

int subpage_counter=0; //To move submenu 1 RGB

int subpage2_counter=0; //To move submenu 2 Led

//-------Dead Pins-----//

int up = 4; //Up/Yes button

int sel = 4; //Select button

int down = 4; //Down/No button

//---------Storage states of buttons for debounce function-----//

boolean current_sel = LOW;

boolean last_sel = LOW;

//--------Relay states-----------//

boolean relay1_state = HIGH;

boolean relay2_state = HIGH;

boolean relay3_state = HIGH;


boolean relay4_state = HIGH;

boolean relay5_state = HIGH;

boolean relay6_state = HIGH;

boolean relay7_state = HIGH;

boolean relay8_state = HIGH;

//Custom return char

byte back[8] = {

0b00100,

0b01000,

0b11111,

0b01001,

0b00101,

0b00001,

0b00001,

0b11111

};

//Custom arrow char

byte arrow[8] = {

0b01000,

0b00100,

0b00010,

0b11111,

0b00010,

0b00100,

0b01000,
0b00000

};

//=============================================================================
==============================================

// SETUP

//=============================================================================
==============================================

void setup() {

//----------------------------------------------------

// S1. Pins

//----------------------------------------------------

pinMode(buusyPin, INPUT);

//assign LED pins as output signal

pinMode(StormLED,OUTPUT);

pinMode(StarsLED,OUTPUT);

pinMode(Fish1LED,OUTPUT);

pinMode(Fish2LED,OUTPUT);

pinMode(SkyL1LED,OUTPUT);

pinMode(SkyL2LED,OUTPUT);

pinMode(SkyL3LED,OUTPUT);

pinMode(SkyL4LED,OUTPUT);

//assign Joystick pins as output signal

pinMode(xPin, INPUT);

pinMode(yPin, INPUT);

pinMode(kPin, INPUT_PULLUP);

//assign Relay pins as outgoing signal


pinMode(RelayPin1, OUTPUT);

pinMode(RelayPin2, OUTPUT);

pinMode(RelayPin3, OUTPUT);

pinMode(RelayPin4, OUTPUT);

pinMode(RelayPin5, OUTPUT);

pinMode(RelayPin6, OUTPUT);

pinMode(RelayPin7, OUTPUT);

pinMode(RelayPin8, OUTPUT);

//----------------------------------------------------

// S2. Objects

//----------------------------------------------------

resetallrelays();

//start intro message

//start serial for debug

Serial2.begin(9600);

Serial1.begin(9600);

Serial.begin(9600); // connect to the serial port

//Serial.println();

//Serial.println(F("DFRobot DFPlayer Mini Demo"));

// Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

if (!myDFPlayer.begin(Serial2)) { //Use softwareSerial to communicate with mp3.

//Serial.println(F("Unable to begin:"));

//Serial.println(F("1.Please recheck the connection!"));


// Serial.println(F("2.Please insert the SD card!"));

else{

//Serial.println(F("DFPlayer Mini online."));

myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

//myDFPlayer.reset();

myDFPlayer.volume (20); // must remove mp3_reset(); to get this to work

myDFPlayer.volumeUp(); //Volume Up

myDFPlayer.volumeDown(); //Volume Down

myDFPlayer.play(4);

lcd.begin(20,4);

lcd.createChar(1, back);

lcd.createChar(2, arrow);

lcd.backlight(); // finish with backlight on

lcd.setCursor(4,1);

lcd.print("Bantam.Earth");

lcd.setCursor(8,3);

lcd.print("v1.10");

delay(3000);

lcd.clear();

readTime = 0;

myDFPlayer.play(1);
}

//=============================================================================
==============================================

// LOOP

//=============================================================================
==============================================

void loop() {

if (myDFPlayer.available()) {

printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from


DFPlayer to handle diferent errors and states.

if(millis() > readTime+1500){

updatestatistics();

readJoystick();

navigationFunctioner();

myMenu();

relayStates();

bluetooth();

if(subpage2_counter < 5){

clearSkyMode();

//if (isPlaying == true) {

// myDFPlayer.stop();

// isPlaying = false;

// }println

}
else{

cloudySkyMode();

if(page_counter !=1){

autoGoBackToHomePage();

//=============================================================================
==============================================

// CHECK SYSTEM STATS

//=============================================================================
==============================================

void updatestatistics(){

readTime = millis();

//read air temperature & humidity

int chk = DHT.read11(DHT11_PIN);

AirTemp = DHT.temperature;

AirTemp *= 1.8;

AirTemp += 30;

//read water temperature

Vo = analogRead(ThermistorPin);

R2 = R1 * (1023.0 / (float)Vo - 1.0);

logR2 = log(R2);

WaterTemp = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));


WaterTemp = WaterTemp - 273.15;

WaterTemp = (WaterTemp * 9.0)/ 5.0 + 32.0;

byte Air = AirTemp;

byte Humidity = DHT.humidity;

byte Water = WaterTemp;

Serial1.print("Stats:");

Serial1.print((int)Air);

//Serial1.print(" F");

Serial1.print("|");

Serial1.print((int)Humidity);

//Serial1.print(" %");

Serial1.print("|");

Serial1.print((int)Water);

//Serial1.print(" F");

Serial1.print("|");

if(subpage2_counter == 0){

Serial1.print("Sky Disabled");

else if(subpage2_counter == 1){

Serial1.print("Morning");

else if(subpage2_counter == 2){

Serial1.print("Noon");

}
else if(subpage2_counter == 3){

Serial1.print("Evening");

else if(subpage2_counter == 4){

Serial1.print("Night");

else if(subpage2_counter == 5){

Serial1.print("Storm");

Serial1.print("StatsEnd");

byte FanMode = FanState;

byte FogMode = FogState;

byte RainMode = RainState;

byte SunMode = SunState;

byte BaskMode = BaskState;

byte SkyMode = SkyState;

Serial1.print("Setts:");

Serial1.print((int)FanMode);

Serial1.print("|");

Serial1.print((int)FogMode);

Serial1.print("|");

Serial1.print((int)RainMode);

Serial1.print("|");

Serial1.print((int)SunMode);
Serial1.print("|");

Serial1.print((int)BaskMode);

Serial1.print("|");

Serial1.print((int)SkyMode);

Serial1.print("SettsEnd");

//=============================================================================
==============================================

// WRITE SYSTEM STATS

//=============================================================================
==============================================

void writestatistics(){

//write a pleasant message

//write air temperature to LCD

lcd.setCursor(1,1);

lcd.print("Temp: A:");

lcd.print(AirTemp, 0);

lcd.print((char)223);

lcd.print(" W:");

// write water temperature to LCD

lcd.print(WaterTemp, 0);

lcd.print((char)223);

//lcd.print("F");

// write humidity to LCD


lcd.setCursor(4,2);

lcd.print("Humidity ");

lcd.print(DHT.humidity, 0);

lcd.print("%");

//=============================================================================
==============================================

// MENUS

//=============================================================================
==============================================

//----------------------------------------------------------------------------------------------------------------------

// MAIN MENU(PageCounter1)

//----------------------------------------------------------------------------------------------------------------------

void myMenu(){

switch (page_counter) {

case 1:{

homeScreen();

break;

case 2: {

fanControl();

break;

case 3: {
fogControl();

break;

case 4: {

rainControl();

break;

case 5: {

sunControl();

break;

case 6: {

BaskingControl();

break;

case 7: {

skyControl();

break;

//----------------------------------------------------------------------------------------------------------------------

// SUB MENU(PageCounter2)

//----------------------------------------------------------------------------------------------------------------------

void SkyMenu(){
switch (subpage2_counter) {

case 1:{

morning();

break;

case 2: {

noon();

break;

case 3: {

evening();

break;

case 4: {

night();

break;

case 5: {

storm();

break;

case 0: {

TurnOfSky();

}
break;

//----------------------------------------------------------------------------------------------------------------------

// SUB MENU SETTINGS

//----------------------------------------------------------------------------------------------------------------------

void morning(){

lcd.setCursor(5,2);

lcd.print(" Morning");

StormLEDSet = 0;

StarsLEDSet = 0;

FishLED1Set = 15;

FishLED2Set = 0;

SkyL1LEDSet = 65;

SkyL2LEDSet = 65;

SkyL3LEDSet = 65;

SkyL4LEDSet = 65;

void noon(){

lcd.setCursor(5,2);

lcd.print(" Noon ");

StormLEDSet = 0;

StarsLEDSet = 0;

FishLED1Set = 65;

FishLED2Set = 0;
SkyL1LEDSet = 200;

SkyL2LEDSet = 200;

SkyL3LEDSet = 200;

SkyL4LEDSet = 200;

void evening(){

lcd.setCursor(5,2);

lcd.print(" Evening");

StormLEDSet = 0;

StarsLEDSet = 0;

FishLED1Set = 25;

FishLED2Set = 1;

SkyL1LEDSet = 25;

SkyL2LEDSet = 25;

SkyL3LEDSet = 25;

SkyL4LEDSet = 25;

void night(){

lcd.setCursor(5,2);

lcd.print(" Night ");

StormLEDSet = 2;

StarsLEDSet = 1;

FishLED1Set = 0;

FishLED2Set = 5;

SkyL1LEDSet = 0;
SkyL2LEDSet = 0;

SkyL3LEDSet = 0;

SkyL4LEDSet = 0;

void storm(){

lcd.setCursor(5,2);

lcd.print(" Storm ");

StormLEDSet = 0;

StarsLEDSet = 0;

FishLED1Set = 5;

FishLED2Set = 5;

SkyL1LEDSet = 255;

SkyL2LEDSet = 255;

SkyL3LEDSet = 255;

SkyL4LEDSet = 255;

void TurnOfSky(){

lcd.setCursor(5,2);

lcd.print(" ");

StormLEDSet = 0;

StarsLEDSet = 0;

FishLED1Set = 0;

SkyL1LEDSet = 0;

SkyL2LEDSet = 0;

SkyL3LEDSet = 0;
SkyL4LEDSet = 0;

//----------------------------------------------------------------------------------------------------------------------

// HOME

//----------------------------------------------------------------------------------------------------------------------

void homeScreen(){

if (refresh){lcd.clear();refresh=0;}

writestatistics();

//----------------------------------------------------------------------------------------------------------------------

// MENU OPTION ONE

//----------------------------------------------------------------------------------------------------------------------

void fanControl(){

//Static objects

lcd.setCursor(4,0);

lcd.print("Fan Control:");

//----------------------------------------

// page controls

//----------------------------------------

last_sel=current_sel; //Save last state of select button

if (last_sel== LOW && joyButtonPushed==1 || last_sel== LOW && joyButtonPushed==2){


//Up or Down

if(subpage_counter <2){ // subpage counter never higher than 2(total of items)

subpage_counter ++; //subcounter to move beetwen submenu

lcd.setCursor(15,3);
lcd.write(byte(1)); //Return custom char

else{ //If subpage higher than 2 (total of items) return to first item

subpage_counter=1;

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(3);

// Sub menu counter control

if (last_sel== LOW && joyButtonPushed==5){ //select button pressed

if(subpage_counter <2){ // subpage counter never higher than 4 (total of items)

subpage_counter ++; //subcounter to move between submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==2){ //If subpage higher than 2 (total of items)


return to first item

subpage_counter=0;

lcd.setCursor(14,3);

lcd.print(" ");

lcd.setCursor(15,3);

lcd.print(" ");

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(7);

}
last_sel=current_sel; //Save last state of select button

//----------------------------------------

// item control 1

//----------------------------------------

//First item control(subpage_counter =1) Fan Power

if(subpage_counter==1){

lcd.setCursor(14,3);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(7,1);

lcd.write(byte(2));

if (last_sel== LOW && joyButtonPushed==3){ //Right, Fan on

relay8_state=LOW;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(last_sel== LOW && joyButtonPushed==4){//Left, Fan of

relay8_state=HIGH;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(relay8_state==HIGH){
lcd.setCursor(8,1);

lcd.print("OFF");

if(FanState !=0){

FanState = 0;

else if(relay8_state==LOW){

lcd.setCursor(8,1);

lcd.print("ON ");

if(FanState !=1){

FanState = 1;

//----------------------------------------

// BACK controls

//----------------------------------------

//Second item control (subpage_counter=2) back

if(subpage_counter==2){

lcd.setCursor(7,1);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(14,3); //Place the arrow

lcd.write(byte(2));

//----------------------------------------------------------------------------------------------------------------------
// MENU OPTION TWO

//----------------------------------------------------------------------------------------------------------------------

void fogControl(){

//Static objects

lcd.setCursor(4,0);

lcd.print("Fog Control:");

//----------------------------------------

// page controls

//----------------------------------------

last_sel=current_sel; //Save last state of select button

if (last_sel== LOW && joyButtonPushed==1 || last_sel== LOW && joyButtonPushed==2){


//Up or Down

if(subpage_counter <2){ // subpage counter never higher than 2(total of items)

subpage_counter ++; //subcounter to move beetwen submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else{ //If subpage higher than 2 (total of items) return to first item

subpage_counter=1;

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(3);

// Sub menu counter control


if (last_sel== LOW && joyButtonPushed==5){ //select button pressed

if(subpage_counter <2){ // subpage counter never higher than 4 (total of items)

subpage_counter ++; //subcounter to move between submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==2){ //If subpage higher than 2 (total of items)


return to first item

subpage_counter=0;

lcd.setCursor(14,3);

lcd.print(" ");

lcd.setCursor(15,3);

lcd.print(" ");

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(7);

last_sel=current_sel; //Save last state of select button

//----------------------------------------

// item control 1

//----------------------------------------

//First item control(subpage_counter =1) Fog Power

if(subpage_counter==1){

lcd.setCursor(14,3);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(7,1);
lcd.write(byte(2));

if (last_sel== LOW && joyButtonPushed==3){ //Right, Fog on

relay2_state=LOW;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(last_sel== LOW && joyButtonPushed==4){//Left, Fog of

relay2_state=HIGH;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(relay2_state==HIGH){

lcd.setCursor(8,1);

lcd.print("OFF");

if(FogState !=0){

FogState = 0;

else if(relay2_state==LOW){

lcd.setCursor(8,1);

lcd.print("ON ");

if(FogState !=1){
FogState = 1;

//----------------------------------------

// BACK controls

//----------------------------------------

//Second item control (subpage_counter=2) back

if(subpage_counter==2){

lcd.setCursor(7,1);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(14,3); //Place the arrow

lcd.write(byte(2));

//----------------------------------------------------------------------------------------------------------------------

// MENU OPTION THREE

//----------------------------------------------------------------------------------------------------------------------

void rainControl(){

//Static objects

lcd.setCursor(4,0);

lcd.print("Rain Control:");

//----------------------------------------

// page controls

//----------------------------------------

last_sel=current_sel; //Save last state of select button


if (last_sel== LOW && joyButtonPushed==1 || last_sel== LOW && joyButtonPushed==2){
//Up or Down

if(subpage_counter <2){ // subpage counter never higher than 2(total of items)

subpage_counter ++; //subcounter to move beetwen submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else{ //If subpage higher than 2 (total of items) return to first item

subpage_counter=1;

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(3);

// Sub menu counter control

if (last_sel== LOW && joyButtonPushed==5){ //select button pressed

if(subpage_counter <2){ // subpage counter never higher than 4 (total of items)

subpage_counter ++; //subcounter to move between submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==2){ //If subpage higher than 2 (total of items)


return to first item

subpage_counter=0;

lcd.setCursor(14,3);
lcd.print(" ");

lcd.setCursor(15,3);

lcd.print(" ");

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(7);

last_sel=current_sel; //Save last state of select button

//----------------------------------------

// item control 1

//----------------------------------------

//First item control(subpage_counter =1) Fog Power

if(subpage_counter==1){

lcd.setCursor(14,3);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(7,1);

lcd.write(byte(2));

if (last_sel== LOW && joyButtonPushed==3){ //Right, Rain on

relay3_state=LOW;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(last_sel== LOW && joyButtonPushed==4){//Left, Rain of

relay3_state=HIGH;
joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(relay3_state==HIGH){

lcd.setCursor(8,1);

lcd.print("OFF");

if(RainState !=0){

RainState = 0;

else if(relay3_state==LOW){

lcd.setCursor(8,1);

lcd.print("ON ");

if(RainState !=1){

RainState = 1;

//----------------------------------------

// BACK controls

//----------------------------------------

//Second item control (subpage_counter=2) back

if(subpage_counter==2){

lcd.setCursor(7,1);
lcd.print(" "); //Delete last arrow position

lcd.setCursor(14,3); //Place the arrow

lcd.write(byte(2));

//----------------------------------------------------------------------------------------------------------------------

// MENU OPTION FOUR

//----------------------------------------------------------------------------------------------------------------------

void sunControl(){

//Static objects

lcd.setCursor(4,0);

lcd.print("Sun Control:");

//----------------------------------------

// page controls

//----------------------------------------

last_sel=current_sel; //Save last state of select button

if (last_sel== LOW && joyButtonPushed==1 || last_sel== LOW && joyButtonPushed==2){


//Up or Down

if(subpage_counter <2){ // subpage counter never higher than 2(total of items)

subpage_counter ++; //subcounter to move beetwen submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else{ //If subpage higher than 2 (total of items) return to first item

subpage_counter=1;
lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(3);

// Sub menu counter control

if (last_sel== LOW && joyButtonPushed==5){ //select button pressed

if(subpage_counter <2){ // subpage counter never higher than 4 (total of items)

subpage_counter ++; //subcounter to move between submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==2){ //If subpage higher than 2 (total of items)


return to first item

subpage_counter=0;

lcd.setCursor(14,3);

lcd.print(" ");

lcd.setCursor(15,3);

lcd.print(" ");

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(7);

last_sel=current_sel; //Save last state of select button

//----------------------------------------

// item control 1

//----------------------------------------
//First item control(subpage_counter =1) Sun Power

if(subpage_counter==1){

lcd.setCursor(14,3);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(7,1);

lcd.write(byte(2));

if (last_sel== LOW && joyButtonPushed==3){ //Right, Sun on

relay4_state=LOW;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(last_sel== LOW && joyButtonPushed==4){//Left, Sun of

relay4_state=HIGH;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(relay4_state==HIGH){

lcd.setCursor(8,1);

lcd.print("OFF");

if(SunState !=0){

SunState = 0;
}

else if(relay4_state==LOW){

lcd.setCursor(8,1);

lcd.print("ON ");

if(SunState !=1){

SunState = 1;

//----------------------------------------

// BACK controls

//----------------------------------------

//Second item control (subpage_counter=2) back

if(subpage_counter==2){

lcd.setCursor(7,1);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(14,3); //Place the arrow

lcd.write(byte(2));

//----------------------------------------------------------------------------------------------------------------------

// MENU OPTION FIVE

//----------------------------------------------------------------------------------------------------------------------

void BaskingControl(){

//Static objects
lcd.setCursor(4,0);

lcd.print("Bask Control:");

//----------------------------------------

// page controls

//----------------------------------------

last_sel=current_sel; //Save last state of select button

if (last_sel== LOW && joyButtonPushed==1 || last_sel== LOW && joyButtonPushed==2){


//Up or Down

if(subpage_counter <2){ // subpage counter never higher than 2(total of items)

subpage_counter ++; //subcounter to move beetwen submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else{ //If subpage higher than 2 (total of items) return to first item

subpage_counter=1;

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(3);

// Sub menu counter control

if (last_sel== LOW && joyButtonPushed==5){ //select button pressed

if(subpage_counter <2){ // subpage counter never higher than 4 (total of items)

subpage_counter ++; //subcounter to move between submenu

lcd.setCursor(15,3);
lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==2){ //If subpage higher than 2 (total of items)


return to first item

subpage_counter=0;

lcd.setCursor(14,3);

lcd.print(" ");

lcd.setCursor(15,3);

lcd.print(" ");

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(7);

last_sel=current_sel; //Save last state of select button

//----------------------------------------

// item control 1

//----------------------------------------

//First item control(subpage_counter =1) Basking Power

if(subpage_counter==1){

lcd.setCursor(14,3);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(7,1);

lcd.write(byte(2));

if (last_sel== LOW && joyButtonPushed==3){ //Right, Basking on

relay5_state=LOW;
joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(last_sel== LOW && joyButtonPushed==4){//Left, Basking of

relay5_state=HIGH;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(relay5_state==HIGH){

lcd.setCursor(8,1);

lcd.print("OFF");

if(BaskState !=0){

BaskState = 0;

else if(relay5_state==LOW){

lcd.setCursor(8,1);

lcd.print("ON ");

if(BaskState !=1){

BaskState = 1;

//----------------------------------------
// BACK controls

//----------------------------------------

//Second item control (subpage_counter=2) back

if(subpage_counter==2){

lcd.setCursor(7,1);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(14,3); //Place the arrow

lcd.write(byte(2));

//----------------------------------------------------------------------------------------------------------------------

// MENU OPTION SIX

//----------------------------------------------------------------------------------------------------------------------

void skyControl(){

//Static objects

lcd.setCursor(4,0);

lcd.print("Sky Control:");

//----------------------------------------

// page controls

//----------------------------------------

last_sel=current_sel; //Save last state of select button

if (last_sel== LOW && joyButtonPushed==2){ //Down

if(subpage_counter ==1 && relay6_state==HIGH || subpage_counter ==2 &&


relay6_state==LOW){ // subpage counter never higher than 2(total of items)
subpage_counter=3; //subcounter to move beetwen submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==1 && relay6_state==LOW){ // subpage counter never


higher than 2(total of items)

subpage_counter =2; //subcounter to move beetwen submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else{ //If subpage higher than 2 (total of items) return to first item

subpage_counter=1;

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(3);

else if (last_sel== LOW && joyButtonPushed==1){ //Up

if(subpage_counter ==1 && relay6_state==HIGH || subpage_counter ==1 &&


relay6_state==LOW){ // subpage counter never higher than 2(total of items)

subpage_counter=3; //subcounter to move beetwen submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==2){ //If subpage higher than 2 (total of items)


return to first item
subpage_counter=1;

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==3 && relay6_state==LOW){ // subpage counter never


higher than 2(total of items)

subpage_counter =2; //subcounter to move beetwen submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==3 && relay6_state==HIGH){ // subpage counter never


higher than 2(total of items)

subpage_counter =1; //subcounter to move beetwen submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(3);

// Sub menu counter control

last_sel=current_sel; //Save last state of select button

if (last_sel== LOW && joyButtonPushed==5){ //select button pressed

if(subpage_counter ==0){ // subpage counter never higher than 4 (total of items)

subpage_counter =1; //subcounter to move between submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char


}

else if(subpage_counter ==1 && relay6_state==HIGH || subpage_counter ==2){ //


subpage counter never higher than 4 (total of items)

subpage_counter =3; //subcounter to move between submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==1 && relay6_state==LOW){ // subpage counter never


higher than 4 (total of items)

subpage_counter =2; //subcounter to move between submenu

lcd.setCursor(15,3);

lcd.write(byte(1)); //Return custom char

else if(subpage_counter ==3){ //If subpage higher than 2 (total of items)


return to first item

subpage_counter=0;

lcd.setCursor(14,3);

lcd.print(" ");

lcd.setCursor(15,3);

lcd.print(" ");

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(7);

//----------------------------------------

// item control 1

//----------------------------------------
//First item control(subpage_counter =1) Sky Power

if(subpage_counter==1){

lcd.setCursor(14,3);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(4,2);

lcd.print(" ");

lcd.setCursor(7,1);

lcd.write(byte(2));

if (last_sel== LOW && joyButtonPushed==3){ //Right, Sky on

relay6_state=LOW;

subpage2_counter =1;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(last_sel== LOW && joyButtonPushed==4){//Left, Sky of

relay6_state=HIGH;

subpage2_counter =0;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(relay6_state==HIGH){

lcd.setCursor(8,1);
lcd.print("OFF");

SkyMenu();

else if(relay6_state==LOW){

lcd.setCursor(8,1);

lcd.print("ON ");

SkyMenu();

//----------------------------------------

// item control 2

//----------------------------------------

//Second item control(subpage_counter =2) Sky Setting

if(subpage_counter==2 && relay6_state==LOW){

lcd.setCursor(7,1);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(14,3);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(4,2);

lcd.write(byte(2));

if (last_sel== LOW && joyButtonPushed==3){ //Right, Sky on

if(subpage2_counter <5){

subpage2_counter ++;
}

else if(subpage2_counter ==5){

subpage2_counter =1;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

if(last_sel== LOW && joyButtonPushed==4){//Left, Sky of

if(subpage2_counter >1){

subpage2_counter --;

else if(subpage2_counter ==1){

subpage2_counter =5;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(6);

last_sel=current_sel;

//----------------------------------------

// BACK controls

//----------------------------------------

//Second item control (subpage_counter=2) back

if(subpage_counter==3){
lcd.setCursor(7,1);

lcd.print(" "); //Delete last arrow position

lcd.setCursor(4,2);

lcd.print(" ");

lcd.setCursor(14,3); //Place the arrow

lcd.write(byte(2));

//=============================================================================
==============================================

// NIGHT/DAY FUNCTIONALITY

//=============================================================================
==============================================

void clearSkyMode(){

//--------------------------------

// SOUND

//--------------------------------

//Sky Of

if(digitalRead(buusyPin) !=1 && subpage2_counter ==0 && subpage_counter ==0){

if(SkyState !=0){

SkyState = 0;

//Morning

//Serial.println(digitalRead(buusyPin));
if(digitalRead(buusyPin) !=0 && subpage2_counter ==1 && subpage_counter ==0){

if(SkyState !=1){

SkyState = 1;

myDFPlayer.volume (15);

myDFPlayer.play(10);

buusyPin ==0;

//Noon

// Serial.println(digitalRead(buusyPin));

if(digitalRead(buusyPin) !=0 && subpage2_counter ==2 && subpage_counter ==0){

if(SkyState !=2){

SkyState = 2;

myDFPlayer.volume (15);

myDFPlayer.play(11);

buusyPin ==0;

//Evening

//Serial.println(digitalRead(buusyPin));

if(digitalRead(buusyPin) !=0 && subpage2_counter ==3 && subpage_counter ==0){

if(SkyState !=3){

SkyState = 3;

myDFPlayer.volume (17);
myDFPlayer.play(12);

buusyPin ==0;

//Night

// Serial.println(digitalRead(buusyPin));

if(digitalRead(buusyPin) !=0 && subpage2_counter ==4 && subpage_counter ==0){

if(SkyState !=4){

SkyState = 4;

myDFPlayer.volume (18);

myDFPlayer.play(13);

buusyPin ==0;

//--------------------------------

// LIGHTS

//--------------------------------

if(StormLEDPos != StormLEDSet){

if(StormLEDPos < StormLEDSet){

StormLEDPos++;

analogWrite(StormLED,StormLEDPos);

else if(StormLEDPos > StormLEDSet){

StormLEDPos--;

analogWrite(StormLED,StormLEDPos);

}
}

if(StarsLEDPos != StarsLEDSet){

if(StarsLEDPos < StarsLEDSet){

StarsLEDPos++;

analogWrite(StarsLED,StarsLEDPos);

else if(StarsLEDPos > StarsLEDSet){

StarsLEDPos--;

analogWrite(StarsLED,StarsLEDPos);

if(FishLED1Pos != FishLED1Set){

if(FishLED1Pos < FishLED1Set){

FishLED1Pos++;

analogWrite(Fish1LED,FishLED1Pos);

else if(FishLED1Pos > FishLED1Set){

FishLED1Pos--;

analogWrite(Fish1LED,FishLED1Pos);

if(FishLED2Pos != FishLED2Set){

if(FishLED2Pos < FishLED2Set){

FishLED2Pos++;

analogWrite(Fish2LED,FishLED2Pos);
}

else if(FishLED2Pos > FishLED2Set){

FishLED2Pos--;

analogWrite(Fish2LED,FishLED2Pos);

if(SkyL1LEDPos != SkyL1LEDSet){

if(SkyL1LEDPos < SkyL1LEDSet){

SkyL1LEDPos++;

analogWrite(SkyL1LED,SkyL1LEDPos);

else if(SkyL1LEDPos > SkyL1LEDSet){

SkyL1LEDPos--;

analogWrite(SkyL1LED,SkyL1LEDPos);

if(SkyL2LEDPos != SkyL2LEDSet){

if(SkyL2LEDPos < SkyL2LEDSet){

SkyL2LEDPos++;

analogWrite(SkyL2LED,SkyL2LEDPos);

else if(SkyL2LEDPos > SkyL2LEDSet){

SkyL2LEDPos--;

analogWrite(SkyL2LED,SkyL2LEDPos);

}
}

if(SkyL3LEDPos != SkyL3LEDSet){

if(SkyL3LEDPos < SkyL3LEDSet){

SkyL3LEDPos++;

analogWrite(SkyL3LED,SkyL3LEDPos);

else if(SkyL3LEDPos > SkyL3LEDSet){

SkyL3LEDPos--;

analogWrite(SkyL3LED,SkyL3LEDPos);

if(SkyL4LEDPos != SkyL4LEDSet){

if(SkyL4LEDPos < SkyL4LEDSet){

SkyL4LEDPos++;

analogWrite(SkyL4LED,SkyL4LEDPos);

else if(SkyL4LEDPos > SkyL4LEDSet){

SkyL4LEDPos--;

analogWrite(SkyL4LED,SkyL4LEDPos);

//----------------------------------------------------------------------------------------------------------------------

// CLOUDS/LIGHTNING FUNCTIONALITY

//----------------------------------------------------------------------------------------------------------------------
void cloudySkyMode(){

if(SkyState !=5){

SkyState = 5;

if(StarsLEDPos != StarsLEDSet){

if(StarsLEDPos < StarsLEDSet){

StarsLEDPos++;

analogWrite(StarsLED,StarsLEDPos);

else if(StarsLEDPos > StarsLEDSet){

StarsLEDPos--;

analogWrite(StarsLED,StarsLEDPos);

if(FishLED1Pos != FishLED1Set){

if(FishLED1Pos < FishLED1Set){

FishLED1Pos++;

analogWrite(Fish1LED,FishLED1Pos);

else if(FishLED1Pos > FishLED1Set){

FishLED1Pos--;

analogWrite(Fish1LED,FishLED1Pos);

if(FishLED2Pos != FishLED2Set){
if(FishLED2Pos < FishLED2Set){

FishLED2Pos++;

analogWrite(Fish2LED,FishLED2Pos);

else if(FishLED2Pos > FishLED2Set){

FishLED2Pos--;

analogWrite(Fish2LED,FishLED2Pos);

//--------------------------------

// LIGHTNING

//--------------------------------

if(StormLEDPos != StormLEDSet){

if(StormLEDPos < StormLEDSet){

StormLEDPos++;

analogWrite(StormLED,StormLEDPos);

else if(StormLEDPos > StormLEDSet){

StormLEDPos--;

analogWrite(StormLED,StormLEDPos);

//--------------------------------

// CLOUDS

//--------------------------------
unsigned long currentCloudMillis = millis(); //call current millis

if (currentCloudMillis - previousCloudMillis > CloudInterval) { //If interval is reached :

previousCloudMillis = currentCloudMillis; //replace previous millis by current millis


as new start point

CloudreadTime++; //do something

Serial.println(CloudreadTime);

if(SkyL1LEDPos == CloudBrightness && CloudreadTime == 1){

if(CloudBrightness >= CloudBrightnessMax){

CloudBrightness = CloudBrightnessMin;

else if(CloudBrightness <= CloudBrightnessMin){

CloudBrightness = CloudBrightnessMax;

CloudreadTime = 0;

//----------Cloud 1------------

else if (SkyL1LEDPos != CloudBrightness){

if(SkyL1LEDPos < CloudBrightness){

SkyL1LEDPos += StormSpeed;

analogWrite(SkyL1LED,SkyL1LEDPos);

CloudBrightness = CloudBrightnessMax;

}
else if(SkyL1LEDPos > CloudBrightness){

SkyL1LEDPos -= StormSpeed;

analogWrite(SkyL1LED,SkyL1LEDPos);

CloudBrightness = CloudBrightnessMin;

//----------Cloud 2------------

if (SkyL2LEDPos != CloudBrightness){

if(SkyL2LEDPos < CloudBrightness){

SkyL2LEDPos += StormSpeed +1;

analogWrite(SkyL2LED,SkyL2LEDPos);

else if(SkyL2LEDPos > CloudBrightness){

SkyL2LEDPos -= StormSpeed +1;

analogWrite(SkyL2LED,SkyL2LEDPos);

//----------Cloud 3------------

if (SkyL3LEDPos != CloudBrightness){

if(SkyL3LEDPos < CloudBrightness){

SkyL3LEDPos += StormSpeed +2;

analogWrite(SkyL3LED,SkyL3LEDPos);

else if(SkyL3LEDPos > CloudBrightness){

SkyL3LEDPos -= StormSpeed+2;
analogWrite(SkyL3LED,SkyL3LEDPos);

//----------Cloud 4------------

if (SkyL4LEDPos != CloudBrightness){

if(SkyL4LEDPos < CloudBrightness){

SkyL4LEDPos += StormSpeed +1;

analogWrite(SkyL4LED,SkyL4LEDPos);

else if(SkyL4LEDPos > CloudBrightness){

SkyL4LEDPos -= StormSpeed +1;

analogWrite(SkyL4LED,SkyL4LEDPos);

//--------------------------------

// SOUND

//--------------------------------

//Serial.println(digitalRead(buusyPin));

if(digitalRead(buusyPin) !=0 && subpage_counter ==0){

myDFPlayer.volume (25);

myDFPlayer.play(14);

//isPlaying = true;

//Serial.println(digitalRead(buusyPin));

//while (bsy == 0); // zero when sound active


}

sensorValue = analogRead(sensorPin);

//Serial.println(sensorValue);

//Serial.println(" ");

if (sensorValue >= 650) {

StormLEDPos=255;

analogWrite(StormLED,StormLEDPos);

if (sensorValue <= 550) {

StormLEDPos=0;

analogWrite(StormLED,StormLEDPos);

bsy = digitalRead(buusyPin);

//=============================================================================
==============================================

// AUTO GO BACK TO HOMEPAGE

//=============================================================================
==============================================

void autoGoBackToHomePage(){

unsigned long currentMillis = millis(); //call current millis

if (currentMillis - previousMillis > interval) { //If interval is reached :

lcd.clear();

previousMillis = currentMillis; //replace previous millis by current millis as new start


point

subpage_counter=0;
page_counter=1; //Go back to home page

joyButtonPushed = 0; pushedTime = 0;

if (joyRead != 0){ // Reset millis counter If any button is pressed

previousMillis = currentMillis;

//=============================================================================
==============================================

// NAVIGATION FUNCTIONALITY

//=============================================================================
==============================================

void navigationFunctioner(){

//----Page counter function to move pages----//

if(subpage_counter==0){ // right/left buttons enabled if subcounters are 0,Disabled if


1,2..etc to work on submenus

//Page Right

if (last_sel== LOW && joyButtonPushed==3){ //Right button pressed

lcd.clear(); //Clear lcd if page is changed to print new one

if(page_counter <pages){ //Page counter never higher than 3(total of pages)

page_counter= page_counter +1; //Page up

else{
page_counter= 2; //If higher than 3 (last page) stay on page 3(change to 1 if you
want to rotate)

current_sel = HIGH;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(5);

last_sel = current_sel; //Save up button last state

//Page Left

if (last_sel== LOW && joyButtonPushed==4){//Left button pressed

lcd.clear(); //Clear lcd if page is changed to print new one

if(page_counter >2){ //Page counter never lower than 1 (total of pages)

page_counter= page_counter -1; //Page down

else{

page_counter= pages; //If lower than 1(first page) stay on page 1(change to 3 if
you want to rotate)

current_sel = HIGH;

joyButtonPushed = 0; pushedTime = 0; myDFPlayer.play(5);

}
last_sel = current_sel; //Save down button last state

//Show sub counters status,delete or comment if not needed

if(page_counter !=1){

lcd.setCursor(0,0);

lcd.print(page_counter-1);

lcd.setCursor(1,0);

lcd.print(".");

if(page_counter >9){

lcd.setCursor(0,0);

lcd.print(page_counter-1);

lcd.setCursor(2,0);

lcd.print(".");

//=============================================================================
==============================================

// BUTTON DEBOUNCER

//=============================================================================
==============================================

boolean debounce(boolean last, int pin){

boolean current = digitalRead(pin);


if (last != current){

delay(5);

current = digitalRead(pin);

return current;

//=============================================================================
==============================================

// JOYSTICK CONTROLLER

//=============================================================================
==============================================

int readJoystick(){

int x = analogRead(xPin);

int y = analogRead(yPin);

int k = digitalRead(kPin);

if(x>600){joyRead=1; //x+

}else if(x<100){joyRead=2; //x-

}else if(y>600){joyRead=3; //y+

}else if(y<100){joyRead=4; //y-

}else if(!k){joyRead=5;

}else{joyRead=0;}

if (joyRead != lastJoyPos){lastDebounceTime = millis();}

if(((millis() - lastDebounceTime) > debounceDelay)&&(joyRead!=joyPos)){


joyPos=joyRead;

if (joyPos != lastJoyPos && pushedTime > 3){

joyButtonPushed =joyPos;

if (joyRead != 0){

pushedTime++;

if (pushedTime >= 50){

pushedTime = 0;

lastJoyPos=joyRead;

current_sel = debounce(last_sel, sel); //Debounce for Select button

//=============================================================================
==============================================

// RELAY STATES

//=============================================================================
==============================================

void relayStates(){

//------------Change Relay states---------//


if(relay1_state==HIGH && RelayPin1 != HIGH){

digitalWrite(RelayPin1,HIGH);

if(relay1_state==LOW && RelayPin1 != LOW){

digitalWrite(RelayPin1,LOW);

if(relay2_state==HIGH && RelayPin2 != HIGH){

digitalWrite(RelayPin2,HIGH);

if(relay2_state==LOW && RelayPin2 != LOW){

digitalWrite(RelayPin2,LOW);

if(relay3_state==HIGH && RelayPin3 != HIGH){

digitalWrite(RelayPin3,HIGH);

if(relay3_state==LOW && RelayPin3 != LOW){

digitalWrite(RelayPin3,LOW);

if(relay4_state==HIGH && RelayPin4 != HIGH){

digitalWrite(RelayPin4,HIGH);

if(relay4_state==LOW && RelayPin4 != LOW){

digitalWrite(RelayPin4,LOW);

if(relay5_state==HIGH && RelayPin5 != HIGH){


digitalWrite(RelayPin5,HIGH);

if(relay5_state==LOW && RelayPin5 != LOW){

digitalWrite(RelayPin5,LOW);

if(relay6_state==HIGH && RelayPin6 != HIGH){

digitalWrite(RelayPin6,HIGH);

if(relay6_state==LOW && RelayPin6 != LOW){

digitalWrite(RelayPin6,LOW);

if(relay7_state==HIGH && RelayPin7 != HIGH){

digitalWrite(RelayPin7,HIGH);

if(relay7_state==LOW && RelayPin7 != LOW){

digitalWrite(RelayPin7,LOW);

if(relay8_state==HIGH && RelayPin8 != HIGH){

digitalWrite(RelayPin8,HIGH);

if(relay8_state==LOW && RelayPin8 != LOW){

digitalWrite(RelayPin8,LOW);

//----------------------------------------------------------------------------------------------------------------------
// turn of all relays

//----------------------------------------------------------------------------------------------------------------------

void resetallrelays(){

digitalWrite(RelayPin1, HIGH);

digitalWrite(RelayPin2, HIGH);

digitalWrite(RelayPin3, HIGH);

digitalWrite(RelayPin4, HIGH);

digitalWrite(RelayPin5, HIGH);

digitalWrite(RelayPin6, HIGH);

digitalWrite(RelayPin7, HIGH);

digitalWrite(RelayPin8, HIGH);

//=============================================================================
==============================================

// BLUETOOTH

//=============================================================================
==============================================

void bluetooth(){

if(Serial1.available() > 0){ // Checks whether data is comming from the serial port

Serial.println("you have a connection");

dataFromBT = Serial1.read(); // Reads the data from the serial port

State = dataFromBT;

// Print on the Monitor latest command recieved


}

// Set relay states from bluetooth buttons

if (State == '1') {

// Turn of FAN

page_counter=2;

relay8_state=HIGH;

if(FanState !=0){

FanState = 0;

page_counter=1;

State = 0;

} else if ( State == '2') {

// Turn on FAN

page_counter=2;

relay8_state=LOW;

if(FanState !=1){

FanState = 1;

page_counter=1;

State = 0;

if (State == '3') {

// Turn of Fog

page_counter=3;
relay2_state=HIGH;

if(FogState !=0){

FogState = 0;

page_counter=1;

State = 0;

} else if ( State == '4') {

// Turn on Fog

page_counter=3;

relay2_state=LOW;

if(FogState !=1){

FogState = 1;

page_counter=1;

State = 0;

if (State == '5') {

// Turn of RAIN

page_counter=4;

relay3_state=HIGH;

if(RainState !=0){

RainState = 0;

page_counter=1;
State = 0;

} else if ( State == '6') {

// Turn on RAIN

page_counter=4;

relay3_state=LOW;

if(RainState !=1){

RainState = 1;

page_counter=1;

State = 0;

if (State == '7') {

// Turn of SUN

page_counter=5;

relay4_state=HIGH;

if(SunState !=0){

SunState = 0;

page_counter=1;

State = 0;

} else if ( State == '8') {

// Turn on SUN

page_counter=5;

relay4_state=LOW;
if(SunState !=1){

SunState = 1;

page_counter=1;

State = 0;

if (State == '9') {

// Turn of BASK

page_counter=6;

relay5_state=HIGH;

if(BaskState !=0){

BaskState = 0;

page_counter=1;

State = 0;

} else if ( State == 'a') {

// Turn on BASK

page_counter=6;

relay5_state=LOW;

if(BaskState !=1){

BaskState = 1;

page_counter=1;

State = 0;
}

if (State == 'o') {

// Turn of SKY

myDFPlayer.stop();

page_counter=7;

relay6_state=HIGH;

subpage2_counter =0;

subpage_counter =0;

SkyMenu();

lcd.clear();

page_counter=1;

State = 0;

clearSkyMode();

} else if ( State == 'm') {

// Turn SKY to MORNING

myDFPlayer.stop();

page_counter=7;

relay6_state=LOW;

subpage2_counter =1;

subpage_counter =0;

SkyMenu();

lcd.clear();

page_counter=1;

State = 0;

clearSkyMode();
}else if ( State == 'd') {

// Turn SKY to NOON

myDFPlayer.stop();

page_counter=7;

relay6_state=LOW;

subpage2_counter =2;

subpage_counter =0;

SkyMenu();

lcd.clear();

page_counter=1;

State = 0;

clearSkyMode();

}else if ( State == 'e') {

// Turn SKY to EVENING

myDFPlayer.stop();

page_counter=7;

relay6_state=LOW;

subpage2_counter =3;

subpage_counter =0;

SkyMenu();

lcd.clear();

page_counter=1;

State = 0;

clearSkyMode();

}else if ( State == 'n') {


// Turn SKY to NIGHT

myDFPlayer.stop();

page_counter=7;

relay6_state=LOW;

subpage2_counter =4;

subpage_counter =0;

SkyMenu();

lcd.clear();

page_counter=1;

State = 0;

clearSkyMode();

}else if ( State == 's') {

// Turn SKY to STORM

myDFPlayer.stop();

page_counter=7;

relay6_state=LOW;

subpage2_counter =5;

subpage_counter =0;

SkyMenu();

lcd.clear();

page_counter=1;

State = 0;

cloudySkyMode();

}
}

//=============================================================================
==============================================

// DEBUG DFPLAYER

//=============================================================================
==============================================

void printDetail(uint8_t type, int value){

switch (type) {

case TimeOut:

// Serial.println(F("Time Out!"));

break;

case WrongStack:

// Serial.println(F("Stack Wrong!"));

break;

case DFPlayerCardInserted:

// Serial.println(F("Card Inserted!"));

break;

case DFPlayerCardRemoved:

// Serial.println(F("Card Removed!"));

break;

case DFPlayerCardOnline:

// Serial.println(F("Card Online!"));

break;

case DFPlayerPlayFinished:

// Serial.print(F("Number:"));
// Serial.print(value);

// Serial.println(F(" Play Finished!"));

break;

case DFPlayerError:

// Serial.print(F("DFPlayerError:"));

switch (value) {

case Busy:

// Serial.println(F("Card not found"));

break;

case Sleeping:

// Serial.println(F("Sleeping"));

break;

case SerialWrongStack:

// Serial.println(F("Get Wrong Stack"));

break;

case CheckSumNotMatch:

// Serial.println(F("Check Sum Not Match"));

break;

case FileIndexOut:

// Serial.println(F("File Index Out of Bound"));

break;

case FileMismatch:

// Serial.println(F("Cannot Find File"));

break;

case Advertise:
// Serial.println(F("In Advertise"));

break;

default:

break;

break;

default:

break;

You might also like