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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.11.2018, 23:13   #921
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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
По умолчанию

Лучше 1-2 сек=100%
С детектором ноля для нагревателя предпочтительней
Admin вне форума   Ответить с цитированием
Старый 17.11.2018, 19:57   #922
hoiho
Junior Member
 
Регистрация: 07.11.2018
Сообщений: 11
Вес репутации: 0
hoiho is an unknown quantity at this point
По умолчанию

Все получилось собрать, но в какой то момент симистор начинает самопроизвольно открываться, при том, что подачи на на оптрон никакой нет. Может это быть из-за близости схемы к электропроводке?
Или это вообще проблема из-за rc цепи?

Последний раз редактировалось hoiho; 18.11.2018 в 09:39.
hoiho вне форума   Ответить с цитированием
Старый 20.11.2018, 18:40   #923
XOBIT
Junior Member
 
Регистрация: 20.11.2018
Сообщений: 2
Вес репутации: 0
XOBIT is an unknown quantity at this point
По умолчанию

Всем привет. Спсб автору за статью.
Схему повторил, работает отлично.

Добавил в код OLED дисплей (Ini). Создал простой счетчик.
При попытке вывода, появилось мерцание (Loop#2).
Если закомментировать display.print (Loop#1), все отлично.

Подскажите в чем проблема?
I2C конфликтует с прерыванием? Кто-то не успевает?

Как заставить OLED дисплей выводить информацию,
без какого-то влияния на диммер?

Ini:

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

PHP код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


volatile uint8_t ticDimmer1Dimmer2Dimmer3;
uint8_t data;

unsigned long curTimeloopTime// Время работы программы 
volatile int Hz 0;            // Назовем частотой в сети переменного тока . 


#define SCREEN_WIDTH 128              // OLED дисплей ширина, пикселей
#define SCREEN_HEIGHT 64              // OLED дисплей высота, пикселей 

// Декларация для дисплея SSD1306, подключенного к I2C (контакты SDA, SCL)
#define OLED_RESET     7              // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTHSCREEN_HEIGHT, &WireOLED_RESET);

void setup() 

  
D4_OutD5_OutD6_Out//Настраиваем порты на выход
  
D4_LowD5_LowD6_Low//установить на выходах низкий уровень сигнала
  
D2_In//настраиваем порт на вход для отслеживания прохождения сигнала через ноль  

//CHANGE – прерывание вызывается при любом изменении значения на входе; 
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH) 
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low) 
    
attachInterrupt(0detect_upLOW);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
    
StartTimer1(halfcycle40); //время для одного разряда ШИМ
    
StopTimer1(); //остановить таймер
    
UART_Init(115200); //инициализация порта
    
display.begin(SSD1306_SWITCHCAPVCC0x3C); // Address 0x3D for 128x64 // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
}
//********************обработчики прерываний*******************************
void halfcycle()  //прерывания таймера

  
tic++;  //счетчик  
  
if(Dimmer1 tic D4_High//управляем выходом
  
if(Dimmer2 tic D5_High;  //управляем выходом
  
if(Dimmer3 tic D6_High;  //управляем выходом 
}

void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту
{  
 
tic=0;             //обнулить счетчик
 
ResumeTimer1();   //запустить таймер
 
attachInterrupt(0detect_downHIGH);  //перепрограммировать прерывание на другой обработчик
}  

void  detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту
{   
 
StopTimer1(); //остановить таймер
 
D4_LowD5_LowD6_Low//логический ноль на выходы
 
tic=0;       //обнулить счетчик
 
attachInterrupt(0detect_upLOW); //перепрограммировать прерывание на другой обработчик

[свернуть]



Loop#1

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

PHP код:
void loop() 
{
  
Dimmer1=160;  


  
display.clearDisplay();             // Сlear display
  
display.setTextSize(2);             // Normal 1:1 pixel scale
  
display.setTextColor(WHITE);        // Draw white text
  
display.setCursor(0,0);             // Start at top-left corner

  //display.print(Hz++);   display.print(" Hz");   display.display();   

  
delay(500); 
  

[свернуть]


Loop#2

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

PHP код:
void loop() 
{
  
Dimmer1=160;  


  
display.clearDisplay();             // Сlear display
  
display.setTextSize(2);             // Normal 1:1 pixel scale
  
display.setTextColor(WHITE);        // Draw white text
  
display.setCursor(0,0);             // Start at top-left corner

  
display.print(Hz++);   display.print(" Hz");   display.display();   

  
delay(500); 
  

[свернуть]
XOBIT вне форума   Ответить с цитированием
Старый 20.11.2018, 23:19   #924
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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 конфликтует с прерыванием? Кто-то не успевает?
Все верно, у I2C похоже приоритет выше

Цитата:
I2C конфликтует с прерыванием? Кто-то не успевает?
Я бы попробовал синхронизировать передаче данных по I2C с переходом через ноль.
Admin вне форума   Ответить с цитированием
Старый 21.11.2018, 17:56   #925
XOBIT
Junior Member
 
Регистрация: 20.11.2018
Сообщений: 2
Вес репутации: 0
XOBIT is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Все верно, у I2C похоже приоритет выше
Я бы попробовал синхронизировать передаче данных по I2C с переходом через ноль.
Может подскажите как?
По переходу через ноль, выводить инфу - не получилось.
Засунуть I2C в прерывание - тоже.
XOBIT вне форума   Ответить с цитированием
Старый 22.11.2018, 00:19   #926
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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   #927
Рефик79
Junior Member
 
Регистрация: 07.01.2019
Сообщений: 1
Вес репутации: 0
Рефик79 is an unknown quantity at this point
По умолчанию

Скажите код написан под мегу, а каким образом мне использовать ардуино про мини?? Понятно, пины сменить, но какие и на какие?? Более того в коде подключена неизвестная мне библиотека.
Скажите как мне поступить??целью ставлю использовать димер для управления мотором от стиралки??
Рефик79 вне форума   Ответить с цитированием
Старый 07.01.2019, 21:41   #928
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
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   #929
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   #930
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 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 206 (пользователей: 0 , гостей: 206)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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


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


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