Добавление нескольких «или» в строку для сокращения количества строк «если»
Я отредактировал свой вопрос для большей ясности. Прилагаю весь набросок. Я пытался сделать более короткую версию наброска для этого вопроса, но в нём были опечатки, и в таком виде он бы не скомпилировался. Кроме того, я сказал, что строки, которые я пытаюсь сократить с помощью ||, оставались неизменными в течение 24 часов. Это не так.
Я забыл упомянуть NTS (ночные секунды), которые активируют реле ночью на количество секунд, отличное от дневных секунд DTS (дневные секунды).
Полный скетч работает как есть, но наверняка есть способ сжать его с помощью операторов OR, чтобы не выводить по строке на каждый час. Я перепробовал всё, но так и не смог заставить это работать. Я пытался добавить несколько операторов OR, чтобы сжать строки, но ничего не получается. Думаю, дело в правильном размещении (), || или {}, а также, возможно, в булевом значении.
Я попробую ваш совет и позже отпишусь с результатами. Моя главная ошибка заключалась в том, что я перепробовал так много всего, но не записывал результаты. Теперь буду записывать. Кроме того, я хочу собрать небольшую схему для тестирования. Я постоянно переживаю, что подключу USB-кабель одновременно с блоком питания к ESP-32 и сожгу его, компьютер или телефон. Я делал это в другом проекте с Arduino, и Arduino сгорела. В общем, если хотите увидеть, что у меня за проект, посмотрите комментарии в начале моего скетча. Я отвечу, как только смогу. Вот полный скетч:
// Этот скетч «Talliahs_Rocket_WiFi» предназначен для управления освещением и поливом бонсай из сладкой сливы в стеклянной скульптуре «Talliah Travels the Sky», созданной мной (Томом Лахью).
// Чтобы посмотреть видеоролики о первой версии ракеты и историю ее создания, посетите мой канал YouTube "tomlahue472".
// Этот скетч модифицирован Томом Лахью на основе скетча «Code_ESP32_NTP_Timer_Relay», написанного Tech StudyCell, и кода из «The EASY Guide To Over-The_Air (OTA) Updates»
// With Arduino OTA» — видео на YouTube от Programming Electronics Academy. Авторов смотрите в разделе «Библиотеки». Спасибо всем авторам.
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ArduinoOTA.h>
#include <Arduino_Secrets.h>
// Замените их на ваши учетные данные WiFi
const char* ssid = SECRET_SSID;
const char* password = SECRET_PASS;
// Определить адрес NTP-сервера
const char* ntpServer = "pool.ntp.org"; // Измените в соответствии с вашей страной
const long gmtOffset_sec = 72000; // Смещение от UTC (в секундах) (Индия GMT 5:30 // 5.5*60*60 = 19800) Измените в соответствии с вашей страной
const int daylightOffset_sec = 3600; // Смещение дневного света (в секундах)
// Определить контакт реле
const int pump1Pin = 25; // Это контакт ESP-32, подключенный к реле насоса
const int pump2Pin = 27; // Это вывод ESP-32, подключенный к реле насоса 2 // насос 2 — это будущий насос для будущего сада мхов
const int fanPin = 26; // Это контакт ESP-32, подключенный к вентилятору
const int llPin = 32; // Это контакт ESP-32, подключенный к нижнему реле света
const int ulPin = 33; // Это вывод ESP-32, который подключен к верхнему реле света
// Определить параметры OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Определить объекты NTP и WiFi
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, ntpServer, gmtOffset_sec, daylightOffset_sec);
// Определить переменные для управления реле
int DTS = 42; // DTS = Дневные секунды для дерева бонсай (время работы насоса 1 каждый час в дневное время)
int NTS = 28; // NTS = Секунды для дерева бонсай в ночное время (время работы насоса 1 каждый час в ночное время)
int DTSM = 55; // DTSM = Дневные секунды Moss Garden (время работы насоса 2 каждые полчаса в течение дня)
int NTSM = 35; // NTSM = Секунды ночного времени в Moss Garden (время работы насоса 2 каждые полчаса в ночное время)
void setup() {
Serial.begin(115200);
// Инициализируем OLED-дисплей
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Initializing...");
display.display();
delay(1000);
// Подключитесь к WiFi и запустите Arduino OTA
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
ArduinoOTA.begin(); // Запускает OTA
// Инициализируем контакт реле насоса 1 как выход
pinMode(pump1Pin, OUTPUT);
digitalWrite(pump1Pin, LOW);
// Инициализируем контакт реле насоса 2 как выход
pinMode(pump2Pin, OUTPUT);
digitalWrite(pump2Pin, LOW);
// инициализируем контакт реле вентилятора как выход
pinMode(fanPin, OUTPUT);
digitalWrite(fanPin, LOW);
// инициализируем нижний контакт реле освещения как выход
pinMode(llPin, OUTPUT);
digitalWrite(llPin, LOW);
// инициализируем верхний контакт реле освещения как выход
pinMode(ulPin, OUTPUT);
digitalWrite(ulPin, LOW);
// Запустить синхронизацию времени NTP
timeClient.begin();
timeClient.update();
}
void loop() {
ArduinoOTA.handle(); // Обрабатывает запрос на обновление кода
timeClient.update(); //Обновляет время NTP
// Получить текущее время
time_t currentTime = timeClient.getEpochTime();
struct tm * timeinfo;
timeinfo = localtime(¤tTime);
// Отображение текущего времени на OLED-дисплее
display.clearDisplay();
display.setCursor(0, 0);
display.println(" Talliah");
display.println(" Travels the Sky");
display.print(" ");
display.println(timeClient.getFormattedTime());
display.print(" DTS = ");
display.print(DTS);
display.print(" NTS = ");
display.print(NTS);
display.display();
// Следующие строки задают время включения и выключения реле насоса 1
// Если логическое значение становится истинным, вывод 25 становится ВЫСОКИМ, пока логическое значение снова не станет ложным
bool pump1State = false;
if (timeinfo->tm_hour == 6 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 6 утра в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 7 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 7 утра в течение указанного количества секунд в течение дня
if (timeinfo->tm_hour == 8 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 8 утра в течение дневного количества секунд
if (timeinfo->tm_hour == 9 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 9 утра в течение дневного количества секунд
if (timeinfo->tm_hour == 10 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 10 утра в течение указанного в дневном времени количества секунд
if (timeinfo->tm_hour == 11 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 11 утра в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 12 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 12 часов ночи в течение указанного в дневном времени количества секунд
if (timeinfo->tm_hour == 13 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 13:00 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 14 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 14:00 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 15 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 15:00 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 16 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 16:00 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 17 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 17:00 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 18 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 18:00 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 19 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 7 вечера в течение дневного количества секунд
if (timeinfo->tm_hour == 20 && timeinfo->tm_min == 00 && timeinfo->tm_sec < DTS) pump1State = true; // Поливает дерево бонсай в 20:00 в течение дневного количества секунд
if (timeinfo->tm_hour == 21 && timeinfo->tm_min == 00 && timeinfo->tm_sec < NTS) pump1State = true; // Поливает дерево бонсай в 21:00 в течение ночного количества секунд
if (timeinfo->tm_hour == 22 && timeinfo->tm_min == 00 && timeinfo->tm_sec < NTS) pump1State = true; // Поливает дерево бонсай в 22:00 в течение ночного количества секунд
if (timeinfo->tm_hour == 23 && timeinfo->tm_min == 00 && timeinfo->tm_sec < NTS) pump1State = true; // Поливает дерево бонсай в 23:00 в течение ночного количества секунд
if (timeinfo->tm_hour == 24 && timeinfo->tm_min == 00 && timeinfo->tm_sec < NTS) pump1State = true; // Поливает дерево бонсай в 12 часов дня в течение ночного количества секунд
if (timeinfo->tm_hour == 1 && timeinfo->tm_min == 00 && timeinfo->tm_sec < NTS) pump1State = true; // Поливает дерево бонсай в 1 час ночи в течение указанного количества секунд
if (timeinfo->tm_hour == 2 && timeinfo->tm_min == 00 && timeinfo->tm_sec < NTS) pump1State = true; // Поливает дерево бонсай в 2 часа ночи в течение указанного количества секунд
if (timeinfo->tm_hour == 3 && timeinfo->tm_min == 00 && timeinfo->tm_sec < NTS) pump1State = true; // Поливает дерево бонсай в 3 часа ночи в течение указанного количества секунд
if (timeinfo->tm_hour == 4 && timeinfo->tm_min == 00 && timeinfo->tm_sec < NTS) pump1State = true; // Поливает дерево бонсай в 4 утра в течение ночного количества секунд
if (timeinfo->tm_hour == 5 && timeinfo->tm_min == 00 && timeinfo->tm_sec < NTS) pump1State = true; // Поливает дерево бонсай в 5 утра в течение ночного количества секунд
if (pump1State == true)
digitalWrite(pump1Pin, HIGH);
else
digitalWrite(pump1Pin, LOW);
// Следующие строки задают время включения и выключения реле насоса 2
// Если логическое значение становится истинным, вывод 25 становится ВЫСОКИМ, пока логическое значение снова не станет ложным
bool pump2State = false;
if (timeinfo->tm_hour == 6 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 6:30 утра в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 7 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 7:30 утра в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 8 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 8:30 утра в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 9 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 9:30 утра в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 10 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 10:30 утра в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 11 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 11:30 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 12 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 12:30 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 13 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 13:30 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 14 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает мох в 14:30 на указанное количество секунд в дневное время
if (timeinfo->tm_hour == 15 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 15:30 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 16 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 16:30 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 17 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 17:30 в течение указанного количества секунд в дневное время
if (timeinfo->tm_hour == 18 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 18:30 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 19 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 19:30 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 20 && timeinfo->tm_min == 30 && timeinfo->tm_sec < DTSM) pump2State = true; // Поливает моховой сад в 20:30 в течение указанного в дневное время количества секунд
if (timeinfo->tm_hour == 21 && timeinfo->tm_min == 30 && timeinfo->tm_sec < NTSM) pump2State = true; // Поливает моховой сад в 21:30 в течение ночного времени в секундах
if (timeinfo->tm_hour == 22 && timeinfo->tm_min == 30 && timeinfo->tm_sec < NTSM) pump2State = true; // Поливает моховой сад в 22:30 в течение ночного времени в секундах
if (timeinfo->tm_hour == 23 && timeinfo->tm_min == 30 && timeinfo->tm_sec < NTSM) pump2State = true; // Поливает моховой сад в 23:30 в течение указанного количества секунд
if (timeinfo->tm_hour == 24 && timeinfo->tm_min == 30 && timeinfo->tm_sec < NTSM) pump2State = true; // Поливает моховой сад в 12:30 в течение ночного времени в секундах
if (timeinfo->tm_hour == 1 && timeinfo->tm_min == 30 && timeinfo->tm_sec < NTSM) pump2State = true; // Поливает моховой сад в 1:30 ночи в течение указанного количества секунд
if (timeinfo->tm_hour == 2 && timeinfo->tm_min == 30 && timeinfo->tm_sec < NTSM) pump2State = true; // Поливает моховой сад в 2:30 ночи в течение указанного количества секунд
if (timeinfo->tm_hour == 3 && timeinfo->tm_min == 30 && timeinfo->tm_sec < NTSM) pump2State = true; // Поливает моховой сад в 3:30 утра в течение ночного количества секунд
if (timeinfo->tm_hour == 4 && timeinfo->tm_min == 30 && timeinfo->tm_sec < NTSM) pump2State = true; // Поливает моховой сад в 4:30 утра в течение ночного количества секунд
if (timeinfo->tm_hour == 5 && timeinfo->tm_min == 30 && timeinfo->tm_sec < NTSM) pump2State = true; // Поливает моховой сад в 5:30 утра в течение ночного количества секунд
if (pump2State == true)
digitalWrite(pump2Pin, HIGH);
else
digitalWrite(pump2Pin, LOW);
// Следующая строка устанавливает время включения и выключения вентилятора
// Если логическое значение становится истинным, вывод 26 становится ВЫСОКИМ, пока логическое значение снова не станет ложным
bool fanState = false;
if (timeinfo->tm_hour > 4 && timeinfo->tm_hour < 22) fanState = true;
// Тест истинен 5:00-21:59 и ложен 22:00-4:59
if (fanState == true)
digitalWrite(fanPin, HIGH);
else
digitalWrite(fanPin, LOW);
// Следующие строки задают время включения и выключения реле нижнего света
// Если логическое значение становится истинным, вывод 32 становится ВЫСОКИМ, пока логическое значение снова не станет ложным
bool llState = false;
if (timeinfo->tm_hour > 4 && timeinfo->tm_hour < 22) llState = true;
// Тест истинен 5:00-21:59 и ложен 22:00-4:59
if (llState == true)
digitalWrite(llPin, HIGH);
else
digitalWrite(llPin, LOW);
// Следующие строки задают время включения и выключения реле верхнего света
// Если логическое значение становится истинным, вывод 33 становится ВЫСОКИМ, пока логическое значение снова не станет ложным
bool ulState = false;
if (timeinfo->tm_hour > 5 && timeinfo->tm_hour < 21) ulState = true;
// Тест истинен 6:00-20:59 и ложен 21:00-5:59
if (ulState == true)
digitalWrite(ulPin, HIGH);
else
digitalWrite(ulPin, LOW);
// Подождите 1 секунду, прежде чем снова проверить время
delay(1000);
}
@Tom Lahue, 👍0
Обсуждение4 ответа
const unsigned long DTS = 42; // DTS = дневное количество секунд, в течение которых работает pump1
static int old_hour = -1;
static unsigned long time_turned_on = 0;
// включайте насос, когда меняется час
if (timeinfo->tm_hour != old_hour && timeinfo->tm_min == 0)
{
digitalWrite(pump1Pin, HIGH); // включить насос
old_hour = timeinfo->tm_hour; // сохраняем час, чтобы знать, когда он изменится
time_turned_on = millis(); // когда мы его включили?
}
// выключить насос через DTS секунд
if ((millis() - time_turned_on) >= (DTS * 1000))
{
digitalWrite(pump1Pin, LOW); // выключить насос
}
Как упоминается в комментариях, использование логики OR для проверки каждого из 24 возможных часов в одной строке — крайне неэффективный способ. Если вам непонятно, почему, позвольте мне объяснить, прежде чем я отвечу на ваш вопрос. В вашем фрагменте кода вы проверяете 3 критерия: час равен 6, минута равна 0, секунда меньше DTS? Затем вы запускаете несколько строк кода, которые идентичны строкам кода, которые вы планируете запускать через час.
Если вы проверяете каждый час отдельно, каждый раз, когда ваш цикл выполняется, один из циклов if будет оценивать истину для первого критерия. Каждый раз. Следовательно, единственное, что фактически определяет, должны ли выполняться ваши несколько строк кода, — это вторые два критерия, касающиеся минут и секунд. Поэтому вы можете удалить первый критерий из оператора if. Другими словами, if(timeinfo0>tm_min==0 && timeinfo->time_sec<DTS){ запустить код здесь} — это все, что вам нужно сделать.
Однако, поскольку этот подход может быть полезен и в других ситуациях, его всё равно стоит изучить. Можно сделать что-то вроде этого:
if ( (timeinfo->tm_hour==0 && timeinfo->tm_min==0 && timeinfo->time_sec < DTS) || (timeinfo->tm_hour==1 && timeinfo->tm_min==0 && timeinfo->time_sec < DTS) || (timeinfo->tm_hour==2 && timeinfo->tm_min==0 && timeinfo->time_sec < DTS) ..... || (timeinfo->tm_hour==23 && timeinfo->tm_min==0 && timeinfo->time_sec < DTS)){run code here}
Расширяя ответ InBedded16, с более «формальной логической» точки зрения вид...
У вас есть 24 условия, которые делают pump1State истинным, и все они выглядят
то же самое, за исключением часа, на который проводится проверка. Затем переменная
pump1State становится true, когда любое из условий истинно. Вы
поэтому можно объединить все эти условия в одно, используя или
Оператор (также пишется как ||). Условие включения (или сохранения)
тогда насос включен:
(hour == 0 and min == 0 and sec < DTS)
or (hour == 1 and min == 0 and sec < DTS)
...
or (hour == 23 and min == 0 and sec < DTS)
И вот здесь немного логики может помочь вам упростить выражение. Применяя дистрибутивность «и» над «или», можно разложить на множители тест на минуты и секунды, который дает вам это более простое выражение:
(hour == 0 or hour == 1 or ... or hour == 23) and min == 0 and sec < DTS
Однако, учитывая, что час — это целое число от 0 до 23, Заключенное в скобки подвыражение всегда истинно, поэтому:
true and min == 0 and sec < DTS
Учитывая, что true является тождеством для «и», вы можете удалить его
из выражения. В итоге получается просто:
min == 0 and sec < DTS
Вот почему вам говорят исключить час из уравнения: он Из простых логических рассуждений следует, что час на самом деле не имеет значения.
В реальном коде вы можете написать:
if (timeinfo->tm_min == 0 && timeinfo->tm_sec < DTS)
digitalWrite(pump1Pin, HIGH);
else
digitalWrite(pump1Pin, LOW);
Дополнено: Отвечаю на обновлённый вопрос.
Теперь время полива зависит от того, день сейчас или ночь. Вы можете все еще применяем дистрибутивность «и» над «или», как я показал выше, Независимо для дня и ночи. Тогда условие будет таким:
(hour == 6 or hour == 7 or ... or hour == 20) and min == 0 and sec < DTS
or
(hour == 21 or hour == 22 or ... or hour == 5) and min == 0 and sec < NTS
Выражения в скобках можно упростить:
(hour >= 6 and hour < 21) and min == 0 and sec < DTS
or
(hour >= 21 or hour < 6) and min == 0 and sec < NTS
Применяя снова принцип дистрибутивности, min == 0 можно разложить на множители:
min == 0 and
(
(hour >= 6 and hour < 21) and sec < DTS
or
(hour >= 21 or hour < 6) and sec < NTS
)
Это проще написать, если определить вспомогательную логическую переменную
дневное время, которое соответствует часу >= 6 и часу < 21. Используя эту переменную ,
условие становится:
min == 0 and ((daytime and sec < DTS) or (not daytime and sec < NTS))
В качестве альтернативы вы можете определить целочисленную переменную watering_time, которая
DTS днём и NTS ночью. Тогда условие будет таким:
то же, что и в предыдущей версии этого ответа, с заменой DTS на
время_полива:
min == 0 and sec < watering_time
В коде это можно записать так:
int watering_time;
if (timeinfo->tm_hour >= 6 && timeinfo->tm_hour < 21)
watering_time = DTS;
else
watering_time = NTS;
pump1State = mtimeinfo->tm_min == 0 && timeinfo->tm_sec < watering_time;
Я пробовал разные способы использования ||, но как только добавляю второй ||, всё работает не так, как я ожидал. Я собрал схему для испытательного стенда, чтобы проверять результаты каждого изменения скетча. Проблема была в часах, но я отредактировал минуты во время поиска неисправностей, чтобы не ждать так долго результатов. Я работал над этой проблемой вместе со знакомым программистом на пенсии (моей женой), и она придумала что-то похожее на то, что предложил Эдгар Бонет. Вот решение для сокращения количества линий в скетче:
// установка времени включения и выключения насоса 1
// Если логическое значение становится истинным, вывод 25 ESP-32 становится ВЫСОКИМ, пока логическое значение снова не станет ложным
bool pump1State = false;
// Поливать дерево бонсай каждый час с 6 утра до 9 вечера в течение DTS секунд
if (timeinfo->tm_hour >=6 && timeinfo->tm_hour <=21 && timeinfo->tm_min == 0 && timeinfo->tm_sec <DTS) pump1State = true;
// Поливайте дерево бонсай каждый час с 22:00 до 5:00 в течение указанного количества секунд.
if (timeinfo->tm_hour >=22 || timeinfo->tm_hour <=5 && timeinfo->tm_min == 0 && timeinfo->tm_sec < NTS) pump1State = true;
if (pump1State == true)
digitalWrite(pump1Pin, HIGH);
else
digitalWrite(pump1Pin, LOW);
// установить время включения и выключения насоса 2
// Если логическое значение становится истинным, вывод 27 ESP-32 становится ВЫСОКИМ, пока логическое значение снова не станет ложным
bool pump2State = false;
// Водный моховой сад в течение получаса с 6 утра до 9 вечера для DTS количества секунд
if (timeinfo->tm_hour >=6 && timeinfo->tm_hour <=5 && timeinfo->tm_min == 30 && timeinfo->tm_sec <DTSM) pump2State = true;
// Водный моховой сад в течение получаса с 22:00 до 5:00 в течение NTS-количества секунд
if (timeinfo->tm_hour >=22 || timeinfo->tm_hour <=5 && timeinfo->tm_min == 30 && timeinfo->tm_sec <NTSM) pump2State = true;
if (pump2State == true)
digitalWrite(pump2Pin, HIGH);
else
digitalWrite(pump2Pin, LOW);
Вы пропустили скобки вокруг timeinfo->tm_hour >=22 || timeinfo->tm_hour <=5: оператор && имеет более высокий приоритет, чем ||, и без этих скобок выражение было бы интерпретировано как tm_hour >=22 || (tm_hour <=5 && tm_min == 0 && tm_sec < NTS), а это не то, что вы имеете в виду., @Edgar Bonet
Спасибо, теперь понятно, почему ночью вода полностью ушла. Я проверил около 23:20, насос работал постоянно., @Tom Lahue
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Печать string and integer LCD
- устаревшее преобразование из строковой константы в 'char*'
если вам нужно выполнять действие каждый час, то основывайте действие на минутах, а не на часах, @jsotola
пожалуйста, включите весь ваш код, @jsotola
Да, вы можете поместить текущие логические операторы в один блок в скобках, а затем использовать оператор || для ИЛИ с логическим оператором 7am, также заключенным в скобки, и повторить это 24 раза, чтобы охватить каждый час. Но, как сказал jsotola, зачем вам оператор if для каждого часа, если вы делаете одно и то же каждый час? Уберите логическое уравнение tm_hour, и вы получите тот же результат., @InBedded16
Проголосовал за возобновление обсуждения: Вопрос был достаточно ясен мне и двум комментаторам, которые предложили разумные решения. По крайней мере одно из них достаточно полно, чтобы считаться ответом., @JRobert
Ваш код не скомпилировался бы, потому что вам нужна точка с запятой после
const int pum1Pin = 25, а также послеint DTS = 42., @Nick Gammonjsotola, ваше решение убрать часы отличное, за исключением того, что я ошибся и забыл, что все 24 часа — это разные вещи. Кроме того, вы правы, что мне следует включить весь код. Тогда вы могли бы заметить, что я забыл о NTS (секундах ночного времени). Это также помогло бы мне не упустить ; в моей сокращённой версии кода, как заметил Ник Гэммон. К тому же, это может помочь другим учиться на моём коде или ошибках. Я отредактировал свой вопрос и включил весь код. Спасибо. Вернусь, когда попробую кое-что, но на этот раз отслеживайте их., @Tom Lahue