SoilMoisture-m5stick/src/main.cpp

187 lines
4.0 KiB
C++

/*#include <Arduino.h>
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
*/
#include <M5StickC.h>
#if defined(ESP32)
#include <WiFi.h>
#include <./wifi-creds.h> // needs to define hostname, ssid, password
#else
#include <ESP8266WiFi.h>
#endif
#include <HTTPClient.h>
int val = 0; //value for storing moisture value
int soilPin = 36;//Declare a variable for the soil moisture sensor
int soilPower = 26;//Variable for Soil moisture Power
int readIndicatorLed = 10;//pin for LED indicating read is happening
int modeButton = 37;
char spinner[] = {'/','-','\\','|'};
int spinnerIndex = 0;
bool logging = false;
bool buttonWasDown = false;
uint16_t textColor = WHITE;
const char* url = "http://192.168.1.101:9989/api/log/m5stick";
const long nonLoggingModeInterval = 2000; // every second
const long loggingModeInterval = 1800000; // every 30 minutes
long remainingInInterval = 0;
const int loopInterval = 1000;
int moist = 0; // moisture readings
// the setup routine runs once when M5StickC starts up
void setup() {
// initialize the M5StickC object
M5.begin();
M5.Lcd.setRotation(1);
pinMode(soilPin, INPUT);
pinMode(soilPower, OUTPUT);
pinMode(modeButton, INPUT);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(1);
M5.Axp.ScreenBreath(8); // set lower than default backlight level
#if defined(ESP32)
WiFi.setHostname(hostname);
#else
WiFi.hostname(hostname);
#endif
WiFi.begin(ssid, password);
M5.Lcd.printf("Connecting to wifi");
{
uint8_t timeout = 10;
// Wait for connection, 5s timeout
do {
delay(500);
Serial.print(".");
M5.Lcd.print(".");
timeout--;
} while (timeout && WiFi.status() != WL_CONNECTED);
}
}
//This is a function used to get the soil moisture content
int readSoil()
{
digitalWrite(soilPower, HIGH);//turn D7 "On"
digitalWrite(readIndicatorLed, HIGH);//turn D7 "On"
delay(100);//wait 10 milliseconds
val = analogRead(soilPin);//Read the SIG value form sensor
digitalWrite(soilPower, LOW);//turn D7 "Off"
digitalWrite(readIndicatorLed, LOW);//turn D7 "Off"
return val;//send current moisture value
}
void report(int value){
if (WiFi.status() != WL_CONNECTED)
return;
char urlBuffer[80];
sprintf(urlBuffer, "%s/%d", url, value);
HTTPClient http;
http.begin(urlBuffer);
int responseCode = http.GET();
if (responseCode > 0){
textColor = WHITE;
}
else {
textColor = RED;
}
http.end();
}
void handleModeButton(){
// press: low
int buttonState = digitalRead(modeButton);
if (!buttonState)
{
buttonWasDown = true;
textColor = PURPLE; // visual indication that the buttonpress was read
}
else {
if (buttonWasDown == true){
// mode switch here
logging = !logging;
buttonWasDown = false;
remainingInInterval = 0; // force an action immediately.
textColor = WHITE;
}
}
}
// the loop routine runs over and over again forever
void loop(){
handleModeButton();
remainingInInterval -= loopInterval;
bool shouldAct = remainingInInterval <= 0;
if (shouldAct)
{
moist = readSoil();
// reset interval
remainingInInterval = logging ? loggingModeInterval : nonLoggingModeInterval;
}
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10, 10);
M5.Lcd.setTextColor(textColor);
M5.Lcd.setTextSize(5);
M5.Lcd.printf("%d", moist);
M5.Lcd.setCursor(5, 60);
M5.Lcd.setTextSize(2);
M5.Lcd.printf("%c ", spinner[spinnerIndex]);
spinnerIndex = (spinnerIndex + 1) % 4;
if (WiFi.status() == WL_CONNECTED)
M5.Lcd.printf("W ");
if (logging) {
M5.Lcd.print("L ");
if (shouldAct){
report(moist);
}
}
M5.Lcd.setTextSize(1);
if (remainingInInterval >= 1000){
M5.Lcd.printf("next: %lds", remainingInInterval/1000);
}
else{
M5.Lcd.printf("next: %ldms", remainingInInterval);
}
delay(loopInterval);//wait 10 milliseconds
//M5.update();
}