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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.03.2017, 21:06   #791
Ilnur
Junior Member
 
Регистрация: 02.01.2017
Сообщений: 16
Вес репутации: 0
Ilnur is an unknown quantity at this point
По умолчанию

Ага, сейчас понял. Я думал через монитор тоже можно регулировать передачей чисел 0-200.

Почему у меня диммер по вашей схеме не захотел работать, есть предположения? Просто самому интересно.
Ilnur вне форума   Ответить с цитированием
Старый 25.03.2017, 22:49   #792
RaySun
Junior Member
 
Регистрация: 29.01.2017
Сообщений: 10
Вес репутации: 0
RaySun is an unknown quantity at this point
По умолчанию

Добрый день!
Подскажите, на Ваш взгляд вот такой код имеет право на реализацию или лучше не стоит. Нет осциллографа посмотреть что тут на выходе творится.
PHP код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile unsigned long Dimmer

void setup()
{
  
D4_Out;  //Настраиваем порты на выход
  
D4_Low;  //установить на выходах низкий уровень сигнала
  
D2_In//настраиваем порт на вход для отслеживания прохождения сигнала через ноль

  //CHANGE – прерывание вызывается при любом изменении значения на входе;
  //RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
  //FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
  
attachInterrupt(0detect_upRISING);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
  
}
//********************обработчики прерываний*******************************

void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту
{
  
delay_us(Dimmer);
  
D4_High;
  
attachInterrupt(0detect_downLOW);  //перепрограммировать прерывание на другой обработчик
}

void  detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту
{
  
delay_us(10);
  
D4_Low;
  
attachInterrupt(0detect_upRISING); //перепрограммировать прерывание на другой обработчик
}
//*************************************************************************
void loop() {
  
Dimmer 5500// время в микросекундах, где 500 = Max. 9500 = Min. 

RaySun вне форума   Ответить с цитированием
Старый 26.03.2017, 00:11   #793
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
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
По умолчанию

PHP код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile unsigned long Dimmer

void setup()
{
  
D4_Out;  //Настраиваем порты на выход
  
D4_Low;  //установить на выходах низкий уровень сигнала
  
D2_In//настраиваем порт на вход для отслеживания прохождения сигнала через ноль

  //CHANGE – прерывание вызывается при любом изменении значения на входе;
  //RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
  //FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
  
attachInterrupt(0detect_upRISING);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
  
}
//********************обработчики прерываний*******************************

void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту
{
  
delay_us(Dimmer);
  
D4_High;
  
delay_us(40); //формируем импульс включения симистора
  
D4_Low;
}

//*************************************************************************
void loop() 
{
  
Dimmer 5500// время в микросекундах, где 500 = Max. 9500 = Min. 

Теоретически и так должно работать. На практике не проверял
Но мне не нравится большая пауза в прерывании, о многозадачности придется забыть
У меня в первой версии диммера было так реализовано
Но в первой версии оптрон был с одним светодиодом
Admin вне форума   Ответить с цитированием
Старый 26.03.2017, 01:53   #794
RaySun
Junior Member
 
Регистрация: 29.01.2017
Сообщений: 10
Вес репутации: 0
RaySun is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Теоретически и так должно работать. На практике не проверял
Но мне не нравится большая пауза в прерывании, о многозадачности придется забыть
У меня в первой версии диммера было так реализовано
Но в первой версии оптрон был с одним светодиодом
Схема "визуально"работает (проверил), но полностью с Вами согласен, для меня ключевой момент - нет многозадачности, в топку эту версию.
Просто я ищу куда можно в коде из шапки вклиниться, чтобы скажем выполнить несложную функцию, без "видимого"(в прямом смысле слова) влияния на работу димера.
Например выполнить функцию по запросу данных с датчика DS1820 или отправить в сериал массив данных.
Т.к. если что-то "в лоб" выполнять в loop(e), то эффект начинает визуально проявляться, особенно на низком напряжении.
Есть же мертвая зона пусть и в какое-то кол-во мкс. Пока на ум приходят мысли только о функции halfcycle()

Последний раз редактировалось RaySun; 26.03.2017 в 01:56.
RaySun вне форума   Ответить с цитированием
Старый 26.03.2017, 01:55   #795
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
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 вне форума   Ответить с цитированием
Старый 26.03.2017, 02:13   #796
RaySun
Junior Member
 
Регистрация: 29.01.2017
Сообщений: 10
Вес репутации: 0
RaySun is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
С сериалом можно что то решить, а вот с датчиком проблемно
Ок, ну покурю тему еще немного
В общем-то у меня больше спортивный интерес, т.к. димер буду использовать для тэна. Там в принципе визуализация не важна, да вообще на полупериоды по вашим рекомендациям смотреть надо, но вот тем кому лампочку диммировать - тут вопрос...
RaySun вне форума   Ответить с цитированием
Старый 19.04.2017, 14:13   #797
RS_Razor
Junior Member
 
Регистрация: 19.04.2017
Сообщений: 2
Вес репутации: 0
RS_Razor is an unknown quantity at this point
По умолчанию

Здравствуйте! Спасибо за вашу библиотеку, очень помогла! Собрал диммер светодиодной лампы (диммируемая) - работает отлично, даже с учетом того что к ардуине подключен ультразвуковой датчик и часы реального времени). Написал функцию плавного изменения яркости, вдруг кому-то пригодится).

Power(uint8_t x, unsigned long t) - тут x - необходимая мощность, от 0 до 100%, 0% - выключено.
t - время (мs), за которое мощность меняется с текущего значения до введенного.
PHP код:
void Power(uint8_t xunsigned long t)
 {
  if (
== 0) {Dimmer1 mapx,0,100,200,0);return;}
  
int8_t znak;
  
int tz map (Dimmer1,0,200,200,0);
  
int dp 2*tz;
  if (
dp znak 1; else if (dp znak = -1; else if (dp 0) return;
  
dp abs(dp);
  if (
t<dpdp
      for (
int i=0i<dpi++)
     {
       
tz tz + (1*znak);
       
Dimmer1 maptz ,0,200,200,0);
       
delay_ms t/dp );
     }
    if (
== 0Dimmer1 255;
 } 

Последний раз редактировалось RS_Razor; 07.05.2017 в 14:58. Причина: подправил код
RS_Razor вне форума   Ответить с цитированием
Старый 28.04.2017, 16:56   #798
Ajlex71
Junior Member
 
Регистрация: 28.04.2017
Сообщений: 2
Вес репутации: 0
Ajlex71 is an unknown quantity at this point
По умолчанию По поводу LCD 1602 I2C

Подскажите когда прописываю код с первой страницы данной темы, не работает LCD по шине I2C. На экран не выводится информация. Может есть какое нибудь решение? Если нужно выложу скетч.

Вот код


/*******************************************************************************************************/
/* ПАЯЛЬНАЯ СТАНЦИЯ С ЭНКОДЕРОМ */
/*******************************************************************************************************/

#include <iarduino_Encoder_tmr.h>
#include <max6675.h>
#include <Bounce2.h>
#include <LiquidCrystal_I2C.h>
#include <CyberLib.h> //для Диммера
#include <Wire.h>

volatile uint8_t tic, Dimmer; //переменные для диммера фена

iarduino_Encoder_tmr enc(14,15); // создаем объект энкодер
MAX6675 tpPay(7, 6, 5);// создаем объект термопару для паяльника
MAX6675 tpFen(10, 11, 12);// создаем объект термопару для фена
LiquidCrystal_I2C lcd(0x3F, 16, 2); // создаем объект экран
Bounce btnEnc = Bounce(); // создаем объект кнопка энкодера
int e; //переменная для считывания значения поворота энкодера
int temPayTek; //температура с термопары паяльника
int temPayUst; // температура которую установили для паяльника
int btnEncPrev; // Предыдущее состояние кнопки энкодера
byte btnI=0; // счетчик нажатий кнопки энкодера

int setTPayDisp = 195; // установили начальную температуру 195 градусов чтобы вывести на дисплей off, начинать будем с 200 градусов
int setTFenDisp = 195; // установили начальную температуру 195 градусов чтобы вывести на дисплей off, начинать будем с 200 градусов
int setFenVentDisp = 247; // установили 0% на вентилятор фена,чтобы вывести на дисплей off


void setup()
{
D4_Out; //Диммер Настраиваем порты на выход
D4_Low;//Диммер установить на выходах низкий уровень сигнала
D2_In; //Диммер настраиваем порт на вход для отслеживания прохождения сигнала через ноль
lcd.begin();// инициализация экрана
delay(500);
enc.begin(); // инициализация энкодера
D16_In; // конфигурируем пин для кнопки энкодера
D16_High;// конфигурируем пин для кнопки энкодера
//pinMode(16,INPUT_PULLUP); // конфигурируем пин для кнопки энкодера
btnEnc.attach(16); // подключаем кнопку энкодера на 16 пин ????? проверить пин ????
btnEnc.interval(5); // устанавливаем интервал 5 мс для устранения дребезга
btnEnc.update(); // обновляем состояние кнопки энкодера
btnEncPrev = btnEnc.read(); // считываем состояние кнопки энкодера в переменную для сверки

//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
attachInterrupt(0, detect_up, LOW); //Диммер настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
StartTimer1(halfcycle, 40); //Диммер время для одного разряда ШИМ
StopTimer1(); //Диммер остановить таймер
//UART_Init(115200); //Диммер инициализация порта ?????????? если не будет работать откоментировать ????????????????

// Вывод приветствия
lcd.setCursor(0, 0);
lcd.print("SOLDER STATION");
lcd.setCursor(0, 1);
lcd.print("ver 0.1");
// задержка
delay (3000);
lcd.clear();

lcd.setCursor(0, 0);
lcd.print("SOLDER");
lcd.setCursor(0, 1);
lcd.print("FEN");

}

//********************обработчики прерываний для Диммера*******************************
/*
void halfcycle() //Диммер прерывания таймера
{
tic++; //счетчик
if(Dimmer < tic ) D4_High; //управляем выходом Диммера
}

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

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

//************************************************************************* Диммер



void loop() {

int setTPayTP = int(tpPay.readCelsius()); // получили температуру паяльника с MAX6675
int setTFenTP = 200;// int(tpFen.readCelsius()); // получили температуру фена с MAX6675
byte setFenVent = 119;
// unsigned long timeTemp;


btnEnc.update(); // обновили значение кнопки энкодера
if (btnEncPrev != btnEnc.read()){ // если изменилось
if (btnEnc.read()==LOW) { // если кнопка нажата
if (btnI<3){ // если значение счетчика кнопки меньше 3
btnI++; // увеличили значение на 1 единицу
}
else {
btnI=0;
}
//if (timeTemp==0) timeTemp=millis(); // получили значение для мигания дисплея // мигания не будет
}
btnEncPrev=btnEnc.read();
};

/*****************************************************************************************************/
/* отработка энкодера и вывод данных о заданной температуре на дисплей */

/* Вывели текущую температуру паяльника*/
if(setTPayTP>=100){
lcd.setCursor(12, 0);
lcd.print(setTPayTP);
}
else {
lcd.setCursor(13, 0);
lcd.print(setTPayTP);
}

/* Вывели текущую температуру фена*/
if(setTFenTP>=100){
lcd.setCursor(8, 1);
lcd.print(setTFenTP);
}
else {
lcd.setCursor(9, 1);
lcd.print(setTFenTP);
}


switch (btnI){
case 0:{ // выход из режима настройки, стираем с дисплея > <
// timeTemp=0;
lcd.setCursor(6, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(3, 1);
lcd.print(" ");
lcd.setCursor(7, 1);
lcd.print(" ");
lcd.setCursor(11, 1);
lcd.print(" ");
lcd.setCursor(15, 1);
lcd.print(" ");
}
// отбабатываем одиночное нажатие кнопки
case 1:{ // получение температуры паяльника
e=enc.read();
if (e) setTPayDisp = setTPayDisp+e*5; // если повернули энкодер прибавили к температуре на дисплее 5 градусов
if (setTPayDisp<200) setTPayDisp=195; // если температура опустилась меньше 200 гр сделали 195, чтобы отключить
if (setTPayDisp>450) setTPayDisp=450; // если температура превысила 450 гр сделали 450
lcd.setCursor(6, 0);
lcd.print(">");
lcd.setCursor(10, 0);
lcd.print("<");
lcd.setCursor(3, 1);
lcd.print(" ");
lcd.setCursor(7, 1);
lcd.print(" ");
lcd.setCursor(11, 1);
lcd.print(" ");
lcd.setCursor(15, 1);
lcd.print(" ");

if(setTPayDisp>=100){
lcd.setCursor(7, 0);
lcd.print(setTPayTP);
}
else {
lcd.setCursor(8, 0);
lcd.print(setTPayTP);
}

break;
}
case 2:{ // получение температуры фена
e=enc.read();
if (e) setTFenDisp = setTFenDisp+e*5; // если повернули энкодер прибавили к температуре на дисплее 5 градусов
if (setTFenDisp<200) setTFenDisp=195; // если температура опустилась меньше 200 гр сделали 195, чтобы отключить
if (setTFenDisp>450) setTFenDisp=450; // если температура превысила 450 гр сделали 450
lcd.setCursor(6, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(3, 1);
lcd.print(">");
lcd.setCursor(7, 1);
lcd.print("<");
lcd.setCursor(11, 1);
lcd.print(" ");
lcd.setCursor(15, 1);
lcd.print(" ");
if(setTFenDisp>=100){
lcd.setCursor(4, 1);
lcd.print(setTFenDisp);
}
else {
lcd.setCursor(5, 1);
lcd.print(setTFenDisp);
}

setFenVent=128;

//lcd.setCursor(11, 1);
//lcd.print(" ");
//lcd.setCursor(15, 1);
//lcd.print(" ");
break;

}
case 3:{ // получение скорости вращения фена
e=enc.read();
if (e) setFenVent = setFenVent+e*4; //если повернули энкодер прибавили к температуре на дисплее 5 градусов
if (setFenVent<127) setFenVent=119;
if (setFenVent>247) setFenVent=247;
lcd.setCursor(6, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(3, 1);
lcd.print(" ");
lcd.setCursor(7, 1);
lcd.print(" ");
lcd.setCursor(11, 1);
lcd.print(">");
lcd.setCursor(15, 1);
lcd.print("<");
setFenVentDisp = setFenVent/255*100;
if(setFenVentDisp>=10){
lcd.setCursor(12, 1);
lcd.print(setFenVentDisp+"%");
}
else {
lcd.setCursor(13, 1);
lcd.print(setFenVentDisp+"%");
}

break;
}
};


//Dimmer=map(setTFenTP,200,0,200,450); //Управление диммером 200=мин. 0=макс

}

[свернуть]


Если не комментировать эти строки
Цитата:
attachInterrupt(0, detect_up, LOW); //Диммер настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
StartTimer1(halfcycle, 40); //Диммер время для одного разряда ШИМ
StopTimer1(); //Диммер остановить таймер
Информация на экран не выводится.

Последний раз редактировалось Ajlex71; 28.04.2017 в 17:04.
Ajlex71 вне форума   Ответить с цитированием
Старый 28.04.2017, 19:16   #799
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
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 вне форума   Ответить с цитированием
Старый 29.04.2017, 07:10   #800
Ajlex71
Junior Member
 
Регистрация: 28.04.2017
Сообщений: 2
Вес репутации: 0
Ajlex71 is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Скорее всего конфликт библиотек
Может тогда сбросите библиотеку, которая не конфликтует с вашей. Заранее спасибо.
Ajlex71 вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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