Hi there,
Thanks for taking the time to take a look here. I've been building a project on my arduino and scrolling trough topic after topic here. I've learned so much and hope to continue doing that but I've hit a bit of a wall. The global outline and current state of the project is this:
An Arduino Mega 2560 with 6 sensors (temp, humidity and pressure), 1.8 TFT Screen, Joystick, HC-05 bluetooth unit, RTC DS1307, an 8 relay module and an ESP8266-01 for the WiFi.
The project is around 2000 lines of code now and I have control of the relays with either the joystick or a bluetooth app made with MIT ap inventor. On the TFT or on the app I get all the sensor readings and relay states. So far things are great ![]()
I have to say I managed all this mostly by copy-pasting code from examples or work of others. My skills at creating code are beginner at best.
I can get the thing connected to my WiFi but I'm struggling to get data onto a server. Ideally I would store data on a subdomain, be able to view the data in graphs and have connectivity over the internet the same way I have over the bluetooth connection, with my app. Or a new app.
At the moment I have 2 ESP8266-01 modules, 1 as it came:
the other with flashed firmware.
I have a levelconverter,
ESP-01 adapter (https://cdn.bitsandparts.nl/partpics/0001ESP01ADAPTER_hi.jpg)
ESP-01 USB programming adapter (https://ls.codetech.nl/shops/346407/files/420565015/otronic-esp-01-programmeer-adapter-usb-to-esp8266.jpg)
ESP-01 breadboard adapter
ESP-32 .... I got this one before I really understood much about it, I just saw it used in lots of other projects.
What I think I understand is the ESP-01 and ESP-32 can control a lot of things just by themselves, but I don't know if I can connect all the sensors and relays to them. In the future I will also need 4 PWN outputs. Therefore my reasoning is I need the Arduino Mega 2560.
The parts where everything starts getting blurry is that the ESP units can be programmed with their own sketches, and when I'm finding examples and try to use code I often run into libraries I can't find or use when I try to upload them to the mega.
I've set up a database with php files on a free subdomain but I can't get the mega to send data. The http library keeps giving me errors. Posting code on request but the errors aren't the focus of this question.
TLDR: I would like to get my project onto my WiFi and be able to monitor status and control relays from outside my home. Should I use the Arduino Mega to do all the work or should I program the ESP-01 with it's own sketch to work in tandem with the mega?
Connecting the ESP-32 and the mega would have advantages (I think) but that seems even more complicated.
I know that I have a lot to learn but any help or nudges in the right direction would be greatly appreciated!
```cpp
//****************************************************************************************************************************//
// Main code from: BANTAM.EARTH //
// Paludarium Arduino Code //
// Used with permission by Arne 2023 https://bantam.earth/ //
//****************************************************************************************************************************//
//---------------------------------------------------
// 1. Libraries
//---------------------------------------------------
#include "Arduino.h"
#include <Wire.h>
#include <DHT.h>
#include <TFT.h>
#include <SPI.h>
#include <math.h>
#include <Adafruit_SHT31.h>
#include <WiFiEsp.h> // Use with factory ESP-01, set to 9600 baud
#include <WiFiEspClient.h>
#include <WiFiEspServer.h>
#include <WiFiEspUdp.h>
//#include <WiFiEspAT.h> // Used with flashed ESP-01 set to 115200 baud
#include <ArduinoHttpClient.h>
const char* ssid = "Space Raiders"; // The SSID (name) of the Wi-Fi network you want to connect to
const char* password = "12mjb3a4n5j"; // The password of the Wi-Fi network
WiFiEspServer server(80);
int sleeptime = 10;
String sensorName = "Averages";
//----------------------------------------------------
// 2. Pins
//----------------------------------------------------
#define xPin A5
#define yPin A4
#define kPin 12
#define DHT22_PIN 3
#define DHT222_PIN 2
#define DHTTYPE DHT22
#define DHT2TYPE DHT22
DHT dht(DHT22_PIN, DHTTYPE);
DHT dht2(DHT222_PIN, DHT2TYPE);
//SHT31 sht = SHT31();
Adafruit_SHT31 sht31 = Adafruit_SHT31();
#define CS 10
#define DC 9
#define RESET 8
TFT myScreen = TFT(CS, DC, RESET);
#define BLACK 0x0000
#define WHITE 0xFFFF
#define StormLED 22
#define StarsLED 24
#define Fish1LED 26
#define Fish2LED 28
#define SkyL1LED 30
#define SkyL2LED 32
#define SkyL3LED 34
#define SkyL4LED 36
#define RelayPin1 35
#define RelayPin2 37
#define RelayPin3 39
#define RelayPin4 41
#define RelayPin5 43
#define RelayPin6 45
#define RelayPin7 47
#define RelayPin8 49
#define BLACK 0x0000
#define WHITE 0xFFFF
//----------------------------------------------------
// 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 = A0;
int Thermistor2Pin = A1;
int Vo, Vo2;
float R1 = 10000;
float logR2, logR3, R2, R3, WaterTemp1, WaterTemp2, AirTemp1, AirTemp2, Humidity1, Humidity2, WaterTempA, AirTempA, HumidityA;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
int tCount1;
bool refresh; //lcd clear On/Off
//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 = 5; //Up/Yes button
int sel = 5; //Select button
int down = 5; //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 up-arrow char
static const unsigned char PROGMEM top[]{
B00011000,
B00011000,
B00111100,
B01111110,
B11111111,
B00011000,
B00011000,
B00011000
};
//Custom down-arrow char
static const unsigned char PROGMEM bottom[]{
B00011000,
B00011000,
B00011000,
B11111111,
B01111110,
B00111100,
B00011000,
B00011000
};
//===========================================================================================================================
// SETUP
//===========================================================================================================================
void setup() {
Serial.begin(9600); // connect to the serial port
Serial1.begin(9600); // bluetooth serial
//WiFi ESP8266 setup
Serial2.begin(9600); // Start the Serial communication to send messages to the computer
delay(50);
setupWiFi();
server.begin();
//----------------------------------------------------
// 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();
myScreen.begin();
myScreen.background(0, 0, 0); // finish with backlight on
myScreen.setCursor(0, 1);
myScreen.print("Arnes PaludariumController");
myScreen.setCursor(0, 10);
myScreen.print("v1.58");
delay(1000);
myScreen.fillScreen(BLACK);
Wire.begin();
dht.begin();
dht2.begin();
//sht31.begin(0x44);
if (!sht31.begin(0x44)) { // Set to 0x45 for alternate I2C address
Serial.println("Couldn't find SHT31");
while (1) delay(1);
}
readTime = 0;
}
//===========================================================================================================================
// LOOP
//===========================================================================================================================
void loop() {
if (millis() > readTime + 2000) { updatestatistics(); }
bluetooth();
readJoystick();
navigationFunctioner();
myMenu();
relayStates();
if (subpage2_counter < 5) {
clearSkyMode();
} else {
cloudySkyMode();
}
if (page_counter != 1) { autoGoBackToHomePage(); }
if (WiFi.status() != WL_CONNECTED) {
//Serial.print(millis());
delay(10000);
//Serial.println("Reconnecting to WIFI network");
WiFi.disconnect();
WiFi.begin(ssid, password);
}
/* Prepare URL */
String url = "http://arnespaludariumcontroller.scienceontheweb.net/insert_data.php?key=APC2023&NAME=" + sensorName + "&TAA=" + AirTempA + "&TWA=" + WaterTempA + "&HA=" + HumidityA;
Serial.println(url);
/* Start Post */
HttpClient http(); // ERROR with library
if ((WiFi.status() == WL_CONNECTED)) // wait for WiFi connection
{
Serial.print("[HTTP] begin...\n");
http.begin(url); //HTTP send // start of errors, wrong library?
//Get Answer (Not mandatory)
int httpCode = http.GET(); //Start connection and get HTTP respond
// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
// file found at server
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
//End of -Get Answer- (Not Mandatory)
/* End Post */
http.end();
}
}
//===========================================================================================================================
// CHECK SYSTEM STATS
//===========================================================================================================================
void updatestatistics() {
readTime = millis();
//read air temperature & humidity
int chk = dht.read(DHT22_PIN);
AirTemp1 = dht.readTemperature();
//read air temperature2 & humidity2 +++ DHT22 SENSOR +++
//int chk2 = dht2.read(DHT222_PIN);
//AirTemp2 = dht2.readTemperature();
AirTemp2 = sht31.readTemperature(); //+++ SHT31 SENSOR +++
//Average air temp
AirTempA = ((AirTemp1 + AirTemp2) / 2);
//read water temperature1
Vo = analogRead(ThermistorPin);
R2 = R1 * (1023.0 / (float)Vo - 1.0);
logR2 = log(R2);
WaterTemp1 = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2));
WaterTemp1 = WaterTemp1 - 273.15;
//read water temperature2
Vo2 = analogRead(Thermistor2Pin);
R3 = R1 * (1023.0 / (float)Vo2 - 1.0);
logR3 = log(R3);
WaterTemp2 = (1.0 / (c1 + c2 * logR3 + c3 * logR3 * logR3 * logR3));
WaterTemp2 = WaterTemp2 - 273.15;
//WaterTemp Average
WaterTempA = (WaterTemp1 + WaterTemp2) / 2;
//Humidity average
Humidity1 = dht.readHumidity();
Humidity2 = sht31.readHumidity(); // +++ SHT31 SENSOR +++
//Humidity2 = dht2.readHumidity(); // +++ DHT22 SENSOR +++
HumidityA = (Humidity1 + Humidity2) / 2;
//Serial1.print("Stats:");
//Serial1.print("|");
Serial1.print(AirTempA, 1); //1
Serial1.print(" °C");
Serial1.print("|");
Serial1.print(HumidityA, 1); //2
Serial1.print(" %");
Serial1.print("|");
Serial1.print(WaterTempA, 1); //3
Serial1.print(" °C");
Serial1.print("|");
Serial1.print(AirTemp1, 1); //4
Serial1.print(" °C");
Serial1.print("|");
Serial1.print(AirTemp2, 1); //5
Serial1.print(" °C");
Serial1.print("|");
Serial1.print(Humidity1, 1); //6
Serial1.print(" %");
Serial1.print("|");
Serial1.print(Humidity2); //7 No decimal with SHT31 sensor?
Serial1.print(" %");
Serial1.print("|");
Serial1.print(WaterTemp1, 1); //8
Serial1.print(" °C");
Serial1.print("|");
Serial1.print(WaterTemp2, 1); //9
Serial1.print(" °C");
Serial1.print("|");
/* if(subpage2_counter == 0){ //10
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("|");
Serial1.print((int)FanMode); //11
Serial1.print("|");
Serial1.print((int)FogMode); //12
Serial1.print("|");
Serial1.print((int)RainMode); //13
Serial1.print("|");
Serial1.print((int)SunMode); //14
Serial1.print("|");
Serial1.print((int)BaskMode); //15
Serial1.print("|");
Serial1.print((int)SkyMode); //16
//Serial1.print("SettsEnd");
Serial1.println();
if (page_counter == 1) {
writestatistics();
}
}
//===========================================================================================================================
// WRITE SYSTEM STATS
//===========================================================================================================================
void writestatistics() {
myScreen.setTextColor(WHITE, BLACK);
//write air temperature to TFT
myScreen.setCursor(0, 30);
myScreen.print("Temp: A1:");
myScreen.print(AirTemp1, 1);
myScreen.print("\367");
myScreen.print(" A2:");
myScreen.print(AirTemp2, 1);
myScreen.print("\367");
myScreen.println();
myScreen.print(" Air-average:");
myScreen.print(AirTempA, 1);
myScreen.print("\367");
myScreen.println();
// write water temperature1 to TFT
myScreen.print(" W1:");
myScreen.print(WaterTemp1, 1);
myScreen.print("\367");
// write water temperature2 to TFT
myScreen.print(" W2:");
myScreen.print(WaterTemp2, 1);
myScreen.print("\367");
myScreen.println();
// write water temperature average to TFT
myScreen.print(" Water-average:");
myScreen.print(WaterTempA, 1);
myScreen.print("\367");
// write humidity to TFT
myScreen.setCursor(0, 70);
myScreen.print("Humidity1 ");
myScreen.print(dht.readHumidity(), 1);
myScreen.print("%");
// write humidity2 to TFT
myScreen.println();
myScreen.print("Humidity2 ");
//myScreen.print(dht2.readHumidity(), 1);
myScreen.print(sht31.readHumidity(), 1);
myScreen.print("%");
// write averagehumidity to TFT
myScreen.println();
myScreen.print("Average: ");
myScreen.print(HumidityA, 1);
myScreen.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:
{
TurnOffSky();
}
break;
}
}
//----------------------------------------------------------------------------------------------------------------------
// SUB MENU SETTINGS
//----------------------------------------------------------------------------------------------------------------------
void morning() {
myScreen.setCursor(10, 10);
myScreen.print(" Morning");
StormLEDSet = 0;
StarsLEDSet = 0;
FishLED1Set = 15;
FishLED2Set = 0;
SkyL1LEDSet = 65;
SkyL2LEDSet = 65;
SkyL3LEDSet = 65;
SkyL4LEDSet = 65;
}
void noon() {
myScreen.setCursor(10, 10);
myScreen.print(" Noon ");
StormLEDSet = 0;
StarsLEDSet = 0;
FishLED1Set = 65;
FishLED2Set = 0;
SkyL1LEDSet = 200;
SkyL2LEDSet = 200;
SkyL3LEDSet = 200;
SkyL4LEDSet = 200;
}
void evening() {
myScreen.setCursor(10, 10);
myScreen.print(" Evening");
StormLEDSet = 0;
StarsLEDSet = 0;
FishLED1Set = 25;
FishLED2Set = 1;
SkyL1LEDSet = 25;
SkyL2LEDSet = 25;
SkyL3LEDSet = 25;
SkyL4LEDSet = 25;
}
void night() {
myScreen.setCursor(10, 10);
myScreen.print(" Night ");
StormLEDSet = 2;
StarsLEDSet = 1;
FishLED1Set = 0;
FishLED2Set = 5;
SkyL1LEDSet = 0;
SkyL2LEDSet = 0;
SkyL3LEDSet = 0;
SkyL4LEDSet = 0;
}
void storm() {
myScreen.setCursor(10, 10);
myScreen.print(" Storm ");
StormLEDSet = 0;
StarsLEDSet = 0;
FishLED1Set = 5;
FishLED2Set = 5;
SkyL1LEDSet = 255;
SkyL2LEDSet = 255;
SkyL3LEDSet = 255;
SkyL4LEDSet = 255;
}
void TurnOffSky() {
myScreen.setCursor(10, 10);
myScreen.print(" ");
StormLEDSet = 0;
StarsLEDSet = 0;
FishLED1Set = 0;
SkyL1LEDSet = 0;
SkyL2LEDSet = 0;
SkyL3LEDSet = 0;
SkyL4LEDSet = 0;
}
//----------------------------------------------------------------------------------------------------------------------
// HOME
//----------------------------------------------------------------------------------------------------------------------
void homeScreen() {
}
//----------------------------------------------------------------------------------------------------------------------
// MENU OPTION ONE
//----------------------------------------------------------------------------------------------------------------------
void fanControl() {
//Static objects
myScreen.setCursor(10, 0);
myScreen.print("Fan Control:");
if (relay8_state == HIGH) {
myScreen.setCursor(90, 0);
myScreen.print("OFF");
if (FanState != 0) {
FanState = 0;
}
} else if (relay8_state == LOW) {
myScreen.setCursor(90, 0);
myScreen.print("ON ");
if (FanState != 1) {
FanState = 1;
}
}
//----------------------------------------
// page controls
//----------------------------------------
last_sel = current_sel; //Save last state of select button
if (last_sel == LOW && joyButtonPushed == 2) { //Up or Down LOW && joyButtonPushed==1 ||
if (subpage_counter == 0) { // subpage counter never higher than 2(total of items)
subpage_counter++; //subcounter to move beetwen submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
}
joyButtonPushed = 0;
pushedTime = 0;
}
// Sub menu counter control
if (last_sel == LOW && joyButtonPushed == 5) { //select button pressed
if (subpage_counter == 0) { // subpage counter never higher than 4 (total of items)
subpage_counter++; //subcounter to move between submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
} else if (subpage_counter == 1) { //If subpage higher than 2 (total of items) return to first item
subpage_counter = 0;
myScreen.setCursor(10, 10);
myScreen.print(" ");
}
joyButtonPushed = 0;
pushedTime = 0;
}
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) {
if (last_sel == LOW && joyButtonPushed == 3) { //Right, Fan on
relay8_state = LOW;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
if (last_sel == LOW && joyButtonPushed == 4) { //Left, Fan off
relay8_state = HIGH;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
}
if (subpage_counter == 1 && relay8_state == HIGH) {
myScreen.setCursor(10, 30);
myScreen.print("OFF");
if (FanState != 0) {
FanState = 0;
}
} else if (subpage_counter == 1 && relay8_state == LOW) {
myScreen.setCursor(10, 30);
myScreen.print("ON ");
if (FanState != 1) {
FanState = 1;
}
}
//----------------------------------------
// BACK controls
//----------------------------------------
//Second item control (subpage_counter=2) back
if (subpage_counter == 0) {
myScreen.setCursor(10, 10);
myScreen.print(" "); //Delete last arrow position
}
}
//----------------------------------------------------------------------------------------------------------------------
// MENU OPTION TWO
//----------------------------------------------------------------------------------------------------------------------
void fogControl() {
//Static objects
myScreen.setCursor(10, 0);
myScreen.print("Fog Control:");
if (relay2_state == HIGH) {
myScreen.setCursor(90, 0);
myScreen.print("OFF");
if (FogState != 0) {
FogState = 0;
}
} else if (relay2_state == LOW) {
myScreen.setCursor(90, 0);
myScreen.print("ON ");
if (FogState != 1) {
FogState = 1;
}
}
//----------------------------------------
// page controls
//----------------------------------------
last_sel = current_sel; //Save last state of select button
if (last_sel == LOW && joyButtonPushed == 2) { //Up or Down LOW && joyButtonPushed==1 ||
if (subpage_counter == 0) { // subpage counter never higher than 2(total of items)
subpage_counter++; //subcounter to move beetwen submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
}
joyButtonPushed = 0;
pushedTime = 0;
}
// Sub menu counter control
if (last_sel == LOW && joyButtonPushed == 5) { //select button pressed
if (subpage_counter == 0) { // subpage counter never higher than 4 (total of items)
subpage_counter++; //subcounter to move between submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
} else if (subpage_counter == 1) { //If subpage higher than 2 (total of items) return to first item
subpage_counter = 0;
myScreen.setCursor(10, 10);
myScreen.print(" ");
}
joyButtonPushed = 0;
pushedTime = 0;
}
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) {
if (last_sel == LOW && joyButtonPushed == 3) { //Right, Fog on
relay2_state = LOW;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
if (last_sel == LOW && joyButtonPushed == 4) { //Left, Fog off
relay2_state = HIGH;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
}
if (subpage_counter == 1 && relay2_state == HIGH) {
myScreen.setCursor(10, 30);
myScreen.print("OFF");
if (FogState != 0) {
FogState = 0;
}
} else if (subpage_counter == 1 && relay2_state == LOW) {
myScreen.setCursor(10, 30);
myScreen.print("ON ");
if (FogState != 1) {
FogState = 1;
}
}
//----------------------------------------
// BACK controls
//----------------------------------------
//Second item control (subpage_counter=2) back
if (subpage_counter == 0) {
myScreen.setCursor(10, 10);
myScreen.print(" "); //Delete last arrow position
}
}
//----------------------------------------------------------------------------------------------------------------------
// MENU OPTION THREE
//----------------------------------------------------------------------------------------------------------------------
void rainControl() {
//Static objects
myScreen.setCursor(10, 0);
myScreen.print("Rain Control:");
if (relay3_state == HIGH) {
myScreen.setCursor(90, 0);
myScreen.print("OFF");
if (RainState != 0) {
RainState = 0;
}
} else if (relay3_state == LOW) {
myScreen.setCursor(90, 0);
myScreen.print("ON ");
if (RainState != 1) {
RainState = 1;
}
}
//----------------------------------------
// page controls
//----------------------------------------
last_sel = current_sel; //Save last state of select button
if (last_sel == LOW && joyButtonPushed == 2) { //Up or Down LOW && joyButtonPushed==1 ||
if (subpage_counter == 0) { // subpage counter never higher than 2(total of items)
subpage_counter++; //subcounter to move beetwen submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
}
joyButtonPushed = 0;
pushedTime = 0;
}
// Sub menu counter control
if (last_sel == LOW && joyButtonPushed == 5) { //select button pressed
if (subpage_counter == 0) { // subpage counter never higher than 4 (total of items)
subpage_counter++; //subcounter to move between submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
} else if (subpage_counter == 1) { //If subpage higher than 2 (total of items) return to first item
subpage_counter = 0;
myScreen.setCursor(10, 10);
myScreen.print(" ");
}
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel; //Save last state of select button
//----------------------------------------
// item control 1
//----------------------------------------
//First item control(subpage_counter =1) rain Power
if (subpage_counter == 1) {
if (last_sel == LOW && joyButtonPushed == 3) { //Right, Rain on
relay3_state = LOW;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
if (last_sel == LOW && joyButtonPushed == 4) { //Left, Rain off
relay3_state = HIGH;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
}
if (subpage_counter == 1 && relay3_state == HIGH) {
myScreen.setCursor(10, 30);
myScreen.print("OFF");
if (RainState != 0) {
RainState = 0;
}
} else if (subpage_counter == 1 && relay3_state == LOW) {
myScreen.setCursor(10, 30);
myScreen.print("ON ");
if (RainState != 1) {
RainState = 1;
}
}
//----------------------------------------
// BACK controls
//----------------------------------------
//Second item control (subpage_counter=2) back
if (subpage_counter == 0) {
myScreen.setCursor(10, 10);
myScreen.print(" "); //Delete last arrow position
}
}
//----------------------------------------------------------------------------------------------------------------------
// MENU OPTION FOUR
//----------------------------------------------------------------------------------------------------------------------
void sunControl() {
//Static objects
myScreen.setCursor(10, 0);
myScreen.print("Sun Control:");
if (relay4_state == HIGH) {
myScreen.setCursor(90, 0);
myScreen.print("OFF");
if (SunState != 0) {
SunState = 0;
}
} else if (relay4_state == LOW) {
myScreen.setCursor(90, 0);
myScreen.print("ON ");
if (SunState != 1) {
SunState = 1;
}
}
//----------------------------------------
// page controls
//----------------------------------------
last_sel = current_sel; //Save last state of select button
if (last_sel == LOW && joyButtonPushed == 2) { //Up or Down LOW && joyButtonPushed==1 ||
if (subpage_counter == 0) { // subpage counter never higher than 2(total of items)
subpage_counter++; //subcounter to move beetwen submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
}
joyButtonPushed = 0;
pushedTime = 0;
}
// Sub menu counter control
if (last_sel == LOW && joyButtonPushed == 5) { //select button pressed
if (subpage_counter == 0) { // subpage counter never higher than 4 (total of items)
subpage_counter++; //subcounter to move between submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
} else if (subpage_counter == 1) { //If subpage higher than 2 (total of items) return to first item
subpage_counter = 0;
myScreen.setCursor(10, 10);
myScreen.print(" ");
}
joyButtonPushed = 0;
pushedTime = 0;
}
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) {
if (last_sel == LOW && joyButtonPushed == 3) { //Right, Sun on
relay4_state = LOW;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
if (last_sel == LOW && joyButtonPushed == 4) { //Left, Sun off
relay4_state = HIGH;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
}
if (subpage_counter == 1 && relay4_state == HIGH) {
myScreen.setCursor(10, 30);
myScreen.print("OFF");
if (SunState != 0) {
SunState = 0;
}
} else if (subpage_counter == 1 && relay4_state == LOW) {
myScreen.setCursor(10, 30);
myScreen.print("ON ");
if (SunState != 1) {
SunState = 1;
}
}
//----------------------------------------
// BACK controls
//----------------------------------------
//Second item control (subpage_counter=2) back
if (subpage_counter == 0) {
myScreen.setCursor(10, 10);
myScreen.print(" "); //Delete last arrow position
}
}
//----------------------------------------------------------------------------------------------------------------------
// MENU OPTION FIVE
//----------------------------------------------------------------------------------------------------------------------
void BaskingControl() {
//Static objects
myScreen.setCursor(10, 0);
myScreen.print("Bask Control:");
if (relay5_state == HIGH) {
myScreen.setCursor(90, 0);
myScreen.print("OFF");
if (BaskState != 0) {
BaskState = 0;
}
} else if (relay5_state == LOW) {
myScreen.setCursor(90, 0);
myScreen.print("ON ");
if (BaskState != 1) {
BaskState = 1;
}
}
//----------------------------------------
// page controls
//----------------------------------------
last_sel = current_sel; //Save last state of select button
if (last_sel == LOW && joyButtonPushed == 2) { //Up or Down LOW && joyButtonPushed==1 ||
if (subpage_counter == 0) { // subpage counter never higher than 2(total of items)
subpage_counter++; //subcounter to move beetwen submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
}
joyButtonPushed = 0;
pushedTime = 0;
}
// Sub menu counter control
if (last_sel == LOW && joyButtonPushed == 5) { //select button pressed
if (subpage_counter == 0) { // subpage counter never higher than 4 (total of items)
subpage_counter++; //subcounter to move between submenu
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE); //Return custom char
} else if (subpage_counter == 1) { //If subpage higher than 2 (total of items) return to first item
subpage_counter = 0;
myScreen.setCursor(10, 10);
myScreen.print(" ");
}
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel; //Save last state of select button
//----------------------------------------
// item control 1
//----------------------------------------
//First item control(subpage_counter =1) Bask Power
if (subpage_counter == 1) {
if (last_sel == LOW && joyButtonPushed == 3) { //Right, Basking on
relay5_state = LOW;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
if (last_sel == LOW && joyButtonPushed == 4) { //Left, Basking off
relay5_state = HIGH;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
}
if (subpage_counter == 1 && relay5_state == HIGH) {
myScreen.setCursor(10, 30);
myScreen.print("OFF");
if (BaskState != 0) {
BaskState = 0;
}
} else if (subpage_counter == 1 && relay5_state == LOW) {
myScreen.setCursor(10, 30);
myScreen.print("ON ");
if (BaskState != 1) {
BaskState = 1;
}
}
//----------------------------------------
// BACK controls
//----------------------------------------
//Second item control (subpage_counter=2) back
if (subpage_counter == 0) {
myScreen.setCursor(10, 10);
myScreen.print(" ");
}
}
//----------------------------------------------------------------------------------------------------------------------
// MENU OPTION SIX
//----------------------------------------------------------------------------------------------------------------------
void skyControl() {
//Static objects
myScreen.setCursor(10, 0);
myScreen.print("Sky Control:");
if (relay6_state == HIGH) {
myScreen.setCursor(90, 0);
myScreen.print("OFF");
SkyMenu();
}
else if (relay6_state == LOW) {
myScreen.setCursor(90, 0);
myScreen.print("ON ");
SkyMenu();
}
//----------------------------------------
// 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
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE); //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
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE); //Return custom char
} else { //If subpage higher than 2 (total of items) return to first item
subpage_counter = 1;
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE); //Return custom char
}
joyButtonPushed = 0;
pushedTime = 0;
}
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
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE); //Return custom char
} else if (subpage_counter == 2) { //If subpage higher than 2 (total of items) return to first item
subpage_counter = 1;
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE);
} 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
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE); //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
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE); //Return custom char
}
joyButtonPushed = 0;
pushedTime = 0;
}
// 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
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE); //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
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE); //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
myScreen.drawBitmap(0, 10, top, 8, 8, WHITE); //Return custom char
} else if (subpage_counter == 3) { //If subpage higher than 2 (total of items) return to first item
subpage_counter = 0;
myScreen.setCursor(14, 3);
myScreen.print(" ");
myScreen.setCursor(15, 3);
myScreen.print(" ");
}
joyButtonPushed = 0;
pushedTime = 0;
}
//----------------------------------------
// item control 1
//----------------------------------------
//First item control(subpage_counter =1) Sky Power
if (subpage_counter == 1) {
myScreen.drawBitmap(10, 10, bottom, 8, 8, WHITE);
if (last_sel == LOW && joyButtonPushed == 3) { //Right, Sky on
relay6_state = LOW;
subpage2_counter = 1;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
if (last_sel == LOW && joyButtonPushed == 4) { //Left, Sky off
relay6_state = HIGH;
subpage2_counter = 0;
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
}
if (subpage_counter == 1 && relay6_state == HIGH) {
myScreen.setCursor(10, 30);
myScreen.print("OFF");
SkyMenu();
}
else if (subpage_counter == 1 && relay6_state == LOW) {
myScreen.setCursor(10, 30);
myScreen.print("ON ");
SkyMenu();
}
//----------------------------------------
// item control 2
//----------------------------------------
//Second item control(subpage_counter =2) Sky Setting
if (subpage_counter == 2 && relay6_state == LOW) {
myScreen.setCursor(10, 10);
myScreen.print(" "); //Delete last arrow position
myScreen.setCursor(14, 3);
myScreen.print(" "); //Delete last arrow position
//myScreen.setCursor(10, 10);
myScreen.drawBitmap(4, 2, bottom, 8, 8, WHITE);
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;
}
last_sel = current_sel;
if (last_sel == LOW && joyButtonPushed == 4) { //Left, Sky off
if (subpage2_counter > 1) {
subpage2_counter--;
} else if (subpage2_counter == 1) {
subpage2_counter = 5;
}
joyButtonPushed = 0;
pushedTime = 0;
}
last_sel = current_sel;
}
//----------------------------------------
// BACK controls
//----------------------------------------
//Second item control (subpage_counter=2) back
if (subpage_counter == 3) {
myScreen.setCursor(10, 10);
myScreen.print(" "); //Delete last arrow position
myScreen.setCursor(4, 2);
myScreen.print(" ");
myScreen.drawBitmap(14, 3, bottom, 8, 8, WHITE); //Place the arrow
}
}
//===========================================================================================================================
// NIGHT/DAY FUNCTIONALITY
//===========================================================================================================================
void clearSkyMode() {
//--------------------------------
// SOUND
//--------------------------------
//Sky Off
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;
}
buusyPin == 0;
}
//Noon
// Serial.println(digitalRead(buusyPin));
if (digitalRead(buusyPin) != 0 && subpage2_counter == 2 && subpage_counter == 0) {
if (SkyState != 2) {
SkyState = 2;
}
buusyPin == 0;
}
//Evening
//Serial.println(digitalRead(buusyPin));
if (digitalRead(buusyPin) != 0 && subpage2_counter == 3 && subpage_counter == 0) {
if (SkyState != 3) {
SkyState = 3;
}
buusyPin == 0;
}
//Night
// Serial.println(digitalRead(buusyPin));
if (digitalRead(buusyPin) != 0 && subpage2_counter == 4 && subpage_counter == 0) {
if (SkyState != 4) {
SkyState = 4;
}
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) {
//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 :
myScreen.fillScreen(BLACK);
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
myScreen.fillScreen(BLACK); //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;
}
last_sel = current_sel; //Save up button last state
//Page Left
if (last_sel == LOW && joyButtonPushed == 4) { //Left button pressed
myScreen.fillScreen(BLACK); //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;
}
last_sel = current_sel; //Save down button last state
}
//Show sub counters status,delete or comment if not needed
if (page_counter != 1) {
myScreen.setCursor(0, 0);
myScreen.print(page_counter - 1);
//myScreen.setCursor(1,0);
//myScreen.print(".");
}
if (page_counter > 9) {
myScreen.setCursor(0, 0);
myScreen.print(page_counter - 1);
//myScreen.setCursor(2,0);
//myScreen.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 > 800) {
joyRead = 1;
joyButtonPushed = 3; //Serial.println("x + "); //x+
} else if (x < 400) {
joyRead = 2;
joyButtonPushed = 4; //Serial.println("x - "); //x-
} else if (y < 400) {
joyRead = 3;
joyButtonPushed = 1; //Serial.println("y + "); //y+
} else if (y > 800) {
joyRead = 4;
joyButtonPushed = 2; //Serial.println("y - "); //y-
} else if (!k) {
joyRead = 5;
joyButtonPushed = 5; //Serial.println("Push");
} 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 off 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 off 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 off Fog
page_counter = 3;
relay2_state = HIGH;
if (FogState != 0) {
FogState = 0;
}
delay(2000);
page_counter = 1;
State = 0;
} else if (State == '4') {
// Turn on Fog
page_counter = 3;
relay2_state = LOW;
if (FogState != 1) {
FogState = 1;
}
delay(2000);
page_counter = 1;
State = 0;
}
if (State == '5') {
// Turn off 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 off 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 off 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 off SKY
page_counter = 7;
relay6_state = HIGH;
subpage2_counter = 0;
subpage_counter = 0;
SkyMenu();
myScreen.fillScreen(BLACK);
page_counter = 1;
State = 0;
clearSkyMode();
} else if (State == 'm') {
// Turn SKY to MORNING
page_counter = 7;
relay6_state = LOW;
subpage2_counter = 1;
subpage_counter = 0;
SkyMenu();
myScreen.fillScreen(BLACK);
page_counter = 1;
State = 0;
clearSkyMode();
} else if (State == 'd') {
// Turn SKY to NOON
page_counter = 7;
relay6_state = LOW;
subpage2_counter = 2;
subpage_counter = 0;
SkyMenu();
myScreen.fillScreen(BLACK);
page_counter = 1;
State = 0;
clearSkyMode();
} else if (State == 'e') {
// Turn SKY to EVENING
page_counter = 7;
relay6_state = LOW;
subpage2_counter = 3;
subpage_counter = 0;
SkyMenu();
myScreen.fillScreen(BLACK);
page_counter = 1;
State = 0;
clearSkyMode();
} else if (State == 'n') {
// Turn SKY to NIGHT
page_counter = 7;
relay6_state = LOW;
subpage2_counter = 4;
subpage_counter = 0;
SkyMenu();
myScreen.fillScreen(BLACK);
page_counter = 1;
State = 0;
clearSkyMode();
} else if (State == 's') {
// Turn SKY to STORM
page_counter = 7;
relay6_state = LOW;
subpage2_counter = 5;
subpage_counter = 0;
SkyMenu();
myScreen.fillScreen(BLACK);
page_counter = 1;
State = 0;
cloudySkyMode();
}
}
void setupWiFi() {
WiFi.init(&Serial2);
Serial.print("Connecting to ");
Serial.println(ssid);
int status = WL_IDLE_STATUS;
while (status != WL_CONNECTED) {
status = WiFi.begin(ssid, password);
}
if (status == WL_CONNECTED) {
Serial.println();
Serial.println("Connection established!");
Serial.print("IP address:\t");
Serial.print(WiFi.localIP());
}
}

