Подготовка к умному дому)

flyj
Offline
Зарегистрирован: 20.09.2016

Всем привет!

В загородном доме для отопления поставли электроконвекторы. Суммарная мощность порядка 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

Dimanoss
Offline
Зарегистрирован: 29.05.2016

грубенько соображения накидаю....

Для начала я бы немного оптимизировал то, что имеется:

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);
}

Это всё - теория!  Не проверял на практике (на коленке пишу), могут вылезти у компилятора вопросы.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Dimanoss, ответьте на один вопрос: зачем в автомобиле ... руль? Наверно для того что бы случайно не заехать куда не надо. Так вот сейчас вы делаете "умный дом", который делает что хочет, потому что "умный".

Dimanoss
Offline
Зарегистрирован: 29.05.2016

чтобы случайно не заехать куда не надо, есть ещё и водитель.... :-)

 

flyj
Offline
Зарегистрирован: 20.09.2016

Большое спасибо) попробую!

Может подскажете толковую теорию почитать?

 

По поводу водителя ;) это первый этап - просто поочерёдное включение. Уже заказал термодатчики и wifi esp чтобы был контроль и выставление температуры.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Dimanoss пишет:

чтобы случайно не заехать куда не надо, есть ещё и водитель.... :-)

 

Водитель если он без руля , то рулить он в машине не может, даже если тушка есть. Так что как минимум надо примитивное меню с дисплеем и энкодером.

Dimanoss
Offline
Зарегистрирован: 29.05.2016

 да любую по программированию на С-подобных языках.  На ардуине - весьма простенький диалект используется.

 

Dimanoss
Offline
Зарегистрирован: 29.05.2016

qwone пишет:

Водитель если он без руля , то рулить он в машине не может, даже если тушка есть. Так что как минимум надо примитивное меню с дисплеем и энкодером.

 

 может, парень столь крут, что будет ежедневно перепрошивать контроллер?  :-)  Разговор был не о деталях ведь, там основы надо расковыривать.

flyj
Offline
Зарегистрирован: 20.09.2016

Система осваивается и будет постепенно пополняться)

 

в догонку вопрос по wifi esp8266, я правильно понимаю, что он может сам управлять реле если его правильно прошить? И ещё если такой модуль подцепить на ардуину, сколько одновременных соединений с точками (esp8266+реле+термодатчик) он сможет держать? 15 сможет?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Черт кроется в деталях. И я не думаю, что он и температуру в комнатах на копьютере смотреть.

Лично я бы начал программировать в 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();  
  }
}

 

Dimanoss
Offline
Зарегистрирован: 29.05.2016

мда, отказ от делея - верный шаг.  Согласен.  А дисплей и клавиатуру, думаю, лучше заменить на сопряжение с андроидом + блютус.... Правда, придётся ещё и эпы на яве учиться писать.. ;-)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Да . Если тонешь в луже, то переплыть реку уже становится тяжко, а еще мечтать о плавание в море, и тем более в океане это фантазерство.  Попробуйте пока в обкатать идею на дисплее и энкодере. Или же ищите готовое решение на андроиде с блютузом. 

NfO
NfO аватар
Offline
Зарегистрирован: 20.09.2016

Не надо очеловечивать дома, они этого очень не любят ))) Учиться надо и мне тоже, но если автор хочет чтобы обогреватели включались просто поочерёдно с какой-то задержкой, то пусть так и сделает. Тут обсуждаются алгоритмы, а он, возможно, обнаружит, что нагреватели дико индуктивные и все реле погорят к соответствующей фене. Понадобятся тиристоры и т.д. Потом сам захочет температуру измерять - это уже следующий этап. Я вот тоже сейчас хочу сделать просто бегущую строку, потом ещё что-нибудь захочу... А пока мне не нужен адронный коллайдер для ускорения её бега )))