• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP + Arduino + диммер 220в

gonzales

New member
Доброго всем времени суток!

Собираю плату для управления освещением (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}
Код построен на прерывании на 2 пине (отслеживает ноль).

Код работы 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 затыкается как только я включаю прерывание attachInterrupt(0, detect_up, LOW);
Причем диод на ESP при подаче запроса мигает, но в мониторе никаких действий не происходит.

Может кто знает, в чем причина и как решить такую задачу.
ЗЫ. модуль у меня ESP-01
 

gonzales

New member
По сути я хочу добиться, чтобы ESP принимала запрос по TCP и вываливала все это в UART, то есть работала просто как ретранслятор
 

msg31

New member
Доброго всем времени суток!

По отдельности все работает, но вместе никак. Путем проб и ошибок понял, что ESP затыкается как только я включаю прерывание attachInterrupt(0, detect_up, LOW);
Причем диод на ESP при подаче запроса мигает, но в мониторе никаких действий не происходит.

Может кто знает, в чем причина и как решить такую задачу.
ЗЫ. модуль у меня ESP-01
Такая же ерунда с аппаратным прерыванием. Видимо, что-то не так в Ардуино с кодом.
http://esp8266.ru/forum/threads/apparatnoe-preryvanie-vyzyvaet-perezagruzku-esp8266.938/
 

al.kl

New member
понял, что ESP затыкается как только я включаю прерывание attachInterrupt(0, detect_up, LOW);
Интересно, как может "затыкаться" модуль, как совершенно другое устройство, от того, что Вы там накодили в Дурине ?
Поясните, плиз, откуда Вы "поняли" это ?
 

msg31

New member
Интересно, как может "затыкаться" модуль, как совершенно другое устройство, от того, что Вы там накодили в Дурине ?
Поясните, плиз, откуда Вы "поняли" это ?
Да чего там не понять-то. Отсоединяешь контакт от прерывания детектора нуля - все работает, подсоединяешь обратно - виснет и перезагружается.
 

msg31

New member
Нет, не использовал. До этого не дошел даже. Я взял стандартный пример из Ардуино WiFiAcsessPoint, просто добавил туда обработку внешнего прерывания и сразу получил такой эффект. Дальше что-то делать на Ардуино смысла для меня уже не было.
 

sally555

New member
Да чего там не понять-то. Отсоединяешь контакт от прерывания детектора нуля - все работает, подсоединяешь обратно - виснет и перезагружается.
так и непонятно, что "все работает"? и что именно "виснет и перезагружается", Ардуино или ESPшка?
 

sally555

New member
По отдельности все работает, но вместе никак.
Оба кода у вас для Ардуино, простите, а где скетч для ESPшки(здесь вообще раздел программирования ESP в среде Ардуино IDE:)) ? Или у вас в ESPшке залита одна из ATшных прошивок?
И еще, как именно вы соединяете оба кода в один, хотелось бы посмотреть порядок действий.
 

msg31

New member
Оба кода у вас для Ардуино, простите, а где скетч для ESPшки(здесь вообще раздел программирования ESP в среде Ардуино IDE:)) ? Или у вас в ESPшке залита одна из ATшных прошивок?
Ведь это Ардуино IDE для ESP. В ESP просто загружается скетч. Платы Ардуино тут вообще не используются.
 

sally555

New member
Ведь это Ардуино IDE для ESP. В ESP просто загружается скетч. Платы Ардуино тут вообще не используются.
Вы начало топика читали, хоть название?
ESP + Arduino + диммер 220в.
И скетчи приведенные здесь написаны для Ардуино, и библа CyberLib.h заточена для Ардуино.
 

nicelight

Member
Товарищи дорогие. Оживлю тему.
Очень не хватает времени разобраться и написать код в сишной(емнип) родной сдк для есп. Писать буду на ардуино/дурино, нужное подчеркнуть.
Есть ли какая либо возможность, вставить кусок кода на красивом си в ардуиновскую иде, чтобы корректно отрабатывало внешнее прерывание. Просьба потратить минуту своего драгоценного времени на помощь не доросшему до вас быдло кодеру. (Запятые и дефизы при желании поставить в нужном месте ;)
Или хотя бы объясните на пальцах алгоритм корректного формирования внешнего прерывания и его обработки чтобы нигде ничего не зацепить хрупкого.
ЗЫ: простым смертным вопрос: у кого нибудь есть догадки, почему прерывание не работает стандартными методами ардуино иде?
 
Сверху Снизу