Программное обеспечение для управления светом с помощью 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.
Кто-нибудь знает, почему?
@Vladimir Djukic, 👍1
1 ответ
▲ 3
-10 мкс из-за задержки в 10 мкс в конце цикла и /128, потому что он решил, что будет 128 возможных уровней затемнения.
,
@Majenko
Смотрите также:
- NodeMCU - Vin контакт как выход 5V?
- Блок питания для Seeeduino Xiao
- Чтение частоты ввода в цифровых выводах
- Разница между 3,3 В и 5 В
- Почему пассивный зуммер щелкает, а не гудит, когда установлен на ВЫСОКИЙ?
- Как узнать максимальный ток через VIN на плате NodeMCU?
- Как подключить драйвер двигателя L298N к источнику питания 5V?
- Датчики Lolin NodeMCU V3 и 5V
Почему он поставил dalay 10uS в конце цикла? И откуда он знает номер затемнения?, @Vladimir Djukic
Там указано, почему существует задержка 10 мкс — это симистор задержки распространения. И как он «узнал», что нужно использовать 128 уровней затемнения? Он этого не сделал. Он *решил* использовать 128 уровней затемнения. Он *мог бы* выбрать другое значение, но 128 — это достаточный уровень затемнения для большинства людей, и он оставляет достаточную степень детализации задержки для облегчения выбора времени., @Majenko
Ага, теперь я понимаю уровни. но все еще неясно с задержкой 10 мкс... Зачем симистору нужны эти 10 мкс? Это очень маленькое значение. Почему это важно?, @Vladimir Djukic
Грубо говоря, это время, необходимое симистору для включения., @Majenko