Страница 28 из 32 ПерваяПервая ... 182223242526272829303132 ПоследняяПоследняя
Показано с 271 по 280 из 315
  1. #271
    Пользователь
    Регистрация
    17.12.2009
    Возраст
    46
    Сообщений
    34
    Вес репутации
    190

    По умолчанию Re: AC dimmer 220V 50Hz

    Обработка ИК диода должна построена быть на прерывании! Соответственно должен быть подключен к лапе контролера с фиксацией факта изменения уровня на входе.

  2. #272
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: AC dimmer 220V 50Hz

    Так и есть, смотри скетч
    attachInterrupt(0, FrontDown, FALLING);

  3. #273
    Новичок
    Регистрация
    19.07.2012
    Возраст
    33
    Сообщений
    3
    Вес репутации
    0

    По умолчанию Re: AC dimmer 220V 50Hz

    Цитата Сообщение от awtoap Посмотреть сообщение
    Обработка ИК диода должна построена быть на прерывании! Соответственно должен быть подключен к лапе контролера с фиксацией факта изменения уровня на входе.
    Добавил прерывание на 3 цифровой порт (attachInterrupt(1, irReceive, FALLING)). Функция один раз вызывается. Почему только один?

    И при добавлении второго прерывания у меня перестает работать первое прерывание, контролирующее якрость лампы. По умолчанию она должна включаться. Если второе прерывание отключить - лампа включается, если вернуть второе прерывание - лампа не включается. Нельзя использовать сразу 2 прерывания?

    Код:
    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
    }
    И подскажите, для чего переменной dim volatile? Разве не один поток проходит через прерывания?
    Последний раз редактировалось oxilor; 20.07.2012 в 21:37.

  4. #274
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: AC dimmer 220V 50Hz

    И подскажите, для чего переменной dim volatile? Разве не один поток проходит через прерывания?
    Любая переменная используемая в обработчике прерывания должна быть volatile

  5. #275
    Новичок
    Регистрация
    19.07.2012
    Возраст
    33
    Сообщений
    3
    Вес репутации
    0

    По умолчанию Re: AC dimmer 220V 50Hz

    Chip, не подскажешь почему в вышеприведенном коде функция irReceive вызывается только один раз?
    Я использую TSOP382 и выходную ногу завел на 3 цифровой порт. Первоначально, напряжение на выходе 2.3В. Когда я нажимаю на кнопку оно падает до 1.8В.

    Сигналы от приемника при нажатии на кнопку вроде идут.
    Последний раз редактировалось oxilor; 21.07.2012 в 14:50.

  6. #276
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: AC dimmer 220V 50Hz

    Зависает, так как нельзя использовать в обработчике Вашего прерывания Serial.print и delay

  7. #277
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    333

    По умолчанию Re: AC dimmer 220V 50Hz

    Может имеет смысл использовать библиотеку <IRremote.h>, она вроде на втором прерывании.
    Вот тут у меня скетч завалялся для считывания пульта и вывода результата на LCD.

    PHP код:
    #include <IRremote.h>
    int RECV_PIN 9;    //вход ИК приемника
    IRrecv irrecv(RECV_PIN);
    decode_results results
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12117654);

    void setup() 
    {
      
    lcd.begin(162);
      
    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();
      }

    Вложения Вложения
    Последний раз редактировалось mebitek; 23.11.2012 в 04:11.

  8. #278
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    333

    По умолчанию Re: AC dimmer 220V 50Hz

    Меня не покидает вопрос, почему на схеме резисторы (82к) стоят по два, паралельно, а не по одному 41к ? Видимо специально так сделано, а объясните пожалуйста, почему?

  9. #279
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: AC dimmer 220V 50Hz

    Для увеличения рассеиваемой мощности
    Умножаем падение напряжения на ток
    Последний раз редактировалось Chip; 23.11.2012 в 11:23.

  10. #280
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: AC dimmer 220V 50Hz


Страница 28 из 32 ПерваяПервая ... 182223242526272829303132 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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