Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. Adafruit Feather M0 RFM69HCW with MySensors?

Adafruit Feather M0 RFM69HCW with MySensors?

Scheduled Pinned Locked Moved Troubleshooting
featheradafruitrfm69hcwatsamd21g18samd
17 Posts 7 Posters 7.9k Views 6 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    Sweeman
    wrote on last edited by Sweeman
    #3

    Thank you for the advice!

    To begin with I followed lafleurs advice from this thread: https://forum.mysensors.org/topic/6718/8bit-or-32bit-processors/4

    Unfortunately I wasn't able to establish communication by using the Zero-Board-definitions. I didn't really figure out what screwed up, since I was able to compile but it never really worked and I had no Serial-Monitor available.

    Even tweaking the hardware definiton files didn't really work out. So I had a look into the initial error again to make it work with original Adafruit-FeatherM0-definitions. And I don't know why I didn't see that earlier:

    Since SerialUSB wasn't declared I did a quick search for that error and I found this: https://forums.adafruit.com/viewtopic.php?f=22&t=88793

    Apparently they changed "SerialUSB" to only "Serial".
    I edited that in MyHwSAMD.h from

    #ifndef MY_SERIALDEVICE
    #define MY_SERIALDEVICE SerialUSB
    #endif
    

    to

    #ifndef MY_SERIALDEVICE
    #define MY_SERIALDEVICE Serial
    #endif
    

    and it seems to work now.
    I will have to check with a gateway tomorrow. I hope this helps anyone in the future.

    And btw. for the M0-Feather the PINs changed (I found that for the 32u4 and didn't notice the difference immediately).
    You now need to define this before including the MySensors.h

        #define MY_RF69_SPI_CS 8
        #define MY_RF69_IRQ_PIN 3
        #define MY_RF69_IRQ_NUM 3
    

    Thanks for the help and setting me on the right track! I will post if it works tomorrow.

    1 Reply Last reply
    1
    • S Offline
      S Offline
      Sweeman
      wrote on last edited by
      #4

      It works.
      They communicate and I am able to send data from a onewire.
      The only thing which doesn't work right now is sleep. Even though I am using MySensors 2.1.0 (lafleur mentioned that sleep does not work for M0 in 2.1.1).
      Any thoughts how to fix this? It would be annoying to change batteries all the time :)

      1 Reply Last reply
      0
      • tbowmoT Offline
        tbowmoT Offline
        tbowmo
        Admin
        wrote on last edited by
        #5

        If I remember right, then sleep is still on the todo list for m0.. The first m0 board (Sensebender Gateway), is meant to be a gateway, and as such, does not need sleep functionality.

        1 Reply Last reply
        1
        • S Offline
          S Offline
          Sweeman
          wrote on last edited by Sweeman
          #6

          Hi guys,
          I do have a working node now. And I think sleep is working as well. I am using Adafruit_SleepyDog for now.
          Powerconsumption has to be tested yet. To see if the node is still active I made it flash the LED everytime it wakes up for sending data. If you leave out that part it will behave a little odd, because the LED will light up for a whole cycle and go down in the next one. But I guess that's just cosmetics.

          So far it sends battery level and the temperature from one wire sensors.

          For anybody interested I will post the code. I hope it helps someone.

          
           /**
               * The MySensors Arduino library handles the wireless radio link and protocol
               * between your home built sensors/actuators and HA controller of choice.
               * The sensors forms a self healing radio network with optional repeaters. Each
               * repeater and gateway builds a routing tables in EEPROM which keeps track of the
               * network topology allowing messages to be routed to nodes.
               *
               * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
               * Copyright (C) 2013-2015 Sensnology AB
               * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
               *
               * Documentation: http://www.mysensors.org
               * Support Forum: http://forum.mysensors.org
               *
               * This program is free software; you can redistribute it and/or
               * modify it under the terms of the GNU General Public License
               * version 2 as published by the Free Software Foundation.
               *
               *******************************
               *
               * DESCRIPTION
               *
               * Example sketch showing how to send in DS1820B OneWire temperature readings back to the controller
               * http://www.mysensors.org/build/temp
               */
          
              #define MY_DEBUG                                  // used by MySensor (Print debug messages via serial)
              #define MY_RADIO_RFM69                            // Select Radio-Module RFM69
              #define MY_RFM69_FREQUENCY RF69_433MHZ            // Define our Frequency of 433 MHz
              #define MY_IS_RFM69HW                             // Module is high power (HW/HCW)
              //#define MY_RFM69_NETWORKID 100                  // leave out for gateway selection
              #define MY_RF69_SPI_CS 8                          // SPI CS PIN
              #define MY_RF69_IRQ_PIN 3                         // IRQ PIN
              #define MY_RF69_IRQ_NUM 3                         // IRQ PIN NUM (for M0 it is the same as IRQ PIN. Will be obsolete in upcoming MySensors.h) 
              #define MY_NODE_ID 162                            // Node ID
              #define MY_DEFAULT_TX_LED_PIN 13                  // LED Pin for "Blink while sending"
              
              #define CHILD_ID_BATTERY 1                        // Battery ID (standard 1) 
              
              #include <SPI.h>                                  // include SPI for communication with radio
              #include <MySensors.h>                            // include MySensors (it has to be done after the defines) 
              #include <DallasTemperature.h>                    // Lib for Dallas Temperature OneWires
              #include <OneWire.h>                              // Lib for OneWires
              #include <Adafruit_SleepyDog.h>
              
              #define COMPARE_TEMP 0                            // Send temperature only if changed? 1 = Yes 0 = No
              #define ONE_WIRE_BUS 12                           // Pin where dallase sensor is connected 
              #define MAX_ATTACHED_DS18B20 16                   // maximum number of sensors
          
              int VBATPIN = A7;                                 // select the input pin for the battery sense point
              int batteryPcnt;                                  // battery value in percent
              int SleepCycles = 1;                              // Number of sleep cycles (each 17 seconds)
              int n = 0;                                        // Sleepcounter
              
              OneWire oneWire(ONE_WIRE_BUS);                    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
              DallasTemperature sensors(&oneWire);              // Pass the oneWire reference to Dallas Temperature. 
              float lastTemperature[MAX_ATTACHED_DS18B20];      // lastTemp variabels for every possible Sensor (0 - MAX_ATTACHED_DS18B20)
              int numSensors=0;                                 // Number of Sensors (automatically defined later)
              bool receivedConfig = false;                      
              bool metric = true;
             
              MyMessage msg(0,V_TEMP);                          // initialize temperature message
              MyMessage msgBatt(CHILD_ID_BATTERY,V_VOLTAGE);    // initialize battery reading
          
              
              
          /* ********************* Before *********************** */
              void before()
              {
                sensors.begin();                                // Startup up the OneWire library
              }
              
          
          /* ******************** Setup ************************ */
              void setup()  
              { 
                sensors.setWaitForConversion(false);            // requestTemperatures() will not block current thread
                pinMode(LED_BUILTIN, OUTPUT);
              }
          
          
          /* ********************** Presentation ********************** */
              void presentation() {
                sendSketchInfo("Temperature Sensor", "1.1");                    // Send the sketch version information to the gateway and Controller
                numSensors = sensors.getDeviceCount();                          // Fetch the number of attached temperature sensors
                for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                    present(i, S_TEMP);                                         // Present all sensors to controller
                }
                present(CHILD_ID_BATTERY, S_MULTIMETER);                        // Present battery to controller
              }
          
           
          /* ********************** Loop ********************** */    
              void loop()     
          { 
              n = 0;                                                            // reset sleep count
              if (n == 0)                                                       // Only send Data when sleep cycles completed
              {
               
                /* ***************** Get the battery Voltage ***************** */
                
                // To make this easy we stuck a double-100K resistor divider on the BAT pin, and connected it to D9 (a.k.a analog #7 A7). You can read this pin's voltage, then double it, to get the battery voltage.
                float sensorValue = analogRead(VBATPIN);
                #ifdef MY_DEBUG
                Serial.println(sensorValue);                                  // Debug msg
                #endif
                sensorValue *= 2;                                             // we divided by 2, so multiply back (because of double-100K resistor)
                sensorValue *= 3.3;                                           // Multiply by 3.3V, our reference voltage
                sensorValue /= 1024;                                          // convert to voltage
                float batteryV  = sensorValue;
                int batteryPcnt = ((batteryV-2.7)/3.3)*100;                   // for 6V batterypack (don't use 6V directly. It will fry your radio. 3.3 -5 V is OK) 
              
                #ifdef MY_DEBUG                                               // Battery Debug
                Serial.print("Battery Voltage: ");
                Serial.print(batteryV);
                Serial.println(" V");
          
                Serial.print("Battery percent: ");
                Serial.print(batteryPcnt);
                Serial.println(" %");
                #endif
          
                sendBatteryLevel(batteryPcnt);
                send(msgBatt.set(batteryV,2));
                
                /* ***************** Send Sensor Data ***************** */
          
                sensors.requestTemperatures();                                                                                                                                      // Fetch temperatures from Dallas sensors
                for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {                                                                                                        // Read temperatures and send them to controller 
                  float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;     //Fetch and round temperature to one decimal (v2.1.1 "getControllerConfig" instead of "getConfig")
                  #if COMPARE_TEMP == 1                                                                                                                                             // Only send data if temperature has changed and no error
                    if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
                  #else
                    if (temperature != -127.00 && temperature != 85.00) {                          // Only send Data if not -127 or 85 °C (indicates reading-error)
                  #endif
                       send(msg.setSensor(i).set(temperature,1));                                  // Send the new temperature
                  
                       lastTemperature[i]=temperature;                                             // Save new temperatures for next compare
                    }
                }
               digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on to indicate transmission
               delay(500);                        // wait for a 500 ms
               digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
              }                                                                                    // end of "only send data if sleep cycles completed"-if 
           
            /* ***************** Sleep ***************** */
            
            while (n <= SleepCycles)
              {
              Watchdog.sleep(17000);              // Deepsleep with Watchdog interrupt !!Watchdog can't handle long sleep times, hence the cycles!! (n=1 -> 17 sec * 2 = 34 sec sleep)
              n++;
              }
          
          } // end of loop
          
          
          TerrenceT NeverDieN 2 Replies Last reply
          0
          • S Sweeman

            Hi guys,
            I do have a working node now. And I think sleep is working as well. I am using Adafruit_SleepyDog for now.
            Powerconsumption has to be tested yet. To see if the node is still active I made it flash the LED everytime it wakes up for sending data. If you leave out that part it will behave a little odd, because the LED will light up for a whole cycle and go down in the next one. But I guess that's just cosmetics.

            So far it sends battery level and the temperature from one wire sensors.

            For anybody interested I will post the code. I hope it helps someone.

            
             /**
                 * The MySensors Arduino library handles the wireless radio link and protocol
                 * between your home built sensors/actuators and HA controller of choice.
                 * The sensors forms a self healing radio network with optional repeaters. Each
                 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
                 * network topology allowing messages to be routed to nodes.
                 *
                 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
                 * Copyright (C) 2013-2015 Sensnology AB
                 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
                 *
                 * Documentation: http://www.mysensors.org
                 * Support Forum: http://forum.mysensors.org
                 *
                 * This program is free software; you can redistribute it and/or
                 * modify it under the terms of the GNU General Public License
                 * version 2 as published by the Free Software Foundation.
                 *
                 *******************************
                 *
                 * DESCRIPTION
                 *
                 * Example sketch showing how to send in DS1820B OneWire temperature readings back to the controller
                 * http://www.mysensors.org/build/temp
                 */
            
                #define MY_DEBUG                                  // used by MySensor (Print debug messages via serial)
                #define MY_RADIO_RFM69                            // Select Radio-Module RFM69
                #define MY_RFM69_FREQUENCY RF69_433MHZ            // Define our Frequency of 433 MHz
                #define MY_IS_RFM69HW                             // Module is high power (HW/HCW)
                //#define MY_RFM69_NETWORKID 100                  // leave out for gateway selection
                #define MY_RF69_SPI_CS 8                          // SPI CS PIN
                #define MY_RF69_IRQ_PIN 3                         // IRQ PIN
                #define MY_RF69_IRQ_NUM 3                         // IRQ PIN NUM (for M0 it is the same as IRQ PIN. Will be obsolete in upcoming MySensors.h) 
                #define MY_NODE_ID 162                            // Node ID
                #define MY_DEFAULT_TX_LED_PIN 13                  // LED Pin for "Blink while sending"
                
                #define CHILD_ID_BATTERY 1                        // Battery ID (standard 1) 
                
                #include <SPI.h>                                  // include SPI for communication with radio
                #include <MySensors.h>                            // include MySensors (it has to be done after the defines) 
                #include <DallasTemperature.h>                    // Lib for Dallas Temperature OneWires
                #include <OneWire.h>                              // Lib for OneWires
                #include <Adafruit_SleepyDog.h>
                
                #define COMPARE_TEMP 0                            // Send temperature only if changed? 1 = Yes 0 = No
                #define ONE_WIRE_BUS 12                           // Pin where dallase sensor is connected 
                #define MAX_ATTACHED_DS18B20 16                   // maximum number of sensors
            
                int VBATPIN = A7;                                 // select the input pin for the battery sense point
                int batteryPcnt;                                  // battery value in percent
                int SleepCycles = 1;                              // Number of sleep cycles (each 17 seconds)
                int n = 0;                                        // Sleepcounter
                
                OneWire oneWire(ONE_WIRE_BUS);                    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
                DallasTemperature sensors(&oneWire);              // Pass the oneWire reference to Dallas Temperature. 
                float lastTemperature[MAX_ATTACHED_DS18B20];      // lastTemp variabels for every possible Sensor (0 - MAX_ATTACHED_DS18B20)
                int numSensors=0;                                 // Number of Sensors (automatically defined later)
                bool receivedConfig = false;                      
                bool metric = true;
               
                MyMessage msg(0,V_TEMP);                          // initialize temperature message
                MyMessage msgBatt(CHILD_ID_BATTERY,V_VOLTAGE);    // initialize battery reading
            
                
                
            /* ********************* Before *********************** */
                void before()
                {
                  sensors.begin();                                // Startup up the OneWire library
                }
                
            
            /* ******************** Setup ************************ */
                void setup()  
                { 
                  sensors.setWaitForConversion(false);            // requestTemperatures() will not block current thread
                  pinMode(LED_BUILTIN, OUTPUT);
                }
            
            
            /* ********************** Presentation ********************** */
                void presentation() {
                  sendSketchInfo("Temperature Sensor", "1.1");                    // Send the sketch version information to the gateway and Controller
                  numSensors = sensors.getDeviceCount();                          // Fetch the number of attached temperature sensors
                  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                      present(i, S_TEMP);                                         // Present all sensors to controller
                  }
                  present(CHILD_ID_BATTERY, S_MULTIMETER);                        // Present battery to controller
                }
            
             
            /* ********************** Loop ********************** */    
                void loop()     
            { 
                n = 0;                                                            // reset sleep count
                if (n == 0)                                                       // Only send Data when sleep cycles completed
                {
                 
                  /* ***************** Get the battery Voltage ***************** */
                  
                  // To make this easy we stuck a double-100K resistor divider on the BAT pin, and connected it to D9 (a.k.a analog #7 A7). You can read this pin's voltage, then double it, to get the battery voltage.
                  float sensorValue = analogRead(VBATPIN);
                  #ifdef MY_DEBUG
                  Serial.println(sensorValue);                                  // Debug msg
                  #endif
                  sensorValue *= 2;                                             // we divided by 2, so multiply back (because of double-100K resistor)
                  sensorValue *= 3.3;                                           // Multiply by 3.3V, our reference voltage
                  sensorValue /= 1024;                                          // convert to voltage
                  float batteryV  = sensorValue;
                  int batteryPcnt = ((batteryV-2.7)/3.3)*100;                   // for 6V batterypack (don't use 6V directly. It will fry your radio. 3.3 -5 V is OK) 
                
                  #ifdef MY_DEBUG                                               // Battery Debug
                  Serial.print("Battery Voltage: ");
                  Serial.print(batteryV);
                  Serial.println(" V");
            
                  Serial.print("Battery percent: ");
                  Serial.print(batteryPcnt);
                  Serial.println(" %");
                  #endif
            
                  sendBatteryLevel(batteryPcnt);
                  send(msgBatt.set(batteryV,2));
                  
                  /* ***************** Send Sensor Data ***************** */
            
                  sensors.requestTemperatures();                                                                                                                                      // Fetch temperatures from Dallas sensors
                  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {                                                                                                        // Read temperatures and send them to controller 
                    float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;     //Fetch and round temperature to one decimal (v2.1.1 "getControllerConfig" instead of "getConfig")
                    #if COMPARE_TEMP == 1                                                                                                                                             // Only send data if temperature has changed and no error
                      if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
                    #else
                      if (temperature != -127.00 && temperature != 85.00) {                          // Only send Data if not -127 or 85 °C (indicates reading-error)
                    #endif
                         send(msg.setSensor(i).set(temperature,1));                                  // Send the new temperature
                    
                         lastTemperature[i]=temperature;                                             // Save new temperatures for next compare
                      }
                  }
                 digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on to indicate transmission
                 delay(500);                        // wait for a 500 ms
                 digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
                }                                                                                    // end of "only send data if sleep cycles completed"-if 
             
              /* ***************** Sleep ***************** */
              
              while (n <= SleepCycles)
                {
                Watchdog.sleep(17000);              // Deepsleep with Watchdog interrupt !!Watchdog can't handle long sleep times, hence the cycles!! (n=1 -> 17 sec * 2 = 34 sec sleep)
                n++;
                }
            
            } // end of loop
            
            
            TerrenceT Offline
            TerrenceT Offline
            Terrence
            wrote on last edited by
            #7

            @Sweeman Thank you for posting this. I will be attempting to put a mo into practice soon.

            1 Reply Last reply
            0
            • S Sweeman

              Hi guys,
              I do have a working node now. And I think sleep is working as well. I am using Adafruit_SleepyDog for now.
              Powerconsumption has to be tested yet. To see if the node is still active I made it flash the LED everytime it wakes up for sending data. If you leave out that part it will behave a little odd, because the LED will light up for a whole cycle and go down in the next one. But I guess that's just cosmetics.

              So far it sends battery level and the temperature from one wire sensors.

              For anybody interested I will post the code. I hope it helps someone.

              
               /**
                   * The MySensors Arduino library handles the wireless radio link and protocol
                   * between your home built sensors/actuators and HA controller of choice.
                   * The sensors forms a self healing radio network with optional repeaters. Each
                   * repeater and gateway builds a routing tables in EEPROM which keeps track of the
                   * network topology allowing messages to be routed to nodes.
                   *
                   * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
                   * Copyright (C) 2013-2015 Sensnology AB
                   * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
                   *
                   * Documentation: http://www.mysensors.org
                   * Support Forum: http://forum.mysensors.org
                   *
                   * This program is free software; you can redistribute it and/or
                   * modify it under the terms of the GNU General Public License
                   * version 2 as published by the Free Software Foundation.
                   *
                   *******************************
                   *
                   * DESCRIPTION
                   *
                   * Example sketch showing how to send in DS1820B OneWire temperature readings back to the controller
                   * http://www.mysensors.org/build/temp
                   */
              
                  #define MY_DEBUG                                  // used by MySensor (Print debug messages via serial)
                  #define MY_RADIO_RFM69                            // Select Radio-Module RFM69
                  #define MY_RFM69_FREQUENCY RF69_433MHZ            // Define our Frequency of 433 MHz
                  #define MY_IS_RFM69HW                             // Module is high power (HW/HCW)
                  //#define MY_RFM69_NETWORKID 100                  // leave out for gateway selection
                  #define MY_RF69_SPI_CS 8                          // SPI CS PIN
                  #define MY_RF69_IRQ_PIN 3                         // IRQ PIN
                  #define MY_RF69_IRQ_NUM 3                         // IRQ PIN NUM (for M0 it is the same as IRQ PIN. Will be obsolete in upcoming MySensors.h) 
                  #define MY_NODE_ID 162                            // Node ID
                  #define MY_DEFAULT_TX_LED_PIN 13                  // LED Pin for "Blink while sending"
                  
                  #define CHILD_ID_BATTERY 1                        // Battery ID (standard 1) 
                  
                  #include <SPI.h>                                  // include SPI for communication with radio
                  #include <MySensors.h>                            // include MySensors (it has to be done after the defines) 
                  #include <DallasTemperature.h>                    // Lib for Dallas Temperature OneWires
                  #include <OneWire.h>                              // Lib for OneWires
                  #include <Adafruit_SleepyDog.h>
                  
                  #define COMPARE_TEMP 0                            // Send temperature only if changed? 1 = Yes 0 = No
                  #define ONE_WIRE_BUS 12                           // Pin where dallase sensor is connected 
                  #define MAX_ATTACHED_DS18B20 16                   // maximum number of sensors
              
                  int VBATPIN = A7;                                 // select the input pin for the battery sense point
                  int batteryPcnt;                                  // battery value in percent
                  int SleepCycles = 1;                              // Number of sleep cycles (each 17 seconds)
                  int n = 0;                                        // Sleepcounter
                  
                  OneWire oneWire(ONE_WIRE_BUS);                    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
                  DallasTemperature sensors(&oneWire);              // Pass the oneWire reference to Dallas Temperature. 
                  float lastTemperature[MAX_ATTACHED_DS18B20];      // lastTemp variabels for every possible Sensor (0 - MAX_ATTACHED_DS18B20)
                  int numSensors=0;                                 // Number of Sensors (automatically defined later)
                  bool receivedConfig = false;                      
                  bool metric = true;
                 
                  MyMessage msg(0,V_TEMP);                          // initialize temperature message
                  MyMessage msgBatt(CHILD_ID_BATTERY,V_VOLTAGE);    // initialize battery reading
              
                  
                  
              /* ********************* Before *********************** */
                  void before()
                  {
                    sensors.begin();                                // Startup up the OneWire library
                  }
                  
              
              /* ******************** Setup ************************ */
                  void setup()  
                  { 
                    sensors.setWaitForConversion(false);            // requestTemperatures() will not block current thread
                    pinMode(LED_BUILTIN, OUTPUT);
                  }
              
              
              /* ********************** Presentation ********************** */
                  void presentation() {
                    sendSketchInfo("Temperature Sensor", "1.1");                    // Send the sketch version information to the gateway and Controller
                    numSensors = sensors.getDeviceCount();                          // Fetch the number of attached temperature sensors
                    for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                        present(i, S_TEMP);                                         // Present all sensors to controller
                    }
                    present(CHILD_ID_BATTERY, S_MULTIMETER);                        // Present battery to controller
                  }
              
               
              /* ********************** Loop ********************** */    
                  void loop()     
              { 
                  n = 0;                                                            // reset sleep count
                  if (n == 0)                                                       // Only send Data when sleep cycles completed
                  {
                   
                    /* ***************** Get the battery Voltage ***************** */
                    
                    // To make this easy we stuck a double-100K resistor divider on the BAT pin, and connected it to D9 (a.k.a analog #7 A7). You can read this pin's voltage, then double it, to get the battery voltage.
                    float sensorValue = analogRead(VBATPIN);
                    #ifdef MY_DEBUG
                    Serial.println(sensorValue);                                  // Debug msg
                    #endif
                    sensorValue *= 2;                                             // we divided by 2, so multiply back (because of double-100K resistor)
                    sensorValue *= 3.3;                                           // Multiply by 3.3V, our reference voltage
                    sensorValue /= 1024;                                          // convert to voltage
                    float batteryV  = sensorValue;
                    int batteryPcnt = ((batteryV-2.7)/3.3)*100;                   // for 6V batterypack (don't use 6V directly. It will fry your radio. 3.3 -5 V is OK) 
                  
                    #ifdef MY_DEBUG                                               // Battery Debug
                    Serial.print("Battery Voltage: ");
                    Serial.print(batteryV);
                    Serial.println(" V");
              
                    Serial.print("Battery percent: ");
                    Serial.print(batteryPcnt);
                    Serial.println(" %");
                    #endif
              
                    sendBatteryLevel(batteryPcnt);
                    send(msgBatt.set(batteryV,2));
                    
                    /* ***************** Send Sensor Data ***************** */
              
                    sensors.requestTemperatures();                                                                                                                                      // Fetch temperatures from Dallas sensors
                    for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {                                                                                                        // Read temperatures and send them to controller 
                      float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;     //Fetch and round temperature to one decimal (v2.1.1 "getControllerConfig" instead of "getConfig")
                      #if COMPARE_TEMP == 1                                                                                                                                             // Only send data if temperature has changed and no error
                        if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
                      #else
                        if (temperature != -127.00 && temperature != 85.00) {                          // Only send Data if not -127 or 85 °C (indicates reading-error)
                      #endif
                           send(msg.setSensor(i).set(temperature,1));                                  // Send the new temperature
                      
                           lastTemperature[i]=temperature;                                             // Save new temperatures for next compare
                        }
                    }
                   digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on to indicate transmission
                   delay(500);                        // wait for a 500 ms
                   digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
                  }                                                                                    // end of "only send data if sleep cycles completed"-if 
               
                /* ***************** Sleep ***************** */
                
                while (n <= SleepCycles)
                  {
                  Watchdog.sleep(17000);              // Deepsleep with Watchdog interrupt !!Watchdog can't handle long sleep times, hence the cycles!! (n=1 -> 17 sec * 2 = 34 sec sleep)
                  n++;
                  }
              
              } // end of loop
              
              
              NeverDieN Offline
              NeverDieN Offline
              NeverDie
              Hero Member
              wrote on last edited by NeverDie
              #8

              @Sweeman
              I'm very interested to hear your power consumption measurements. I only just recently acquired an Adafruit Feather M0 RFM69HCW, and it's probably my #1 question, because if it's not good, then I'm going to shelve it until it is good. Ultra low current consumption is simpy a MUST.

              1 Reply Last reply
              0
              • S Offline
                S Offline
                Sweeman
                wrote on last edited by
                #9

                I think that I will have some data on that by next tuesday, since that is also my #1 requirement. I will let you know!

                1 Reply Last reply
                2
                • S Offline
                  S Offline
                  Sweeman
                  wrote on last edited by
                  #10

                  My gear is a bit quick and dirty, because I am in a cheapo lab and would need to get a better suited resistor for my measurement to be absolutely certain. But what I get is aprox. 150mA while sending and 2mA during sleep (with 10 Ohms as measurement resistor).
                  There is some room for improvement I guess. But it is already better than the old setup.
                  I hope that helps a little and maybe you find a way to have even less power consumption.
                  I will think a little about this and decide wheather I will get some better gear for that later. :)

                  NeverDieN 1 Reply Last reply
                  0
                  • S Sweeman

                    My gear is a bit quick and dirty, because I am in a cheapo lab and would need to get a better suited resistor for my measurement to be absolutely certain. But what I get is aprox. 150mA while sending and 2mA during sleep (with 10 Ohms as measurement resistor).
                    There is some room for improvement I guess. But it is already better than the old setup.
                    I hope that helps a little and maybe you find a way to have even less power consumption.
                    I will think a little about this and decide wheather I will get some better gear for that later. :)

                    NeverDieN Offline
                    NeverDieN Offline
                    NeverDie
                    Hero Member
                    wrote on last edited by NeverDie
                    #11

                    @Sweeman
                    That sounds rather high. Was it the sketch above that you were running for the sleep cycle? I could try measuring with a uCurrent Gold. It's the sleep current that matters most. I'm around 1ua during sleep with an atmega328p and an RFM69.

                    S 1 Reply Last reply
                    1
                    • scalzS Offline
                      scalzS Offline
                      scalz
                      Hardware Contributor
                      wrote on last edited by scalz
                      #12

                      from datasheet, atsamd is approx 2.8uA in deepest sleep mode without rtc, 4uA with rtc 1khz. wdt should consumes some uA too. it's not comparable with 328p, it's different, not same features, still low power vs features though.

                      NeverDieN 1 Reply Last reply
                      1
                      • NeverDieN NeverDie

                        @Sweeman
                        That sounds rather high. Was it the sketch above that you were running for the sleep cycle? I could try measuring with a uCurrent Gold. It's the sleep current that matters most. I'm around 1ua during sleep with an atmega328p and an RFM69.

                        S Offline
                        S Offline
                        Sweeman
                        wrote on last edited by
                        #13

                        @NeverDie
                        Yes it was essentially the same sketch. I guess the 3.3 V regulator is consuming some power as well?
                        I would love to see it consuming even less power. But as long as it holds for about 3 months on 4500 mAh it is kind of OK for my purposes.
                        It would be great if you could measure it with your gear and maybe you have an idea how to get it even lower, since I also have to work on some peripheral stuff first. I am looking forward to hear from your tests.

                        @scalz
                        To be honest I am a little lost with all these abbreviations since I just started on working with MCUs, but I guess it is to make a point of "features need power"? But I will use these as hints as where to look for more saving potential. :)

                        Nca78N 1 Reply Last reply
                        0
                        • gohanG Offline
                          gohanG Offline
                          gohan
                          Mod
                          wrote on last edited by
                          #14

                          voltage regulators do consume power and are usually bad for sleeping nodes. ;)

                          1 Reply Last reply
                          0
                          • S Sweeman

                            @NeverDie
                            Yes it was essentially the same sketch. I guess the 3.3 V regulator is consuming some power as well?
                            I would love to see it consuming even less power. But as long as it holds for about 3 months on 4500 mAh it is kind of OK for my purposes.
                            It would be great if you could measure it with your gear and maybe you have an idea how to get it even lower, since I also have to work on some peripheral stuff first. I am looking forward to hear from your tests.

                            @scalz
                            To be honest I am a little lost with all these abbreviations since I just started on working with MCUs, but I guess it is to make a point of "features need power"? But I will use these as hints as where to look for more saving potential. :)

                            Nca78N Offline
                            Nca78N Offline
                            Nca78
                            Hardware Contributor
                            wrote on last edited by
                            #15

                            @Sweeman said in Adafruit Feather M0 RFM69HCW with MySensors?:

                            I guess the 3.3 V regulator is consuming some power as well?

                            It's a SPX3819 and the datasheet says "Low Quiescent Current: 90μA". Out of spec for any decent battery powered sensor IMHO :P

                            1 Reply Last reply
                            0
                            • scalzS scalz

                              from datasheet, atsamd is approx 2.8uA in deepest sleep mode without rtc, 4uA with rtc 1khz. wdt should consumes some uA too. it's not comparable with 328p, it's different, not same features, still low power vs features though.

                              NeverDieN Offline
                              NeverDieN Offline
                              NeverDie
                              Hero Member
                              wrote on last edited by NeverDie
                              #16

                              @scalz said in Adafruit Feather M0 RFM69HCW with MySensors?:

                              from datasheet, atsamd is approx 2.8uA in deepest sleep mode without rtc, 4uA with rtc 1khz.

                              Thanks for posting this. I think that alone may kill it for me. For some reason I thought it was lower.

                              1 Reply Last reply
                              0
                              • S Offline
                                S Offline
                                Sweeman
                                wrote on last edited by Sweeman
                                #17

                                Hey guys aside from these power-consumption issues, I am now running the Feather as gateway and node.
                                And I get a strange problem.
                                The gateway is attached to a raspberry pi via usb (by-id), which runs fhem. And everything works great for about an hour to 1 1/2. Then somehow the gateway stops receiving/communicating. I already tried an active USB-Hub incase the power consumption was too high for too long. But that didn't help. I have to reset the gateway and node to make it work again.
                                Did anybody else ever experience similar behaviour?

                                1 Reply Last reply
                                0
                                Reply
                                • Reply as topic
                                Log in to reply
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes


                                16

                                Online

                                11.7k

                                Users

                                11.2k

                                Topics

                                113.0k

                                Posts


                                Copyright 2019 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                • Login

                                • Don't have an account? Register

                                • Login or register to search.
                                • First post
                                  Last post
                                0
                                • MySensors
                                • OpenHardware.io
                                • Categories
                                • Recent
                                • Tags
                                • Popular