Как остановить или временно прервать цикл For

Тема в разделе "Arduino & Shields", создана пользователем Крапивин, 12 апр 2015.

  1. Крапивин

    Крапивин Нерд

    так как мне сделать чтоб для начала выводились температура с датчиков ?
    как вы
    Unixon
    сказали не нужен цикл. как узнать об изменении температуры. ? датчики о себе не расскажут
    если их не спросить об этом.
    и как мне послать команду радио розеткам ? можно без вывода Т на экран.
    есть такой скетч. посмотреть как это работает ?
     
  2. Unixon

    Unixon Оракул Модератор

    Вы все как-то совсем неверно поняли.
    У вас и так программа крутится по кругу.
    Если что-то нужно не делать - это оформляется не в виде выхода из цикла, а в виде условного (не-)исполнения части тела цикла. С розетками то же самое - приняли команду и отдали управляющий сигнал на ключ (реле, симистор, и т.п.).
     
  3. Unixon

    Unixon Оракул Модератор

    Код (Text):

    char cmd = 0;

    void loop()
    {
    //опрос термодатчиков
    //опрос радиомодуля
    //еще чего-нибудь
    ...
    if (Serial.available()) cmd = Serial.read();
    switch (cmd)
    {
      case '0':
      {
       //вывод данных термодатчиков
       break;
      }
      case '1':
      {
       //вывод данных радиомодуля
       break;
      }
      case '2':
      {
       //вывод данных еще чего-нибудь
       break;
      }
      case 'A':
      {
       digitalWrite(PIN_RELAY, HIGH);
       cmd = 0;
       break;
      }
      case 'B':
      {
       digitalWrite(PIN_RELAY, LOW);
       cmd = 0;
       break;
      }
    }
    }
     
     
    Крапивин нравится это.
  4. Крапивин

    Крапивин Нерд

    у меня 2 варианта. как раз и путают. 1 вариант всё работает. НО нет опроса датчиков температуры, нажииииМАЮ 8 и 1 раз выскакивает показание датчика. нет цыкла в void loop() датчик показывает температуру 1 раз и не меняется.
     
  5. Крапивин

    Крапивин Нерд

    у меня 2 варианта. как раз и путают. 1 вариант всё работает. НО нет опроса датчиков температуры, нажииииМАЮ 8 и 1 раз выскакивает показание датчика. нет цыкла в void loop() датчик показывает температуру 1 раз и не меняется. приходится писать цикл, тогда видно как датчик меняет температуру, но все остальное ни на что не реагирует.
     
    Последнее редактирование: 12 апр 2015
  6. iglooshtosser

    iglooshtosser Гик

    Конечно ждет.
    Вот тут: while (Serial.available() == 0); //функция Serial.аvailable() проверяет, есть ли в COM порте
    пока не появятся данные в буфере сом-порта.
    замените while на if и ждать не будет.

    Логика будет такая: если что-то есть - читаем, если нет работаем ещё одну итерацию по старым данным.

    И ещё. Если у вас датчик отвечает долго, а датчиков много, то может быть имеет смысл опрашивать их не подряд, а по очереди. Опросили 1 датчик, что-то сделали, опросили второй... и т.д.
    Так у вас лаг сократится до времени ответа одного датчика.

    Хорошую идею предложили выше: пусть датчики опрашивает отдельный контроллер. И когда все опросит, дерогает прерыванием основной и передает ему данные. Тогда с точки зрения основного (того что на связи с оператором) считывание данных будет занимать единицы миллисекунд.
     
  7. Крапивин

    Крапивин Нерд





    Unixon БОЛЬШОЕ Спасибо за Код.
    и наставление куда двигаться.
    Буду сегодня пробовать.
     
  8. Крапивин

    Крапивин Нерд

    Unixon
    Большое вам спасибо за ваши советы и идеи. Сейчас всё работает так как надо.
    По вашим наводкам.
     
  9. Крапивин

    Крапивин Нерд

    Unixon Здравствуйте

    написал скетч авто полив. но работает не стабильно.
    вы не подскажете, как мне после отработки 1 функции , включить реле но только на 3 мин, реле включается если земля очень сухая, цикл проверки идет 1 раз в 15 мин. если оставить как есть, поливалка работает 15 мин, это много и перелив получается. Перепробовал всё. если просто моргать диодом, это временно вместо реле, он моргает тоже с интервалом в 15 мин. если по таймеру, то первый цикл проходит как надо, а на втором цикле просто моргнет очень быстро, и не включается на заданное время.

    я уже не знаю где ошибка.



    //#include <dht11.h>

    int dat1 = 0; //объявляем глобальную переменную, сенсор влажности.
    int diodRed=5; // В место диода подключить реле для полива.
    int diodBlue;

    float TempMillis;
    int ledState = LOW;

    dht11 sensor;

    #define POLL_INTERVAL 150000 // опрос датчика интервал
    #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); // для реле

    }

    void loop() // ------------------------------------------------------------
    {


    if ((time_poll==time_start) || ((millis()-time_poll)>POLL_INTERVAL))
    {
    unsigned long currentMillis = millis(); // ***********



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

    }
    }