Сообщение от
knyaz2020
а функции FrontUp() и FrontDown() как правильно вызывать?
Они сами вызываются при прохождении через ноль
Наброскал скетч , сразу предупреждаю что для стабильной работы скетча нужно знать время от реального нуля до срабатывания прерывания, тоже самое косается спада, иначе у нас получается не симметричное срабатывание датчика нуля
Вычислить можно осциллографом, если такой имеется
PHP код:
#include <avr/delay.h>
int AC_pin = 10; // выход для симистора
volatile byte dim = 128; // уровень димирования (0-128) 0 = on, 128 = 0ff
void setup()
{
pinMode(AC_pin, OUTPUT);
attachInterrupt(0, FrontUp, RISING); //прерывание по изменению уровня с низкого на высокий
}
// Функция обработки прерывания на подъем
void FrontUp()
{
int dimtime = (77*dim); // вычислим время отсечки
_delay_us(dimtime); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(200); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится когда полупериод достигнет нуля)
detachInterrupt(0);
attachInterrupt(0, FrontDown, FALLING);
}
// Функция обработки прерывания на спад
void FrontDown()
{
int dimtime = (79*dim); // вычислим время отсечки
_delay_us(dimtime); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(200); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится
detachInterrupt(0);
attachInterrupt(0, FrontUp, RISING);
}
void loop()
{
if(dim > 0) {dim--; } else { dim=128; } // пример уменьшения яркости лампы
}