вы не подскажете, как мне после отработки 1 функции , включить реле но только на 3 мин, реле включается если земля очень сухая, цикл проверки идет 1 раз в 15 мин. если оставить как есть, поливалка работает 15 мин, это много и перелив получается. Перепробовал всё. если просто морнать диодом он моргает тоже с интервалом в 15 мин. если по таймеру, то первый цикл проходит как надо, а на втором цикле просто моргнет очень быстро, и не включается на заданное время.
я уже не знаю где ошибка.
#define POLL_INTERVAL 4000 // опрос датчика интервал
#define POLL_PERIOD (20*20*1000) // через сколько все отключится
// bool poll_sensor = false;
unsigned long time_start;
unsigned long time_poll;
long previousMillis = 0; // храним время последнего переключения светодиода
long interval = 2000;
void setup(){ // ---------------------------------------------------
Serial.begin(9600);
,
,
,
,
pinMode(diodRed,OUTPUT); // для реле
pinMode(DAT, OUTPUT); //используем 13 пин как выход (для включения/выключения датчика)
}
void loop() // ------------------------------------------------------------
{
int data[2];
,
,
,
,
,
}
}
if ((time_poll==time_start) || ((millis()-time_poll)>POLL_INTERVAL))
{
unsigned long currentMillis = millis();
digitalWrite (DAT, HIGH); // Включаем питание на датчик
delay (200); // задержка (для стабилизации питания датчика)
dat1 = analogRead (2); // Считываем показания датчика (датчик в данном случае подключен ко входу А0)
digitalWrite (DAT, LOW); // Выключаем питание датчика
if (analogRead(2) <= 450) // Очень влажная почва
{
// digitalWrite(diodBlue, HIGH);
Serial.print("Ochen Vlagno ");
digitalWrite(diodRed, LOW);
}
else if( analogRead(2)>450 && analogRead(2)<700)
{
Serial.print("Vlagnaya pochva "); // Влажная почва
digitalWrite(diodRed, LOW);
}
else
{
digitalWrite(diodRed,HIGH); // Сухая почва Тут реле влючается
Serial.print("Suhays pochva ");
if(millis() - previousMillis > interval) {
// сохраняем время последнего переключения
previousMillis = millis();
digitalWrite(diodRed,LOW); // должно выключится через заданный интервал
digitalWrite(diodRed,!digitalRead(diodRed));
}
Serial.print("Vlajnost ");
Serial.print(dat1); // Влажность земли
Serial.println(" %%");
Serial.println();
time_poll = millis();
}
}}
SKub, во-первых у вас при вставлении скетча слетел формат. В сетапе какие-то запятые, в начале loop какие-то лишние кавычки. Объявления DAT и diodred вообще не видно. Исправьте. Во-вторых вы объявляете ряд констант через #define, но не даёте компилятору информацию о том, какой это тип данных. Это может привести к глюкам . Загляните сюда http://arduino.ru/Reference/IntegerConstants , и поставьте директивы данных. И во второй строке -лучше сразу пересчитать. Компилятор конечно сразу перемножит, а вот человеку смотреть неудобно. Ну и дальше видно будет :)
SKub, к сожалению вам трудно помочь, в данном скетче совершенно нет фундамента, за который можно было бы зацепиться, что-бы на этой основе переделать. Проблема самая традиционная для начинающих -раздутый путанный loop. Вы хотите решить одними операторами if довольно не тривиальную задачу. Как минимум нужно использовать флаги, желательно и функции. У вас сейчас на мой взгляд один путь что-б не взорвался мозг - сначала отбросить всё лишнее и маловажное. Т.е. опрашивать ацп покамест не по времени, а на каждом круге loop. С питанием датчика лучше тоже пока не заморачиваться. Почитайте для начала про работу по флагам. Когда уловите идею, то всё начнёт получаться.
vidro_boltiv в соседней теме я дал пример решения вашей проблемы - специально и назвал "как проверить кнопку из цикла". Можете брать код и использовать как хотите. Но чтобы приспособить его к вашей задаче - надо более-менее владеть языком Си.
Если вы поднимете клаза к верху страницы - там есть ссылка "Программирование". В ней всего-то около 30 базовых конструкций языка. Все это можно освоить за один вечер. Люди за два-три месяца успевают выучить иностранный язык. Вы на форуме с ноября - а до сих пор break от return не отличаете.
Dimax Сдравствуйте .
вы не подскажете, как мне после отработки 1 функции , включить реле но только на 3 мин, реле включается если земля очень сухая, цикл проверки идет 1 раз в 15 мин. если оставить как есть, поливалка работает 15 мин, это много и перелив получается. Перепробовал всё. если просто морнать диодом он моргает тоже с интервалом в 15 мин. если по таймеру, то первый цикл проходит как надо, а на втором цикле просто моргнет очень быстро, и не включается на заданное время.
я уже не знаю где ошибка.
SKub, во-первых у вас при вставлении скетча слетел формат. В сетапе какие-то запятые, в начале loop какие-то лишние кавычки. Объявления DAT и diodred вообще не видно. Исправьте. Во-вторых вы объявляете ряд констант через #define, но не даёте компилятору информацию о том, какой это тип данных. Это может привести к глюкам . Загляните сюда http://arduino.ru/Reference/IntegerConstants , и поставьте директивы данных. И во второй строке -лучше сразу пересчитать. Компилятор конечно сразу перемножит, а вот человеку смотреть неудобно. Ну и дальше видно будет :)
Извиняюсь за мусор в скетче остался с прошлых эксперементов со временем.
почистил.
70 строка включает реле. 1 раз на заданное время.
76 должна выключить через заданное время. но это происходит только раз, далее просто щелкнет и все.
временно закоментир.
SKub, к сожалению вам трудно помочь, в данном скетче совершенно нет фундамента, за который можно было бы зацепиться, что-бы на этой основе переделать. Проблема самая традиционная для начинающих -раздутый путанный loop. Вы хотите решить одними операторами if довольно не тривиальную задачу. Как минимум нужно использовать флаги, желательно и функции. У вас сейчас на мой взгляд один путь что-б не взорвался мозг - сначала отбросить всё лишнее и маловажное. Т.е. опрашивать ацп покамест не по времени, а на каждом круге loop. С питанием датчика лучше тоже пока не заморачиваться. Почитайте для начала про работу по флагам. Когда уловите идею, то всё начнёт получаться.
Добрый день
Скажите как прервать выполение в цикле по нажатию кнопки.
Считать в цикле кнопку и сделать break, если тру.
Идея применить break обычно вытекает из ошибок проектирования - неправильного выбора типа цикла.
Полностью согласен, некрасивый костыль. Но вопрос был именно про него. Второй способ убраться из фор-а еще хуже.
1. Выход по break (плохой вариант)
2. for заменить на while, нажатие кнопки проверять в условии цикла (норм, если цикл не тяжелый)
3. for заменить на while, нажатие кнопки ловить прерываением и передавать на проверку в условие цикла
Из подпограммы не выходит.
Извините, неправильно задан вопрос был, нужен выход из подпрограммы mode_8_loop.
Если кнопка нажата - то переходим в подпрограмму далее - mode_9_loop
тогда в п 2 и 3 меняем начало:
Все for заменить на while, ... и далее по тексту
Из подпограммы не выходит.
Извините, неправильно задан вопрос был, нужен выход из подпрограммы mode_8_loop.
Если кнопка нажата - то переходим в подпрограмму далее - mode_9_loop
Тогда не break, а return.
PS. Вам бы учебник почитать.
vidro_boltiv в соседней теме я дал пример решения вашей проблемы - специально и назвал "как проверить кнопку из цикла". Можете брать код и использовать как хотите. Но чтобы приспособить его к вашей задаче - надо более-менее владеть языком Си.
Если вы поднимете клаза к верху страницы - там есть ссылка "Программирование". В ней всего-то около 30 базовых конструкций языка. Все это можно освоить за один вечер. Люди за два-три месяца успевают выучить иностранный язык. Вы на форуме с ноября - а до сих пор break от return не отличаете.
Готов к тухлым помидорам. Но есть ли желающие помочь? (Откоректировать, или написать робоччий код - за определенную суму денег.).