Программное обеспечение для управления светом с помощью Arduino

Я нашел это программное обеспечение:

/*

Диммер переменного напряжения с обнаружением перехода через ноль
Автор: Чарит Фернадо <a href="http://www.inmojo.com"> http://www.inmojo.com

</а>
Адаптировано DIY_bloke
Лицензия: Лицензия Creative Commons Attribution Share-Alike 3.0.
Подключите вывод нуля модуля к выводу внешнего прерывания Arduino.
Выберите правильный номер прерывания из таблицы ниже.
(Номера контактов являются цифровыми, а НЕ физическими:
цифровой контакт 2 [INT0] = физический контакт 4 и цифровой контакт 3 [INT1] = физический контакт 5)
проверьте: <a href="http://arduino.cc/en/Reference/attachInterrupt"> http://www.inmojo.com

</а>

Pin    |  Interrrupt # | Arduino Platform
---------------------------------------
2      |  0            |  All -But it is INT1 on the Leonardo
3      |  1            |  All -But it is INT0 on the Leonardo
18     |  5            |  Arduino Mega Only
19     |  4            |  Arduino Mega Only
20     |  3            |  Arduino Mega Only
21     |  2            |  Arduino Mega Only
0      |  0            |  Leonardo
1      |  3            |  Leonardo
7      |  4            |  Leonardo
Arduino Due не имеет стандартных выводов прерывания, поскольку прерывание можно подключить практически к любому выводу.

В программе выбран вывод 2
*/
int AC_LOAD = 3;    // Выход на контакт оптосимистора
int dimming = 128;  // Уровень затемнения (0-128) 0 = ВКЛ, 128 = ВЫКЛ

void setup()
{
  pinMode(AC_LOAD, OUTPUT);// Устанавливаем вывод нагрузки переменного тока в качестве выхода
  attachInterrupt(0, zero_crosss_int, RISING);  // Выберите номер прерывания перехода через ноль из таблицы выше
}

//функция прерывания не должна принимать никаких параметров и ничего не возвращать
void zero_crosss_int()  //функция, которая будет запущена при пересечении нуля, чтобы затемнить свет
{
  // Расчет угла открытия: 1 полная волна 50 Гц = 1/50 = 20 мс
  // Таким образом, каждое пересечение нуля: (50 Гц)-> 10 мс (1/2 цикла)
  // Для 60 Гц => 8,33 мс (10 000/120)
  // 10 мс=10000 мкс
  // (10000 мкс - 10 мкс) / 128 = 75 (приблизительно) для 60 Гц =>65

  int dimtime = (75*dimming);    // Для 60 Гц =>65
  delayMicroseconds(dimtime);    // Подождем, пока сработает триак
  digitalWrite(AC_LOAD, HIGH);   // Запускаем триак
  delayMicroseconds(10);         // симистор при задержке распространения
                 // (для 60 Гц используйте 8,33) Некоторым симисторам требуется более длительный период
  digitalWrite(AC_LOAD, LOW);    // Больше не запускаем TRIAC (следующее пересечение нуля отключит его) TRIAC
}

void loop()  {
  for (int i=5; i <= 128; i++){
    dimming=i;
    delay(10);
   }
}

Но вот эту часть вы не понимаете:

(10000 мкс – 10 мкс) / 128 = 75 (приблизительно) Для 60 Гц => 65

Я знаю, что 10 000 мкс — это 10 мс, и нам нужно подождать менее 10 мс, чтобы затемнить свет.

Но не понимаю, почему здесь -10us и /128.

Кто-нибудь знает, почему?

, 👍1


1 ответ


3

-10 мкс из-за задержки в 10 мкс в конце цикла и /128, потому что он решил, что будет 128 возможных уровней затемнения.

,

Почему он поставил dalay 10uS в конце цикла? И откуда он знает номер затемнения?, @Vladimir Djukic

Там указано, почему существует задержка 10 мкс — это симистор задержки распространения. И как он «узнал», что нужно использовать 128 уровней затемнения? Он этого не сделал. Он *решил* использовать 128 уровней затемнения. Он *мог бы* выбрать другое значение, но 128 — это достаточный уровень затемнения для большинства людей, и он оставляет достаточную степень детализации задержки для облегчения выбора времени., @Majenko

Ага, теперь я понимаю уровни. но все еще неясно с задержкой 10 мкс... Зачем симистору нужны эти 10 мкс? Это очень маленькое значение. Почему это важно?, @Vladimir Djukic

Грубо говоря, это время, необходимое симистору для включения., @Majenko