Доброго всем времени суток!
Собираю плату для управления освещением (4 канала, RGB+LED+реле+диммер). В прогу зашиты сценарии - нажал кнопку сценарий изменился на следующий.
Для редактирования сценариев хочу использовать ESP как минисервер. Послал запрос - изменился параметр сценария.
В качестве диммер использовал схему http://www.cyber-place.ru/showthread.php?p=3371#post3371
Код построен на прерывании на 2 пине (отслеживает ноль).
Код работы ESP взял вот такой
По отдельности все работает, но вместе никак. Путем проб и ошибок понял, что ESP затыкается как только я включаю прерывание attachInterrupt(0, detect_up, LOW);
Причем диод на ESP при подаче запроса мигает, но в мониторе никаких действий не происходит.
Может кто знает, в чем причина и как решить такую задачу.
ЗЫ. модуль у меня ESP-01
Собираю плату для управления освещением (4 канала, RGB+LED+реле+диммер). В прогу зашиты сценарии - нажал кнопку сценарий изменился на следующий.
Для редактирования сценариев хочу использовать ESP как минисервер. Послал запрос - изменился параметр сценария.
В качестве диммер использовал схему http://www.cyber-place.ru/showthread.php?p=3371#post3371
Код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile uint8_t tic, Dimmer1, Dimmer2, Dimmer3;
uint8_t data;
void setup()
{
D4_Out; D5_Out; D6_Out; //Настраиваем порты на выход
D4_Low; D5_Low; D6_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
StopTimer1(); //остановить таймер
UART_Init(115200); //инициализация порта
}
//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if(Dimmer1 < tic ) D4_High; //управляем выходом
if(Dimmer2 < tic ) D5_High; //управляем выходом
if(Dimmer3 < tic ) D6_High; //управляем выходом
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic=0; //обнулить счетчик
ResumeTimer1(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
StopTimer1(); //остановить таймер
D4_Low; D5_Low; D6_Low; //логический ноль на выходы
tic=0; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
//*************************************************************************
void loop()
{Start
if (UART_ReadByte(data)) Dimmer1=data;
Dimmer2=195; //200=мин. 0=макс
Dimmer3=0; //200=мин. 0=макс
End}
Код работы ESP взял вот такой
Код:
HardwareSerial & ESPport = Serial;
const int ledPin = 13;
int ledState = HIGH;
#define BUFFER_SIZE 128
char buffer[BUFFER_SIZE];
String vklotkl;
void setup()
{
pinMode(ledPin, OUTPUT);
//Serial.begin(9600); // Терминал
ESPport.begin(115200); // ESP8266
clearSerialBuffer();
GetResponse("AT+RST",3400); // перезагрузка ESP
GetResponse("AT+CWMODE=1",300); // режим клиента
connectWiFi("dlink","Nauka2014"); // подключаемся к домашнему роутеру (имя точки, пароль)
GetResponse("AT+CIPMODE=0",300); // сквозной режим передачи данных.
GetResponse("AT+CIPMUX=1",300); // multiple connection.
GetResponse("AT+CIPSERVER=1,88", 300); // запускаем ТСР-сервер на 88-ом порту
GetResponse("AT+CIPSTO=2", 300); // таймаут сервера 2 сек
Serial.println(GetResponse("AT+CIFSR", 300)); // узнаём адрес
//clearSerialBuffer();
digitalWrite(ledPin,ledState);
}
///////////////////основной цикл, принимает запрос от клиента///////////////////
void loop()
{
int ch_id, packet_len;
char *pb;
ESPport.readBytesUntil('\n', buffer, BUFFER_SIZE);
//clearSerialBuffer();
// Serial.println(buffer);
if(strncmp(buffer, "+IPD,", 5)==0)
{
sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
if (packet_len > 0)
{
pb = buffer+5;
while(*pb!=':') pb++;
pb++;
if((strncmp(pb, "GET / ", 6) == 0) || (strncmp(pb, "GET /?", 6) == 0))
{
clearSerialBuffer();
if(ledState == LOW)
{
ledState = HIGH;
vklotkl = "VKL";
}
else
{
ledState = LOW;
vklotkl = "OTKL";
}
digitalWrite(ledPin, ledState);
otvet_klienty(ch_id);
}
}
}
clearBuffer();
}
//////////////////////формирование ответа клиенту////////////////////
void otvet_klienty(int ch_id)
{
String Header;
Header = "HTTP/1.1 200 OK\r\n";
Header += "Content-Type: text/html\r\n";
Header += "Connection: close\r\n";
String Content;
Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> " + vklotkl;
Content += "</form></body></html>";
Header += "Content-Length: ";
Header += (int)(Content.length());
Header += "\r\n\r\n";
ESPport.print("AT+CIPSEND="); // ответ клиенту
ESPport.print(ch_id);
ESPport.print(",");
ESPport.println(Header.length()+Content.length());
delay(20);
if(ESPport.find(">"))
{
ESPport.print(Header);
ESPport.print(Content);
delay(200);
}
}
/////////////////////отправка АТ-команд/////////////////////
String GetResponse(String AT_Command, int wait)
{
String tmpData;
ESPport.println(AT_Command);
delay(wait);
while (ESPport.available() >0 )
{
char c = ESPport.read();
tmpData += c;
if ( tmpData.indexOf(AT_Command) > -1 )
tmpData = "";
else
tmpData.trim();
}
return tmpData;
}
//////////////////////очистка ESPport////////////////////
void clearSerialBuffer(void)
{
while ( ESPport.available() > 0 )
{
ESPport.read();
}
}
////////////////////очистка буфера////////////////////////
void clearBuffer(void) {
for (int i =0;i<BUFFER_SIZE;i++ )
{
buffer[i]=0;
}
}
////////////////////подключение к wifi/////////////////////
boolean connectWiFi(String NetworkSSID,String NetworkPASS)
{
String cmd = "AT+CWJAP=\"";
cmd += NetworkSSID;
cmd += "\",\"";
cmd += NetworkPASS;
cmd += "\"";
ESPport.println(cmd);
delay(6500);
}
Причем диод на ESP при подаче запроса мигает, но в мониторе никаких действий не происходит.
Может кто знает, в чем причина и как решить такую задачу.
ЗЫ. модуль у меня ESP-01