Navigation

    • Register
    • Login
    • Search
    • OpenHardware.io
    • Categories
    • Recent
    • Tags
    • Popular
    1. Home
    2. Mike Cayouette
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    Mike Cayouette

    @Mike Cayouette

    6
    Reputation
    41
    Posts
    1049
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online

    Mike Cayouette Follow

    Best posts made by Mike Cayouette

    • RE: Node-Red as Controller

      I also use node-red with a serial gateway attached. I created a flow that converts the serial payload to a mqtt type payload and it is picked up by openHAB. This also works the other way around. openHAB sents everything out via mqtt and node-red picks it up and parses it back into a serial formated payload which is picked up by the serial gateway. I also use node-red's Owntracks node to monitor my proximity and send updates to openHAB as an mqtt message and I also have a flow that monitors my phone and my wifes phone, if we are both home the outside lights get turned off at 22:00. node-red also sends twitter messages to me when my doors and windows are opened and no one is home.

      I only use mqtt with with a combiniation if nfr radios via the serial gateway, like I mentioned above, and I also use ESP8266 modules running lua. So as not to send the wrong payload to the serial gateway, all topics that come from openHAB that are destined for the serial gateway start with RF24SN/out/... and on node-red I subscribe the RF24SN/out/#. This will capture all those message and they will get parsed to the serial format (Nodeid;clientid;message;...etc).

      Everything that happens in node-red is passed to openHAB. I have a couple of relays and leds I control from openHAB. The leds use the MySensor LEDDimmer. Basically node-red acts as the middle man between the serial gateway and openHAB/mqtt.

      Mike

      posted in Node-RED
      Mike Cayouette
      Mike Cayouette
    • RE: Install your own controller on cheap android tvbox

      The TV box you are talking about is pretty much like the Cubieboard2, which is also an A20 processor, except the cubieboard2 has 1GB of DDR3 memory. I use a Cubieboard3, also known as a Cubietruck, which is an A20 dual core 1Ghz with 2GB of DDR3 memory. The Cubietruck runs Cubuntu server, on this I run openHAB, Node,js, Node-RED and Mosquitto server. I have the MySensor serial Gateway connected to the USB port of my Cubietruck and node-red handles all the incoming serial messages and parses them to an MQTT format, and the other way around it takes MQTT message and parses them to a MySensor serial format and sends it the serial gateway. I also have a 128GB SSD attached to it and use it as a NAS for my 3 OpenELEC media center servers running on Raspberry Pi's and I also have some Raspberry Pi's with PiCams that stream mjpeg videos to the NAS. It works like a charm all in one little package.

      I have been documenting my installation and configuration progress, one day when I have more time I will put it up somewhere.

      Regards,

      Mike

      posted in Controllers
      Mike Cayouette
      Mike Cayouette
    • RE: Why is my ESP8266 MQTT Client Gateway an Access Point?

      Forget that last message. I reliazed you mentioned to change the MyGatewayTransportEthernet.cpp, which I did, but I'm running the MQTT Gateway. I found the same location in the MyGatewayTransportMQTTClient.cpp file (line 157) and added the entry there. That disabled the AP advertisement.

      Thank you,

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: Node-Red as Controller

      @Fredrik-Carlsson said:

      The only thing is that you must point the topic of the mqtt node directly to a child. Its not possible to just subscribe to topics higher in the hierarchy.

      For example in MyMQTT app on Android i can just subscribe to topic MyMQTT and then i get messages from all nodes connected to the Gateway. This is not possible with the mqtt node in NodeRED. You must specifically point it.

      You can capture all higher level topics by using the # symbal. As I mention above, my openHAB sents RF24SN/out/.... and on node-red I have an mqtt node that listens for RF24SN/out/#.

      Mike

      posted in Node-RED
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      @Yveaux I solved the problem.

      The issue was not my sketch, but rather my ESP8266 MQTT Gateway. I was using an older development version. After upgrading to version 2.0 everything started working. Thankfully my older nodes, using the older development version, are still working, I will upgrade them over time.

      This is my final sketch:

      #define MY_DEBUG 
      
      #define MY_RADIO_NRF24
      
      #define MY_NODE_ID 300
      
      #define SN "ACDimmer"
      #define SV "1.0"
      #define AC1_ID 1
      #define FADE_DELAY 18      // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
      
      #include <TimerOne.h>
      #include <SPI.h>
      #include <MySensors.h>
      
      MyMessage dimmerMsg(AC1_ID, V_DIMMER);
      
      volatile int i=0;               // Variable to use as a counter volatile as it is in an interrupt
      volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
      int AC_pin = 4;                // Output to Opto Triac
      int intPin = 3;
      int dim = 0;                    // Dimming level (0-128)  0 = on, 128 = 0ff
      int inc=1;                      // counting up or down, 1=up, -1=down
      int freqStep = 65;    // This is the delay-per-brightness step in microseconds.
      unsigned long previousMillis = 0;        // will store last time LED was updated
      unsigned long currentMillis = 0;
      int currentLevel =  0;
      int requestedLevel = 0;
      
      void before() {
        #ifdef MY_DEBUG
        Serial.println("Dimmer Node Starting");
        #endif
      
        pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
        attachInterrupt(digitalPinToInterrupt(intPin), zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
        Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
        Timer1.attachInterrupt(dim_check, freqStep);      
      }
      
      void setup() {                                      // Begin setup
      }
      
      void presentation() {
        present( AC1_ID, S_DIMMER );
        
        sendSketchInfo(SN, SV);
      }
      
      void zero_cross_detect() {    
        zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
        i=0;
        digitalWrite(AC_pin, LOW);       // turn off TRIAC (and AC)
      }                                 
      
      // Turn on the TRIAC at the appropriate time
      void dim_check() {                   
        if(zero_cross == true) {              
          if(i>=currentLevel) {                     
            digitalWrite(AC_pin, HIGH); // turn on light       
            i=0;  // reset time step counter                         
            zero_cross = false; //reset zero cross detection
          } 
          else {
            i++; // increment time step counter                     
          }                                
        }                                  
      }                                   
      
      void loop() {
                               
      }
      
      
      void receive(const MyMessage &message) {
      
        #ifdef MY_DEBUG
        Serial.print("Message: ");
        Serial.println(message.type);
        Serial.print("Message Data: ");
        Serial.println(message.data);
        #endif
      
        if (message.type == 3) {
          int requestedLevel = map(atoi( message.data ), 0, 100, 128, 0); //128 = off | 0 = ON
      
          while (currentLevel != requestedLevel) {
        
            if(currentLevel<=requestedLevel) inc=1;
            if(currentLevel>=requestedLevel) inc=-1;
      
            currentLevel+=inc;
      
            #ifdef MY_DEBUG
            Serial.print("Current Level:");
            Serial.println(String(currentLevel));
            #endif
      
            //delay
            currentMillis = previousMillis = millis();
            while (currentMillis - previousMillis < FADE_DELAY) {
              currentMillis = millis();
            }
      
          }
      
        }
      }
      

      There is still one error though. When I try to set my own node id using #define MY_NODE_ID 300, I get the following error:

      In file included from /home/sketchbook/libraries/MySensors/MySensors.h:253:0,
                       from /home/sketchbook/ACDimmer_Test/ACDimmer_Test.ino:11:
      /home/sketchbook/libraries/MySensors/core/MyTransport.cpp: In function 'void stInitTransition()':
      /home/sketchbook/libraries/MySensors/core/MyTransport.cpp:74:16: warning: large integer implicitly truncated to unsigned type [-Woverflow]
           _nc.nodeId = MY_NODE_ID;
                      ^
      In file included from /home/sketchbook/libraries/MySensors/core/MyHwATMega328.cpp:22:0,
                       from /home/sketchbook/libraries/MySensors/MySensors.h:69,
                       from /home/sketchbook/ACDimmer_Test/ACDimmer_Test.ino:11:
      /home/sketchbook/libraries/MySensors/core/MyHwATMega328.h:69:88: warning: large integer implicitly truncated to unsigned type [-Woverflow]
        #define hwWriteConfig(__pos, __value) (eeprom_update_byte((uint8_t*)(__pos), (__value)))
                                                                                              ^
      /home/sketchbook/libraries/MySensors/core/MyTransport.cpp:76:5: note: in expansion of macro 'hwWriteConfig'
           hwWriteConfig(EEPROM_NODE_ID_ADDRESS, MY_NODE_ID);
      

      I was able to set my own node id's in the older development version but it does not seem to work now.

      Thank you for all your help.

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      @mfalkvidd Node id's work now.

      Thank you everyone for your help.

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette

    Latest posts made by Mike Cayouette

    • RE: [SOLVED] Timers and Interrupts not being triggered

      @mfalkvidd Node id's work now.

      Thank you everyone for your help.

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      @Yveaux I solved the problem.

      The issue was not my sketch, but rather my ESP8266 MQTT Gateway. I was using an older development version. After upgrading to version 2.0 everything started working. Thankfully my older nodes, using the older development version, are still working, I will upgrade them over time.

      This is my final sketch:

      #define MY_DEBUG 
      
      #define MY_RADIO_NRF24
      
      #define MY_NODE_ID 300
      
      #define SN "ACDimmer"
      #define SV "1.0"
      #define AC1_ID 1
      #define FADE_DELAY 18      // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
      
      #include <TimerOne.h>
      #include <SPI.h>
      #include <MySensors.h>
      
      MyMessage dimmerMsg(AC1_ID, V_DIMMER);
      
      volatile int i=0;               // Variable to use as a counter volatile as it is in an interrupt
      volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
      int AC_pin = 4;                // Output to Opto Triac
      int intPin = 3;
      int dim = 0;                    // Dimming level (0-128)  0 = on, 128 = 0ff
      int inc=1;                      // counting up or down, 1=up, -1=down
      int freqStep = 65;    // This is the delay-per-brightness step in microseconds.
      unsigned long previousMillis = 0;        // will store last time LED was updated
      unsigned long currentMillis = 0;
      int currentLevel =  0;
      int requestedLevel = 0;
      
      void before() {
        #ifdef MY_DEBUG
        Serial.println("Dimmer Node Starting");
        #endif
      
        pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
        attachInterrupt(digitalPinToInterrupt(intPin), zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
        Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
        Timer1.attachInterrupt(dim_check, freqStep);      
      }
      
      void setup() {                                      // Begin setup
      }
      
      void presentation() {
        present( AC1_ID, S_DIMMER );
        
        sendSketchInfo(SN, SV);
      }
      
      void zero_cross_detect() {    
        zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
        i=0;
        digitalWrite(AC_pin, LOW);       // turn off TRIAC (and AC)
      }                                 
      
      // Turn on the TRIAC at the appropriate time
      void dim_check() {                   
        if(zero_cross == true) {              
          if(i>=currentLevel) {                     
            digitalWrite(AC_pin, HIGH); // turn on light       
            i=0;  // reset time step counter                         
            zero_cross = false; //reset zero cross detection
          } 
          else {
            i++; // increment time step counter                     
          }                                
        }                                  
      }                                   
      
      void loop() {
                               
      }
      
      
      void receive(const MyMessage &message) {
      
        #ifdef MY_DEBUG
        Serial.print("Message: ");
        Serial.println(message.type);
        Serial.print("Message Data: ");
        Serial.println(message.data);
        #endif
      
        if (message.type == 3) {
          int requestedLevel = map(atoi( message.data ), 0, 100, 128, 0); //128 = off | 0 = ON
      
          while (currentLevel != requestedLevel) {
        
            if(currentLevel<=requestedLevel) inc=1;
            if(currentLevel>=requestedLevel) inc=-1;
      
            currentLevel+=inc;
      
            #ifdef MY_DEBUG
            Serial.print("Current Level:");
            Serial.println(String(currentLevel));
            #endif
      
            //delay
            currentMillis = previousMillis = millis();
            while (currentMillis - previousMillis < FADE_DELAY) {
              currentMillis = millis();
            }
      
          }
      
        }
      }
      

      There is still one error though. When I try to set my own node id using #define MY_NODE_ID 300, I get the following error:

      In file included from /home/sketchbook/libraries/MySensors/MySensors.h:253:0,
                       from /home/sketchbook/ACDimmer_Test/ACDimmer_Test.ino:11:
      /home/sketchbook/libraries/MySensors/core/MyTransport.cpp: In function 'void stInitTransition()':
      /home/sketchbook/libraries/MySensors/core/MyTransport.cpp:74:16: warning: large integer implicitly truncated to unsigned type [-Woverflow]
           _nc.nodeId = MY_NODE_ID;
                      ^
      In file included from /home/sketchbook/libraries/MySensors/core/MyHwATMega328.cpp:22:0,
                       from /home/sketchbook/libraries/MySensors/MySensors.h:69,
                       from /home/sketchbook/ACDimmer_Test/ACDimmer_Test.ino:11:
      /home/sketchbook/libraries/MySensors/core/MyHwATMega328.h:69:88: warning: large integer implicitly truncated to unsigned type [-Woverflow]
        #define hwWriteConfig(__pos, __value) (eeprom_update_byte((uint8_t*)(__pos), (__value)))
                                                                                              ^
      /home/sketchbook/libraries/MySensors/core/MyTransport.cpp:76:5: note: in expansion of macro 'hwWriteConfig'
           hwWriteConfig(EEPROM_NODE_ID_ADDRESS, MY_NODE_ID);
      

      I was able to set my own node id's in the older development version but it does not seem to work now.

      Thank you for all your help.

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      @Yveaux I find it hard to believe that the radio is not initialized. My MQTT server receives the following when I have the node running:

      mymqtt-out/44/255/3/0/24
      

      I modified the sketch and add the following receive method

      void receive(const MyMessage &message) {
      
        Serial.print("Message: ");
        Serial.println(message.type);
        Serial.print("Message Data: ");
        Serial.println(message.data);
          
      }
      

      when I send a payload of 50 to mymqtt-in/44/1/1/0/3, the serial output shows the following:

      Dim Sketch started
      Message: 3
      Message Data: 50
      

      I would think if the radio is not initialized this would not be possible.

      My debug output is below:

      Dim Sketch started
      Starting sensor (RNNNA-, 2.0.0)
      TSM:INIT
      TSM:RADIO:OK
      TSP:ASSIGNID:OK (ID=44)
      TSM:FPAR
      TSP:MSG:SEND 44-44-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
      TSP:MSG:READ 0-0-44 s=255,c=3,t=8,pt=1,l=1,sg=0:0
      TSP:MSG:FPAR RES (ID=0, dist=0)
      TSP:MSG:PAR OK (ID=0, dist=1)
      TSM:FPAR:OK
      TSM:ID
      TSM:CHKID:OK (ID=44)
      TSM:UPL
      TSP:PING:SEND (dest=0)
      TSP:MSG:SEND 44-44-0-0 s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=ok:1
      TSP:CHKUPL:FAIL (hops=255)
      !TSM:UPL:FAIL
      TSM:FPAR
      TSP:MSG:SEND 44-44-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
      TSP:MSG:READ 0-0-44 s=255,c=3,t=8,pt=1,l=1,sg=0:0
      TSP:MSG:FPAR RES (ID=0, dist=0)
      TSP:MSG:PAR OK (ID=0, dist=1)
      TSM:FPAR:OK
      TSM:ID
      

      I remember in the past when the radio would not initialize it said radio init failed or something like that.

      Thank you,

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      @Yveaux There is still something odd happening. This is now my basic sketch

      //#define MY_DEBUG 
      
      #define MY_RADIO_NRF24
      
      //#define MY_NODE_ID 300
      #define SN "ACDimmer"
      #define SV "1.0"
      
      #include <SPI.h>
      #include <MySensors.h>
      
      unsigned long previousMillis = 0;      
      unsigned long currentMillis = 0;
      int AC1_ID = 1; 
      int SET_DELAY = 300;
      
      MyMessage dimmerMsg(AC1_ID, V_DIMMER);
      
      void before() {
        Serial.begin( 115200 );
        Serial.println("Dim Sketch started");
       
      }
      
      void setup() {                                        // Begin setup
      }
      
      void presentation() {
        // Register the LED Dimmable Light with the gateway
        present( AC1_ID, S_DIMMER );
        
        sendSketchInfo(SN, SV);
      }
      
      
      void loop() 
      {                        
       Serial.println("Loop"); 
       if (currentMillis - previousMillis > SET_DELAY) {
          send( dimmerMsg.set("Message From Dimmer") );
          previousMillis = millis();
        }
          currentMillis = millis();
      
      
      }
      
      

      I get the output that is in the before() method, but what I have in the loop is not output at all. Its as if loop is not running at all.

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      @TheoL I tried that also but I thought that was not needed if MY_DEBUG was defined. In any case, event with Serial.begin( 115200 ) it still does not work.

      I did notice the following 2 errors in the debug output, one after the other.

      TSP:CHKUPL:FAIL (hops=255)
      !TSM:UPL:FAIL
      

      but I see my sensor registered on my MQTT server.

      Thank you,

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      @Yveaux There is something wrong with the Serial print command. I have the most basic of sketches below but I see none on the Serial.println() output, but I get all the debug output.

      #define MY_DEBUG 
      
      #define MY_RADIO_NRF24
      
      #define SN "ACDimmer"
      #define SV "1.0"
      
      #include <SPI.h>
      #include <MySensors.h>
      
      int AC1_ID = 1;
      
      MyMessage dimmerMsg(AC1_ID, V_DIMMER);
      
      void setup() {                                        // Begin setup
        Serial.println("Dim Sketch started");
      }
      
      void presentation() {
        // Register the LED Dimmable Light with the gateway
        present( AC1_ID, S_DIMMER );
        
        sendSketchInfo(SN, SV);
      }
      
      
      void loop() {                        
        Serial.println("Loop"); 
      }
      
      

      what am I doing wrong?

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      @Yveaux How can I get Serial.println to work? I'm using the new 2.0 library and I have a few Serail.println() command in various places, including in void setup(), but I am not getting any output on the serial monitor except for all the debug data.

      Sketch with serial output:

      /*AC Light Control
       
       Updated by Robert Twomey 
       
       Changed zero-crossing detection to look for RISING edge rather
       than falling.  (originally it was only chopping the negative half
       of the AC wave form). 
       
       Also changed the dim_check() to turn on the Triac, leaving it on 
       until the zero_cross_detect() turn's it off.
       
       Adapted from sketch by Ryan McLaughlin 
       http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230333861/30
       
       */
      #define MY_DEBUG 
      
      #define MY_RADIO_NRF24
      
      #define MY_NODE_ID 300
      #define SN "ACDimmer"
      #define SV "1.0"
      #define AC1_ID 1
      
      #include <MySensors.h>
      #include <SPI.h>
      #include <TimerOne.h>          // Avaiable from http://www.arduino.cc/playground/Code/Timer1
      
      volatile int i=0;               // Variable to use as a counter volatile as it is in an interrupt
      volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
      int AC_pin = 4;                 // Output to Opto Triac
      int interruptPin = 3;
      int dim = 0;                    // Dimming level (0-128)  0 = on, 128 = 0ff
      int inc=1;                      // counting up or down, 1=up, -1=down
      int freqStep = 65;    // This is the delay-per-brightness step in microseconds.
                            // For 60 Hz it should be 65
      
      MyMessage dimmerMsg(AC1_ID, V_DIMMER);
      
      void setup() {                                        // Begin setup
        Serial.println("Dim Sketch started");
      
        pinMode(AC_pin, OUTPUT);                            // Set the Triac pin as output
        attachInterrupt(digitalPinToInterrupt(interruptPin), zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
        Timer1.initialize(freqStep);                       // Initialize TimerOne library for the freq we need
        Timer1.attachInterrupt(dim_check, freqStep);      
      
      }
      
      void presentation() {
        // Register the LED Dimmable Light with the gateway
        present( AC1_ID, S_DIMMER );
        
        sendSketchInfo(SN, SV);
      }
      
      
      void zero_cross_detect() {    
        Serial.println("Zero Cross");
        
        zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
        i=0;
        digitalWrite(AC_pin, LOW);       // turn off TRIAC (and AC)
      }                                 
      
      // Turn on the TRIAC at the appropriate time
      void dim_check() {                   
        Serial.println("Dim Check");
      
        if(zero_cross == true) {              
          if(i>=dim) {                     
            digitalWrite(AC_pin, HIGH); // turn on light       
            i=0;  // reset time step counter                         
            zero_cross = false; //reset zero cross detection
          } 
          else {
            i++; // increment time step counter                     
          }                                
        }                                  
      }                                   
      
      void loop() {                        
        Serial.print("Dim value: ");
        Serial.println(String(dim));
        
        dim+=inc;
        if((dim>=128) || (dim<=0))
          inc*=-1;
        delay(18);
      }
      
      
      
      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      Just to be clear, below is the exact sketch that I used, i added the digitalPinToInterrupt() to the sketch.

      /*AC Light Control
       
       Updated by Robert Twomey 
       
       Changed zero-crossing detection to look for RISING edge rather
       than falling.  (originally it was only chopping the negative half
       of the AC wave form). 
       
       Also changed the dim_check() to turn on the Triac, leaving it on 
       until the zero_cross_detect() turn's it off.
       
       Adapted from sketch by Ryan McLaughlin 
       http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230333861/30
       
       */
      
      #include  <TimerOne.h>          // Avaiable from http://www.arduino.cc/playground/Code/Timer1
      volatile int i=0;               // Variable to use as a counter volatile as it is in an interrupt
      volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
      int AC_pin = 4;                // Output to Opto Triac
      int interruptPin = 3;
      int dim = 0;                    // Dimming level (0-128)  0 = on, 128 = 0ff
      int inc=1;                      // counting up or down, 1=up, -1=down
      
      int freqStep = 65;    // This is the delay-per-brightness step in microseconds.
                            // For 60 Hz it should be 65
      // It is calculated based on the frequency of your voltage supply (50Hz or 60Hz)
      // and the number of brightness steps you want. 
      // 
      // Realize that there are 2 zerocrossing per cycle. This means
      // zero crossing happens at 120Hz for a 60Hz supply or 100Hz for a 50Hz supply. 
      
      // To calculate freqStep divide the length of one full half-wave of the power
      // cycle (in microseconds) by the number of brightness steps. 
      //
      // (120 Hz=8333uS) / 128 brightness steps = 65 uS / brightness step
      // (100Hz=10000uS) / 128 steps = 75uS/step
      
      void setup() {                                      // Begin setup
        pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
        attachInterrupt(digitalPinToInterrupt(interruptPin), zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
        Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
        Timer1.attachInterrupt(dim_check, freqStep);      
        // Use the TimerOne Library to attach an interrupt
        // to the function we use to check to see if it is 
        // the right time to fire the triac.  This function 
        // will now run every freqStep in microseconds.                                            
      }
      
      void zero_cross_detect() {    
        zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
        i=0;
        digitalWrite(AC_pin, LOW);       // turn off TRIAC (and AC)
      }                                 
      
      // Turn on the TRIAC at the appropriate time
      void dim_check() {                   
        if(zero_cross == true) {              
          if(i>=dim) {                     
            digitalWrite(AC_pin, HIGH); // turn on light       
            i=0;  // reset time step counter                         
            zero_cross = false; //reset zero cross detection
          } 
          else {
            i++; // increment time step counter                     
          }                                
        }                                  
      }                                   
      
      void loop() {                        
        dim+=inc;
        if((dim>=128) || (dim<=0))
          inc*=-1;
        delay(18);
      }
      
      

      The above sketch works as intended. When I add the mysensors library to the sketch, as I did below, the triac never gets triggered.

      /*AC Light Control
       
       Updated by Robert Twomey 
       
       Changed zero-crossing detection to look for RISING edge rather
       than falling.  (originally it was only chopping the negative half
       of the AC wave form). 
       
       Also changed the dim_check() to turn on the Triac, leaving it on 
       until the zero_cross_detect() turn's it off.
       
       Adapted from sketch by Ryan McLaughlin 
       http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230333861/30
       
       */
      #define MY_DEBUG 
      
      #define MY_RADIO_NRF24
      
      #define MY_NODE_ID 300
      #define SN "ACDimmer"
      #define SV "1.0"
      #define AC1_ID 1
      
      #include <MySensors.h>
      #include <SPI.h>
      #include  <TimerOne.h>          // Avaiable from http://www.arduino.cc/playground/Code/Timer1
      
      volatile int i=0;               // Variable to use as a counter volatile as it is in an interrupt
      volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
      int AC_pin = 4;                 // Output to Opto Triac
      int interruptPin = 3;
      int dim = 0;                    // Dimming level (0-128)  0 = on, 128 = 0ff
      int inc=1;                      // counting up or down, 1=up, -1=down
      int freqStep = 65;    // This is the delay-per-brightness step in microseconds.
                            // For 60 Hz it should be 65
      
      MyMessage dimmerMsg(AC1_ID, V_DIMMER);
      
      void setup() {                                        // Begin setup
        pinMode(AC_pin, OUTPUT);                            // Set the Triac pin as output
        attachInterrupt(digitalPinToInterrupt(interruptPin), zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
        Timer1.initialize(freqStep);                       // Initialize TimerOne library for the freq we need
        Timer1.attachInterrupt(dim_check, freqStep);      
      }
      
      void presentation() {
        // Register the LED Dimmable Light with the gateway
        present( AC1_ID, S_DIMMER );
        
        sendSketchInfo(SN, SV);
      }
      
      
      void zero_cross_detect() {    
        zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
        i=0;
        digitalWrite(AC_pin, LOW);       // turn off TRIAC (and AC)
      }                                 
      
      // Turn on the TRIAC at the appropriate time
      void dim_check() {                   
        if(zero_cross == true) {              
          if(i>=dim) {                     
            digitalWrite(AC_pin, HIGH); // turn on light       
            i=0;  // reset time step counter                         
            zero_cross = false; //reset zero cross detection
          } 
          else {
            i++; // increment time step counter                     
          }                                
        }                                  
      }                                   
      
      void loop() {                        
        dim+=inc;
        if((dim>=128) || (dim<=0))
          inc*=-1;
        delay(18);
      }
      
      

      What would be preventing the interrupt from triggering?

      Thank you,

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • RE: [SOLVED] Timers and Interrupts not being triggered

      @Yveaux Sorry for the confusion. In my testing I did in fact change the original sketch to use interrupt 1 as I have in my modified sketch and it worked. I did this knowing the radio was going to be connected to 0. I understand your comment about hard coding the interrupt and agree it is not best practice, however, that does not take away from the fact that the sketch did not work when I added the mysensors library in my changes. I believe, even with it hard coded, it should have worked or am I missing something?

      Thank you,

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette
    • [SOLVED] Timers and Interrupts not being triggered

      Hi,

      I'm making an AC (mains) dimmer using a circuit from this website https://arduinodiy.wordpress.com/2012/10/19/dimmer-arduino/. I basically uses interrupts to detect when the sine wave crosses zero and then triggers a triac. To achieve this I'm using this sketch:

      /*AC Light Control
       
       Updated by Robert Twomey 
       
       Changed zero-crossing detection to look for RISING edge rather
       than falling.  (originally it was only chopping the negative half
       of the AC wave form). 
       
       Also changed the dim_check() to turn on the Triac, leaving it on 
       until the zero_cross_detect() turn's it off.
       
       Adapted from sketch by Ryan McLaughlin 
       http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230333861/30
       
       */
      
      #include  <TimerOne.h>          // Avaiable from http://www.arduino.cc/playground/Code/Timer1
      volatile int i=0;               // Variable to use as a counter volatile as it is in an interrupt
      volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
      int AC_pin = 11;                // Output to Opto Triac
      int dim = 0;                    // Dimming level (0-128)  0 = on, 128 = 0ff
      int inc=1;                      // counting up or down, 1=up, -1=down
      
      int freqStep = 75;    // This is the delay-per-brightness step in microseconds.
                            // For 60 Hz it should be 65
      // It is calculated based on the frequency of your voltage supply (50Hz or 60Hz)
      // and the number of brightness steps you want. 
      // 
      // Realize that there are 2 zerocrossing per cycle. This means
      // zero crossing happens at 120Hz for a 60Hz supply or 100Hz for a 50Hz supply. 
      
      // To calculate freqStep divide the length of one full half-wave of the power
      // cycle (in microseconds) by the number of brightness steps. 
      //
      // (120 Hz=8333uS) / 128 brightness steps = 65 uS / brightness step
      // (100Hz=10000uS) / 128 steps = 75uS/step
      
      void setup() {                                      // Begin setup
        pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
        attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
        Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
        Timer1.attachInterrupt(dim_check, freqStep);      
        // Use the TimerOne Library to attach an interrupt
        // to the function we use to check to see if it is 
        // the right time to fire the triac.  This function 
        // will now run every freqStep in microseconds.                                            
      }
      
      void zero_cross_detect() {    
        zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
        i=0;
        digitalWrite(AC_pin, LOW);       // turn off TRIAC (and AC)
      }                                 
      
      // Turn on the TRIAC at the appropriate time
      void dim_check() {                   
        if(zero_cross == true) {              
          if(i>=dim) {                     
            digitalWrite(AC_pin, HIGH); // turn on light       
            i=0;  // reset time step counter                         
            zero_cross = false; //reset zero cross detection
          } 
          else {
            i++; // increment time step counter                     
          }                                
        }                                  
      }                                   
      
      void loop() {                        
        dim+=inc;
        if((dim>=128) || (dim<=0))
          inc*=-1;
        delay(18);
      }
      
      
      

      The circuit and the sketch works fine until I introduce the mysensors library and a radio. When I do that the interrupt never detects the zero crossing and therefore the triac never triggers. I have not changed anything in my sketch except to include the mysensors library. My modified sketch looks like this:

      /*AC Light Control
       
       Updated by Robert Twomey 
       
       Changed zero-crossing detection to look for RISING edge rather
       than falling.  (originally it was only chopping the negative half
       of the AC wave form). 
       
       Also changed the dim_check() to turn on the Triac, leaving it on 
       until the zero_cross_detect() turn's it off.
       
       Adapted from sketch by Ryan McLaughlin 
       http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230333861/30
       
       */
      #define MY_DEBUG 
      
      #define MY_RADIO_NRF24
      
      #define MY_NODE_ID 300
      #define SN "ACDimmer"
      #define SV "1.0"
      #define AC1_ID 1
      
      #include <MySensors.h>
      #include <SPI.h>
      #include  <TimerOne.h>          // Avaiable from http://www.arduino.cc/playground/Code/Timer1
      
      volatile int i=0;               // Variable to use as a counter volatile as it is in an interrupt
      volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
      int AC_pin = 4;                // Output to Opto Triac
      int dim = 0;                    // Dimming level (0-128)  0 = on, 128 = 0ff
      int inc=1;                      // counting up or down, 1=up, -1=down
      int freqStep = 65;    // This is the delay-per-brightness step in microseconds.
                            // For 60 Hz it should be 65
      
      MyMessage dimmerMsg(AC1_ID, V_DIMMER);
      
      void setup() {                                      // Begin setup
        pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
        attachInterrupt(1, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
        Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
        Timer1.attachInterrupt(dim_check, freqStep);      
      }
      
      void presentation() {
        // Register the LED Dimmable Light with the gateway
        present( AC1_ID, S_DIMMER );
        
        sendSketchInfo(SN, SV);
      }
      
      
      void zero_cross_detect() {    
        zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
        i=0;
        digitalWrite(AC_pin, LOW);       // turn off TRIAC (and AC)
      }                                 
      
      // Turn on the TRIAC at the appropriate time
      void dim_check() {                   
        if(zero_cross == true) {              
          if(i>=dim) {                     
            digitalWrite(AC_pin, HIGH); // turn on light       
            i=0;  // reset time step counter                         
            zero_cross = false; //reset zero cross detection
          } 
          else {
            i++; // increment time step counter                     
          }                                
        }                                  
      }                                   
      
      void loop() {                        
        dim+=inc;
        if((dim>=128) || (dim<=0))
          inc*=-1;
        delay(18);
      }
      

      My node registers with my gateway and all seems fine. Is the mysensors library using the same timer?

      Any help would be appreciated.

      Thank you,

      Mike

      posted in Troubleshooting
      Mike Cayouette
      Mike Cayouette