Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.11.2018, 00:19   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Прежде чем посылать данные в шину I2C нужно дождаться прерывания INT0(перехода через ноль). Засовывать в обработчик прерывания вывод на дисплей не нужно, достаточно изменять статус какой либо переменной.
Admin вне форума   Ответить с цитированием
Старый 07.01.2019, 20:34   #2
Рефик79
Junior Member
 
Регистрация: 07.01.2019
Сообщений: 1
Вес репутации: 0
Рефик79 is an unknown quantity at this point
По умолчанию

Скажите код написан под мегу, а каким образом мне использовать ардуино про мини?? Понятно, пины сменить, но какие и на какие?? Более того в коде подключена неизвестная мне библиотека.
Скажите как мне поступить??целью ставлю использовать димер для управления мотором от стиралки??
Рефик79 вне форума   Ответить с цитированием
Старый 07.01.2019, 21:41   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Код в шапке темы можно использовать для arduino pro mini
Admin вне форума   Ответить с цитированием
Старый 19.09.2019, 08:33   #4
Valery22
Junior Member
 
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0
Valery22 is an unknown quantity at this point
По умолчанию

Правильно ли я понял?

Развернуть для просмотра

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", Голубым - сигнал на управление нагрузкой.
Миниатюры
Нажмите на изображение для увеличения
Название: NewFile1.jpg
Просмотров: 8
Размер:	69.1 Кб
ID:	5186  
Valery22 вне форума   Ответить с цитированием
Старый 19.09.2019, 09:35   #5
Valery22
Junior Member
 
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0
Valery22 is an unknown quantity at this point
По умолчанию

Если все работает так, как я написал в предыдущем посте, то тогда при задержке в 1 должно быть больше мертвого времени. Однако мы четко видим короткое пропадание сигнала управления.
При попытке выставить максимальную задержку, при значениях больше 205 получается нестабильное появление управляющего сигнала, а при значениях больше 210 управляющий сигнал вообще не появляется. Грубо 20% диапазона. Видимо, я не правильно понял алгоритм. Подскажите в чем ошибка.
П.С. Если кому интересно взаимное расположение сигналов, розовым синусоида сети через разделительный трансформатор. Уровни смещены по вертикали.
Миниатюры
Нажмите на изображение для увеличения
Название: NewFile2.jpg
Просмотров: 8
Размер:	79.7 Кб
ID:	5187   Нажмите на изображение для увеличения
Название: NewFile3.jpg
Просмотров: 5
Размер:	84.1 Кб
ID:	5188  
Valery22 вне форума   Ответить с цитированием
Старый 20.09.2019, 08:38   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Проблема в детекторе ноля. Дело в том, что светодиод в оптроне начинает светиться при достаточном токе, который может появится на пороге 30-50 В
Можно уменьшить сопротивление резисторов, но тогда они будут сильно греться
Admin вне форума   Ответить с цитированием
Старый 21.09.2019, 22:07   #7
Valery22
Junior Member
 
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0
Valery22 is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Проблема в детекторе ноля
Спасибо за подсказку. Почему-то не пришло оповещение.

Еще не подскажите, возникла проблема при добавлении дисплея, пропала задержка. Такое ощущение, что активация дисплея изменяет время прерывания таймера, уменьшает его. Использую библиотеку LiquidCrystal_I2C. Только столкнулся. Начинается после активации дисплея lcd.init();
Valery22 вне форума   Ответить с цитированием
Старый 06.10.2019, 01:46   #8
aleja
Junior Member
 
Регистрация: 06.10.2019
Сообщений: 2
Вес репутации: 0
aleja is an unknown quantity at this point
По умолчанию Многоканальный 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();
}
[свернуть]
aleja вне форума   Ответить с цитированием
Старый 22.09.2019, 00:54   #9
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Да, библиотека дисплея использует этот же таймер. Можно использовать другой свободный таймер
Admin вне форума   Ответить с цитированием
Старый 22.09.2019, 08:44   #10
Valery22
Junior Member
 
Регистрация: 19.09.2019
Сообщений: 4
Вес репутации: 0
Valery22 is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Можно использовать другой свободный таймер
Спасибо. И это я еще до АЦП не дошел...
Valery22 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 15 (пользователей: 0 , гостей: 15)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 19:49. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика