Помогите разобраться с кодом для открывания форточки.
- Войдите на сайт для отправки комментариев
Приветствую.
С сыном совсем начинающие. Задумали сделать приблуду для теплицы. Принцип простой как лапоть - температура внутри теплицы выше 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 - это для примера, зависит от точности и шума датчика.