Ну вот наконец то дождались!
Сегодня первый день продолжительного тестирования модуля "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(pin, statUnit+48);
break;
case 'S': //выключатель
pinMode(pin, OUTPUT);
digitalWrite(pin, stat);
SendStat(pin, idev);
DB_Stat();
break;
case 'D': //Dimmer
analogWrite(pin, stat);
SendStat(pin, idev);
DB_Stat();
break;
case 'A': //Читать АЦП
SendStat(pin, idev);
DB_Stat();
break;
case 'I': //конфигурировать пин на вход
pinMode(pin, INPUT);
SendStat(pin, idev);
DB_Stat();
break;
case 'B': //кнопка
pinMode(pin, OUTPUT);
if(stat<2)
{
digitalWrite(pin, stat);
} else
if(stat==2)
{
for (int i=0; i < 10; i++)
{
digitalWrite(pin, 1);
delay(50);
digitalWrite(pin, 0);
delay(50);
}
}
SendStat(pin, idev);
DB_Stat();
break;
}
}
}
//*******************************
void SendStat(uint8_t pin, uint8_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("}");
}