// Include Libraries
#include "Arduino.h"
#include "ESP8266.h"
#include "GraphicLCD.h"
#include "SoilMoisture.h"
// Pin Definitions
#define GRAPHICLCD_PIN_TX 3
#define GRAPHICLCD_PIN_RX 2
#define RELAYMODULE4CH_PIN_IN1 4
#define RELAYMODULE4CH_PIN_IN2 5
#define RELAYMODULE4CH_PIN_IN4 7
#define RELAYMODULE4CH_PIN_IN3 6
#define SOILMOISTURE_5V1_1_PIN_SIG A10
#define SOILMOISTURE_5V2_2_PIN_SIG A0
#define SOILMOISTURE_5V3_3_PIN_SIG A3
#define SOILMOISTURE_5V4_4_PIN_SIG A13
// Global variables and defines
// ====================================================================
// vvvvvvvvvvvvvvvvvvvv ENTER YOUR WI-FI SETTINGS vvvvvvvvvvvvvvvvvvvv
//
const char *SSID = "WIFI-SSID"; // CornishRes
const char *PASSWORD = "PASSWORD"; // Crabpeople2023!!
//
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// ====================================================================
char *const host = "www.google.com";
int hostPort = 80;
//define an array for the 4ch relay module pins
int RelayModule4chPins[] = { RELAYMODULE4CH_PIN_IN1, RELAYMODULE4CH_PIN_IN2, RELAYMODULE4CH_PIN_IN3, RELAYMODULE4CH_PIN_IN4 };
// object initialization
ESP8266 wifi;
GraphicLCD graphicLCD(GRAPHICLCD_PIN_RX, GRAPHICLCD_PIN_TX);
SoilMoisture soilMoisture_5v1_1(SOILMOISTURE_5V1_1_PIN_SIG);
SoilMoisture soilMoisture_5v2_2(SOILMOISTURE_5V2_2_PIN_SIG);
SoilMoisture soilMoisture_5v3_3(SOILMOISTURE_5V3_3_PIN_SIG);
SoilMoisture soilMoisture_5v4_4(SOILMOISTURE_5V4_4_PIN_SIG);
// define vars for testing menu
const int timeout = 10000; //define timeout of 10 sec
char menuOption = 0;
long time0;
// Setup the essentials for your circuit to work. It runs first every time your circuit is powered with electricity.
void setup() {
// Setup Serial which is useful for debugging
// Use the Serial Monitor to view printed messages
Serial.begin(9600);
while (!Serial)
; // wait for serial port to connect. Needed for native USB
Serial.println("start");
wifi.init(SSID, PASSWORD);
pinMode(RELAYMODULE4CH_PIN_IN1, OUTPUT);
pinMode(RELAYMODULE4CH_PIN_IN2, OUTPUT);
pinMode(RELAYMODULE4CH_PIN_IN3, OUTPUT);
pinMode(RELAYMODULE4CH_PIN_IN4, OUTPUT);
menuOption = menu();
}
// Main logic of your circuit. It defines the interaction between the components you selected. After setup, it runs over and over again, in an eternal loop.
void loop() {
if (menuOption == '1') {
// Logic Level Converter - Bi-Directional - Test Code
//Send request for www.google.com at port 80
wifi.httpGet(host, hostPort);
// get response buffer. Note that it is set to 250 bytes due to the Arduino low memory
char *wifiBuf = wifi.getBuffer();
//Comment out to print the buffer to Serial Monitor
//for(int i=0; i< MAX_BUFFER_SIZE ; i++)
// Serial.print(wifiBuf[i]);
//search buffer for the date and time and print it to the serial monitor. This is GMT time!
char *wifiDateIdx = strstr(wifiBuf, "Date");
for (int i = 0; wifiDateIdx[i] != '\n'; i++)
Serial.print(wifiDateIdx[i]);
} else if (menuOption == '2') {
// Graphic LCD 160x128 Huge - Test Code
// The LCD Screen will display the text of your choice at the location (30,50) on screen. Counting from the top left corner: 30 pixels to the right and 50 pixels down
graphicLCD.setX(30); // 1. sets left-right indent for text to print. Change the value in the brackets (1 - left, 164 - right) for a different indent.
graphicLCD.setY(50); // 2. sets top-bottom height for text to print. Change the value in the brackets (1 - top, 128 - bottom) for a different height.
graphicLCD.print("Circuito.io Rocks!"); // 3. prints the text in the brackets. Modify the text to get your own unique print.
delay(1000); // 4. waits 1000 milliseconds (1 sec). Change the value in the brackets (1000) for a longer or shorter delay in milliseconds.
graphicLCD.clear(); // 5. wipes the screen
delay(1000); // 6. waits 1000 milliseconds (1 sec). Change the value in the brackets (1000) for a longer or shorter delay in milliseconds.
} else if (menuOption == '3') {
// Relay Module 4-Ch - Test Code
//This loop will turn on and off each relay in the array for 0.5 sec
for (int i = 0; i < 4; i++) {
digitalWrite(RelayModule4chPins[i], HIGH);
delay(500);
digitalWrite(RelayModule4chPins[i], LOW);
delay(500);
}
} else if (menuOption == '4') {
// Soil Moisture Sensor #1 - Test Code
int soilMoisture_5v1_1Val = soilMoisture_5v1_1.read();
Serial.print(F("Val: "));
Serial.println(soilMoisture_5v1_1Val);
} else if (menuOption == '5') {
// Soil Moisture Sensor #2 - Test Code
int soilMoisture_5v2_2Val = soilMoisture_5v2_2.read();
Serial.print(F("Val: "));
Serial.println(soilMoisture_5v2_2Val);
} else if (menuOption == '6') {
// Soil Moisture Sensor #3 - Test Code
int soilMoisture_5v3_3Val = soilMoisture_5v3_3.read();
Serial.print(F("Val: "));
Serial.println(soilMoisture_5v3_3Val);
} else if (menuOption == '7') {
// Soil Moisture Sensor #4 - Test Code
int soilMoisture_5v4_4Val = soilMoisture_5v4_4.read();
Serial.print(F("Val: "));
Serial.println(soilMoisture_5v4_4Val);
}
if (millis() - time0 > timeout) {
menuOption = menu();
}
}
// Menu function for selecting the components to be tested
// Follow serial monitor for instrcutions
char menu() {
Serial.println(F("\nWhich component would you like to test?"));
Serial.println(F("(1) Logic Level Converter - Bi-Directional"));
Serial.println(F("(2) Graphic LCD 160x128 Huge"));
Serial.println(F("(3) Relay Module 4-Ch"));
Serial.println(F("(4) Soil Moisture Sensor #1"));
Serial.println(F("(5) Soil Moisture Sensor #2"));
Serial.println(F("(6) Soil Moisture Sensor #3"));
Serial.println(F("(7) Soil Moisture Sensor #4"));
Serial.println(F("(menu) send anything else or press on board reset button\n"));
while (!Serial.available())
;
// Read data from serial monitor if received
while (Serial.available()) {
char c = Serial.read();
if (isAlphaNumeric(c)) {
if (c == '1')
Serial.println(F("Now Testing Logic Level Converter - Bi-Directional"));
else if (c == '2')
Serial.println(F("Now Testing Graphic LCD 160x128 Huge"));
else if (c == '3')
Serial.println(F("Now Testing Relay Module 4-Ch"));
else if (c == '4')
Serial.println(F("Now Testing Soil Moisture Sensor #1"));
else if (c == '5')
Serial.println(F("Now Testing Soil Moisture Sensor #2"));
else if (c == '6')
Serial.println(F("Now Testing Soil Moisture Sensor #3"));
else if (c == '7')
Serial.println(F("Now Testing Soil Moisture Sensor #4"));
else {
Serial.println(F("illegal input!"));
return 0;
}
time0 = millis();
return c;
}
}
}
/*******************************************************
* Circuito.io is an automatic generator of schematics and code for off
* the shelf hardware combinations.
* Copyright (C) 2016 Roboplan Technologies Ltd.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* In addition, and without limitation, to the disclaimers of warranties
* stated above and in the GNU General Public License version 3 (or any
* later version), Roboplan Technologies Ltd. ("Roboplan") offers this
* program subject to the following warranty disclaimers and by using
* this program you acknowledge and agree to the following:
* THIS PROGRAM IS PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS, AND
* WITHOUT WARRANTIES OF ANY KIND EITHER EXPRESS OR IMPLIED. ROBOPLAN
* HEREBY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY, TITLE, FITNESS
* FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND THOSE ARISING BY
* STATUTE OR FROM A COURSE OF DEALING OR USAGE OF TRADE.
* YOUR RELIANCE ON, OR USE OF THIS PROGRAM IS AT YOUR SOLE RISK.
* ROBOPLAN DOES NOT GUARANTEE THAT THE PROGRAM WILL BE FREE OF, OR NOT
* SUSCEPTIBLE TO, BUGS, SECURITY BREACHES, OR VIRUSES. ROBOPLAN DOES
* NOT WARRANT THAT YOUR USE OF THE PROGRAM, INCLUDING PURSUANT TO
* SCHEMATICS, INSTRUCTIONS OR RECOMMENDATIONS OF ROBOPLAN, WILL BE SAFE
* FOR PERSONAL USE OR FOR PRODUCTION OR COMMERCIAL USE, WILL NOT
* VIOLATE ANY THIRD PARTY RIGHTS, WILL PROVIDE THE INTENDED OR DESIRED
* RESULTS, OR OPERATE AS YOU INTENDED OR AS MAY BE INDICATED BY ROBOPLAN.
* YOU HEREBY WAIVE, AGREE NOT TO ASSERT AGAINST, AND RELEASE ROBOPLAN,
* ITS LICENSORS AND AFFILIATES FROM, ANY CLAIMS IN CONNECTION WITH ANY OF
* THE ABOVE.
********************************************************/