Официальный сайт компании Arduino по адресу arduino.cc
Управление поддувалом котла отопления.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 09/01/2017 - 16:18
Здравствуйте!
Собрал скетч и все вроде нечего но есть косяк! серва дребезжит, сделал так чтобы серва включалась в определенные интервалы температуры, но хотелось бы избавится от дребезга совсем.
Спасибо заранее!
#include <LiquidCrystal.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Servo.h> OneWire oneWire(15); DallasTemperature ds(&oneWire); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Servo serv; int alarm = 12; // подача сигнализации перегрева int motor = 3; // управление насосом int Tnight = 60; // по умолчанию температура закрытия заслонки ночь int Tday = 80; // по умолчанию температура закрытия заслонки ночь int TzadN = 50; // по умолчанию температура включения насоса int TzadA = 100; // по умолчанию температура включения сигнализации int list;// byte E; // для вывода ошибки датчика температуры int Tzad; // для переключения между день и ночь int mode=0; // переключение листов select key 1 DeviceAddress sensor1 = {0x28, 0xEE, 0x41, 0x3E, 0x16, 0x16, 0x01, 0xDE}; byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; } //// void tit(int titul) { if (titul == 0) { lcd.setCursor(0, 0); lcd.print("NIGHT "); lcd.setCursor(12,0); lcd.print(" DAY"); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(3,1); lcd.print("C "); lcd.setCursor(1,1); lcd.print(Tnight); lcd.setCursor(3,1); lcd.print("C"); lcd.setCursor(13,1); lcd.print(Tday); lcd.setCursor(15,1); lcd.print("C"); lcd.setCursor(6, 1); lcd.print(ds.getTempC(sensor1)); lcd.setCursor(10,1); lcd.print("C "); } } void naklon(){ // наклон от температуры serv.attach(12); if (Tzad < ds.getTempC(sensor1)) { serv.write(0); } if (((Tzad-5) < ds.getTempC(sensor1))&&(Tzad > ds.getTempC(sensor1))){ serv.write(50); } if ((Tzad-5) > ds.getTempC(sensor1)) { serv.write(180); } } void setList(int List) { // листы на экране if (List == 0) { tit(0); lcd.setCursor(6,0); lcd.print("<= "); list = 0; } else if (List == 1) { tit(0); lcd.setCursor(6,0); lcd.print(" =>"); list = 1;} else if (List == 2) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Set"); lcd.setCursor(4, 0); lcd.print("(HACOC)"); lcd.setCursor(6, 1); lcd.print(TzadN); lcd.setCursor(12, 1); lcd.print(int(ds.getTempC(sensor1))); lcd.setCursor(15, 1); lcd.print("C"); list = 2;} else if (List == 3) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Set"); lcd.setCursor(4, 0); lcd.print("(ALARM) "); lcd.setCursor(6, 1); lcd.print(TzadA); lcd.setCursor(12, 1); lcd.print(int(ds.getTempC(sensor1))); lcd.setCursor(15, 1); lcd.print("C"); list = 3;} } void setup() { pinMode(alarm, OUTPUT); pinMode(motor, OUTPUT); Serial.begin(9600); lcd.begin(16, 2); ds.begin(); E= ds.getDeviceCount(); } void loop(){ /////// ошибка градусника ds.requestTemperatures(); ds.begin(); if(ds.getDeviceCount()!= E){ lcd.clear(); lcd.setCursor(4, 0); lcd.print("(Ds ERROR)"); lcd.setCursor(6, 1); lcd.print("Mon"); serv.write(0); digitalWrite(motor, HIGH); delay(5000); } /////////////////////////// byte KEY = key(); // переключение листов if (KEY == 1) { mode ++ ; } if (mode == 4) mode=0; setList(mode); ///// температура управления задвижой ///// if (list==0) { if (KEY == 3) { Tnight = Tnight +5; } if (KEY == 4) { Tnight = Tnight -5; } Tzad = Tnight; } if (list==1) { if (KEY == 3) { Tday = Tday +5; } if (KEY == 4) { Tday = Tday -5; } Tzad = Tday; } ///// температура управления насосом ////// if ((KEY == 3)&&(list==2)) { TzadN = TzadN +5; setList(2); } if ((KEY == 4)&&(list==2)) { TzadN = TzadN -5; setList(2); } //////// alarm if ((KEY == 3)&&(list==3)) { TzadA = TzadA +5; setList(3); } if ((KEY == 4)&&(list==3)) { TzadA = TzadA -5; setList(3); } //////// задвижка ///////////// if (((Tzad-1 < ds.getTempC(sensor1))&&(Tzad+1 > ds.getTempC(sensor1))) || ((Tzad-6 < ds.getTempC(sensor1))&&(Tzad-4 > ds.getTempC(sensor1)))) { naklon(); } else { serv.detach(); } /////////////насос////////// if (TzadN > ds.getTempC(sensor1)) { digitalWrite(motor, LOW); } if (TzadN < ds.getTempC(sensor1)) { digitalWrite(motor, HIGH); } /// СИГНАЛ /// if (ds.getTempC(sensor1)>TzadA){ digitalWrite(alarm, HIGH); lcd.clear(); lcd.setCursor(4, 0); lcd.print("(ALARM)"); lcd.setCursor(6, 1); lcd.print(int(ds.getTempC(sensor1))); digitalWrite(motor, HIGH); lcd.setCursor(12, 0); lcd.print("Mon "); delay(5000); lcd.clear(); } if (ds.getTempC(sensor1)<TzadA){ digitalWrite(alarm, LOW); } /// delay(100); }
118-121 включает серву только в интервалах, а 46-50 регулирует наклон от установленной температуры.
видео приложить попробую если надо конечно.
Да еще. сейчас работает от терморезистора на котле без дребезга через map(....) без ЛСД ...
Испльзовать серву не айс, вот жто гораздо лучше подойдет
http://i040.radikal.ru/1109/57/d8e2a66f4dc1.jpg
Привод заслонки печки от ваза, этот представляет собой биполярный шаговик, а что у поддувала всего два положения? Промежуточных нет?
нет средних я решил убрать, так лучше получается, а если шаговый шаг пропустит?
или не должно быть такого?
видео дребезга
https://youtu.be/5kLRwhgFKFI
При нормальном напряжении, усилие на штоке и скорости ничего не пропустит, а серва дребежжит потому что когда ей задаешь угол она включает мотор, доводит заслонку до нужного положения и отключает мотор, заслонка под своим весом начинает опускаться и проворачивать мотор, что фиксируется сервой, соответсвенно мотор включается и цикл замкнулся, получилось дрожжание, чтобы его небыло, надо чтобы заслонка не опускалась под собственным весом, но и не была слишком тугой.
Видос не пашет
не на нее пока нечего не давит, это пройденый этап, сейчас сделал скетч и так не дергается уже.
https://youtu.be/mwrqNJl9NTo видео работы экрана
Видео заработало, а как сервамсебя ведет если небольшое усилие к ней приложить?
повернется
а вот так
temp = map(temp,75,90,170,2); не повернешь
Похоже строка 48 дергает серву на 0, а потом 49 сразу на 50
в скетч ЛСД вставил map(...) не провернешь, но дергает... не че не пойму.
может скорость вращения надо изменить?
Надо условие пересмотреть, или на ноль или на 50 градусов, а не сначала на 0 а в следующей строке на 50 градусов
Ура!!! победа!!!!
отключается провернуть можно руками, но у меня дополнительный редуктор сделан к серве.
убрал лишнее и после каждого условия
serv.detach();
или так
Видео работы на котле....
https://youtu.be/eap7Fmv8P-w
и еще пытаюсь подружить все это с ENC28J60, но есть проблема. После начала работы отправляет на страницу показания несколько раз, а затем теряется связь со страницей, хотя пинг на адрес идет.
может по неопытности че лишнее туда влил, или наоборот забыл чего... пока не догнал.
Заменил библиотеку , переписал. #include <UIPEthernet.h> перестала виснуть, пока конечно только температуру шлет, но я думаю надо продолжать.
Доброго времени суток. а Вы не задумывались чтобы сделать заслонке всего 2 положения, открыто и закрыто. т е запустить котел в режим старт-стоп. На форум хаусе, есть не плохая тема про плюсы и минусы данного режима. Просто поставить ЭМ на 12 вольт который будет открывать задвижку. Просто при не полном открытии заслонки котел будет работать в задушенном режиме, следовательно топливо не будет полностью сгорать. И при пропаже питания заслонка просто под своим весом опустится в положение закрыто, что не даст котлу уйти в разгон
Просто при не полном открытии заслонки котел будет работать в задушенном режиме, следовательно топливо не будет полностью сгорать.
чтобы такого небыло на котлах есть подача вторичного воздуха который и дожигает.
так у ТС всего 3 положения заслонки- закрыто,почти закрыто и открыто
Сгорает все на ура! Проблем нет с этим, посыплю голову пеплом! в открытом состоянии серва не дергается, в чуть закрытом дергается немного, в полностью закрытом не дергается, возможно уберу серву, замену чем нибудь, но это не особо изменит саму задумку и скетч. уже 2 недели прошло полет нормальный.
Если смотрели видео, то видно что день и ночь есть только в скетче, просто для удобства сделал 2 режима.
Сейчас долепил примивный сервер кидаю скеч и видео небольшое.
Доброго времени суток. а Вы не задумывались чтобы сделать заслонке всего 2 положения, открыто и закрыто. т е запустить котел в режим старт-стоп. На форум хаусе, есть не плохая тема про плюсы и минусы данного режима. Просто поставить ЭМ на 12 вольт который будет открывать задвижку. Просто при не полном открытии заслонки котел будет работать в задушенном режиме, следовательно топливо не будет полностью сгорать. И при пропаже питания заслонка просто под своим весом опустится в положение закрыто, что не даст котлу уйти в разгон
Вы слегка не в теме. Горение дров более сложный процесс и управлять эффективно только полностью открыто и закрыто не получится. На том форуме тоже об этом есть.
Да, сервер на ENC28j60 вид и работа...
https://youtu.be/6QxgfkYUZW0
Алексей, можете дать схему подключения? По видео не понятно, а по скетчу разобрался с пинами только на LCD ))
Друзья, помогите новичку, немогу разобраться по скетчу, к каким пинам подключать датчики...
напишите кто нибудь, например: реле-5 пин, ds18b20-3пин, серво-6 пин ... и т.д. Заранее спасибо
Есть не старт-стоп, а имитироване плавного изменения расхода воздуха кратковременным открытием на небольшой промежуток времени раз, допустим, в 5 секунд.
По сабжу - тема интересная но больно дорогая в реализации. Не вижу радикальных отличий от тех, режимов, которые обеспечивает термомеханическая "цепочка" за 25 баксов. Сам задумывался над регулятором и решил собирать наддув на вентиляторе WPA с симисторным фазовым управлением - вот где можно компенсировать сезонный не только избыток, но и недостаток тяги, контролируя температуру уходящих газов.
Всем привет.
Как система работает?
При компиляции пишет-недостаточно памяти.
Используется почти 27 килобайт.
Как сервер,допилил?