Created
April 9, 2018 19:34
-
-
Save bsmaat/6eb3fc56a30ed34717463e65c9c5993b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
AC Voltage dimmer with Zero cross detection | |
Author: Charith Fernanado <a href="http://www.inmojo.com"> http://www.inmojo.com | |
</a> | |
Adapted by DIY_bloke | |
License: Creative Commons Attribution Share-Alike 3.0 License. | |
Attach the Zero cross pin of the module to Arduino External Interrupt pin | |
Select the correct Interrupt # from the below table | |
(the Pin numbers are digital pins, NOT physical pins: | |
digital pin 2 [INT0]=physical pin 4 and digital pin 3 [INT1]= physical pin 5) | |
check: <a href="http://arduino.cc/en/Reference/attachInterrupt"> http://www.inmojo.com | |
</a> | |
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 | |
The Arduino Due has no standard interrupt pins as an iterrupt can be attached to almosty any pin. | |
In the program pin 2 is chosen | |
*/ | |
int AC_LOAD = D5; // Output to Opto Triac pin | |
int dimming = 0; // Dimming level (0-128) 0 = ON, 128 = OFF | |
int GPIO_Pin = D2; | |
void setup() | |
{ | |
pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output | |
// attachInterrupt(0, zero_crosss_int, RISING); // Choose the zero cross interrupt # from the table above | |
pinMode(GPIO_Pin, INPUT_PULLUP); | |
attachInterrupt(digitalPinToInterrupt(GPIO_Pin), zero_crosss_int, RISING); | |
Serial.begin(9600); | |
while (!Serial) {} | |
Serial.println("Starting..."); | |
} | |
//the interrupt function must take no parameters and return nothing | |
void zero_crosss_int() //function to be fired at the zero crossing to dim the light | |
{ | |
Serial.println("interrupt"); | |
// Firing angle calculation : 1 full 50Hz wave =1/50=20ms | |
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) | |
// For 60Hz => 8.33ms (10.000/120) | |
// 10ms=10000us | |
// (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65 | |
int dimtime = (75*dimming); // For 60Hz =>65 | |
delayMicroseconds(dimtime); // Wait till firing the TRIAC | |
digitalWrite(AC_LOAD, HIGH); // Fire the TRIAC | |
delayMicroseconds(10); // triac On propogation delay | |
// (for 60Hz use 8.33) Some Triacs need a longer period | |
digitalWrite(AC_LOAD, LOW); // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC | |
} | |
void loop() { | |
Serial.println("loop"); | |
for (int i=5; i <= 128; i++){ | |
dimming=i; | |
delay(10); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment