Нужно избавиться от делея

Тема в разделе "Arduino & Shields", создана пользователем igorochenka, 30 янв 2018.

  1. igorochenka

    igorochenka Нуб

    В скетче в части с датчиком движения в конце есть делей , который здесь нужен. Но просто делей оставить не получается ибо виснет весь скетч. Помогите исправить пожалуйста
    Код (C++):
    #include <Servo.h>  // Включаем библиотеку Сервопривода
    #include <DHT.h> // Включаем библиотеку Термометра
    const int move_sensor = 2; // Пин Датчика Приближения
    const int button = 4; // Пин Кнопки
    const int motor1_IN3 = 5; // Пин Мотора на Драйвер_1 L298N
    const int motor2_IN4 = 6; // Пин Мотора на Драйвер_2 L298N
    const int LEDpin1 = 7; // Пин Светодиода_1
    const int LEDpin2 = 8; // Пин Светодиода_2
    const int motor_ENB = 9; // Пин скорости мотора
    const int DHTPIN = 11; // Пин Датчика Температуры
    const int LEDpin3 = 12; // Пин Светодиода_3
    int state = LOW; // Переменная состояния выхода
    int reading; // Переменная значения кнопки в данный момент      
    int previous = HIGH; // Переменная предыдущего значения кнопки
    #define DHTTYPE DHT11 // Тип Датчика Температуры (DHT11)
    DHT dht(DHTPIN, DHTTYPE); // Обозначаем Датчик Температуры для Библиотеки

    long time = 0; // Переменная последнего времени , когда выход был переключен  
    long debounce = 200; // Переменная дребежжания

    Servo servo1; // Обозначаем Сервопривод для Библиотеки Сервоприводов

    void setup()
    {
      servo1.attach(3); // Подключить Сервопривод Пин - 3
      pinMode(A0, INPUT); // Пин A0 - вход (Фоторезистор)
      pinMode (2, INPUT); // Пин 2 - вход (Датчик приближения)
      pinMode(4, INPUT); // Пин 4 - вход (Кнопка)
      pinMode(5, OUTPUT); // Пин 5 - выход (Мотор)
      pinMode(6, OUTPUT); // Пин 6 - выход (Мотор)
      pinMode (7, OUTPUT); // Пин 7 - выход (Светодиод)
      pinMode (8, OUTPUT); // Пин 8 - выход (Светодиод)
      pinMode (9, OUTPUT); // Пин 9 - выход (Скорость мотора)
      pinMode (12, OUTPUT); // Пин 12 - выход (Светодиод)
    }

    void loop()
    {
    /* Гараж открывается и закрывается по кнопке. */
    {
        reading = digitalRead(4); // Присваивем переменной значение с 4 пина (кнопки)
       if (reading == HIGH && previous == LOW && millis() - time > debounce) // Если значение кнопки HIGH, до этого было LOW и нет дребежжания
         {
           if (state == HIGH) // Если значение выхода HIGH , то сделать LOW.
            state = LOW;
           else // Иначе оставить
            state = HIGH;
           time = millis();
           }
        digitalWrite(8, state); // Значение светодиода = состоянию выхода
       if (state == HIGH) // Если значение выхода HIGH , то сервопривод на угол 0
         {
            servo1.write(0);
         }
       else   // Иначе на 90
         {                  
            servo1.write(90);
         }
        previous = reading;
    }

    /* Свет включается , если на улице темно. */
    {
       if (analogRead(A0) < 150) // Если значение фоторезистора меньше 150 , то включить светодиод
       {
          digitalWrite(12, HIGH);
       }
       else
       {
          digitalWrite(12, LOW); // Иначе выключить
       }
    }

    /* Если температура больше 27 градусов , то включается вентилятор. */
    {
       float t = dht.readTemperature();
       if (t > 27)
       {
          digitalWrite (6, HIGH); // Включить мотор на скорость 200
          digitalWrite (5, LOW);
          analogWrite(9,200);
       }
       else // Иначе выключить
       {
          digitalWrite (6, LOW);
          digitalWrite (5, LOW);
       }
    }
    /* Если есть движение , то включить свет. */
    {
       int move; // Переменной move присвоить значение Датчика движения          
        move = digitalRead (2);    
       if(move == HIGH) // Если есть движение , то включить светодиод и не выключать 40 секунд            
       {        
          digitalWrite (7, HIGH);
          delay (40000)
          digitalWrite (7, LOW);
       }
       else // Иначе выключить
       {
          digitalWrite (7, LOW);
       }
    }
    }
     
    Последнее редактирование: 30 янв 2018
  2. DIYMan

    DIYMan Guest

    Для вставки кода скетча есть кнопочка "<>" на панели инструменнтов редактора.
     
  3. igorochenka

    igorochenka Нуб

    спасибо) по теме не знаете?
     
  4. qwone

    qwone Гик

    delay проще в использовании, а millis требует более структурированую программу. Конкретно, пока вы не научитесь такие программы писать, то вы будете топтаться на месте. Поэтому более опытные помалкивают на ваш вопрос.
     
  5. igorochenka

    igorochenka Нуб

    Я написал, однако не работает как надо. Не скажите, в чём проблема?



    Код (C++):
    #include <Servo.h> // Включаем библиотеку Сервопривода
    #include <DHT.h> // Включаем библиотеку Термометра
    const int move_sensor = 2; // Пин Датчика Приближения
    const int button = 4; // Пин Кнопки
    const int motor1_IN3 = 5; // Пин Мотора на Драйвер_1 L298N
    const int motor2_IN4 = 6; // Пин Мотора на Драйвер_2 L298N
    const int LEDpin1 = 7; // Пин Светодиода_1
    const int LEDpin2 = 8; // Пин Светодиода_2
    const int motor_ENB = 9; // Пин скорости мотора
    const int DHTPIN = 11; // Пин Датчика Температуры
    const int LEDpin3 = 12; // Пин Светодиода_3
    long long last;
    int state = LOW; // Переменная состояния выхода
    int reading; // Переменная значения кнопки в данный момент
    int previous = HIGH; // Переменная предыдущего значения кнопки
    #define DHTTYPE DHT11 // Тип Датчика Температуры (DHT11)
    DHT dht(DHTPIN, DHTTYPE); // Обозначаем Датчик Температуры для Библиотеки
    long time = 0; // Переменная последнего времени , когда выход был переключен
    long debounce = 200; // Переменная дребежжания
    Servo servo1; // Обозначаем Сервопривод для Библиотеки Сервоприводов
    void setup()
    {
    servo1.attach(3); // Подключить Сервопривод Пин - 3
    pinMode(A0, INPUT); // Пин A0 - вход (Фоторезистор)
    pinMode (2, INPUT); // Пин 2 - вход (Датчик приближения)
    pinMode(4, INPUT); // Пин 4 - вход (Кнопка)
    pinMode(5, OUTPUT); // Пин 5 - выход (Мотор)
    pinMode(6, OUTPUT); // Пин 6 - выход (Мотор)
    pinMode (7, OUTPUT); // Пин 7 - выход (Светодиод)
    pinMode (8, OUTPUT); // Пин 8 - выход (Светодиод)
    pinMode (9, OUTPUT); // Пин 9 - выход (Скорость мотора)
    pinMode (12, OUTPUT); // Пин 12 - выход (Светодиод)
    }
    void loop()
    {
    /* Гараж открывается и закрывается по кнопке. */
    {
    reading = digitalRead(4); // Присваивем переменной значение с 4 пина (кнопки)
    if (reading == HIGH && previous == LOW && millis() - time > debounce) // Если значение кнопки HIGH, до этого было LOW и нет дребежжания
    {
    if (state == HIGH) // Если значение выхода HIGH , то сделать LOW.
    state = LOW;
    else // Иначе оставить
    state = HIGH;
    time = millis();
    }
    digitalWrite(8, state); // Значение светодиода = состоянию выхода
    if (state == HIGH) // Если значение выхода HIGH , то сервопривод на угол 0
    {
    servo1.write(0);
    }
    else // Иначе на 90
    {
    servo1.write(90);
    }
    previous = reading;
    }
    /* Свет включается , если на улице темно. */
    {
    if (analogRead(A0) < 150) // Если значение фоторезистора меньше 150 , то включить светодиод
    {
    digitalWrite(12, HIGH);
    }
    else
    {
    digitalWrite(12, LOW); // Иначе выключить
    }
    }
    /* Если температура больше 27 градусов , то включается вентилятор. */
    {
    float t = dht.readTemperature();
    if (t > 27)
    {
    digitalWrite (6, HIGH); // Включить мотор на скорость 200
    digitalWrite (5, LOW);
    analogWrite(9,200);
    }
    else // Иначе выключить
    {
    digitalWrite (6, LOW);
    digitalWrite (5, LOW);
    }
    }
    /* Если есть движение , то включить свет. */
    {
    int move; // Переменной move присвоить значение Датчика движения
    move = digitalRead (2);
    if(move == HIGH) // Если есть движение , то включить светодиод и не выключать 40 секунд
    {
    digitalWrite (7, HIGH);
    last = millis();
    }
    else // Иначе выключить
    {
    digitalWrite (7, LOW);
    }
    }
    if(millis() - last > 40000){
    digitalWrite (7, LOW);
    }
    }
     
  6. b707

    b707 Гуру

    А кто ж знает, как вам надо
     
  7. igorochenka

    igorochenka Нуб

    Надо , чтобы если есть движение, то диод горел ещё 40 секунд (как я указал для наглядности в начале темы.)
    Попробовал ещё чуть по другому , тож не работает как надо
    Код (C++):
    move = digitalRead (2);
    if (move == HIGH && temp == 0) // Если есть движение , то включить светодиод и не выключать 40 секунд
    {
    digitalWrite (7, HIGH);
    temp = 1;
    }
    t2 = millis();
    if (temp = 1){
    t1 = millis();
    if (t1 - t2 > 40000){
    if ( move == HIGH) t2=t1;//прошло 40с, движение ЕСТЬ, ещё 40с ждём
    if ( move == LOW) {
    digitalWrite (7, LOW);// прошло 40с, движения НЕТ, вырубаем))
    temp = 0;
    }
    }
    }
     
  8. b707

    b707 Гуру

    строчку
    t2 = millis();
    перенесите внутрь скобки выше - иначе у вас t2 будет при каждом проходе цикла обновлятся и 40сек интервал никогда не наступит.

    Вы, похоже, совсем логику кода с миллис не понимаете...
     
  9. DetSimen

    DetSimen Guest

    этта неправильно. проверка (temp = =1) делаеца.
     
    b707 нравится это.
  10. b707

    b707 Гуру

    ну, да, еще и это