Выполнение программы по периодам

Тема в разделе "Arduino & Shields", создана пользователем miwany, 31 мар 2024.

  1. miwany

    miwany Нерд

    Доброго времени суток !
    Имею вот такой код (собрал с просторов интернета, адаптировал). На данный момент программа меня устраивает, но хочется "идеала". Подскажите где капнуть для решения пары вопросов:
    1. Как сделать повторение пары этапов в программе (указаны в коде: этапы 3 и 4 ?;
    2. Как вырубить Ардуинку после выполнения полного цикла программы ?;
    3. Почему то после вывода END включается реле и не отключается (стр. 135) ?!;
    4. Оптимизировать код...

    Код (C++):
    #include <Wire.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <LiquidCrystal_I2C.h>

    #define ONE_WIRE_BUS 12

    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensor(&oneWire);
    LiquidCrystal_I2C lcd(0x27, 20, 4);
    const int Fan = 4 ;
    const int Hat = 10 ;

    unsigned long p0 = 0;

    //Настройка работы
    int c1 = 0;                    // этап 1 - ожидание 1 мин
    unsigned long p1 = 5000;       // время
    byte f1 = 0;

    int c2 = 0;                    // этап 2 - включаем вентилятор, через 2 часа
    unsigned long p2 = 10000;      // время
    byte f2 = 0;
    // этап 3 и 4 повторить 3 раза ----------------------------------------------------------
    int c3 = 30;                   // этап 3 - температура, включаем нагреватель на 4 часа
    unsigned long p3 = 10000;      // время
    byte f3 = 0;

    int c4 = 0;                   //  этап 4 - выключаем нагреватель на 2 часа
    unsigned long p4 = 10000;     //  время
    byte f4 = 0;
    //---------------------------------------------------------------------------------------
    int c5 = 0;                   //  этап 5 - проветриваем 4 часа
    unsigned long p5 = 5000;      //  время
    byte f5 = 0;
    //Конец настройки работы

    void setup(void) {
      Serial.begin(9600);
      pinMode(Fan, OUTPUT);
      pinMode(Hat, OUTPUT);
      digitalWrite(Fan, LOW);
      digitalWrite(Hat, LOW);
      Wire.begin();
      lcd.init();
      lcd.backlight();
      sensor.begin();
      sensor.setResolution(12);
    }

    //отсчет обратного времени
    void Timer(unsigned long p) {
      lcd.setCursor(0, 0);
      //lcd.setCursor(0, 1);
      if (p != 0) {
        unsigned long time = (p - millis()) / 1000;
        if (time / 60 / 60 < 10) {lcd.print("0");}
        lcd.print(time / 60 / 60);
        lcd.print(":");
        if (time / 60 % 60 < 10) {lcd.print("0");}
        lcd.print((time / 60) % 60);
        lcd.print(":");
        if (time % 60 < 10) {lcd.print("0");}
        lcd.print(time % 60);
        } else {lcd.print("00:00:00");
      }
    }

    void loop(void) {
      float temp;
      sensor.requestTemperatures();
      temp = sensor.getTempCByIndex(0);
      delay(500);

      //включение таймера
      if (f1 == 0) {
        f1 = 1;
        p0 = p1 + millis();
      }
      if (f2 == 0 and f1 == 2) {
        digitalWrite(Fan, HIGH);
        f2 = 1;
        p0 = p2 + millis();
      }
      if (f3 == 0 and f2 == 2) {
        digitalWrite(Hat, HIGH);
        f3 = 1;
        p0 = p3 + millis();
      }
      if (f4 == 0 and f3 == 2) {
        digitalWrite(Hat, LOW);
        f4 = 1;
        p0 = p4 + millis();
      }
      if (f5 == 0 and f4 == 2) {
        f5 = 1;
        p0 = p5 + millis();
      }

      // поддержка тем-ры
      if (temp < c1 and f1 == 1 and digitalRead(Hat) == HIGH || temp < c2 and f2 == 1 and digitalRead(Hat) == HIGH || temp < c3 and f3 == 1 and digitalRead(Hat) == HIGH || temp < c4 and f4 == 1 and digitalRead(Hat) == HIGH || temp < c5 and f5 == 1 and digitalRead(Hat) == HIGH) {
        digitalWrite(Hat, LOW);
      }
      if (temp > c1 and f1 == 1 and digitalRead(Hat) == LOW || temp > c2 and f2 == 1 and digitalRead(Hat) == LOW || temp > c3 and f3 == 1 and digitalRead(Hat) == LOW || temp > c4 and f4 == 1 and digitalRead(Hat) == LOW || temp > c5 and f5 == 1 and digitalRead(Hat) == LOW) {
        digitalWrite(Hat, HIGH);
      }

      //обнуление таймера
      if (p0 < millis() and f1 == 1) {
        f1 = 2;
        p0 = 0;
        if (p2 == 0) { f2==2;  }
      }
      if (p0 < millis() and f2 == 1) {
        f2 = 2;
        p0 = 0;
        if (p3 == 0) { f3==2; }
      }
      if (p0 < millis() and f3 == 1) {
        f3 = 2;
        p0 = 0;
        if (p4 == 0) { f4==2; }
      }
      if (p0 < millis() and f4 == 1) {
        f4 = 2;
        p0 = 0;
        if (p5 == 0) { f5==2; digitalWrite(Hat, LOW); }
      }
      if (p0 < millis() and f5 == 1) {
        f5 = 2;
        p0 = 0;
        digitalWrite(Hat, LOW);
        digitalWrite(Fan, LOW);
        lcd.setCursor(0, 3);
        lcd.print("END");                 // почему то включает нагреватель ?!?! как остановить вырубить ардуинку после "END" ?!?!
      }

      //вывод на экран
      Timer(p0);
      lcd.setCursor(0, 1);
      lcd.print("T="+String(temp)+" C");

      lcd.setCursor(11, 0);
      if (f1==1) {lcd.print("1");}
      if (f2==1) {lcd.print("2");}
      if (f3==1) {lcd.print("3");}
      if (f4==1) {lcd.print("4");}
      if (f5==1) {lcd.print("5");}

      lcd.setCursor(15, 0);
      lcd.print("V-");
      lcd.setCursor(17, 0);
      if (digitalRead(Fan) == HIGH) {
        lcd.print("ON ");
        } else {
        lcd.print("OFF");
      }
      lcd.setCursor(15, 1);
      lcd.print("H-");
      lcd.setCursor(17, 1);
      if (digitalRead(Hat) == LOW) {
        lcd.print("ON ");
        } else {
        lcd.print("OFF");
      }
    }
     
     

    Вложения:

    • test_one.ino
      Размер файла:
      4,6 КБ
      Просмотров:
      51
  2. Airbus

    Airbus Радиохулиган Модератор

    Бомбу делаете?
     
  3. miwany

    miwany Нерд

    Да не, сушилка для пороха )))
     
  4. parovoZZ

    parovoZZ Гуру

    переписать на switch ... case, т.е. под автомат состояний.
     
  5. miwany

    miwany Нерд

    Сейчас больше всего интересуют 2 и 3 вопросы...
    При загрузке или перезагрузки ардуинки, реле пару раз включаются...
    Связано ли это с их уровнями (LOW и HIGH), хотя ставил и такие и такие, ничего не меняется ?!
     
  6. parovoZZ

    parovoZZ Гуру

    в момент загрузки МК все его выводы находятся третьем состоянии.
    При переводе пина в режим выхода, он сразу выдаст 0. При грамотном программировании это всё не вызывает проблем. Проблема в том, что дурина - очень медленная, поэтому и все процессы медленные.
     
  7. b707

    b707 Гуру

    нужно добавить физическую подтяжку на выводы, управляющие реле - чтобы при выключении или перезагрузке на выводах было стабильное состояние
     
    Ariadna-on-Line нравится это.