Подготовка к умному дому)
- Войдите на сайт для отправки комментариев
Втр, 20/09/2016 - 23:59
Всем привет!
В загородном доме для отопления поставли электроконвекторы. Суммарная мощность порядка 20кВт. Была ситуация когда все включились одноврменно и выбило автоматы(
В связи с эти решили модернизировать систему до "умного дома" и внедрить для начала поочерёдный пуск обогревателей.
Для начала куплено Ардуино Мега 2560 и 4 реле 10А 220В. В планах поставить реле на остальные приборы + датчики температуры.
Попытался разобраться в скетчках, получилось вот так:
int a1 = 1;
int a2 = 2;
int a3 = 3;
int a4 = 4;
int deley1 = 60000; // задаем общую задержку в миллисекундах
void setup() {
pinMode(a1, OUTPUT);
pinMode(a2, OUTPUT);
pinMode(a3, OUTPUT);
pinMode(a4, OUTPUT);
// указываем что порты являются выходом
}
void loop() {
digitalWrite(a1, HIGH); //поочередно включаем и выключаем реле
delay (deley1);
digitalWrite(a1, LOW);
delay (deley1);
digitalWrite(a2, HIGH);
delay (deley1);
digitalWrite(a2, LOW);
delay (deley1);
digitalWrite(a3, HIGH);
delay (deley1);
digitalWrite(a3, LOW);
delay (deley1);
digitalWrite(a4, HIGH);
delay (deley1);
digitalWrite(a4, LOW);
delay (deley1);
}
Вопрос - как изменить код, что бы объеденить группу кажем 1+2 и 3+4
грубенько соображения накидаю....
Для начала я бы немного оптимизировал то, что имеется:
byte pins[] = {1, 2, 3, 4}; // все используемые пины unsigned int deley1 = 60000; // задаем общую задержку в миллисекундах (0-65535) void setup() { byte i; for (i=0; i<sizeof(pins); i++) { pinMode(pins[i], OUTPUT); // указываем что порты являются выходом } } void onOff(pin) //поочередно включаем и выключаем реле { digitalWrite(pin, HIGH); //вкл delay (deley1); digitalWrite(pin, LOW); //выкл delay (deley1); } void loop() { byte i; for (i=0; i<sizeof(pins);i++) { onOff(pins[i]); // тут всё понятно? } }А теперь - объединим пины в группы:
byte pins[] = {1, 2, 3, 4}; unsigned int deley1 = 60000; byte pinsGroup1[] = {1, 2}; // первая группа пинов byte pinsGroup2[] = {3, 4}; // вторая группа пинов void setup() { byte i; for (i=0; i<sizeof(pins); i++) { pinMode(pins[i], OUTPUT); } } void onOffByGroups(group) { byte i; for (i=0; i<sizeof(group);i++) { digitalWrite(group[i], HIGH); } delay (deley1); for (i=0; i<sizeof(group);i++) { digitalWrite(group[i], LOW); } delay (deley1); } void loop() { onOffByGroups (pinsGroup1); // в идеале - через поинтер, но и так, думаю, вполне можно onOffByGroups (pinsGroup2); }Это всё - теория! Не проверял на практике (на коленке пишу), могут вылезти у компилятора вопросы.
Dimanoss, ответьте на один вопрос: зачем в автомобиле ... руль? Наверно для того что бы случайно не заехать куда не надо. Так вот сейчас вы делаете "умный дом", который делает что хочет, потому что "умный".
чтобы случайно не заехать куда не надо, есть ещё и водитель.... :-)
Большое спасибо) попробую!
Может подскажете толковую теорию почитать?
По поводу водителя ;) это первый этап - просто поочерёдное включение. Уже заказал термодатчики и wifi esp чтобы был контроль и выставление температуры.
чтобы случайно не заехать куда не надо, есть ещё и водитель.... :-)
Водитель если он без руля , то рулить он в машине не может, даже если тушка есть. Так что как минимум надо примитивное меню с дисплеем и энкодером.
да любую по программированию на С-подобных языках. На ардуине - весьма простенький диалект используется.
Водитель если он без руля , то рулить он в машине не может, даже если тушка есть. Так что как минимум надо примитивное меню с дисплеем и энкодером.
может, парень столь крут, что будет ежедневно перепрошивать контроллер? :-) Разговор был не о деталях ведь, там основы надо расковыривать.
Система осваивается и будет постепенно пополняться)
в догонку вопрос по wifi esp8266, я правильно понимаю, что он может сам управлять реле если его правильно прошить? И ещё если такой модуль подцепить на ардуину, сколько одновременных соединений с точками (esp8266+реле+термодатчик) он сможет держать? 15 сможет?
Черт кроется в деталях. И я не думаю, что он и температуру в комнатах на копьютере смотреть.
Лично я бы начал программировать в 3 вычислительных процесса. 1 - дисплей - 2 клавиатура 3 само устройство.
//#1 void setup1(){ } void loop1(){ } //#2 void setup2(){ } void loop2(){ } //#3 void setup3(){ } void loop3(){ } void setup() { //#1 setup1(); //#2 setup2(); //#3 setup3(); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 1000 миллисекунд вычислит. поток 1 static uint32_t future1 = 0 ; if (MILLIS>=future1) { future1 = MILLIS + 1000 ; loop1(); MILLIS = millis() ; } //#2 200 миллисекунд вычислит. поток 2 static uint32_t future2 = 0 ; if (MILLIS>=future2) { future2 = MILLIS + 200 ; loop2(); MILLIS = millis() ; } //#3 100 миллисекунд вычислит. поток 3 static uint32_t future3 = 0 ; if (MILLIS>=future3) { future3 = MILLIS + 100 ; loop3(); } }мда, отказ от делея - верный шаг. Согласен. А дисплей и клавиатуру, думаю, лучше заменить на сопряжение с андроидом + блютус.... Правда, придётся ещё и эпы на яве учиться писать.. ;-)
Да . Если тонешь в луже, то переплыть реку уже становится тяжко, а еще мечтать о плавание в море, и тем более в океане это фантазерство. Попробуйте пока в обкатать идею на дисплее и энкодере. Или же ищите готовое решение на андроиде с блютузом.
Не надо очеловечивать дома, они этого очень не любят ))) Учиться надо и мне тоже, но если автор хочет чтобы обогреватели включались просто поочерёдно с какой-то задержкой, то пусть так и сделает. Тут обсуждаются алгоритмы, а он, возможно, обнаружит, что нагреватели дико индуктивные и все реле погорят к соответствующей фене. Понадобятся тиристоры и т.д. Потом сам захочет температуру измерять - это уже следующий этап. Я вот тоже сейчас хочу сделать просто бегущую строку, потом ещё что-нибудь захочу... А пока мне не нужен адронный коллайдер для ускорения её бега )))