20.09.2019, 08:38 | #931 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Проблема в детекторе ноля. Дело в том, что светодиод в оптроне начинает светиться при достаточном токе, который может появится на пороге 30-50 В
Можно уменьшить сопротивление резисторов, но тогда они будут сильно греться |
21.09.2019, 22:07 | #932 |
Junior Member
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0 |
Спасибо за подсказку. Почему-то не пришло оповещение.
Еще не подскажите, возникла проблема при добавлении дисплея, пропала задержка. Такое ощущение, что активация дисплея изменяет время прерывания таймера, уменьшает его. Использую библиотеку LiquidCrystal_I2C. Только столкнулся. Начинается после активации дисплея lcd.init(); |
22.09.2019, 00:54 | #933 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Да, библиотека дисплея использует этот же таймер. Можно использовать другой свободный таймер
|
22.09.2019, 08:44 | #934 |
Junior Member
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0 |
|
06.10.2019, 01:46 | #935 |
Junior Member
Регистрация: 06.10.2019
Сообщений: 2
Вес репутации: 0 |
Многоканальный I2C плавный димер без мерцания на Arduino+RoboDyn модулях
Добрый день всем! Разрешите влезть к вам в топик со своим самоваром.
Строю себе умный дом, дошли руки до модуля димирования в связке ESP8266(blynk) -> I2C -> Arduino Nano (5 x Robotdyn Dimmer), решил поделится рабочим решением, может кому пригодится. Также принимается любая конструктивная критика, т.к. все еще в процессе отладки. Итак имеем 5 линий света, которыми хотим управлять с использованием Robotdyn Dimmer Перепробовав несколько решений, пришел к своему, рабочему варианту с плавным димированием без мерцания от минимума до максимума с рабочим I2C ESP8266 -> Arduino, может кому пригодится. Код многоканального димера на arduino без блокировок delayMicroseconds, delay ... с работающим I2C интерфейсом Развернуть для просмотраКод:
#include <TimerOne.h> #include <Wire.h> //Функция для работы i2C , можно отключить const byte zcPin = 2; //Zero Cross пин const byte DIMMER_COUNT = 5; //Кол-Во димеров const byte DELAY_TUNING = 1300; //Подстройка минимума/максимума const int pwmPin[DIMMER_COUNT] = { 4, 5, 6, 7, 8 }; //Пины для каждого димера byte tarBrightness[DIMMER_COUNT] = {45, 45, 45, 45, 45}; //Дефолтная яркость для каждого димера byte zcState[DIMMER_COUNT] = {0, 0, 0, 0, 0}; int IdleCyles[DIMMER_COUNT] = {0, 0, 0, 0, 0}; bool zcFired[DIMMER_COUNT] = {false, false, false , false, false }; const int freqStep = 65; // This is the delay-per-brightness step in microseconds. void setup() { startI2C(); //Функция инициализации I2C (i2cinterface.ino), см ниже или можно отключить Serial.begin(9600); pinMode(zcPin, INPUT_PULLUP); for (int i = 0; i < DIMMER_COUNT; i++) { pinMode(pwmPin[i], OUTPUT); } attachInterrupt(0, zcDetectISR, RISING); // Вешаем прерывание на Zero Cross noInterrupts(); Timer1.initialize(freqStep); Timer1.attachInterrupt(dimTimerISR,freqStep); //Таймер для обработчика диммирования interrupts(); } void dimTimerISR() { for (int i = 0; i < DIMMER_COUNT; i++) { if (IdleCyles[i] == 0) { if (!zcFired[i]) { digitalWrite(pwmPin[i], 1); zcState[i] = 0; } else { if (zcState[i] == 0) { zcState[i] = 1; digitalWrite(pwmPin[i], 0); IdleCyles[i] = (30 * (255 - tarBrightness[i])+DELAY_TUNING)/freqStep; //Задержка после определения ноля в виде кол-ва тактов пропуска таймера } zcFired[i] = false; } } else { IdleCyles[i]--; } } } void zcDetectISR() { for (int i = 0; i < DIMMER_COUNT; i++) { zcFired[i] = true; } } void loop() {} [свернуть] i2cinterface.ino Развернуть для просмотраКод:
void startI2C() { Serial.begin(9600); Wire.begin(8); /* join i2c bus with address 0x8 */ Wire.onReceive(receiveEvent); /* register receive event */ } void receiveEvent(int howMany) { while (Wire.available() > 0) { byte x = Wire.read(); tarBrightness[0] = x; //........ } } [свернуть] Код для работы Blynk + Esp8266 для управления i2c ( пока одноканальный) Развернуть для просмотраКод:
#include <Wire.h> #define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> char auth[] = ""; char ssid[] = ""; char pass[] = "!"; void setup() { Serial.begin(9600); Serial.print("Starting ..."); Wire.begin(D1, D2); /* join i2c bus with SDA=D1 and SCL=D2 */ Blynk.begin(auth, ssid, pass, IPAddress(x,x,x,x), 8080); } BLYNK_WRITE(V50) { byte pinValue = param.asInt(); Serial.println(pinValue); Wire.beginTransmission(8); // begin with device address 8 Wire.write(pinValue); // sends hello string Wire.endTransmission(); } void loop() { Blynk.run(); } [свернуть] |
07.10.2019, 10:47 | #936 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
А при помощи ESP8266 на прямую диммером, не пробовали управлять?
|
07.10.2019, 19:54 | #937 |
Junior Member
Регистрация: 06.10.2019
Сообщений: 2
Вес репутации: 0 |
Пробовал конечно, ардуинка нужна чисто как мастер контроллер I2C , по которому у меня все бегает. Просто тянуть 5 (это пока, их и больше будет) проводов к контроллеру напрямую - это лишние провода и сложности. Да и ног у 8266 маловато.
Да и вообще ESP-шка пока для теста, скорее всего мозгом будет какая-то Ruggeduino |
06.11.2019, 22:34 | #938 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
|
21.02.2020, 04:29 | #939 | |
Junior Member
Регистрация: 21.02.2020
Сообщений: 3
Вес репутации: 0 |
Вопросики
Цитата:
Купил данное устройство для регулировки оборотов вентилятора + Ардуино УНО + потенциометр, стал изучать. Скопировал скетч с шапки, настроил, запустил - обороты отлично регулируются, по ощущениям от 30% до максимума. Но есть незначительный гул, видимо влияет на обмотки срезанная полуволна. 1. Стал читать ветку и видел сообщения, что надо не волну резать, а пропускать периоды. Но во всей теме не нашел такого примера со скетчем, а сам пока дуб в этом деле. Не смогли бы вы мне помочь? 2. Так же в вашем скетче вы регистрируете подъем и спад полуволны, а можно ли переделать, чтобы прерывания срабатывали именно на переходе нуля? Как я понимаю, устройство позволяет это делать? Если да, то что нужно подправить/заменить в скетче? 3. Еще, я так понял, нужно собрать снаббер, чтобы в сеть не пускать помехи. Помогите, пжл, рассчитать параметры сопротивления и кондера. Вентилятор такой: http://glorya-holod.ru/catalog/aksia...4_e_350_v_vde/ 4. И еще чуть отвлеченный вопрос. Как средствами ардуинки регистрировать аварийную остановку вентилятора (когда в лопасти попало что-то и его заклинило). Попробовал подключить в цепь "AC in" последовательно это: https://duino.ru/ACS712-Datchik-toka...yazkoi-5A.html, настроил скетч, запустил движок и стал его тормозить рукой. Явного подъема ампеража не заметил (в пределах 1.00 - 1.10А), т.о. такой метод не работает. Таходатчик прикрутить нет технической возможности, т.к. любые магнитики наклеенные на крыльчатку сбивают дисбаланс. Но можно попробовать на решетку прицепить ультразвуковой или инфракрасный датчик и регистрировать прохождение лопастей возле него. В процессе их вращения, циклично будет меняться перпендикулярное к ним расстояние в пределах 3-8 см. Частота получается 1380 об/мин * 5 лопастей = 6900 циклов/мин или 115 циклов/сек. Какой датчик сможет такое фиксировать? На сколько я помню по парктроникам, ультрозвуковые датчики не самые быстрые. Возможно ошибаюсь или остается только инфракрасный? PS Сильно не пинаете, кому вопросы покажутся банальными. Любая помощь приветствуется Последний раз редактировалось Renzo; 21.02.2020 в 04:33. |
|
21.02.2020, 17:37 | #940 | |||
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Цитата:
Цитата:
Цитата:
Или второй вариант импульсами от датчика препятствий обнулять таймер |
|||
Здесь присутствуют: 24 (пользователей: 0 , гостей: 24) | |
|
|