Функция задержки выполняется слишком быстро
Я делаю гидропонную систему, которая собирает данные и отправляет их пользователю через 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);
}```
@GreatWhale64, 👍1
Обсуждение0
Смотрите также:
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
Не могли бы вы, пожалуйста, проверить проблему с примером мигания, в то время как к Arduino ничего не подключено? Просто чтобы еще больше сузить круг проблем. Может быть, предохранители вашего Мега настроены неправильно. Если та же проблема возникает с скетчем blink, вы можете попробовать использовать другой Arduino для записи загрузчика через интернет-провайдера. Это также устанавливает предохранители., @chrisl
Я бы не стал использовать задержку с такими длинными значениями. Вместо этого проверьте текущее время с помощью функции millis (). Это также позволит вам продолжать реагировать на плату (т. Е. на нажатия кнопок)., @PMF
Рекомендуемый метод - изменить длинную СЕКУНДУ = 1000; на длинную СЕКУНДУ = 10000;, @Gil
@Gil, как это должно работать?, @Juraj
Каждая "СЕКУНДА" будет в 10 раз длиннее. Помните, что когда вы находитесь в состоянии задержки, компьютер больше ничего не может сделать., @Gil
@Гил, ты серьезно? понимаете ли вы причину проблемы в вопросе?, @Juraj
Он заявил, что все происходит примерно в 10 раз больше, чем он хотел, он попросил самый простой способ и не хотел менять код, который был бы лучшим. Я также заявил, что это не рекомендуется. Что я пропустил, он изначально заявил, что не хочет менять свой код, это был самый простой способ, который я видел в то время. Что я пропустил?, @Gil
вы пропустили, что 15*МИНУТ вычисляется как int и переполняется, поэтому результат-гораздо более короткая задержка, @Juraj