Помогите разобраться с кодом для открывания форточки.

Densoider
Offline
Зарегистрирован: 02.11.2012

Приветствую.

С сыном совсем начинающие. Задумали сделать приблуду для теплицы. Принцип простой как лапоть - температура внутри теплицы выше 25 градусов - открываем форточку, ниже - закрываем. Пищим (это ненужное украшательство ессно) и зажигаем диоды - красный когда горячо, зеленый когда холодно.

Теперь проблема - измучавшись с жужжащей сервой, изобрели велосипед - теперь серву подключаем и отключаем. НО! Делаем это каждый раз при каждом замере температуры. А нам нужно мучить серву только единожды. Т.е. стало холодно - закрыли и все. Дальше измеряем, измеряем, но серву не трогаем. До тех пор пока опять не потеплеет. Т.е. измерения проходят постоянно, а мотор подключаем только если есть изменения.

Думали использовать прерывания, но походу там только логический сигнал да и не разобрались.

Вот наш код открывания форточки-

#include "DHT.h"
#include <Servo.h>

Servo myservo; 

#define DHTPIN 2     // Куда подключен датчик.
#define DHTTYPE DHT11   // подключаем датчик типа DHT 11 

DHT dht(DHTPIN, DHTTYPE);
dht.begin();
  myservo.attach(9);  // Серва подключается к выводу 9 
  myservo.write(90); // Устанавливаем начальный угол сервы - открываем форточку наполовину
  pinMode(5,OUTPUT); // Зеленый диод
  pinMode(6,OUTPUT); // Красный диод
}

void loop() {

  float t = dht.readTemperature(); // читаем с датчика температуру
      if (t >= 25) {
        digitalWrite(6,HIGH); // Включаем красный диод
        digitalWrite(5,LOW);        
        myservo.attach(9); // Подключаем серву
        myservo.write(175); // Открываем форточку полностью
        delay(500); // Ждем пока откроется
        myservo.detach(); // Выключаем серву, чтобы не жжужала
        tone(8,220,100); // Контрольный писк высокого тона
        noTone(8); // Выключаем звук        
        }
      else {
        digitalWrite(6,LOW);
        digitalWrite(5,HIGH);        
        myservo.attach(9);
        myservo.write(5);
        delay(500);
        myservo.detach();
        tone(8,110,100);
        noTone(8);
       }
    delay(10000); // Ждем изменений т-ры
  
}

 

Borland
Offline
Зарегистрирован: 17.05.2012

ввести переменные LastStatusOfTheDoor - в каком состоянии была форточка в предыдущем цикле

#define OPENED   1

#define CLOSED 0

 

if t>25 {

     if (LastStatusOfTheDoor==CLOSED) {

        // включаем серву на открытие, зажигаем лампочки и проч

         LastStatusOfTheDoor=OPENED;

     }

} else { // холодно

     if (LastStatusOfTheDoor==OPENED) {

        // включаем серву на закрытие , зажигаем лампочки и проч

         LastStatusOfTheDoor=CLOSED;

     }

}

код не проверял , но смысл должен быть ясен.

Вызывает уважение решение вопроса проветривания теплицы с применением Ардуины  только в одном аспекте , а именно  привлечение сына к творчеству

Что касается практической и стоимостной реализации проекта должен заметить что труба с маслом с подсоединенным к ней амортизатором крышки багажника за 200 р, безо всяких датчиков и контроллеров решает проблему проветривания теплицы.

разные варианты описаны на форумах по теплицам mastercity.ru. Ни в коем случае не настаиваю на Вашем отказе от Ардуино.

 

 

 

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Вообще говоря, если делать автоматику по-уму, то привод снабжается концевыми датчиками крайних положений, что исключает из программы мертвые циклы ожидания delay(); и повышает безопасность всей конструкции.

С точки зрения "одновременной" обработки остальных событий, delay() лучше заменить на millis().

Еще в структуре c++ можно делать двойные условия, что-то типа if ( t >=25 && LastStatusOfTheDoor=CLOSED) {...}, будет ли работать на ардуине - не проверял.

Borland
Offline
Зарегистрирован: 17.05.2012

ну как минимум

if ( t >=25 && LastStatusOfTheDoor==CLOSED)

чтобы действительно не было наплевать в каком положении форточка

 

Densoider
Offline
Зарегистрирован: 02.11.2012

Огромное спасибо ответившим.

Именно так. Приучаю сына. И пример на Ардуино для него. Разберемся с простым - будем делать более сложный контроллер полива и т.п. и скорее всего на Attiny13 или 85м. Про фишку с амортизаторами знаю, но мне важно поставить цель перед ребенком и заставить его научиться добиваться ее. Вплоть до конкретной реализации с ЛУТом, травлей платы и прочим крайне интересным пацану занятием. Отвлекся, извините.

Спасибо еще раз.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А еще неплохо сделать гистерезис, т.е. открывать, например, на 26, а закрывать на 24, иначе возле 25 градусов будет датчик "болтаться" и получится вместо форточки вертолет :)

26 и 24 - это для примера, зависит от точности и шума датчика.