esp8266 Диммер и PWD
- Войдите на сайт для отправки комментариев
Чт, 26/08/2021 - 14:33
Здрасте. Может кто подскажет.
есть 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 на другой пин отваливается димер
Да к слову на mega328 все работает.
сам димер
распиновка esp
наверно надо код привести, где отваливается
Код компилируется и заливается. Отваливается в смысле диммер вообще перестает работать
так работает только шим на ledPin = 4;
убираю analogWrite(ledPin, outVal); и диммер воскресает
значит analogWrite использует один и тот же таймер для генерации ШИМ, управляйте всем через библиотеку или через analogWrite
значит analogWrite использует один и тот же таймер для генерации ШИМ, управляйте всем через библиотеку или через analogWrite
в этом и загвоздка что при использовании 2 скетча где не используется библиотека димера а только digitalWrite(dimPin, HIGH) или LOW
то же перестает работать при попытки подключить analogWrite. Грешу на функцию прерывания
Грешу
а не надо бы...
открывай даташит на esp8266 и смотри какие таймеры отвечают за какие пины, в нано один таймер на 2 пина, там три таймера поэтому шимить можно максимально 6-ть пинов
ЗЫ так и не понял к чему analogWrite если задействуете библиотеку от Рободина, работайте через неё
Я делал диммер на Тини25 с I2C slave, и подключал его к ESP по I2C.
То есть Тини25 занимается диммированием 2-ух каналов, обрабатывает z-cross, и получает команды от ESP по I2C.
В такой связке несколько диммеров работают уже много лет, поставил - забыл, как промышленные.