Hi,
I’ve been working on a automated greenhouse project using thinger. I can display sensor values and read slider values, however when i try to use the if statements in ‘void loop’ to control the actuators the values are not read from thinger sliders and are instead constantly 0. I think it is something to do with the structure of the code or interrupts. Does anyone have an idea?
Thanks,
Elliot
#include <SPI.h> //include SPI library
#include <WiFiNINA.h>//include WiFiNINA library
#include <NTPClient.h>//include NTPClient library
#include <WiFiUdp.h>//include WiFiUDP library
#include "arduino_secrets.h"//include arduino secrets document
#define THINGER_SERIAL_DEBUG
#include <ThingerWiFiNINA.h>////include ThingerWiFiNINA library
#include <DHT.h>//include DHT library
#define DHTPIN 2//setting D2 to DHT22
#define DHTTYPE DHT22   // DHT 22
ThingerWiFiNINA thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);//WiFi and Thinger.io settings
int LDRPin = A0;//set LDR to pin A0
int MoisturePin = A1;//set MoisturePin to pin A1
int LEDOutPin = 11;//set LED relay pin to D11
int FanOutPin = 12;//set Fan relay pin to D12
int PumpOutPin = 13;//set LED relay pin to D13
int LDRValue;//Initialise LDRValue as integer variable   
int MoistureValue;//Initialise MoistureValue as integer variable 
pson Max_Moist;//Initialise Max_Moist as pson variable 
pson Min_Moist;//Initialise Min_Moist as pson variable 
pson Max_Temp;//Initialise Max_Temp as pson variable 
pson Min_Temp;//Initialise Min_Temp as pson variable 
pson Light_Hours;//Initialise Light_Hours as pson variable 
pson Enable_Disable;
volatile int min_moist;//Initialise min_moist as integer variable 
volatile int max_moist;//Initialise max_moist as integer variable 
volatile int max_temp;//Initialise max_temp as integer variable 
volatile int min_temp;//Initialise min_temp as integer variable
volatile int light_hours;//Initialise light_hours as integer variable
volatile int MinLight = 300;//Initialise MinLight as integer variable and set value to 300
volatile int MaxLight = 800;//Initialise MaxLight as integer variable and set value to 800
volatile int timelimit;//Initialise timelimit as integer variable
float t;//Initialise t as decimal variable
float h;//Initialise h as decimal variable
bool change = false;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
DHT dht = DHT(DHTPIN, DHTTYPE);//assigning dht variables
void Watering(){//initialising function Watering 
    digitalWrite(PumpOutPin, HIGH);//set pump pin high, turn on pump
    delay(2000);//delay for 2 seconds
    digitalWrite(PumpOutPin, LOW);//set pump pin low, turn pump off
    delay(4000);//delay for 4 seconds
  }
void Cooling (){//initialising function Cooling 
  digitalWrite(FanOutPin, HIGH);//set fan pin high, turn on fan
  delay(10000);//delay for 10 seconds
  digitalWrite(FanOutPin, LOW);//set fan pin low, turn fan off
  delay(4000);//dealy for 4 seconds
}
void LightingOn (){//initialising function LightingOn
  digitalWrite(LEDOutPin, HIGH);//set LED pin high
}
void LightingOff(){//initialising function LightingOff
  digitalWrite(LEDOutPin, LOW);//set LED pin high
}
void setup() {
  dht.begin();
  Serial.begin(115200);//Initialize serial and wait for port to open
  thing.add_wifi(SSID, SSID_PASSWORD);//initialising thinger wifi
  pinMode(PumpOutPin, OUTPUT);//set pump pin output
  pinMode(FanOutPin, OUTPUT);//set fan pin as output
  pinMode(LEDOutPin, OUTPUT);//set LED pin as output
  t = dht.readTemperature();//read temperature and setting it to variable t
  h = dht.readHumidity();//read humidity and setting it to variable h
  MoistureValue = analogRead(MoisturePin);
  LDRValue = analogRead(LDRPin);
  thing["LDR_Value"] >> [](pson& out){//thinger resource "LDR_Value" as output
      out = analogRead(LDRPin);//output is equal to LDR reading
  };
  thing["Temperature"] >> [](pson& out){//initialising thinger resource "Temperature" and setting as output
      out = t;//output is equal to DHT22 temperature reading
  };
  thing["Humidity"] >> [](pson& out){//initialising thinger resource "Humidity" and setting as output
      out = dht.readHumidity();//output is equal to DHT22 humidity reading
  };
  thing["Moisture_Value"] >> [](pson& out){//initialising thinger resource "Moisture_Value" and setting as output
      out = analogRead(MoisturePin);//output is equal to Moisture sensor reading
  };
  thing["Max_Moist"] << [](pson& in){//initialising thinger resource "Max_Moist" and setting as input
    if(in.is_empty()){// in is empty
      in= max_moist;//in is equal to max_moist
    }else{
      max_moist=in;//max_moist in is equal to in
    }
  };
  thing["Min_Moist"] << [](pson& in){//initialising thinger resource "Min_Moist" and setting as input
    if(in.is_empty()){// in is empty
      in= min_moist;//in is equal to min_moist
    }else{
      min_moist=in;//min_moist is equal to in
    }
  };
  thing["Max_Temp"] << [](pson& in){//initialising thinger resource "Max_Temp" and setting as input
    if(in.is_empty()){// in is empty
      in = max_temp;//in is equal to max_temp
    }else{
      max_temp = in;//max_temp is equal to in
    }
  };
  thing["Min_Temp"] << [](pson& in){//initialising thinger resource "Min_Temp" and setting as input
    if(in.is_empty()){// in is empty
      in = min_temp;//in is equal to min_temp
    }else{
      min_temp = in;//min_temp is equal to in
    }
  };
  thing["Light_Hours"] << [](pson& in){//initialising thinger resource "Light_Hours" and setting as input
    if(in.is_empty()){// in is empty
      in = light_hours;//in is equal to light_hours
    }else{
      light_hours = in;//light_hours is equal to in
    }
  };
}
void loop(){
  thing.handle();//loops thing procedures
  timeClient.begin();//begins time function
  timeClient.update();//updates time 
  int CurrentHour = timeClient.getHours();//sets CurrentHour equal to real time hour
  timelimit = (0+Light_Hours);//add input light hours to 0 to getlighting time limit
  thing["Max_Moist"] << inputValue(max_moist);//set max_moist to input Max_Moist value
  thing["Min_Moist"] << inputValue(min_moist);//set min_moist to input Min_Moist value
  thing["Max_Temp"] << inputValue(max_temp);//set max_temp to input Max_Temp value
  thing["Min_Temp"] << inputValue(min_temp);//set min_temp to input Max_Temp value
  thing["Light_Hours"] << inputValue(light_hours);//set light_hours to input Light_hours value
  if (MoistureValue < min_moist)//if the moisture value less then min_moist
  {
    Watering();//call watering function
  }
  if ((CurrentHour >= 0) && (CurrentHour <= timelimit)){//if the current hour is greater than or equal to 0 and less than time limit
    if (LDRValue < MinLight){//if LDR value is less than MinLight value
      LightingOn();//calls lighting on function
    }if(CurrentHour > timelimit){ 
      LightingOff();//calls lighting off function
    }
  }
  if (t > max_temp){//if t is greater than max temp limit 
    Cooling();//call cooling function
  }
}