Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > CyberWrt

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.05.2015, 13:54   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Модуль "Light Control"

Ну вот наконец то дождались!
Сегодня первый день продолжительного тестирования модуля "Light Control"
Этот модуль логическое продолжение модуля "Light Switch", только с разницей в том, что модуль "Light Control" отслеживает
изменение состояния пинов и если состояние пина было изменено физическим выключателем или с другого гаджета, то на
всех подключенных к модулю устройствах, в веб интерфейсе выключатель сам перещелкнется
Если до вечера не всплывут баги то постараюсь выложить

Всю работу связанную с веб интерфейсом и скриптами провел Дмитрий(Prana)
Я только написал скетч и демона обновляющего состояние пинов в БД
Дмитрий постарался сделать веб интерфейс с минимальной нагрузкой на процессор роутера и с высокой степенью надежности, так как роутер должен будет трудится круглыми сутками

Работает со всеми моделями ардуино, но ШИМ пока работает только в ардуинках с процессорами Atmega168/328
Но это временные ограничения по использованию ШИМ , вскоре вынесем эту функцию в библиотеку для всех остальных моделей, что бы не нагромождать скетч

Модуль пока работает только с роутерами на процессоре AR71xx

PHP код:
void setup()   
{   
  
Serial.begin(57600);    
}  
//*******************************
void loop()  
{  
    if (
Serial.available()>7)  
    {    
       
uint8_t inByte Serial.read(); 
        if(
inByte == 'D'
        {   
          
inByte Serial.read(); 
          
SortIdev(inByte); 
        }     
    } 

//****************************************
void SortIdev(uint8_t idev

  
uint8_t pinDec = (Serial.read()-48)*10;  
  
uint8_t pinUnit = (Serial.read()-48);  
  
uint8_t pin pinDec pinUnit;   
  
uint8_t separator Serial.read();    
   
 if(
separator == '='
 { 
   
uint8_t statHund = (Serial.read()-48)*100
   
uint8_t statDec = (Serial.read()-48)*10;  
   
uint8_t statUnit Serial.read()-48;   
   
uint8_t stat statHund statDec statUnit;  
 
//*****************    
  
switch (idev)  
  { 
     case 
's':  // запрос статуса   
      
SendStat(pinstatUnit+48);
     break;   
     
     case 
'S'//выключатель 
      
pinMode(pinOUTPUT);  
      
digitalWrite(pinstat); 
      
SendStat(pinidev);
      
DB_Stat();    
     break;  

    case 
'D'//Dimmer  
      
analogWrite(pinstat);  
      
SendStat(pinidev);
      
DB_Stat();
     break; 
     
    case 
'A':  //Читать АЦП
      
SendStat(pinidev);
      
DB_Stat();
     break;  
      
    case 
'I':  //конфигурировать пин на вход 
      
pinMode(pinINPUT); 
      
SendStat(pinidev);
      
DB_Stat();
     break;   
      
    case 
'B'//кнопка 
      
pinMode(pinOUTPUT);
      if(
stat<2)
       {
         
digitalWrite(pinstat);
       } else 
        if(
stat==2)
         {  
           for (
int i=010i++)
           {
           
digitalWrite(pin1);
           
delay(50);
           
digitalWrite(pin0);
           
delay(50);
           }  
         } 
        
SendStat(pinidev);
        
DB_Stat();
     break;            
   } 
 }  
}  
//*******************************
void SendStat(uint8_t pinuint8_t idev
{
    
uint8_t stat=0;
    switch (
idev)  
  { 
   case 
'S'//выключатель
     
stat digitalRead(pin);
   break;
   
   case 
'D'//Диммер
    
stat PWM_Status(pin);
   break;  
   
   case 
'A'//Аналоговый вход
    
stat analogRead(pin)/4;
   break;  
   
   case 
'B'//кнопка
    
stat digitalRead(pin);   
   break;
   
   case 
'b'//кнопка
    
stat digitalRead(pin);   
   break;   
  }
  
  if(
stat == '{' || stat == '}' stat=124
  
Serial.print("{"); 
  
Serial.write(pin); 
  
Serial.write(stat); 
  
Serial.print("}");


//*******************************
uint8_t PWM_Status(uint8_t pin)
{
     
uint8_t stat;
     switch (
pin)
     {
      case 
3//
        
stat OCR2B//ШИМ на D3   
      
break;
      
      case 
5//
        
stat OCR0B//ШИМ на D5   
      
break;      
      
      case 
6//
        
stat OCR0A//ШИМ на D6   
      
break;  
      
      case 
9//
        
stat OCR1A//ШИМ на D9  
      
break; 
      
      case 
10//
        
stat OCR1B//ШИМ на D10   
      
break;  
      
      case 
11//
        
stat OCR2A//ШИМ на D11  
      
break;  
      
      default:
        
stat digitalRead(pin);
     } 
 return 
stat;    


//*******************************
void DB_Stat(void)
{
  
Serial.print("{"); 
  
Serial.write(99); 
  
Serial.write(1);  //индикатор обновления    
  
Serial.print("}");

Admin вне форума   Ответить с цитированием
Старый 04.05.2015, 21:05   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Модуль "Light Control"

Выложил модуль в "test"
Модуль пока имеет два недостатка, но так как я сегодня улетаю на 10 дней и меня не будет все это время на форуме, то выкладываю модуль так как есть. Тестируйте, после приезда будем с Дмитрием продолжать работу над модулем

На что стоит обратить внимание
1 - После изменений настроек модуля, в автозагрузке не изменяется номер порта, так что после ребута роутера, если был изменен порт, модуль работать не будет
2 - не уверен, но сегодня после каких то манипуляций демон исчез из процессов. Потом после перезапуска модуль проработал 5 часов и повторно этот баг пока не вылазил
Admin вне форума   Ответить с цитированием
Старый 04.05.2015, 23:54   #3
elik745i
Senior Member
 
Регистрация: 07.01.2015
Адрес: Baku
Сообщений: 225
Вес репутации: 0
elik745i is an unknown quantity at this point
По умолчанию Re: Модуль "Light Control"

Цитата:
Сообщение от Admin Посмотреть сообщение
Выложил модуль в "test"
Модуль пока имеет два недостатка, но так как я сегодня улетаю на 10 дней и меня не будет все это время на форуме, то выкладываю модуль так как есть. Тестируйте, после приезда будем с Дмитрием продолжать работу над модулем

На что стоит обратить внимание
1 - После изменений настроек модуля, в автозагрузке не изменяется номер порта, так что после ребута роутера, если был изменен порт, модуль работать не будет
2 - не уверен, но сегодня после каких то манипуляций демон исчез из процессов. Потом после перезапуска модуль проработал 5 часов и повторно этот баг пока не вылазил
классно, молодцы! давайте на Мегу тоже сделайте, ато у меня нано с кривым мостиком....
Он работает на процессоре Ралинк 5350?
elik745i вне форума   Ответить с цитированием
Старый 05.05.2015, 00:04   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Модуль "Light Control"

Цитата:
Он работает на процессоре Ралинк 5350?
Пока не работает, но планируем
Admin вне форума   Ответить с цитированием
Старый 05.05.2015, 13:44   #5
Prana
Junior Member
 
Регистрация: 17.03.2015
Сообщений: 27
Вес репутации: 0
Prana is an unknown quantity at this point
Lightbulb Re: Модуль "Light Control"

Немного о деталях реализации:

Arduino: скетч обрабатывает запросы на считывание статусов и управление нагрузками, приходящие из uart.

Демон serd: демон (приложение-сервис), исполняющийся на роутере, и отвечающий за работу с uart. Он необходим для того, чтобы сразу несколько процессов не пытались работать с портом, и не происходило конфликтов из-за параллельного доступа.

База данных sqlite: БД хранит состояния портов, которые в ней постоянно обновляются демоном. БД введена на перспективу того, чтобы в дальнейшем в нее также можно было писать логи состояний отдельных портов, и использовать для статистики/графиков.
В варианте модуля БД съедает 300Кб.

cgi-скрипты модуля: sh-скрипты, вызываемые веб-сервером и отвечающие за подготовку данных, выдаваемых клиентам.
constructor.cgi - страница настроек, читающая настройки из файла settings, и позволяющая управлять списком портов и логикой их работы (выключатель, диммер, кнопка...). По результатам работы страницы формируется новый набор settings.
generate.cgi - скрипт генерации index.cgi (основной страницы модуля), создающий страницу по настройкам из settings-файла
Остальные cgi не делают страниц, а отдают данные для ajax-запросов:
getstate.cgi - мониторит состояние запрошенного списка пинов, и отвечает клиентам обновленным состоянием. На входе принимает список пинов, и то состояние, которое уже есть у клиента (параметр old)
recover.cgi - восстанавливает старую версию index.cgi из резервной копии
switch.cgi - отправляет в порт запросы на управление выключателями, кнопками и триггером ("спусковым курком")
uart.cgi - отправляет в порт запросы на управление диммером, возвращает новое показание в %

Клиентская часть
constructor.cgi выдает страницу конфигурации, в которой можно настроить набор пинов и логику их работы.
Допускаются следующие виды элементов управления:
Выключатель (кодируется как DSxx, например, DS07): элемент, имеющий состояния ВКЛ и ВЫКЛ, висящий на 7 пине
Диммер (кодируется как DDxx): диммер, имеющий состояния от 0 до 255 (0 - выключен, 255 - полная яркость), отображающий слайдер регулировки и значение, приведенное к % от 0 до 100. Слайдер можно перемещать не только мышью, но и кнопками клавиатуры, если хочется плавности.
Кнопка (кодируется как DB) - это кнопка без фиксации. В момент нажатия в порт отправляется 1, в момент отпускания - 0. Если страница открыта на смартфоне или планшете, то полноценно кнопка работать не будет: ввиду особенностей работы браузеров на тачскрине, происходит "клик", то есть нажатие и сразу же автоматическое отпускание.
Триггер (кодируется как Db) отличается от кнопки тем, что в порт происходит отправка 1, и только в момент нажатия

Отправка сигналов управления диммером происходит через асинхронный запрос к uart.cgi. Формат - "DD13=053". В ответ возвращается значение в %, которое подставляется к слайдеру. Управление выключателями и кнопками осуществляется через асинхронный запрос к switch.cgi. Формат - "DS07=001". Для кнопки при отпускании выдается 002. Ответы при этом не обрабатываются.

Как работает считывание состояний пинов: демон serd осуществляет ежесекундный опрос пинов Arduino для получения актуального состояния. В случае изменения состояния какого-либо из портов он производит его запись в БД. Благодаря этому нет никаких конфликтов в чтении порта, а к БД может обращаться хоть сотня параллельных процессов.
JavaScript на странице index.cgi создает ajax-запрос к getstate.cgi с временем ожидания ответа 30 секунд. Если ответ за это время не получен, открывается новый запрос с теми же параметрами. Если от сервера приходит ответ, то происходит изменение состояний элементов управления на странице, и снова открывается запрос к серверу.
Серверная часть getstate.cgi работает следующим образом: при получении запроса начинает ежесекундно мониториться БД по выбранным пинам. Если изменений состояния нет, то сервер не отвечает клиенту, искусственно заставляя его ждать. Если же состояние какого-то из пинов изменилось, то сервер сразу же отдает ответ клиенту.
Такой подход позволяет снизить количество запросов клиентов к серверу до двух в минуту, уменьшив как трафик, так и количество крутящихся на сервере процессов. С таким подходом и десяток клиентов не будут оказывать сколь-нибудь серьезной нагрузки на роутер. Благодаря использованию одного демона исключаются конфликты при доступе к порту. А БД в будущих версиях можно будет использовать для хранения истории состояний отедельных портов
Prana вне форума   Ответить с цитированием
Старый 05.05.2015, 18:45   #6
elik745i
Senior Member
 
Регистрация: 07.01.2015
Адрес: Baku
Сообщений: 225
Вес репутации: 0
elik745i is an unknown quantity at this point
По умолчанию Re: Модуль "Light Control"

Цитата:
Сообщение от Admin Посмотреть сообщение
Пока не работает, но планируем
а с МЕГА работает?
elik745i вне форума   Ответить с цитированием
Старый 05.05.2015, 23:05   #7
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Модуль "Light Control"

Работает со всеми контролерами.Только пока без
ШИМ
Admin вне форума   Ответить с цитированием
Старый 06.05.2015, 19:19   #8
elik745i
Senior Member
 
Регистрация: 07.01.2015
Адрес: Baku
Сообщений: 225
Вес репутации: 0
elik745i is an unknown quantity at this point
По умолчанию Re: Модуль "Light Control"

Цитата:
Сообщение от Admin Посмотреть сообщение
Работает со всеми контролерами.Только пока без
ШИМ
Класс, а когда доделаете, что бы на ралинке тоже работало и ШИМ? страшно хочется протестировать....
elik745i вне форума   Ответить с цитированием
Старый 06.05.2015, 20:32   #9
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Модуль "Light Control"

Приеду 14.05.15 и будет видно
Admin вне форума   Ответить с цитированием
Старый 14.05.2015, 22:22   #10
elik745i
Senior Member
 
Регистрация: 07.01.2015
Адрес: Baku
Сообщений: 225
Вес репутации: 0
elik745i is an unknown quantity at this point
По умолчанию Re: Модуль "Light Control"

ну как прогресс?
elik745i вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 6 (пользователей: 0 , гостей: 6)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:39. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика