![]() |
|
|
|
|
#1 |
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9825 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Прежде чем посылать данные в шину I2C нужно дождаться прерывания INT0(перехода через ноль). Засовывать в обработчик прерывания вывод на дисплей не нужно, достаточно изменять статус какой либо переменной.
|
|
|
|
|
|
#2 |
|
Junior Member
Регистрация: 07.01.2019
Сообщений: 1
Вес репутации: 0 ![]() |
Скажите код написан под мегу, а каким образом мне использовать ардуино про мини?? Понятно, пины сменить, но какие и на какие?? Более того в коде подключена неизвестная мне библиотека.
Скажите как мне поступить??целью ставлю использовать димер для управления мотором от стиралки?? |
|
|
|
|
|
#3 |
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9825 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Код в шапке темы можно использовать для arduino pro mini
|
|
|
|
|
|
#4 |
|
Junior Member
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0 ![]() |
Правильно ли я понял?
Развернуть для просмотра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); //перепрограммировать прерывание на другой обработчик } [свернуть] Как я понимаю, при появлении LOW на входе мы запускаем таймер и ставим ожидание HIGH. LOW у нас появляется на 2м входе сразу же после прохождения синусоидой "0". После этого мы ждем несколько отсчетов уже по прерыванию таймера и подаем сигнал. При появлении HIGH мы отключаем таймер и обнуляем счетчик. Имеем мертвую зону, что хорошо для гарантированного выключения тиристора. Желтым - сигнал с детектора "0", Голубым - сигнал на управление нагрузкой. |
|
|
|
|
|
#5 |
|
Junior Member
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0 ![]() |
Если все работает так, как я написал в предыдущем посте, то тогда при задержке в 1 должно быть больше мертвого времени. Однако мы четко видим короткое пропадание сигнала управления.
При попытке выставить максимальную задержку, при значениях больше 205 получается нестабильное появление управляющего сигнала, а при значениях больше 210 управляющий сигнал вообще не появляется. Грубо 20% диапазона. Видимо, я не правильно понял алгоритм. Подскажите в чем ошибка. П.С. Если кому интересно взаимное расположение сигналов, розовым синусоида сети через разделительный трансформатор. Уровни смещены по вертикали. |
|
|
|
|
|
#6 |
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9825 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Проблема в детекторе ноля. Дело в том, что светодиод в оптроне начинает светиться при достаточном токе, который может появится на пороге 30-50 В
Можно уменьшить сопротивление резисторов, но тогда они будут сильно греться |
|
|
|
|
|
#7 |
|
Junior Member
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0 ![]() |
Спасибо за подсказку. Почему-то не пришло оповещение.
Еще не подскажите, возникла проблема при добавлении дисплея, пропала задержка. Такое ощущение, что активация дисплея изменяет время прерывания таймера, уменьшает его. Использую библиотеку LiquidCrystal_I2C. Только столкнулся. Начинается после активации дисплея lcd.init(); |
|
|
|
|
|
#8 |
|
Junior Member
Регистрация: 06.10.2019
Сообщений: 2
Вес репутации: 0 ![]() |
Добрый день всем! Разрешите влезть к вам в топик со своим самоваром.
Строю себе умный дом, дошли руки до модуля димирования в связке 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();
}
[свернуть] |
|
|
|
|
|
#9 |
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9825 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Да, библиотека дисплея использует этот же таймер. Можно использовать другой свободный таймер
|
|
|
|
|
|
#10 |
|
Junior Member
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0 ![]() |
|
|
|
|
![]() |
| Здесь присутствуют: 11 (пользователей: 0 , гостей: 11) | |
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|