подскажите как остановить цикл For.

SKub
Offline
Зарегистрирован: 19.04.2015

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();
   
      }
      }}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SKub, во-первых у вас при вставлении скетча слетел формат. В сетапе какие-то запятые, в начале loop какие-то лишние кавычки. Объявления DAT и diodred вообще не видно. Исправьте.  Во-вторых вы объявляете ряд констант через #define, но не даёте компилятору информацию о том, какой это тип данных. Это может привести к глюкам . Загляните сюда http://arduino.ru/Reference/IntegerConstants , и поставьте директивы данных. И во второй строке -лучше сразу пересчитать. Компилятор конечно сразу перемножит, а вот человеку смотреть неудобно. Ну и дальше видно будет :)

SKub
Offline
Зарегистрирован: 19.04.2015

Извиняюсь за мусор в скетче остался с прошлых эксперементов со временем.

почистил.

#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();
   
      }
      }

 

SKub
Offline
Зарегистрирован: 19.04.2015

70 строка включает реле. 1 раз на заданное время.

76 должна выключить через заданное время. но это происходит только раз, далее просто щелкнет и все.

временно закоментир.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SKub, к сожалению вам трудно помочь, в данном скетче совершенно нет фундамента, за который можно было бы зацепиться, что-бы на этой основе переделать.  Проблема  самая традиционная для начинающих -раздутый путанный loop. Вы хотите решить одними операторами if довольно не тривиальную задачу. Как минимум нужно использовать флаги, желательно и функции. У вас сейчас на мой взгляд один путь что-б не взорвался мозг - сначала отбросить всё лишнее и маловажное. Т.е. опрашивать ацп покамест  не по времени, а на каждом круге loop. С питанием датчика лучше тоже пока не заморачиваться. Почитайте для начала про работу по флагам. Когда уловите идею, то всё начнёт получаться.

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Добрый день

Скажите как прервать выполение в цикле по нажатию кнопки.

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;

  //}
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Считать в цикле кнопку и сделать break, если тру.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Идея применить break обычно вытекает из ошибок проектирования - неправильного выбора типа цикла.

bwn
Offline
Зарегистрирован: 25.08.2014

Полностью согласен, некрасивый костыль. Но вопрос был именно про него. Второй способ убраться из фор-а еще хуже. 

okta
Offline
Зарегистрирован: 10.01.2015

1. Выход по break (плохой вариант)

2. for заменить на while, нажатие кнопки проверять в условии цикла (норм, если цикл не тяжелый)

3. for заменить на while, нажатие кнопки ловить прерываением и передавать на проверку в условие цикла

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Из подпограммы не выходит.

Извините, неправильно задан вопрос был, нужен выход из подпрограммы  mode_8_loop.

Если кнопка нажата - то переходим в подпрограмму далее - mode_9_loop

okta
Offline
Зарегистрирован: 10.01.2015

тогда в п 2 и 3 меняем начало:

Все for заменить на while, ... и далее по тексту

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vidro_boltiv пишет:

Из подпограммы не выходит.

Извините, неправильно задан вопрос был, нужен выход из подпрограммы  mode_8_loop.

Если кнопка нажата - то переходим в подпрограмму далее - mode_9_loop

Тогда не break, а return.

 

PS. Вам бы учебник почитать.

b707
Онлайн
Зарегистрирован: 26.05.2017

vidro_boltiv  в соседней теме я дал пример решения вашей проблемы - специально и назвал "как проверить кнопку из цикла". Можете брать код и использовать как хотите. Но чтобы приспособить его к вашей задаче - надо более-менее владеть языком Си.

Если вы поднимете клаза к верху страницы - там есть ссылка "Программирование". В ней всего-то около 30 базовых конструкций языка.  Все это можно освоить за один вечер. Люди за два-три месяца успевают выучить иностранный язык. Вы на форуме с ноября - а до сих пор break от return не отличаете.

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Готов к тухлым помидорам. Но есть ли желающие помочь? (Откоректировать, или написать робоччий код - за определенную суму денег.).