Умный Дом по Ethernet

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 10 сен 2013, 22:32

В main есть

Код: Выделить всё

input_state    = ~PIND;
то ли это не нужно (не уверен)
то ли надо добавить (не уверен также)

Код: Выделить всё

input_state2    = ~PINC;
input_state3    = ~PINB;
В main есть

Код: Выделить всё

if (port_letter == 'D')
{
	my_mask = get_key_press(1 << port_num);
	my_mask2 = get_key_release(1 << port_num);
}
else if (port_letter == 'C')
{
	my_mask = get_key_press2(1 << port_num);
	my_mask2 = get_key_release2(1 << port_num);
}
else
{
	my_mask = get_key_press3(1 << port_num);
	my_mask2 = get_key_release3(1 << port_num);
}
по-моему надо так

Код: Выделить всё

if (port_letter == 'D')
{
	my_mask = get_key_press(1 << port_num);
	my_mask2 = get_key_release(1 << port_num);
}
else if (port_letter == 'C')
{
	my_mask = get_key_press2(1 << port_num);
	my_mask2 = get_key_release2(1 << port_num);
}
else if (port_letter == 'B')
{
	my_mask = get_key_press3(1 << port_num);
	my_mask2 = get_key_release3(1 << port_num);
}

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 10 сен 2013, 22:46

Кстати, Андрей.
Можно немного соптимизировать код.

Вместо

Код: Выделить всё

char get_key_press( char input_mask )
char get_key_press2( char input_mask )
char get_key_press3( char input_mask )
char get_key_release( char input_mask )
char get_key_release2( char input_mask )
char get_key_release3( char input_mask )
использовать одну

Код: Выделить всё

char get_key_press_release( char* in_pr, char input_mask )
{
	cli();
	input_mask &= *in_pr;                // read key(s)
	*in_pr ^= input_mask;                // clear key(s)
	sei();
	return input_mask;
}
а в main вместо

Код: Выделить всё

char my_mask = '\0';
char my_mask2 = '\0';

if ( _port_type[i] == 0 )
{
if (port_letter == 'D')
					{
						my_mask = get_key_press(1 << port_num);
						my_mask2 = get_key_release(1 << port_num);
					}
					else if (port_letter == 'C')
					{
						my_mask = get_key_press2(1 << port_num);
						my_mask2 = get_key_release2(1 << port_num);
					}
					else if (port_letter == 'B')
					{
						my_mask = get_key_press3(1 << port_num);
						my_mask2 = get_key_release3(1 << port_num);
					}
...
использовать

Код: Выделить всё

char my_mask = '\0';
char my_mask2 = '\0';
char *in_p;
char *in_r;
if ( _port_type[i] == 0 )
{
    switch (port_letter)
					{
						case 'D':	in_p = &input_press; in_r = &input_release; break;
						case 'C':	in_p = &input_press2; in_r = &input_release2; break;
					     case 'B':	in_p = &input_press3; in_r = &input_release3; 
					}
					if (port_letter != 'A')
					{
						my_mask = get_key_press_release(in_p, 1 << port_num);
						my_mask2 = get_key_press_release(in_r, 1 << port_num);	
					}
...
у меня уменьшилось на около 160 байт

но это не принципиально
так... мысли вслух
Последний раз редактировалось DOCSIMUS 11 сен 2013, 09:58, всего редактировалось 2 раза.

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 10 сен 2013, 23:56

Создал проект в Proteus.
Работает. Сеть работает тоже - т.е. можно общаться с виртуальной мегой из браузера или сервера.
Если кому надо - обращайтесь.

Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Умный Дом по Ethernet

Сообщение Urbas81 » 11 сен 2013, 09:31

DOCSIMUS писал(а):Создал проект в Proteus.
Работает. Сеть работает тоже - т.е. можно общаться с виртуальной мегой из браузера или сервера.
Если кому надо - обращайтесь.
Да, очень удобно, я уже года три пользуюсь.

AlexTroy
Сообщения: 32
Зарегистрирован: 04 дек 2012, 00:54

Re: Умный Дом по Ethernet

Сообщение AlexTroy » 11 сен 2013, 23:36

DOCSIMUS писал(а):Создал проект в Proteus.
Работает. Сеть работает тоже - т.е. можно общаться с виртуальной мегой из браузера или сервера.
Если кому надо - обращайтесь.
Нужно, выложите пожалуйста.

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 12 сен 2013, 00:21

Проект делал для себя, возможны косяки, т.к. на скорую руку.
Proteus 7.10 SP0.
Файлы проекта должны быть размещены в папке с Си файлами, тогда будет возможность пошаговой отладки.
Путь к файлу elf задайте сами - клик мышкой на атмегу и редкатируйте в свойствах путь.
Также в свойствах enc28j60 необходимо прописать ip вашей сетевой карты. Желательно, чтобы у сетевой карты был статический IP, чтобы каждый раз не редактировать свойства энки. В архиве два скриншота.

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 12 сен 2013, 01:44

Обращаюсь к автору!

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

Вот, что мне удалось "понять", читая ваш сайт, форум и анализируя прошивку (еще не до конца):

Запросы от сервера

http://192.168.0.14/sec/?pt=4&cmd=get - получение текущего состояния порта
ответ - ON (если порт находит в активном состоянии), OFF или текущее значение, если порт настроен в режим PWM (ШИМ) или ADC (АЦП). - актуально?

http://192.168.0.14/sec/?cmd=2:1 – изменение состояния порта SW

http://192.168.0.14/sec/?cmd=3:150 – изменение состояния порта PWM - актуально?
http://192.168.1.32/sec/?pt=12&pwm=10 – вроде бы то же, но что из этих двух вариантов на сегодня актуально?

cnt - ? - параметр для счетчика срабатывания порта, в каком формате запрос? что в ответ?

http://192.168.0.14/sec/?pn=14&m=0&misc=700 — изменение состояния ADC порта

почему где-то используется параметр pt, а где-то pn? хотя оба вроде про одно и то же

Сообщения от меги

http://192.168.0.250/megad.php?pt=6 – номер активированного порта

http://192.168.0.250/megad.php?pt=0&m=1 — при срабатывании на отжатие

http://192.168.0.250/megad.php?pt=14&v=940 — при срабатывании ADC порта (>,<)

http://192.168.0.250/megad.php?pt=14&v=940dir=1 — при изменении ADC порта (<>) - 1 – в сторону увеличения, 0 — в сторону уменьшения

http://192.168.0.250/megad.php?at=35 — при превышении температуры чипа выше Alarm Temp

Andrey_B
Администратор
Сообщения: 4124
Зарегистрирован: 18 мар 2011, 12:06

Re: Умный Дом по Ethernet

Сообщение Andrey_B » 12 сен 2013, 12:12

DOCSIMUS, вы абсолютно правы. Давно назрела необходимость описать API. Постараюсь в ближайшее время сделать.

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 12 сен 2013, 16:51

Ну тогда выложу, то что для себя выписал.
Не описание API это конечно, но может быть будет полезно.
Вложения
Запросы ответы.zip
(64.38 КБ) 834 скачивания

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 20 сен 2013, 01:26

Андрей, у вас в прошивке в websrv_help_functions.c есть две функции:
find_key_val и find_key_val2
похоже, что find_key_val была слегка переделана по сравнению с оригинальной, а оригинальная была переименована в find_key_val2
судя по коду это совершенно идентичные функции
оригинальная возвращает 0 или 1
а вот переделанная возвращает длину value
вероятно было желание использовать это где-то, но оно не реализовалось
т.к. везде, где есть вызов этих функций, их возвращаемое значение используется в условиях, т.е. как это и было задумано в оригинале
но в некоторых местах вызывается функция find_key_val2, в большинстве же find_key_val

по хорошему надо использовать только одну - лучше оригинальную, хотя это все равно, но одну
вторую закомментировать, сэкономив на этом почти килобайт ROM

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 20 сен 2013, 23:06

Обращаю внимание, что в описании сказано, что формат поля Action - X:Y;X:Y;X:Y
Длина поля ввода ограничена 11 символами, соответственно в прошивке в EEPROM отводится по 11 байт на все порты.
Но что в случае, если номер порта больше 9? 10, 11, 12, 13... В этом случае три порта "не помещаются" в Action. Можно записать только 2.
И попутно вопрос - а в поле Action можно указывать PWM? Судя по прошивке - да. Но тогда то же самое. Либо два PWM, либо некое сочетание, может быть и три порта, если значение PWM будет односимвольным ну и т.д. К сожалению в EEPROM хранится массив символов строки Action, который при извлечении подвергается парсингу. Если бы в EEPROM хранился уже результат парсинга в бинарном виде (например, по 2 байта: первый - номер порта, второй - значение, неиспользованные "ячейки" - FF), то такой бы проблемы не существовало бы, а вместо 11 байт на порт в EEPROM достаточно было бы ограничиться 6ю байтами. Экономия составила бы 80 байт при 16 портах. Ну или бы можно было бы увеличить количество портов в Action до 5 (экономия 1 байт на порт) - на вкус. Но в этом случае придется немного переписать прошивку.
Не считаю это ошибкой или недоработкой, но просто необходимо указать на это ограничение. Ну или немного переписать :) Разделить port_execute - отдельно вынести парсинг и собственно выполнение. Парсинг, упаковка результата в массив из 6 байт, сохранение в EEPROM. При извлечении сразу выполнять, без парсинга. Поле Action в web-форме увеличить до 20 байт (3 порта PWM с 3х символьным значением - это максимум).

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 21 сен 2013, 13:31

Еще хочу обратить внимание. В коде встречаются строки:
memset(bits, 0, sizeof(bits));
memset(temp, 0, sizeof(temp));
Насколько я понимаю было желание заполнить массив нулями? Если так, то некорректно использовать sizeof - она выдаст размер переменной bits в первом случае (1, если не ошибаюсь) и размер указателя temp во втором (2, если не ошибаюсь), но никак не размер массива. В результате будет заполнено нулями первый байт в первом случае и 2 первых байта во втором. Вероятно это не критично для кода, но все таки...

можно так
#define temp_size 36
char temp[temp_size]

memset(temp, 0, temp_size);

ну или явно указывать без дефайна
memset(temp, 0, 36);

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 21 сен 2013, 16:40

Попытался осуществить вышесказанное.
Чуть чуть возрос размер кода, на 10 байт возросло использование RAM, но использование EEPROM уменьшилось значительно. Кроме всего прочего теперь можно реально вписать три порта (любых PWM, SW) в поле Action - всего 20 байт вместо 11, при сохранении в EEPROM 6 байт.
Файлы прилагаю - проверял достаточно быстро, вроде все работает корректно, но углубленно не тестировал.

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 21 сен 2013, 20:13

Теперь можно оптимизировать использование EEPROM при сохранении NetAction - это чуть позже.
Но пока разбирался что и почем нашел еще пару ошибок, одна из которых довольно грубая.
1)
Под поле NetAction отводится 35 байт, которые и сохраняются в EEPROM (которые я и оптимизирую).
Однако не пытайтесь сохранить такую длинную строку - не получится, не получится и более короткую.
Дело в том, что при передаче данных строка
например 192.168.0.2/secpw/?cmd=6:128 - 28 байт будет заменена на 192.168.0.2%2Fsecpw%2F%3Fcmd%3D6%3A128 - 38 байт
далее в коде

Код: Выделить всё

if (find_key_val2((char *)&(buf[dat_p+4]),temp,36,"eth"))
				{
					//if ( strlen(temp) > 0 )
					{
						urldecode(temp);
						eeprom_write_block (&temp, &ee_eth_cmd[atoi(gStrbuf)], 35);
						reset_flag = 1;
					}
				}
считает только первые 36 байт в буфер temp, обрезав 3 последних байта (+0 в конец temp)
в результате в EEPROM запишется 192.168.0.2/secpw/?cmd=6:

необходимо увеличить буфер temp - ну например до 60 байт (можно и до 50 наверное) и

Код: Выделить всё

if (find_key_val2((char *)&(buf[dat_p+4]),temp,60,"eth"))
тогда все корректно сохраняется

2) грубая ошибка

Код: Выделить всё

if ( send_eth_flag2 > -1  )
		{
			if ( (tcp_client_state > 0 || tcp_client_state < 6) )
			{
	            // to process the ARP reply we must call the packetloop
	            plen=enc28j60PacketReceive(BUFFER_SIZE, buf);
	            packetloop_arp_icmp_tcp(buf,plen);
				//arp_timeout--;

				eeprom_read_block (temp, &ee_eth_cmd[send_eth_flag], 35);   
				if ( temp[0] != (char)255 && strlen(temp) > 0 ) 
				{
					char ip_b[3];
					char urlpar[10];
					uint8_t ip_flag = 0;
					uint8_t ip_cnt = 0;
					//uint8_t url_cnt = 0;

					for ( k = 0; k < strlen(temp); k++ )
					{
						if ( ip_flag < 4 )
						{
							if ( temp[k] == '.' || temp[k] == '/' )
							{
								ip_cnt = 0;
								_eth_addr[ip_flag] = atoi(ip_b);
								ip_flag++;
								ip_b[0] = '\0';
								ip_b[1] = '\0';
								ip_b[2] = '\0';
							}
							else
							{
								ip_b[ip_cnt] = temp[k];
								ip_cnt++;
							}
						}
						else
						{
							urlpar[url_cnt] = temp[k];
							url_cnt++;
						}
					}
длина считываемого из EEPROM NetAction - 35 байт
некоторое количество байт 13-15 - это IP адрес, который при парсинге сохраняется в _eth_addr
оставшиеся 22-20 байт (если строка в EEPROM максимальной длины - 35 байт) сохраняются при парсинге в urlpar, размер которого всего 10 байт... с выходом за границу массива с непредсказуемыми последствиями

необходимо увеличить размер массива urlpar до 25 байт при данной реализации

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 22 сен 2013, 10:11

Произвел оптимизацию EEPROM в части NetAction. Теперь вместо 35 байт в EEPROM сохраняется 25 байт, размер поля ввода остался прежним - 35 байт. Оптимизация за счет изменения формата хранения данных. В оригинале в EEPROM хранилась символьная строка 35 байт. В предложенном варианте - IP адрес хранится в бинарном виде в первых 4х байтах, под остальное отводится 21 байт в виде символьной строки. Размер использованной EEPROM после всех оптимизаций снизился с 84% до 59%. Проверял - работает корректно, но нуждается в более углубленном тестировании.

Если автора заинтересует, пусть решит применять или не применять данные предложения. Хотя такое ощущение, что форум мертвый...

alexsis_76
Сообщения: 1074
Зарегистрирован: 26 авг 2011, 05:09
Откуда: Забайкальский край п Оловянная

Re: Умный Дом по Ethernet

Сообщение alexsis_76 » 22 сен 2013, 17:08

Хотя такое ощущение, что форум мертвый...
нет мы Вас внимательно слушаем продолжайте пожалуйста.

THK
Модератор
Сообщения: 580
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Умный Дом по Ethernet

Сообщение THK » 22 сен 2013, 20:02

DOCSIMUS писал(а):Хотя такое ощущение, что форум мертвый...
Посмотрите количество скачиваний Вашего кода и это ощущение пройдет. :)

Dron
Сообщения: 207
Зарегистрирован: 08 мар 2013, 13:00

Re: Умный Дом по Ethernet

Сообщение Dron » 22 сен 2013, 20:10

alexsis_76 писал(а):
Хотя такое ощущение, что форум мертвый...
нет мы Вас внимательно слушаем продолжайте пожалуйста.
+1
тут много, очень много не особо профи, но которым тема сильно интересна.
просто, если, к примеру, взять меня, то в данную дискуссию я полноценно не влезу, поскольку мои знания на уровне любителя.
я по теме понимаю, о чём речь, ценю Ваш труд, особо ценю труд создателя этого ресурса, но... повторюсь, пишу редко именно из-за недостаточной компетентности.
а форум жив настолько, насколько возможен интерес такой узкой направленности. и в рунете он лучший, imho

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 22 сен 2013, 22:38

Слава создателю, есть живые :)
Ну код то я видел, что скачивали, но поскольку никто совсем не комментирует - плохо/хорошо/никуда не годится - закралось ощущение отсутствие интереса. Но вы мои нехорошие ощущения развеяли. Еще раз повторюсь - никакой я не профи, просто любитель. В железе пока не воплощал данное устройство, хотел предварительно посмотреть в виртуале так сказать, понять логику работы и применимость для своих задач. Но уже вот вот воплощу. Пока дополнительно для себя добавил два порта - B0, B7. Но код выкладывать не буду, т.к. это расходится с концепцией автора. B0 - за счет купирования светодиода. Сразу оговорюсь - все читал в этой ветке... и про "моддинг" и прочее, но с моей точки зрения использовать порт для очень редкого подмигивания светодиодом... но это мое личное мнение. B7 - при условии тактирования от энки. В связи с этим вопрос - в ревизии 4-5 используется именно такой вариант? Тактирование от энки? Или отдельный кварц на атмегу? В смысле надежности.

И еще пара вопросов по железу (в электронике я совсем слаб). В Proteus'е я подтянул входы и выходы резисторами на +. Как оно на самом деле у вас? При подтяжке на + при NC состоянии на портах логическая 1. Это нормально? Другими словами при изначально пустом EEPROM - все порты в NC и соответственно все предполагаемые выходы (светодиоды в Proteus) включены. Меня волнует что при этом будет? Все выходы "включены" при первом включении... Прошу прощения, если задаю глупые вопросы, в связи со слабым знанием "железной" составляющей.

DOCSIMUS
Сообщения: 184
Зарегистрирован: 07 сен 2013, 01:02

Re: Умный Дом по Ethernet

Сообщение DOCSIMUS » 23 сен 2013, 01:21

DOCSIMUS писал(а):Еще хочу обратить внимание. В коде встречаются строки:
memset(bits, 0, sizeof(bits));
memset(temp, 0, sizeof(temp));
...
беру свои слова обратно, sizeof указывает длину массива, если объявлен именно массив

Ответить