187 lines
4.0 KiB
C++
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();
|
|
} |