esp8266 Диммер и PWD

Sabri
Offline
Зарегистрирован: 26.08.2021

Здрасте. Может кто подскажет.
есть esp8266 (wemos)
Нужно подключить диммер и шим сигнал на другой пин. 
Использовал стандартный скетч для подключения диммера 
 

#include <RBDdimmer.h>//

//#define USE_SERIAL  SerialUSB //Serial for boards whith USB serial port
#define USE_SERIAL  Serial
#define outputPin  12 
#define zerocross  13 // for boards with CHANGEBLE input pins

//dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for ESP8266, ESP32, Arduino due boards
dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for MEGA, Leonardo, UNO, Arduino M0, Arduino Zero

int outVal = 0;

void setup() {
  USE_SERIAL.begin(9600);
  dimmer.begin(NORMAL_MODE, ON); //dimmer initialisation: name.begin(MODE, STATE) 
}

void loop() 
{
  outVal = map(analogRead(0), 1, 1024, 100, 0); // analogRead(analog_pin), min_analog, max_analog, 100%, 0%);
  USE_SERIAL.println(outVal); 
  dimmer.setPower(outVal); // name.setPower(0%-100%)
}

 

При попытке добавить шим на другой пин отваливается димер 
 analogWrite(ledPin, outVal);

Так же нашел скетч подключения димера через <Ticker.h>

 

#include <ESP8266WiFi.h>
#include <Ticker.h>

Ticker blinker;

const byte interruptPin = D7;  // пин диммера М2
const byte dimPin = D5;        // пин диммера М1
int val = 0;                   // переменная, которая определяет мощность от 0 до 10000

int power = 0;
int rise = 0;

void ICACHE_RAM_ATTR handleInterrupt();

void ICACHE_RAM_ATTR onTimerISR()  // обработчик прерывания таймера
{
    digitalWrite(dimPin, HIGH);
    delayMicroseconds(40);
    digitalWrite(dimPin, LOW);
    
    timer1_write(50000);//10мс
}


void handleInterrupt() // обработчик прерывания по фронту (от пина детекции фазы димера)
{
    power = 49000 - 4.785*val;
    timer1_write(power);

    if(val < 10000 && rise == 1) val = val + 100;   // плавное наростание
    else rise = 0;

    if(val > 0 && rise == 0) val = val - 100;  // плавное угасание
    else rise = 1;
}



void setup()
{

  pinMode(interruptPin, INPUT_PULLUP);
  pinMode(dimPin, OUTPUT);
  
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, RISING);

    timer1_attachInterrupt(onTimerISR);
    timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);
}


void loop()
{

}

 

но так же при попытке выдать шим analogWrite на другой пин отваливается  димер

 

Sabri
Offline
Зарегистрирован: 26.08.2021

Да к слову на mega328 все работает.

сам димер

распиновка esp 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

наверно надо код привести, где отваливается

Sabri
Offline
Зарегистрирован: 26.08.2021

Код компилируется и заливается. Отваливается в смысле диммер вообще перестает работать
 

#include <RBDdimmer.h>//

//#define USE_SERIAL  SerialUSB //Serial for boards whith USB serial port
#define USE_SERIAL  Serial
#define outputPin  12 
#define zerocross  13 // for boards with CHANGEBLE input pins

//dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for ESP8266, ESP32, Arduino due boards
dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for MEGA, Leonardo, UNO, Arduino M0, Arduino Zero

const int ledPin = 4; // пин pwm

int outVal = 0;

void setup() {
  USE_SERIAL.begin(9600);
  dimmer.begin(NORMAL_MODE, ON); //dimmer initialisation: name.begin(MODE, STATE) 
  pinMode(ledPin, OUTPUT);  // пин реле как выход
}

void loop() 
{
  outVal = map(analogRead(0), 1, 1024, 100, 0); // analogRead(analog_pin), min_analog, max_analog, 100%, 0%);
  USE_SERIAL.println(outVal); 
  dimmer.setPower(outVal); // name.setPower(0%-100%)
  analogWrite(ledPin, outVal);
}

так работает только шим на  ledPin = 4;
убираю  analogWrite(ledPin, outVal); и диммер воскресает 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

значит analogWrite использует один и тот же таймер для генерации ШИМ, управляйте всем через библиотеку или через analogWrite

Sabri
Offline
Зарегистрирован: 26.08.2021

ua6em пишет:

значит analogWrite использует один и тот же таймер для генерации ШИМ, управляйте всем через библиотеку или через analogWrite

 

в этом и загвоздка что при использовании 2 скетча где не используется библиотека димера а  только digitalWrite(dimPin, HIGH) или LOW
 

 

#include <ESP8266WiFi.h>
#include <Ticker.h>

Ticker blinker;

const byte interruptPin = D7;  // пин диммера D2
const byte dimPin = D5;        // пин диммера D1
int val = 0;                   // переменная, которая определяет мощность от 0 до 10000

int power = 0;
int rise = 0;

void ICACHE_RAM_ATTR handleInterrupt();

void ICACHE_RAM_ATTR onTimerISR()  // обработчик прерывания таймера
{
    digitalWrite(dimPin, HIGH);
    delayMicroseconds(40);
    digitalWrite(dimPin, LOW);
    
    timer1_write(50000);//10мс
}


void handleInterrupt() // обработчик прерывания по фронту (от пина детекции фазы димера)
{
    power = 49000 - 4.785*val;
    timer1_write(power);

    if(val < 10000 && rise == 1) val = val + 100;   // плавное наростание
    else rise = 0;

    if(val > 0 && rise == 0) val = val - 100;  // плавное угасание
    else rise = 1;
}



void setup()
{

  pinMode(interruptPin, INPUT_PULLUP);
  pinMode(dimPin, OUTPUT);
  
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, RISING);

    timer1_attachInterrupt(onTimerISR);
    timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);
}


void loop()
{

}

то же перестает работать при попытки подключить  analogWrite. Грешу на функцию прерывания 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Sabri пишет:

 Грешу

а не надо бы...
открывай даташит на esp8266 и смотри какие таймеры отвечают за какие пины, в нано один таймер на 2 пина, там три таймера поэтому шимить можно максимально 6-ть пинов

ЗЫ так и не понял к чему analogWrite если задействуете библиотеку от Рободина, работайте через неё

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

Sabri пишет:
есть esp8266 (wemos) Нужно подключить диммер

Я делал диммер на Тини25 с I2C slave, и подключал его к ESP по I2C.

То есть Тини25 занимается диммированием 2-ух  каналов, обрабатывает z-cross, и получает команды от ESP по I2C.

В такой связке несколько диммеров работают уже много лет, поставил - забыл, как промышленные.