|
» About me
» Bristol VA/TN
» E-Mail
» Hobby Electronics » Exploring the PICAXE Micro-Controller » Understanding Micro-Controller Input/Output Ports
Using Hardware Interrupts to Control A.C. Powerby Lewis Loflin The purpose of this project is to demonstrate the use of a hardware interrupt to control AC power levels to a load such as a lamp or small AC motor. Also see Hardware Interrupts Demo and Tutorial for ATMEGA168/Arduino Note the "power on" switch must be pushed for the circuit to operate.
For this experiment one can use 24 volts A.C. and a 24 volt lamp. If the circuit is wired properly when the UsesA circuit such as this can can do far more than a $3 lamp dimmer. By connecting a thermistor to measure temperature (or an appropriate thermocouple circuit) to one of the analog inputs we have a proportional heat controller saving energy costs. We could control a heating element or the speed of a blower fan proportional to temperature. By connecting a photocell we could control light intensity of lamps in proportion to natural light, saving energy costs with say sky lights. I use a version of this on my water heater to control a narrow temperature range.In a proportional controller for heat as an example as the desired temperature is reached, power input is reduced automatically (delaying the firing point on the triac) and enough energy is added to maintain temperature. In a cheap mechanical thermostat power is all on or all off producing overshoot and undershoot. This is unacceptable in many industrial applications. For an application of this circuit see Hatching Chicken Eggs with ATMEGA168/Arduino
See Controlling Low-Voltage Driveway Lights with the ATMEGA168/Arduino In that circuit we use a CdS photocell instead of a thermistor, but the circuit is identical.
// LED must be connected between digital pin and ground #define triac_control 5 #define powerIndicator 12 // indicator #define sensorPin 0 // potentiometer #define irq_Pin 2 #define powerOn 4 // when using values in the main routine and IRQ routine must be volatile value volatile byte flag_bit1 = LOW; // declare IRQ flag int analogValue = 0; // HIGH = 1, LOW = 0 void setup() { pinMode(triac_control, OUTPUT); pinMode(powerIndicator, OUTPUT); digitalWrite(triac_control, 0); // LED off digitalWrite(powerIndicator, 0); // LED off pinMode(irq_Pin, INPUT); pinMode(powerOn, INPUT); digitalWrite(irq_Pin, 1); // pull up on digitalWrite(powerOn, 1); // pull up on attachInterrupt(0, flag1, FALLING); // interrupt 0 digital pin 2 connected ZC circuit } void loop() { if (!digitalRead(powerOn)) digitalWrite(powerIndicator, 1); else digitalWrite(powerIndicator, 0); if ((flag_bit1 == 1) && (digitalRead(powerOn)== 0)) { analogValue = analogRead(sensorPin); delayMicroseconds(analogValue * 7); digitalWrite(triac_control, 1); //triac on delayMicroseconds(100); digitalWrite(triac_control, 0); //triac off flag_bit1 = 0; // clear flag } } // end loop void flag1() // set bit { flag_bit1 = 1; }
Added October 22, 2011
Arduino demos:
|