Функция задержки выполняется слишком быстро

Я делаю гидропонную систему, которая собирает данные и отправляет их пользователю через SIM-модуль. Проблема в том, что, хотя я хочу, чтобы это происходило только раз в 15 минут и чтобы насос работал только в течение 30 секунд, устройство, кажется, делает все в 10 раз быстрее, если не быстрее. Есть ли способ исправить это, не умножая все на 10?

#include <SoftwareSerial.h>
#include <DHT.h>
#include <OneWire.h> 
#include <DallasTemperature.h>
#include <EEPROM.h>
#include <GravityTDS.h>
#include <Servo.h>

#define ONE_WIRE_BUS 5
#define DHTPIN 7     
#define DHTTYPE DHT11
#define TdsSensorPin A1
#define PUMPPIN 11

SoftwareSerial mySerial(9, 10);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);
GravityTDS gravityTds;
Servo myservo;

char msg;
char call;

void setup()
{

  dht.begin();
  
  sensors.begin();
  
  gravityTds.setPin(A1);
  gravityTds.setAref(5.0);
  gravityTds.setAdcRange(1024);
  gravityTds.begin();
  
  myservo.attach(PUMPPIN);
}

void loop()
{  
  const unsigned long SECOND = 1000;
  const unsigned long MINUTE = 60*SECOND;
  const unsigned long HOUR = 60*MINUTE;
   
  delay(30*SECOND);
  int h = dht.readHumidity();
  float t = dht.readTemperature();
  float tdsValue = 0;
  float temperature = t;
  gravityTds.setTemperature(temperature);  
  gravityTds.update(); 
  tdsValue = gravityTds.getTdsValue();  
    
  sensors.requestTemperatures(); 

  
  
  mySerial.println("AT+CMGF=1");    //Sets the GSM Module in Text Mode
  delay(1000);  // Delay of 1000 milli seconds or 1 second
  mySerial.println("AT+CMGS=\"+************\"\r"); // Replace x with mobile number
  mySerial.print(h);// The SMS text you want to send
  mySerial.print("% humidity, ");
  mySerial.print(t);
  mySerial.print(" degrees Celsius air temperature, ");
  mySerial.print(sensors.getTempCByIndex(0));
  mySerial.print(" degrees Celsius water temperature, ");
  mySerial.print(tdsValue,0);
  mySerial.print(" ppm");
  

  
  delay(100);
  mySerial.println((char)26);// ASCII code of CTRL+Z
  delay(1000);

  myservo.write(0);   //Clockwise maximum speed rotation
    delay(30*SECOND);
  myservo.write(90);  
  delay(15*MINUTE);


}```

, 👍1

Обсуждение

Не могли бы вы, пожалуйста, проверить проблему с примером мигания, в то время как к Arduino ничего не подключено? Просто чтобы еще больше сузить круг проблем. Может быть, предохранители вашего Мега настроены неправильно. Если та же проблема возникает с скетчем blink, вы можете попробовать использовать другой Arduino для записи загрузчика через интернет-провайдера. Это также устанавливает предохранители., @chrisl

Я бы не стал использовать задержку с такими длинными значениями. Вместо этого проверьте текущее время с помощью функции millis (). Это также позволит вам продолжать реагировать на плату (т. Е. на нажатия кнопок)., @PMF

Рекомендуемый метод - изменить длинную СЕКУНДУ = 1000; на длинную СЕКУНДУ = 10000;, @Gil

@Gil, как это должно работать?, @Juraj

Каждая "СЕКУНДА" будет в 10 раз длиннее. Помните, что когда вы находитесь в состоянии задержки, компьютер больше ничего не может сделать., @Gil

@Гил, ты серьезно? понимаете ли вы причину проблемы в вопросе?, @Juraj

Он заявил, что все происходит примерно в 10 раз больше, чем он хотел, он попросил самый простой способ и не хотел менять код, который был бы лучшим. Я также заявил, что это не рекомендуется. Что я пропустил, он изначально заявил, что не хочет менять свой код, это был самый простой способ, который я видел в то время. Что я пропустил?, @Gil

вы пропустили, что 15*МИНУТ вычисляется как int и переполняется, поэтому результат-гораздо более короткая задержка, @Juraj