Тогда делай переменные статуса каждого триака и в прерываниях проверяй их статусы, если например статус 1-го триакаTRUE то резрешаем его включить и т.д.
Вид для печати
Тогда делай переменные статуса каждого триака и в прерываниях проверяй их статусы, если например статус 1-го триакаTRUE то резрешаем его включить и т.д.
брр... толи я вообще нифига не понимаю.. толи пипец.. (
можно привер кода? или хоть где можно об этом почитать?
так.. ладно.. с этим буду разбираться позже..
что на счет датчика тока? Давайте какбы пробовать чтонить на нем сделать...
битая ссылка..
Я ее убрал ,потому как код не проверенный, не факт что работоспособный Хочу собрать устройство и проверить прежде чем выкладывать
Вернусь к этому вопросу... Диммер сделали, но то что изначально я хотел так и не получается :(
1. Перепробовал разные способы, но добиться включения и отключения прерывания по требованию (с подпрограммы) я не смог.
2. Сделать бегущий огонь с плавным включением и выключением светодиодов в принципе можно (менять в подпрограмме AC_pin), но вот как быть, если хочется сразу 2-е лампы плавно включать и отключать?
3. А реально ли сделать выход с любого цикла, любой подпрограммы, например по нажатию кнопки на loop (что-то типа ресета, в начало всей программы)?
Прошу помощи. Саму цветомузыкальное устройство сделал, но вот без плавного зажига ламп как-то не совсем иестественно... хотелось бы до НГ доделать.
Всю схему устройства нарисовать сложно, так как она вышла довольно большая. Все это подготовлю и выложу отдельным проэктом, когда хоть на 90% закончу.
Но вот давайте возьмем схему с первого поста, силовая часть у меня на ее основе. просто там не одна связка оптрон+симистор, а 6шт.
На счет скетча, то он тоже большой, так как там для конкретно этого вопроса очень много лишнего (в моем устройстве есть LCD, который через шифт-регистор подключен, да и сам выход тоже через шифт). Так что я здесь выкладываю только то, что касается именно этого вопроса. Так как сейчас на работе, то точный скетч без ошибок не могу дать, но думаю идея в нем будет понятная:
Т.э. смысл в том, чтобы когда нужно, была возможность включить: attachInterrupt(0, FrontUp, RISING);, когда не нужно - выключить: detachInterrupt(0);Цитата:
#include <avr/delay.h>
int AC_pin = 10; // выход для симистора
volatile uint16_t dim;
uint8_t dimmer=0;// уровень димирования (0-255) 0 = max, 255 = min
void setup()
{
pinMode(AC_pin, OUTPUT);
}
void loop()
{
PlavniyOgon();
}
void PlavniyOgon(){
attachInterrupt(0, FrontUp, RISING); //прерывание по изменению уровня с низкого на высокий
for (int i=1; i<6; i++){
AC_pin=i;
if(dimmer < 255) dimmer++; else dimmer=0; // уменьшения яркости лампы
dim=33*dimmer;
delay(50);
}
AC_pin=i+1;
if(dimmer > 0) dimmer--; else dimmer=0; // увеличение яркости лампы
dim=33*dimmer;
delay(50);
}
detachInterrupt(0);
}
// Функция обработки прерывания на подъем
void FrontUp()
{
detachInterrupt(0);
_delay_us(dim+1000); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится когда полупериод достигнет нуля)
attachInterrupt(0, FrontDown, FALLING);
}
// Функция обработки прерывания на спад
void FrontDown()
{
detachInterrupt(0);
_delay_us(dim); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится
attachInterrupt(0, FrontUp, RISING);
}
В приведенном выше коде не получается такое реализовать.
Хэх.. вот только что попробовал снова... интересно.. но уже можно сказать это работает... странно что раньше не работало.. мо что-то не так было.
Остается вопрос как сделать чтобы несколько сразу тухло и зажигалось... оптимальный код... хотя как с большим кодом вроде как понимаю.
Да, и еще.. спрашивал раньше, можно ли с любой подпрограммы или цикла выйти по какому-то событию, типа ресет сделать?
Для прерывания цикла используй Break
Цитата:
Break используется для принудительного выхода из циклов do, for или while, не дожидаясь завершения цикла по условию. Он также используется для выхода из оператора switch
нет, это не то.
Мне нужно из глубокого цикла по одной команде выйти в начало программы, на луп или сетап... есть ли такая волшебная команда?
На счет топика... перепробовал много вариантов, но так и не получилось добиться одновременной регулировки яркости 2-ух и более каналов :(
Выложи последний свой скетчь, этот с грубыми ошибками и выкладывай через php.PHP код:
#include <avr/delay.h>
int AC_pin = 10; // выход для симистора
volatile uint16_t dim;
uint8_t dimmer=0;// уровень димирования (0-255) 0 = max, 255 = min
void setup()
{
pinMode(AC_pin, OUTPUT);
}
void loop()
{
PlavniyOgon();
}
void PlavniyOgon(){
attachInterrupt(0, FrontUp, RISING); //прерывание по изменению уровня с низкого на высокий
for (int i=1; i<6; i++){
AC_pin=i;
if(dimmer < 255) dimmer++; else dimmer=0; // уменьшения яркости лампы
dim=33*dimmer;
delay(50);
}
AC_pin=i+1;
if(dimmer > 0) dimmer--; else dimmer=0; // увеличение яркости лампы
dim=33*dimmer;
delay(50);
}
detachInterrupt(0);
}
// Функция обработки прерывания на подъем
void FrontUp()
{
detachInterrupt(0);
_delay_us(dim+1000); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится когда полупериод достигнет нуля)
attachInterrupt(0, FrontDown, FALLING);
}
// Функция обработки прерывания на спад
void FrontDown()
{
detachInterrupt(0);
_delay_us(dim); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится
attachInterrupt(0, FrontUp, RISING);
}
попробую сегодня вечером.. если не получится, то уже после НГ
с датчиком тока что-то получилось?
Честно говоря пока еще не дошли до него руки
А есть хоть схемка и скетч, чтобы измерять этим датчиков ток?
Хочется сделать девайсик измерения потребления мощности
Тему востановил http://www.compcar.ru/forum/attachme...2&d=1324416691
Скетчем еще не занимался.
Ребята,
Подскажите пожалуйста по схеме, в верхней части, там, где отслеживаем ноль. Это же получается, что мы на оптрон 4n35 подаем 220 вольт? Не станет ли ему плохо от такого напряжения? По дейтшиту мак.вход.напряжение 30 вольт!.
Спасибо. :confused:
Подаем на схему 220в , а на оптроне будет всего 2в, а все остальное будет рассеиваться в виде тепла резистором
Привет!
Вчера собрал схему на макетке и залил прогу, все работает, яркость регулируется. Остается вопрос, лампа немного мерцает. Подозреваю, что в проге управление идет только одного полупериода, второй пропускается. Или я прогу не так прочитал?
Если да, то что лучше, поставить диодный мост или в проге дописать еще одно включение симистора?
Спасибо.:confused:
В шапке рабочий скетч лежит.
Чип, в очередной раз, спасибо большое.
Хочу диммер собрать. Но.
Из первого поста не понятно:
1. Зачем к ардуине нужно подключать две ноги D2 и D10 (не считая земли). Мне кажется диммирование должно происходить одной ногой.
2. Не понятны мощности резисторов.
Можете уточнить?
D10 Для управления симистором
D2 для отслеживания нуля и точки включения на полупериоде
суммарная мощность должна быть 1 ватт, если 4 резистора то значит по 0,125 ватт
А вот чтобы не два контакта в ардуине использовать, а хотя бы один?
Или как можно понавешать десять диммеров на одну ардуину?
Вот тут вроде использовали по одному контакту ардуины...
По ссылке схема просто выключателя , без диммера
Добрый день. Собрал составленную в этой ветке схему, проверил - работает. Решил добавить управление яркостью лампы с пульта ДУ и столкнулся с проблемой. С прерываниями пульт далеко не сразу срабатывает. Приходиться нажимать на одну кнопку много раз, для того, что она сработала, причем чем больше задержка (чем dim ближе к 255) тем реже срабатывает пульт. Получается, что поток останавливается на задержках в прерываниях (delayMicroseconds), а в это время я нажимаю кнопку на пульте и естественно она не ловится. Код, при помощи которого происходит обработка сигналов с пульта находиться в функции loop. Подскажите пожалуйста как решить данную проблему? Не ставить же еще один микроконтроллер, который будет ловить кнопки с пульта и посылать на первый микроконтроллер.
Надеюсь что эта тема еще не умерла.
Обработка ИК диода должна построена быть на прерывании! Соответственно должен быть подключен к лапе контролера с фиксацией факта изменения уровня на входе.
Так и есть, смотри скетч
Цитата:
attachInterrupt(0, FrontDown, FALLING);
Добавил прерывание на 3 цифровой порт (attachInterrupt(1, irReceive, FALLING)). Функция один раз вызывается. Почему только один?
И при добавлении второго прерывания у меня перестает работать первое прерывание, контролирующее якрость лампы. По умолчанию она должна включаться. Если второе прерывание отключить - лампа включается, если вернуть второе прерывание - лампа не включается. Нельзя использовать сразу 2 прерывания?
И подскажите, для чего переменной dim volatile? Разве не один поток проходит через прерывания?Код:int AC_pin = 10; // выход для симистора
volatile uint16_t dim = 33 * 5;
uint8_t dimmer;// уровень димирования (0-255) 0 = max, 255 = min
int irPin = 3;
int start_bit = 2200; //Start bit threshold (Microseconds)
int bin_1 = 1000; //Binary 1 threshold (Microseconds)
int bin_0 = 400; //Binary 0 threshold (Microseconds)
void setup()
{
Serial.begin(9600);
pinMode(AC_pin, OUTPUT);
attachInterrupt(1, irReceive, FALLING);
// attachInterrupt(0, FrontUp, RISING);
}
// Функция обработки прерывания на подъем
void FrontUp()
{
Serial.println("FrontUp");
detachInterrupt(0);
delayMicroseconds(dim+1200); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
delayMicroseconds(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится когда полупериод достигнет нуля)
attachInterrupt(0, FrontDown, FALLING);
}
// Функция обработки прерывания на спад
void FrontDown()
{
detachInterrupt(0);
delayMicroseconds(dim); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
delayMicroseconds(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится
attachInterrupt(0, FrontUp, RISING);
}
void irReceive()
{
Serial.println("irReceive");
/*int key = getIRKey();
if (key != 0)
{
if (key == 144)
{
dim = 33 * 2;
Serial.println("HIGH");
}
else if (key == 145)
{
dim = 33 * 255;
Serial.println("LOW");
}
delay(15);
}*/
}
void loop()
{
}
int getIRKey() {
int data[12];
int i;
while(pulseIn(irPin, LOW) < start_bit); //Wait for a start bit
for(i = 0 ; i < 11 ; i++)
data[i] = pulseIn(irPin, LOW); //Start measuring bits, I only want low pulses
for(i = 0 ; i < 11 ; i++) //Parse them
{
if(data[i] > bin_1) //is it a 1?
data[i] = 1;
else if(data[i] > bin_0) //is it a 0?
data[i] = 0;
else
return -1; //Flag the data as invalid; I don't know what it is! Return -1 on invalid data
}
int result = 0;
for(i = 0 ; i < 11 ; i++) //Convert data bits to integer
if(data[i] == 1) result |= (1<<i);
return result; //Return key number
}
Любая переменная используемая в обработчике прерывания должна быть volatileЦитата:
И подскажите, для чего переменной dim volatile? Разве не один поток проходит через прерывания?
Chip, не подскажешь почему в вышеприведенном коде функция irReceive вызывается только один раз?
Я использую TSOP382 и выходную ногу завел на 3 цифровой порт. Первоначально, напряжение на выходе 2.3В. Когда я нажимаю на кнопку оно падает до 1.8В.
http://data1.floomby.com/files/share...U0LUS3v89Q.png
Сигналы от приемника при нажатии на кнопку вроде идут.
Зависает, так как нельзя использовать в обработчике Вашего прерывания Serial.print и delay
Может имеет смысл использовать библиотеку <IRremote.h>, она вроде на втором прерывании.
Вот тут у меня скетч завалялся для считывания пульта и вывода результата на LCD.
PHP код:
#include <IRremote.h>
int RECV_PIN = 9; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
void setup()
{
lcd.begin(16, 2);
Serial.begin(115200);
irrecv.enableIRIn(); // включить приемник
}
void loop() {
if (irrecv.decode(&results))
{
if ((results.value > 0) && (results.value < 0xFFFFFFFF))
{
lcd.clear();
lcd.print(results.value);
Serial.println(results.value);
}
irrecv.resume();
}
}
Меня не покидает вопрос, почему на схеме резисторы (82к) стоят по два, паралельно, а не по одному 41к ? Видимо специально так сделано, а объясните пожалуйста, почему?
Для увеличения рассеиваемой мощности
Умножаем падение напряжения на ток