вы не подскажете, как мне после отработки 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 мин. если по таймеру, то первый цикл проходит как надо, а на втором цикле просто моргнет очень быстро, и не включается на заданное время.
я уже не знаю где ошибка.
#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 , и поставьте директивы данных. И во второй строке -лучше сразу пересчитать. Компилятор конечно сразу перемножит, а вот человеку смотреть неудобно. Ну и дальше видно будет :)
Извиняюсь за мусор в скетче остался с прошлых эксперементов со временем.
почистил.
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> // #include <dht11.h> int dat1 = 0; //объявляем глобальную переменную, сенсор влажности. int DAT = 4; //присваиваем 8-му пину имя DAT питание на датчик. int diodRed=5; // В место диода подключить реле для полива. int diodBlue; float TempMillis; int ledState = LOW; dht11 sensor; #define POLL_INTERVAL 4000 // опрос датчика интервал #define POLL_PERIOD (20000) // через сколько все отключится // 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() // ------------------------------------------------------------ { if ((time_poll==time_start) || ((millis()-time_poll)>POLL_INTERVAL)) { unsigned long currentMillis = millis(); // ****************************************************** digitalWrite (DAT, HIGH); // Включаем питание на датчик delay (200); // задержка (для стабилизации питания датчика) dat1 = analogRead (2); // Считываем показания датчика (датчик в данном случае подключен ко входу 2 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)); } /* lcd.setCursor(12, 0); lcd.print(dat1); // выводим значение с датчика на LCD delay (500); */ Serial.print("Vlajnost "); Serial.print(dat1); // Влажность земли Serial.println(" %%"); Serial.println(); time_poll = millis(); } }70 строка включает реле. 1 раз на заданное время.
76 должна выключить через заданное время. но это происходит только раз, далее просто щелкнет и все.
временно закоментир.
SKub, к сожалению вам трудно помочь, в данном скетче совершенно нет фундамента, за который можно было бы зацепиться, что-бы на этой основе переделать. Проблема самая традиционная для начинающих -раздутый путанный loop. Вы хотите решить одними операторами if довольно не тривиальную задачу. Как минимум нужно использовать флаги, желательно и функции. У вас сейчас на мой взгляд один путь что-б не взорвался мозг - сначала отбросить всё лишнее и маловажное. Т.е. опрашивать ацп покамест не по времени, а на каждом круге loop. С питанием датчика лучше тоже пока не заморачиваться. Почитайте для начала про работу по флагам. Когда уловите идею, то всё начнёт получаться.
Добрый день
Скажите как прервать выполение в цикле по нажатию кнопки.
void mode_8_loop() { Serial.println("leds_88"); // Для отладки // Змінні для Режима-8; byte red = 0; byte green = 0; byte blue = 255; int pixel_size = 20; //bool buttonPressed=0; //while (buttonPressed==0) { for(int i = 0; i < max_led - pixel_size - 2; i++) { for(int i = 0; i < max_led; i++ ) { pixels.setPixelColor(i, pixels.Color(0, 0, 0)); } pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); for(int k = 1; k <= pixel_size; k++) { pixels.setPixelColor(i+k, pixels.Color(red, green, blue)); } pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue)); pixels.show(); delay(1); } for(int i = max_led - pixel_size - 2; i > 0; i--) { for(int i = 0; i < max_led; i++ ) { pixels.setPixelColor(i, pixels.Color(0, 0, 0)); } pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); for(int k = 1; k <= pixel_size; k++) { pixels.setPixelColor(i+k, pixels.Color(red, green, blue)); } pixels.setPixelColor(i + pixel_size + 1, pixels.Color(red, green, blue)); pixels.show(); delay(1); } //if(key_pin==1) buttonPressed=1; //} }Считать в цикле кнопку и сделать 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 не отличаете.
Готов к тухлым помидорам. Но есть ли желающие помочь? (Откоректировать, или написать робоччий код - за определенную суму денег.).