<div dir="ltr">weird i was just about to compose an email about one other possible solution:<br>As long you create a new 'board' entry in the arduino boards.txt file 
showing the 20Mhz Fclock value the time based functions should work fine
 as they use the Fclock value defined in that board selection to setup 
the proper timing value for timer0. Same with the hardware serial baud 
rate calculations used in serial.begin function.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 24, 2016 at 10:38 PM, Jake <span dir="ltr"><<a href="mailto:jake@spaz.org" target="_blank">jake@spaz.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">robb,<br>
<br>
since we got the zero-crossing detection working, now it's a matter of deciding how many lamps to control with a single arduino.  I believe this instructable shows software that doesn't rely on the chip's timer being tied to the triac control pins, meaning that it could be used to control 8 or more triacs with a single plain arduino.<br>
<br>
<a href="http://www.instructables.com/id/3-channel-Dimmerfader-for-Arduino-or-other-microco/?ALLSTEPS" rel="noreferrer" target="_blank">http://www.instructables.com/i<wbr>d/3-channel-Dimmerfader-for-Ar<wbr>duino-or-other-microco/?ALLSTE<wbr>PS</a><br>
<br>
/*<br>
 AC Light Control<br>
 Ryan McLaughlin <<a href="mailto:ryanjmclaughlin@gmail.com" target="_blank">ryanjmclaughlin@gmail.com</a>><br>
 with slight modifications<br>
*/<br>
<br>
#include <TimerOne.h>           // <a href="http://www.arduino.cc/playground/Code/Timer1" rel="noreferrer" target="_blank">http://www.arduino.cc/playgrou<wbr>nd/Code/Timer1</a><br>
#define PINS 3<br>
volatile int pinCount[PINS];    // make volatile to make available in interrupt<br>
volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero<br>
int AC_pins[] = {3,4,5};        // Stup the pin numbers<br>
int AC_dim[PINS];               // Holds Dimming levels (0-128)  0 = on, 128 = 0ff<br>
int freqStep = 78;              // Set the delay for the frequency of power (65 for 60Hz, 78 for 50Hz) per step (using 128 steps)<br>
                                // freqStep may need some adjustment depending on your power the formula<br>
                                // you need to us is (500000/AC_freq)/NumSteps = freqStep<br>
<br>
void setup() {<br>
  for(int a=0; a < PINS; a++) { //set the pins to output<br>
   pinMode(AC_pins[a],OUTPUT);<br>
   pinCount[a] = 0;             // keeps track of the time in the cycle<br>
   AC_dim[a] = 0;               // dimming level set to zero<br>
  }<br>
  attachInterrupt(0, zero_cross_detect, FALLING);  // Attach Interrupt to Pin 2 (interrupt 0) for Zero Cross Detection<br>
  Serial.begin(9600);<br>
  Timer1.initialize(freqStep);                     // Initialize TimerOne library for the freq we need<br>
  Timer1.attachInterrupt(dim_che<wbr>ck, freqStep);     // Use the TimerOne Library to attach an interrupt<br>
                                                   // to the function we use to check to see if it is<br>
                                                   // the right time to fire the triac.  This function<br>
                                                   // will now run every freqStep in microseconds.<br>
}<br>
<br>
void zero_cross_detect() {        // function to be fired at the zero crossing<br>
   zero_cross = 1;                // set flag to tell dimming function zero cross has occured<br>
}                                 // End zero_cross_detect<br>
<br>
void dim_check() {                   // Function will fire the triac at the proper time<br>
 if(zero_cross == 1) {               // First check to make sure the zero-cross has happened else do nothing<br>
   for(int a=0; a < PINS; a++) {<br>
     if(pinCount[a] >= AC_dim[a]) {       // Check and see if i has reached the dimming value we want<br>
       digitalWrite(AC_pins[a], HIGH);    // Fire the Triac<br>
       delayMicroseconds(5);              // Pause briefly to ensure the triac turned on<br>
       digitalWrite(AC_pins[a], LOW);     // Turn off the Triac gate (Triac will turn off at the next zero cross)<br>
       pinCount[a] = 0;                   // Reset the accumulator<br>
       zero_cross = 0;                    // Reset the zero_cross so it may be turned on again at the next zero_cross_detect<br>
     } else {<br>
       pinCount[a]++;                     // If the dimming value has not been reached, incriment the counter<br>
     }<br>
   }<br>
 }<br>
}<br>
<br>
<br>
void loop() {<br>
  // This is simply making all outputs cycle through bright-dark, out of time with each other.<br>
 for(int i=0; i<127; i ++) {<br>
   for(int a=0; a < PINS; a++) {<br>
      int ii = i+42;               //this is the bit that puts the blinking lights out of sync with one another<br>
      if(ii > 127) ii -= 127;<br>
      AC_dim[a] = ii;<br>
    }<br>
    delay(50);<br>
  }<br>
}<br>
<br>
</blockquote></div><br></div>