• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
Товарищи дорогие. Оживлю тему.
Очень не хватает времени разобраться и написать код в сишной(емнип) родной сдк для есп. Писать буду на ардуино/дурино, нужное подчеркнуть.
Есть ли какая либо возможность, вставить кусок кода на красивом си в ардуиновскую иде, чтобы корректно отрабатывало внешнее прерывание. Просьба потратить минуту своего драгоценного времени на помощь не доросшему до вас быдло кодеру. (Запятые и дефизы при желании поставить в нужном месте ;)
Или хотя бы объясните на пальцах алгоритм корректного формирования внешнего прерывания и его обработки чтобы нигде ничего не зацепить хрупкого.
ЗЫ: простым смертным вопрос: у кого нибудь есть догадки, почему прерывание не работает стандартными методами ардуино иде?
 
Сверху Снизу