Помогите разобраться с кодом для открывания форточки.
- Войдите на сайт для отправки комментариев
Приветствую.
С сыном совсем начинающие. Задумали сделать приблуду для теплицы. Принцип простой как лапоть - температура внутри теплицы выше 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); // Ждем изменений т-ры
}
ввести переменные LastStatusOfTheDoor - в каком состоянии была форточка в предыдущем цикле
#define OPENED 1
#define CLOSED 0
if t>25 {
if (LastStatusOfTheDoor==CLOSED) {
// включаем серву на открытие, зажигаем лампочки и проч
LastStatusOfTheDoor=OPENED;
}
} else { // холодно
if (LastStatusOfTheDoor==OPENED) {
// включаем серву на закрытие , зажигаем лампочки и проч
LastStatusOfTheDoor=CLOSED;
}
}
код не проверял , но смысл должен быть ясен.
Вызывает уважение решение вопроса проветривания теплицы с применением Ардуины только в одном аспекте , а именно привлечение сына к творчеству
Что касается практической и стоимостной реализации проекта должен заметить что труба с маслом с подсоединенным к ней амортизатором крышки багажника за 200 р, безо всяких датчиков и контроллеров решает проблему проветривания теплицы.
разные варианты описаны на форумах по теплицам mastercity.ru. Ни в коем случае не настаиваю на Вашем отказе от Ардуино.
Вообще говоря, если делать автоматику по-уму, то привод снабжается концевыми датчиками крайних положений, что исключает из программы мертвые циклы ожидания
delay(); и повышает безопасность всей конструкции.С точки зрения "одновременной" обработки остальных событий, delay() лучше заменить на millis().
Еще в структуре c++ можно делать двойные условия, что-то типа if ( t >=25 && LastStatusOfTheDoor=CLOSED) {...}, будет ли работать на ардуине - не проверял.
ну как минимум
if ( t >=25 && LastStatusOfTheDoor==CLOSED)
чтобы действительно не было наплевать в каком положении форточка
Огромное спасибо ответившим.
Именно так. Приучаю сына. И пример на Ардуино для него. Разберемся с простым - будем делать более сложный контроллер полива и т.п. и скорее всего на Attiny13 или 85м. Про фишку с амортизаторами знаю, но мне важно поставить цель перед ребенком и заставить его научиться добиваться ее. Вплоть до конкретной реализации с ЛУТом, травлей платы и прочим крайне интересным пацану занятием. Отвлекся, извините.
Спасибо еще раз.
А еще неплохо сделать гистерезис, т.е. открывать, например, на 26, а закрывать на 24, иначе возле 25 градусов будет датчик "болтаться" и получится вместо форточки вертолет :)
26 и 24 - это для примера, зависит от точности и шума датчика.