Cayenne Dashboard Lag

Hello,

I’m returning back at my project ( automatic greenhouse ), and i have some issue:

  1. I have a china module(4) with 5v relays and sometimes aprox. 70% my buttons get stuck and remain on off or on, i have to restart board and refresh dashboard, that can be a wrong code or it’s a server issue ( lag )? i tested a local and don’t have that problem
  2. I use a BMP180 module and: temperature work and stay ok, but my pressure went from read value to 0 and so on.

I’m running Mega 2560 + ESP8266

can you share the code?

// Conectare pini ( Legenda )

// Pin D2 - Senzor debit YF-S401.(1)
// Pin D3 - Senzor debit YF-S401.(2)
// Pin D4 - Releu pornire Pompa1.
// Pin D5 - Releu pornire Pompa2.
// Pin D6 - Senzor temperatura si umiditate DHT21/AM2301 ( interior sera ).
// Pin D7 - Senzor temperatura si umiditate DHT21/AM2301 ( exterior ).
// Pin D8 - STEP-PIN deschidere usa-sera.
// Pin D9 - DIR-PIN deschidere usa-sera.
// Pin D10 - ENABLE-PIN deschidere usa-sera.
// Pin D11 - STEP-PIN deschidere fereastra-sera.
// Pin D12 - DIR-PIN deschidere fereastra-sera.
// Pin D13 - ENABLE-PIN deschidere fereastra-sera.
// Pin D18 - Senzor temperatura apa DS18B20.
// Pin D26 - Releu pornire Iluminat.
// Pin D27 - Releu pornire Ventilatie.
// Pin D48 - Senzor distanta HC-SR04.
// Pin D49 - Senzor distanta HC-SR04.
// Pin SDA - Senzor temperatura si presiune atmosferica BMP180.
// Pin SCL - Senzor temperatura si presiune atmosferica BMP180.
// Pin A1 - Senzor umiditate sol (1).
// Pin A2 - Senzor umiditate sol (2).
// Pin A3 - Senzor umiditate sol (3).
// Pin A4 - Senzor umiditate sol (4).
// Pin A5 - Senzor umiditate sol (5).

// Pini virtuali ( Legenda )

// Pin virtual 1 - Senzor temperatura apa in bazin DS18B20.
// Pin virtual 2 - Presiune atmosferica BMP180.
// Pin virtual 3 - Temperatura exterior-umbra BMP180.
// Pin virtual 4 - Actionare Pompa1.
// Pin virtual 5 - Actionare Pompa2.
// Pin virtual 8 - Nivel apa bazin HC-SR04.
// Pin digital 10 - Senzor pentru umiditatea solului (1).
// Pin digital 11 - Senzor pentru umiditatea solului (2).
// Pin digital 12 - Senzor pentru umiditatea solului (3).
// Pin digital 13 - Senzor pentru umiditatea solului (4).
// Pin digital 14 - Senzor pentru umiditatea solului (5).
// Pin digital 16 - Temperatura Sera DHT21/AM2301.
// Pin digital 17 - Umiditate Sera DHT21/AM2301.
// Pin digital 18 - Temperatura Exterior-Lumina DHT21/AM2301.
// Pin digital 19 - Umiditate Exterior-Lumina DHT21/AM2301.
// Pin digital 20 - Deschidere Geam-Sera.
// Pin digital 21 - Inchidere Geam-Sera.
// Pin digital 22 - Apa Irigare Pompa-1.
// Pin digital 23 - Apa Irigare Pompa-2.
// Pin digital 24 - Deschidere Usa-Sera.
// Pin digital 25 - Inchidere Usa-Sera.
// Pin digital 26 - Actionare Iluminat.
// Pin virtual 27 - Actionare ventilatie.

// Librariile necesare pentru Automatizare

#define CAYENNE_PRINT Serial
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#include <Ultrasonic.h>
#include <DHT.h>
#include <CayenneMQTTESP8266Shield.h>

// Conectare WI-FI
char ssid = “”;
char wifiPassword = “”;

// Autorizarea catre siteul MyDevices.Com
char username = “”;
char password = “”;
char clientID = “”;

// Pinul virtualal pentru senzorul de temperatura exterior/presiunea atmosferica (BMP180)
#define VIRTUAL_PIN2 V2
#define VIRTUAL_PIN3 V3

// Pin-urile pentru DHT21/AM2301
#define VIRTUAL_PIN6 V6 // Pin digital pentru senzorul DHT21
#define VIRTUAL_PIN7 V7 // Pin digital pentru senzorul DHT21
#define DHT1PIN 6 // Pin conectare pe placa pentru senzorul DHT21
#define DHT2PIN 7 // Pin conectare pe placa pentru senzorul DHT21
#define DHT1TYPE DHT21 // DHT 21
#define DHT2TYPE DHT21 // DHT 21
DHT dht1(DHT1PIN, DHT1TYPE);
DHT dht2(DHT2PIN, DHT2TYPE);
unsigned long lastMillis = 0;

// Pin-urile pentru relee
#define VIRTUAL_PIN4 V4 // Pin digital pentru releu Pompa1.
#define VIRTUAL_PIN5 V5 // Pin digital pentru releu Pompa2.
#define VIRTUAL_PIN26 V26 // Pin digital pentru releu Ventilatie.
#define VIRTUAL_PIN27 V27 // Pin digital pentru releu Iluminat.
#define RELAY_DIGITAL_PIN1 V4 // Pin conectare pe placa pentru releu Pompa1.
#define RELAY_DIGITAL_PIN2 V5 // Pin conectare pe placa pentru releu Pompa2.
#define RELAY_DIGITAL_PIN26 V26 // Pin conectare pe placa pentru releu Ventilatie.
#define RELAY_DIGITAL_PIN27 V27 // Pin conectare pe placa pentru releu Iluminat.

// Pin digitale/logic pentru senzorul de masurare a cantitatii apei din bazin (HC-SR04)
#define pin_trigger 48 // Pin conectare pe placa pentru HC-SR04
#define pin_echo 49 // Pin conectare pe placa pentru HC-SR04
#define VIRTUAL_PIN8 V8 // Pin digital pentru HC-SR04
Ultrasonic ultrasonic(pin_trigger, pin_echo);

//API-ul pentru senzorul de temperatura exterior/presiune atmosferica (BMP180)
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10180);
bool bmpSensorDetected = true;

// Pin virtual pentru senzorul de temperatura apei (DS18B20).
#define VIRTUAL_PIN1 V1
// Pin conectare pe placa pentru senzorul de temperatura apei (DS18B20).
const int tmpPin = 18;
//API-ul pentru senzorul de temperatura apei (DS18B20)
OneWire oneWire(tmpPin);
DallasTemperature sensors(&oneWire);

// Variabile senzori umiditate sol
int dataread1, dataread2, dataread3, dataread4, dataread5;
int moisturepercent1, moisturepercent2, moisturepercent3, moisturepercent4, moisturepercent5;
#define VIRTUAL_PIN10 V10 // Pin digital senzor pentru umiditatea solului (1).
#define VIRTUAL_PIN11 V11 // Pin digital senzor pentru umiditatea solului (2).
#define VIRTUAL_PIN12 V12 // Pin digital senzor pentru umiditatea solului (3).
#define VIRTUAL_PIN13 V13 // Pin digital senzor pentru umiditatea solului (4).
#define VIRTUAL_PIN14 V14 // Pin digital senzor pentru umiditatea solului (5).

#define sensorpin1 A1 // Pin conectare pe placa pentru senzor umiditate sol (1).
#define sensorpin2 A2 // Pin conectare pe placa pentru senzor umiditate sol (2).
#define sensorpin3 A3 // Pin conectare pe placa pentru senzor umiditate sol (3).
#define sensorpin4 A4 // Pin conectare pe placa pentru senzor umiditate sol (4).
#define sensorpin5 A5 // Pin conectare pe placa pentru senzor umiditate sol (5).

#define sensorpowersupply1 31 // Pin conectare pe placa pentru alimentare senzor umiditate sol (1). ( anti-corodare )
#define sensorpowersupply2 32 // Pin conectare pe placa pentru alimentare senzor umiditate sol (2). ( anti-corodare )
#define sensorpowersupply3 33 // Pin conectare pe placa pentru alimentare senzor umiditate sol (3). ( anti-corodare )
#define sensorpowersupply4 34 // Pin conectare pe placa pentru alimentare senzor umiditate sol (4). ( anti-corodare )
#define sensorpowersupply5 35 // Pin conectare pe placa pentru alimentare senzor umiditate sol (5). ( anti-corodare )

// Variabilele pentru senzorii debit

#define VIRTUAL_PIN22 V22 // Pin digital pentru senzor debit YF-S401 (1).
#define VIRTUAL_PIN23 V23 // Pin digital pentru senzor debit YF-S401 (2).

byte sensorInterrupt = 0;
byte sensorInterrupt1 = 1;

byte sensorPin = 2;
byte sensorPin0 = 3;

float calibrationFactor = 27.3;
float calibrationFactor1 = 27.3;

volatile byte pulseCount;
volatile byte pulseCount1;

float flowRate;
float flowRate1;

unsigned int flowMilliLitres;
unsigned int flowMilliLitres1;

unsigned long totalMilliLitres;
unsigned long totalMilliLitres1;

unsigned long oldTime;
unsigned long oldTime1;

unsigned long read1, read2, read3, read4, read5;
unsigned long pause = 60000;

// Variabile deschidere fereastra
const int stepPin = 11;
const int dirPin = 12;
const int enablePin = 13;

// Variabile deschidere usa
const int stepPin1 = 8;
const int dirPin1 = 9;
const int enablePin1 = 10;

// Variabile ESP8266
#define EspSerial Serial3
ESP8266 wifi(&EspSerial);

void setup()
{

Serial.begin(9600);
Serial.println(“Automatizare Sera - 2020”);
delay(5000);
Serial.println(“Conectare catre serviciul MyDevices.Com”);
pinMode(sensorpowersupply1, OUTPUT);
pinMode(sensorpowersupply2, OUTPUT);
pinMode(sensorpowersupply3, OUTPUT);
pinMode(sensorpowersupply4, OUTPUT);
pinMode(sensorpowersupply5, OUTPUT);
pinMode(RELAY_DIGITAL_PIN1, OUTPUT);
pinMode(RELAY_DIGITAL_PIN2, OUTPUT);
pinMode(RELAY_DIGITAL_PIN26, OUTPUT);
pinMode(RELAY_DIGITAL_PIN27, OUTPUT);
digitalWrite(RELAY_DIGITAL_PIN1, HIGH);
digitalWrite(RELAY_DIGITAL_PIN2, HIGH);
digitalWrite(RELAY_DIGITAL_PIN26, HIGH);
digitalWrite(RELAY_DIGITAL_PIN27, HIGH);
pinMode(sensorPin, INPUT);
pinMode(sensorPin0, INPUT);
digitalWrite(sensorPin, HIGH);
digitalWrite(sensorPin0, HIGH);
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode(enablePin,OUTPUT);
pinMode(stepPin1,OUTPUT);
pinMode(dirPin1,OUTPUT);
pinMode(enablePin1,OUTPUT);
digitalWrite(enablePin,HIGH);
digitalWrite(enablePin1,HIGH);
dht1.begin();
dht2.begin();

pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
oldTime = 0;

pulseCount1 = 0;
flowRate1 = 0.0;
flowMilliLitres1 = 0;
totalMilliLitres1 = 0;
oldTime1 = 0;

attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
attachInterrupt(sensorInterrupt1, pulseCounter1, FALLING);

float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
sensors.begin();

EspSerial.begin(115200);
delay(10);

Cayenne.begin(username, password, clientID, wifi, ssid, wifiPassword);
if (!bmp.begin())
{
bmpSensorDetected = false;
}
digitalWrite(sensorpowersupply1, HIGH);
delay(1000);
dataread1 = analogRead(sensorpin1);
moisturepercent1 = map(dataread1, 1023,0,0,100);
digitalWrite(sensorpowersupply1, LOW);
read1 = millis();

digitalWrite(sensorpowersupply2, HIGH);
delay(1000);
dataread2 = analogRead(sensorpin2);
moisturepercent2 = map(dataread2, 1023,0,0,100);
digitalWrite(sensorpowersupply2, LOW);
read2 = millis();

digitalWrite(sensorpowersupply3, HIGH);
delay(1000);
dataread3 = analogRead(sensorpin3);
moisturepercent3 = map(dataread3, 1023,0,0,100);
digitalWrite(sensorpowersupply3, LOW);
read3 = millis();

digitalWrite(sensorpowersupply4, HIGH);
delay(1000);
dataread4 = analogRead(sensorpin4);
moisturepercent4 = map(dataread4, 1023,0,0,100);
digitalWrite(sensorpowersupply4, LOW);
read4 = millis();

digitalWrite(sensorpowersupply5, HIGH);
delay(1000);
dataread5 = analogRead(sensorpin5);
moisturepercent5 = map(dataread5, 1023,0,0,100);
digitalWrite(sensorpowersupply5, LOW);
read5 = millis();
}

void loop()
{
Cayenne.loop();

if((millis() - oldTime) > 1000)
{

detachInterrupt(sensorInterrupt);   
flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
oldTime = millis();
flowMilliLitres = (flowRate / 60) * 1000;
totalMilliLitres += flowMilliLitres;
unsigned int frac;
frac = (flowRate - int(flowRate)) * 10;   
pulseCount = 0; 
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);

}
if((millis() - oldTime1) > 1000)
{

detachInterrupt(sensorInterrupt1);   
flowRate1 = ((1000.0 / (millis() - oldTime1)) * pulseCount1) / calibrationFactor1;
oldTime1 = millis();
flowMilliLitres1 = (flowRate1 / 60) * 1000;
totalMilliLitres1 += flowMilliLitres1;
unsigned int frac1;
frac1 = (flowRate1 - int(flowRate1)) * 10;   
pulseCount1 = 0; 
attachInterrupt(sensorInterrupt1, pulseCounter1, FALLING);

}
if (millis() - lastMillis > 60000) {
float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
if (isnan(h1) || isnan(t1)) {
return;

}
if (isnan(h2) || isnan(t2)) {
return;

}
Cayenne.celsiusWrite(16, t1);
Cayenne.virtualWrite(17, h1);
lastMillis = millis();
Cayenne.celsiusWrite(18, t2);
Cayenne.virtualWrite(19, h2);
lastMillis = millis();

}

}
void pulseCounter()
{
pulseCount++;
}
void pulseCounter1()
{
pulseCount1++;
}

// Senzorul DS18B20
CAYENNE_OUT(VIRTUAL_PIN1)
{
sensors.requestTemperatures();
Cayenne.celsiusWrite(VIRTUAL_PIN1, sensors.getTempCByIndex(0));
delay(500);
}

// Releu Pornire Pompa1
CAYENNE_IN(V4)
{
int currentValue = getValue.asInt();
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN1, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN1, LOW);
}
}

// Releu Pornire Pompa2
CAYENNE_IN(V5)
{
int currentValue = getValue.asInt();
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN2, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN2, LOW);
}
}

// Releu Aprindere Lumina
CAYENNE_IN(V26)
{
int currentValue = getValue.asInt();
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN26, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN26, LOW);
}
}

// Releu Ventilatie
CAYENNE_IN(V27)
{
int currentValue = getValue.asInt();
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN27, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN27, LOW);
}
}

// Senzor presiune atmosferica BMP180
CAYENNE_OUT(VIRTUAL_PIN2)
{
if (bmpSensorDetected)
{
sensors_event_t event;
bmp.getEvent(&event);

if (event.pressure)
{
  Cayenne.hectoPascalWrite(VIRTUAL_PIN2, event.pressure);
}

}
}

// Senzor Temperatura Exterior BMP180
CAYENNE_OUT(VIRTUAL_PIN3)
{
if (bmpSensorDetected)
{
float temperature;
bmp.getTemperature(&temperature);
Cayenne.celsiusWrite(VIRTUAL_PIN3, temperature);
}
}

// Senzor Nivel Apa In Bazin HC-SR04
CAYENNE_OUT(VIRTUAL_PIN8)
{
float cmMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
Cayenne.virtualWrite(V8, cmMsec, “prox”,“cm”);
}

// Senzor Umiditate Sol 1
CAYENNE_OUT(VIRTUAL_PIN10)
{
if((millis() - read1) > pause)
{
digitalWrite(sensorpowersupply1, HIGH);
delay(1000);
dataread1 = analogRead(sensorpin1);
moisturepercent1 = map(dataread1, 1023,0,0,100);
digitalWrite(sensorpowersupply1, LOW);
read1 = millis();
}
Cayenne.virtualWrite(V10, moisturepercent1, “soil_moist”, “p”);
}

// Senzor Umiditate Sol 2
CAYENNE_OUT(VIRTUAL_PIN11)
{
if((millis() - read2) > pause)
{
digitalWrite(sensorpowersupply2, HIGH);
delay(1000);
dataread2 = analogRead(sensorpin2);
moisturepercent2 = map(dataread2, 1023,0,0,100);
digitalWrite(sensorpowersupply2, LOW);
read2 = millis();
}
Cayenne.virtualWrite(V11, moisturepercent2, “soil_moist”, “p”);
}

// Senzor Umiditate Sol 3
CAYENNE_OUT(VIRTUAL_PIN12)
{
if((millis() - read3) > pause)
{
digitalWrite(sensorpowersupply3, HIGH);
delay(1000);
dataread3 = analogRead(sensorpin3);
moisturepercent3 = map(dataread3, 1023,0,0,100);
digitalWrite(sensorpowersupply3, LOW);
read3 = millis();
}
Cayenne.virtualWrite(V12, moisturepercent3, “soil_moist”, “p”);
}

// Senzor Umiditate Sol 4
CAYENNE_OUT(VIRTUAL_PIN13)
{
if((millis() - read4) > pause)
{
digitalWrite(sensorpowersupply4, HIGH);
delay(1000);
dataread4 = analogRead(sensorpin4);
moisturepercent4 = map(dataread4, 1023,0,0,100);
digitalWrite(sensorpowersupply4, LOW);
read4 = millis();
}
Cayenne.virtualWrite(V13, moisturepercent4, “soil_moist”, “p”);
}

// Senzor Umiditate Sol 5
CAYENNE_OUT(VIRTUAL_PIN14)
{
if((millis() - read5) > pause)
{
digitalWrite(sensorpowersupply5, HIGH);
delay(1000);
dataread5 = analogRead(sensorpin5);
moisturepercent5 = map(dataread5, 1023,0,0,100);
digitalWrite(sensorpowersupply5, LOW);
read5 = millis();
}
Cayenne.virtualWrite(V14, moisturepercent5, “soil_moist”, “p”);
}

// Senzor debit YF-S401
CAYENNE_OUT(VIRTUAL_PIN22)
{
Cayenne.virtualWrite(V22, totalMilliLitres1, “liquid”, “l” );
}

// Senzor debit YF-S401
CAYENNE_OUT(VIRTUAL_PIN23)
{
Cayenne.virtualWrite(V23, totalMilliLitres, “liquid”, “l” );
}

// Senzor Temperatura & Umiditate In Sera DHT21/AM2301
CAYENNE_OUT(VIRTUAL_PIN6)
{
float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
Cayenne.celsiusWrite(16, t1);
Cayenne.virtualWrite(17, h1, “rel_hum”, “p”);
}

// Senzor Temperatura & Umiditate Exterior DHT21/AM2301
CAYENNE_OUT(VIRTUAL_PIN7)
{

float  h2 = dht2.readHumidity();
float  t2 = dht2.readTemperature();

Cayenne.celsiusWrite(18, t2);
Cayenne.virtualWrite(19, h2, “rel_hum”, “p”);
}

CAYENNE_IN(20)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin,LOW);
digitalWrite(dirPin,LOW);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin,HIGH);
}
}

CAYENNE_IN(21)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin,LOW);
digitalWrite(dirPin,HIGH);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin,HIGH);
}
}

CAYENNE_IN(24)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin1,LOW);
digitalWrite(dirPin1,LOW);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin1,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin1,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin1,HIGH);
}
}

CAYENNE_IN(25)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin1,LOW);
digitalWrite(dirPin1,HIGH);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin1,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin1,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin1,HIGH);
}
}

that code is quite big. can you do one change and try. Dont initialise or use virtual channel as V1. Just replace them as 1. Give it a try and let me know. if not just group all virtual channel used for channel and share the code again.

Also, dont do this in the CAYENNE_IN function. You should try and avoid using delay in the code but there is no other way to control a stepper motor i know. Move the stepper code from here into the main loop and use an extra variable to run it only once.

CAYENNE_IN(20)
{
  int x = getValue.asInt();
  if (x == 1) {
    digitalWrite(enablePin, LOW);
    digitalWrite(dirPin, LOW);
    for (int x = 1; x < 4000; x++) {
      digitalWrite(stepPin, HIGH);
      delayMicroseconds(1000);
      digitalWrite(stepPin, LOW);
      delayMicroseconds(1000);
    }
    digitalWrite(enablePin, HIGH);
  }
}

why are you reading data at interval inside the CAYENNE_OUT() function? this function runs every 15 seconds and is publishing data. Better will be just put the code in main loop and send the data from. there like this:

void loop()
{
  Cayenne.loop();

  if ((millis() - read1) > pause)
  {
    digitalWrite(sensorpowersupply1, HIGH);
    delay(1000);
    dataread1 = analogRead(sensorpin1);
    moisturepercent1 = map(dataread1, 1023, 0, 0, 100);
    digitalWrite(sensorpowersupply1, LOW);
    read1 = millis();
  Cayenne.virtualWrite(V10, moisturepercent1, “soil_moist”, “p”);
}
}

Okay, I apologize for my late reply.
The part with reading the sensors is not the problem, the problem is with the delay for using the buttons (stepper motors and relays) I think they also have delays, because sometimes they activate and then I have to refresh the web page or go in and out in the mobile application.
My problem is only at delay, I read a post from 2018 with the same problem.

you can brief more as in what do you mean by lag. as there is too many use case of delay in your code, it will show lag. As during that time the device is on sleep and wont receive the data from cayenne at this time and will result in the lag. Also, use the web dashboard in place of the app.

I rewrote the code, I moved the reading of the soil moisture sensors in the main loop, I only use the function (Cayenne.virtualWrite (channelid)), the problem of that delay seems to be for another reason, somehow the board disconnects then connects again. Probably the wrong code.

can you share the new code.

#define CAYENNE_PRINT Serial
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#include <Ultrasonic.h>
#include <DHT.h>
#include <CayenneMQTTESP8266Shield.h>


// Conectare WI-FI
char ssid[] = "";
char wifiPassword[] = "";

// Autorizarea catre siteul MyDevices.Com
char username[] = "";
char password[] = "";
char clientID[] = "";

// Pinul virtualal pentru senzorul de temperatura exterior/presiunea atmosferica (BMP180)
#define VIRTUAL_PIN2 2
#define VIRTUAL_PIN3 3

// Pin-urile pentru DHT21/AM2301
#define VIRTUAL_PIN6 6 // Pin digital pentru senzorul DHT21
#define VIRTUAL_PIN7 7 // Pin digital pentru senzorul DHT21
#define DHT1PIN 6 // Pin conectare pe placa pentru senzorul DHT21
#define DHT2PIN 7 // Pin conectare pe placa pentru senzorul DHT21
#define DHT1TYPE DHT21   // DHT 21 
#define DHT2TYPE DHT21   // DHT 21 
DHT dht1(DHT1PIN, DHT1TYPE);
DHT dht2(DHT2PIN, DHT2TYPE);
unsigned long lastMillis = 0;


// Pin-urile pentru relee
#define VIRTUAL_PIN4 4 // Pin digital pentru releu Pompa1.
#define VIRTUAL_PIN5 5 // Pin digital pentru releu Pompa2.
#define VIRTUAL_PIN26 26 // Pin digital pentru releu Ventilatie.
#define VIRTUAL_PIN27 27 // Pin digital pentru releu Iluminat.
#define RELAY_DIGITAL_PIN1 4 // Pin conectare pe placa pentru releu Pompa1.
#define RELAY_DIGITAL_PIN2 5 // Pin conectare pe placa pentru releu Pompa2.
#define RELAY_DIGITAL_PIN3 26 // Pin conectare pe placa pentru releu Ventilatie.
#define RELAY_DIGITAL_PIN4 27 // Pin conectare pe placa pentru releu Iluminat.

// Pin digitale/logic pentru senzorul de masurare a cantitatii apei din bazin (HC-SR04)
#define pin_trigger 48 // Pin conectare pe placa pentru HC-SR04
#define pin_echo 49 // Pin conectare pe placa pentru HC-SR04
#define VIRTUAL_PIN8 8 // Pin digital pentru HC-SR04
Ultrasonic ultrasonic(pin_trigger, pin_echo);

//API-ul pentru senzorul de temperatura exterior/presiune atmosferica (BMP180)
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10180);
bool bmpSensorDetected = true;

// Pin virtual pentru senzorul de temperatura apei (DS18B20).
#define VIRTUAL_PIN1 1
// Pin conectare pe placa pentru senzorul de temperatura apei (DS18B20).
const int tmpPin = 18;
//API-ul pentru senzorul de temperatura apei (DS18B20)
OneWire oneWire(tmpPin);
DallasTemperature sensors(&oneWire);

// Variabile senzori umiditate sol
int dataread1, dataread2, dataread3, dataread4, dataread5;
int moisturepercent1, moisturepercent2, moisturepercent3, moisturepercent4, moisturepercent5;
#define VIRTUAL_PIN10 10 // Pin digital senzor pentru umiditatea solului (1).
#define VIRTUAL_PIN11 11 // Pin digital senzor pentru umiditatea solului (2).
#define VIRTUAL_PIN12 12 // Pin digital senzor pentru umiditatea solului (3).
#define VIRTUAL_PIN13 13 // Pin digital senzor pentru umiditatea solului (4).
#define VIRTUAL_PIN14 14 // Pin digital senzor pentru umiditatea solului (5).

#define sensorpin1 A1 // Pin conectare pe placa pentru senzor umiditate sol (1).
#define sensorpin2 A2 // Pin conectare pe placa pentru senzor umiditate sol (2). 
#define sensorpin3 A3 // Pin conectare pe placa pentru senzor umiditate sol (3).
#define sensorpin4 A4 // Pin conectare pe placa pentru senzor umiditate sol (4).
#define sensorpin5 A5 // Pin conectare pe placa pentru senzor umiditate sol (5).
 
#define sensorpowersupply1 31 // Pin conectare pe placa pentru alimentare senzor umiditate sol (1). ( anti-corodare )     
#define sensorpowersupply2 32 // Pin conectare pe placa pentru alimentare senzor umiditate sol (2). ( anti-corodare )     
#define sensorpowersupply3 33 // Pin conectare pe placa pentru alimentare senzor umiditate sol (3). ( anti-corodare )     
#define sensorpowersupply4 34 // Pin conectare pe placa pentru alimentare senzor umiditate sol (4). ( anti-corodare )     
#define sensorpowersupply5 35 // Pin conectare pe placa pentru alimentare senzor umiditate sol (5). ( anti-corodare )     

// Variabilele pentru senzorii debit

#define VIRTUAL_PIN22 22 // Pin digital pentru senzor debit YF-S401 (1).
#define VIRTUAL_PIN23 23 // Pin digital pentru senzor debit YF-S401 (2).

byte sensorInterrupt = 0;
byte sensorInterrupt1 = 1;  

byte sensorPin       = 2;
byte sensorPin0       = 3;

float calibrationFactor = 27.3;
float calibrationFactor1 = 27.3;

volatile byte pulseCount;  
volatile byte pulseCount1;

float flowRate;
float flowRate1;

unsigned int flowMilliLitres;
unsigned int flowMilliLitres1;

unsigned long totalMilliLitres;
unsigned long totalMilliLitres1;

unsigned long oldTime;
unsigned long oldTime1;

unsigned long read1, read2, read3, read4, read5;
unsigned long pause = 60000;

// Variabile deschidere fereastra
const int stepPin = 11;
const int dirPin = 12;
const int enablePin = 13;

// Variabile deschidere usa
const int stepPin1 = 8;
const int dirPin1 = 9;
const int enablePin1 = 10;

// Variabile ESP8266
#define EspSerial Serial3
ESP8266 wifi(&EspSerial);

void setup()
{
 
  Serial.begin(9600);
  Serial.println("Automatizare Sera - 2020");
  delay(5000);
  Serial.println("Conectare catre serviciul MyDevices.Com");
  pinMode(sensorpowersupply1, OUTPUT);
  pinMode(sensorpowersupply2, OUTPUT);
  pinMode(sensorpowersupply3, OUTPUT);
  pinMode(sensorpowersupply4, OUTPUT);
  pinMode(sensorpowersupply5, OUTPUT);
  pinMode(RELAY_DIGITAL_PIN1, OUTPUT);
  pinMode(RELAY_DIGITAL_PIN2, OUTPUT);
  pinMode(RELAY_DIGITAL_PIN3, OUTPUT);
  pinMode(RELAY_DIGITAL_PIN4, OUTPUT);
  digitalWrite(RELAY_DIGITAL_PIN1, HIGH); 
  digitalWrite(RELAY_DIGITAL_PIN2, HIGH);
  digitalWrite(RELAY_DIGITAL_PIN3, HIGH);
  digitalWrite(RELAY_DIGITAL_PIN4, HIGH);
  pinMode(sensorPin, INPUT);
  pinMode(sensorPin0, INPUT);
  digitalWrite(sensorPin, HIGH);
  digitalWrite(sensorPin0, HIGH);
  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);
  pinMode(enablePin,OUTPUT);
  pinMode(stepPin1,OUTPUT);
  pinMode(dirPin1,OUTPUT);
  pinMode(enablePin1,OUTPUT);
  digitalWrite(enablePin,HIGH);
  digitalWrite(enablePin1,HIGH);
  dht1.begin();
  dht2.begin();
  
  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;
  
  pulseCount1        = 0;
  flowRate1         = 0.0;
  flowMilliLitres1   = 0;
  totalMilliLitres1  = 0;
  oldTime1           = 0;
  
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  attachInterrupt(sensorInterrupt1, pulseCounter1, FALLING);
  
  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature();
  float h2 = dht2.readHumidity();
  float t2 = dht2.readTemperature();
  sensors.begin();
  
  
  EspSerial.begin(115200);
  delay(10);

   Cayenne.begin(username, password, clientID, wifi, ssid, wifiPassword);
  if (!bmp.begin())
  {
    bmpSensorDetected = false;
  }
   digitalWrite(sensorpowersupply1, HIGH);
   delay(1000);
   dataread1 = analogRead(sensorpin1);
   moisturepercent1 = map(dataread1, 1023,0,0,100);
   digitalWrite(sensorpowersupply1, LOW); 
   read1 = millis();
   
   digitalWrite(sensorpowersupply2, HIGH);
   delay(1000);
   dataread2 = analogRead(sensorpin2);
   moisturepercent2 = map(dataread2, 1023,0,0,100);
   digitalWrite(sensorpowersupply2, LOW); 
   read2 = millis();
   
   digitalWrite(sensorpowersupply3, HIGH);
   delay(1000);
   dataread3 = analogRead(sensorpin3);
   moisturepercent3 = map(dataread3, 1023,0,0,100);
   digitalWrite(sensorpowersupply3, LOW); 
   read3 = millis();

   digitalWrite(sensorpowersupply4, HIGH);
   delay(1000);
   dataread4 = analogRead(sensorpin4);
   moisturepercent4 = map(dataread4, 1023,0,0,100);
   digitalWrite(sensorpowersupply4, LOW); 
   read4 = millis();

   digitalWrite(sensorpowersupply5, HIGH);
   delay(1000);
   dataread5 = analogRead(sensorpin5);
   moisturepercent5 = map(dataread5, 1023,0,0,100);
   digitalWrite(sensorpowersupply5, LOW); 
   read5 = millis();
}



void loop()
{
  Cayenne.loop();
  
  if((millis() - oldTime) > 1000) 
  { 
    detachInterrupt(sensorInterrupt);   
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;
    unsigned int frac;
    frac = (flowRate - int(flowRate)) * 10;   
    pulseCount = 0; 
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }
  
  if((millis() - oldTime1) > 1000) 
  { 
    detachInterrupt(sensorInterrupt1);   
    flowRate1 = ((1000.0 / (millis() - oldTime1)) * pulseCount1) / calibrationFactor1;
    oldTime1 = millis();
    flowMilliLitres1 = (flowRate1 / 60) * 1000;
    totalMilliLitres1 += flowMilliLitres1;
    unsigned int frac1;
    frac1 = (flowRate1 - int(flowRate1)) * 10;   
    pulseCount1 = 0; 
    attachInterrupt(sensorInterrupt1, pulseCounter1, FALLING);
  }
    if (millis() - lastMillis > 60000) {
    float  h1 = dht1.readHumidity();
    float  t1 = dht1.readTemperature();
    float  h2 = dht2.readHumidity();
    float  t2 = dht2.readTemperature();
  if (isnan(h1) || isnan(t1)) {
    return;
    
  }
  if (isnan(h2) || isnan(t2)) {
    return;
    
  }
// Senzor Temperatura & Umiditate In Sera DHT21/AM2301  
  Cayenne.celsiusWrite(16, t1);
  Cayenne.virtualWrite(17, h1);
  lastMillis = millis();
// Senzor Temperatura & Umiditate Exterior DHT21/AM2301 
  Cayenne.celsiusWrite(18, t2);
  Cayenne.virtualWrite(19, h2);
  lastMillis = millis();

     }
// Senzor Umiditate Sol 1

  if((millis() - read1) > pause) 
  { 
   digitalWrite(sensorpowersupply1, HIGH);
   delay(1000);
   dataread1 = analogRead(sensorpin1);
   moisturepercent1 = map(dataread1, 1023,0,0,100);
   digitalWrite(sensorpowersupply1, LOW); 
   read1 = millis();
   Cayenne.virtualWrite(10, moisturepercent1, "soil_moist", "p");   
  }


// Senzor Umiditate Sol 2

  if((millis() - read2) > pause) 
  {
   digitalWrite(sensorpowersupply2, HIGH);
   delay(1000);
   dataread2 = analogRead(sensorpin2);
   moisturepercent2 = map(dataread2, 1023,0,0,100);
   digitalWrite(sensorpowersupply2, LOW);   
   read2 = millis();
   Cayenne.virtualWrite(11, moisturepercent2, "soil_moist", "p");
  }
   
// Senzor Umiditate Sol 3

  if((millis() - read3) > pause) 
  {
   digitalWrite(sensorpowersupply3, HIGH);
   delay(1000);
   dataread3 = analogRead(sensorpin3);
   moisturepercent3 = map(dataread3, 1023,0,0,100);
   digitalWrite(sensorpowersupply3, LOW);  
   read3 = millis();
   Cayenne.virtualWrite(12, moisturepercent3, "soil_moist", "p");
  } 

// Senzor Umiditate Sol 4

  if((millis() - read4) > pause) 
  {
   digitalWrite(sensorpowersupply4, HIGH);
   delay(1000);
   dataread4 = analogRead(sensorpin4);
   moisturepercent4 = map(dataread4, 1023,0,0,100);
   digitalWrite(sensorpowersupply4, LOW);   
   read4 = millis();
   Cayenne.virtualWrite(13, moisturepercent4, "soil_moist", "p");
  }
   
// Senzor Umiditate Sol 5

   if((millis() - read5) > pause) 
   {
   digitalWrite(sensorpowersupply5, HIGH);
   delay(1000);
   dataread5 = analogRead(sensorpin5);
   moisturepercent5 = map(dataread5, 1023,0,0,100);
   digitalWrite(sensorpowersupply5, LOW);  
   read5 = millis();
   Cayenne.virtualWrite(14, moisturepercent5, "soil_moist", "p");   
   }
    
}
void pulseCounter()
{
  pulseCount++;
}
void pulseCounter1()
{
  pulseCount1++;
}

// Senzorul DS18B20
CAYENNE_OUT(1)
{
  sensors.requestTemperatures();
  Cayenne.celsiusWrite(1, sensors.getTempCByIndex(0));
  delay(500);
}

// Releu Pornire Pompa1
CAYENNE_IN(4)
{
   
  if (getValue.asInt() == 0) {
    digitalWrite(4, HIGH);
  } else {
    digitalWrite(4, LOW);
  }
}

// Releu Pornire Pompa2
CAYENNE_IN(5)
{
   
  if (getValue.asInt() == 0) {
    digitalWrite(5, HIGH);
  } else {
    digitalWrite(5, LOW);
  }
}

// Releu Aprindere Lumina
CAYENNE_IN(26)
{
	
  if (getValue.asInt() == 0) {
    digitalWrite(26, HIGH);
  } else {
    digitalWrite(26, LOW);
  }
}

// Releu Ventilatie
CAYENNE_IN(27)
{
   
  if (getValue.asInt() == 0) {
    digitalWrite(27, HIGH);
  } else {
    digitalWrite(27, LOW);
  }
}

// Senzor presiune atmosferica BMP180
CAYENNE_OUT(2)
{
  if (bmpSensorDetected)
  {
    sensors_event_t event;
    bmp.getEvent(&event);
    if (event.pressure)
    {
      Cayenne.hectoPascalWrite(VIRTUAL_PIN2, event.pressure);
    }
  }
}

// Senzor Temperatura Exterior BMP180
CAYENNE_OUT(3)
{
  if (bmpSensorDetected)
  {
    float temperature;
    bmp.getTemperature(&temperature);
    Cayenne.celsiusWrite(VIRTUAL_PIN3, temperature);
  }
}


// Senzor Nivel Apa In Bazin HC-SR04
CAYENNE_OUT(8)
{
  float cmMsec;
  long microsec = ultrasonic.timing();
  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
  Cayenne.virtualWrite(8, cmMsec, "prox","cm");
}



// Senzor debit YF-S401
CAYENNE_OUT(22)
{ 
   Cayenne.virtualWrite(22, totalMilliLitres1, "liquid", "l" );
}

// Senzor debit YF-S401
CAYENNE_OUT(23)
{ 
   Cayenne.virtualWrite(23, totalMilliLitres, "liquid", "l" );
}

CAYENNE_IN(20)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin,LOW);
digitalWrite(dirPin,LOW);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin,HIGH);
}
}

CAYENNE_IN(21)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin,LOW);
digitalWrite(dirPin,HIGH);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin,HIGH);
}
}

CAYENNE_IN(24)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin1,LOW);
digitalWrite(dirPin1,LOW);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin1,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin1,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin1,HIGH);
}
}

CAYENNE_IN(25)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin1,LOW);
digitalWrite(dirPin1,HIGH);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin1,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin1,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin1,HIGH);
}
}

add #define CAYENNE_DEBUG in the code and share the serial monitor output when the disconnect occurs.

ok,
At the moment I can’t do that, it’s raining and the arduino board is a little further from the house:
I thought of 2-3 options: Probably not powered properly, I use the power supply through the DC 12v plug, from what I can see only the connection with the mydevices service fails, because I checked in the router and the connection remains stable, I saw that sometimes the error “Timeout Reading Data” appears, I tried to connect through the mini-usb port but it seems that it does not receive enough current for everything that is connected to it.

if it is power issue, then the board will offline on the dashboard when it disconnects. The serial monitor output can give more info on the issue.

The problem has been solved, I misplugged the board, now I put a 9v source and it seems to work ok, it has a timeout from time to time, but this is not a problem

1 Like