25.03.2017, 21:06 | #791 |
Junior Member
Регистрация: 02.01.2017
Сообщений: 16
Вес репутации: 0 |
Ага, сейчас понял. Я думал через монитор тоже можно регулировать передачей чисел 0-200.
Почему у меня диммер по вашей схеме не захотел работать, есть предположения? Просто самому интересно. |
25.03.2017, 22:49 | #792 |
Junior Member
Регистрация: 29.01.2017
Сообщений: 10
Вес репутации: 0 |
Добрый день!
Подскажите, на Ваш взгляд вот такой код имеет право на реализацию или лучше не стоит. Нет осциллографа посмотреть что тут на выходе творится. PHP код:
|
26.03.2017, 00:11 | #793 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
PHP код:
Но мне не нравится большая пауза в прерывании, о многозадачности придется забыть У меня в первой версии диммера было так реализовано Но в первой версии оптрон был с одним светодиодом |
26.03.2017, 01:53 | #794 | |
Junior Member
Регистрация: 29.01.2017
Сообщений: 10
Вес репутации: 0 |
Цитата:
Просто я ищу куда можно в коде из шапки вклиниться, чтобы скажем выполнить несложную функцию, без "видимого"(в прямом смысле слова) влияния на работу димера. Например выполнить функцию по запросу данных с датчика DS1820 или отправить в сериал массив данных. Т.к. если что-то "в лоб" выполнять в loop(e), то эффект начинает визуально проявляться, особенно на низком напряжении. Есть же мертвая зона пусть и в какое-то кол-во мкс. Пока на ум приходят мысли только о функции halfcycle() Последний раз редактировалось RaySun; 26.03.2017 в 01:56. |
|
26.03.2017, 01:55 | #795 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
С сериалом можно что то решить, а вот с датчиком проблемно
|
26.03.2017, 02:13 | #796 |
Junior Member
Регистрация: 29.01.2017
Сообщений: 10
Вес репутации: 0 |
Ок, ну покурю тему еще немного
В общем-то у меня больше спортивный интерес, т.к. димер буду использовать для тэна. Там в принципе визуализация не важна, да вообще на полупериоды по вашим рекомендациям смотреть надо, но вот тем кому лампочку диммировать - тут вопрос... |
19.04.2017, 14:13 | #797 |
Junior Member
Регистрация: 19.04.2017
Сообщений: 2
Вес репутации: 0 |
Здравствуйте! Спасибо за вашу библиотеку, очень помогла! Собрал диммер светодиодной лампы (диммируемая) - работает отлично, даже с учетом того что к ардуине подключен ультразвуковой датчик и часы реального времени). Написал функцию плавного изменения яркости, вдруг кому-то пригодится).
Power(uint8_t x, unsigned long t) - тут x - необходимая мощность, от 0 до 100%, 0% - выключено. t - время (мs), за которое мощность меняется с текущего значения до введенного. PHP код:
Последний раз редактировалось RS_Razor; 07.05.2017 в 14:58. Причина: подправил код |
28.04.2017, 16:56 | #798 | |
Junior Member
Регистрация: 28.04.2017
Сообщений: 2
Вес репутации: 0 |
По поводу 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=макс } [свернуть] Если не комментировать эти строки Цитата:
Последний раз редактировалось Ajlex71; 28.04.2017 в 17:04. |
|
28.04.2017, 19:16 | #799 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Скорее всего конфликт библиотек
|
29.04.2017, 07:10 | #800 |
Junior Member
Регистрация: 28.04.2017
Сообщений: 2
Вес репутации: 0 |
|
Здесь присутствуют: 42 (пользователей: 0 , гостей: 42) | |
|
|