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. My Project
  3. My Slim 2AA Battery Node

My Slim 2AA Battery Node

Scheduled Pinned Locked Moved My Project
498 Posts 71 Posters 342.6k Views 69 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.
  • NeverDieN NeverDie

    @badmannen Welcome back. The good news is that there's now a mysensors bootloader, which is even better because it allows over-the-air firmware updates for the atmega328p: https://www.mysensors.org/about/fota

    badmannenB Offline
    badmannenB Offline
    badmannen
    wrote on last edited by
    #474

    @neverdie Alright , that took me a couple of days of fighting with Arduino/Linux/windows/drivers/bootloaders etc etc etc but I got it all running with my updated gateway+repeater-node + mailbox-node. did not try the update function yet but surely it should work. just need one or two more repeater-nodes since I have way to thick cement walls here for this signal.

    rPi 3 - UNO R3 - Mini - Nano - custom

    1 Reply Last reply
    1
    • badmannenB Offline
      badmannenB Offline
      badmannen
      wrote on last edited by
      #475

      OK I had some fun the last couple of days and actually got something done =D !

      Managed to update my gateway and repeater-nodes to latest version and boot-loaded all nodes and future nodes so they are FOTA enabled .

      So far I managed to assemble 3 nodes and after a bit of swearing and soldering and de-soldering and re-soldering I got:
      1 - DHT11 TEMP / HUM node, on Battery (Slim 2AA) - surprisingly accurate actually

      2 - DOOR-SWITCH - on Battery (Slim 2AA) - to be used in my mailbox, got the idea from someone here in the forums, so thank you, I don´t remember who it was since I probably read a million posts by now =D

      3 - a 220V Relay switch, with the PA LN radio, and works as repeater ( runs on a NANO )

      just wanted to say a huge thanks to the MySensors group and all people here on the forum for helping me get started (Had a little break for a couple of years =)

      0_1573941605467_7883601d-ee83-4cf1-a4cf-48da54912bd8.jpg

      0_1573941554139_e0f66ec8-8ddf-4d79-9ab2-6947f0710e65.jpg

      rPi 3 - UNO R3 - Mini - Nano - custom

      1 Reply Last reply
      0
      • NeverDieN Offline
        NeverDieN Offline
        NeverDie
        Hero Member
        wrote on last edited by
        #476

        Let us know when you get it to FOTA update.

        badmannenB 2 Replies Last reply
        0
        • NeverDieN NeverDie

          Let us know when you get it to FOTA update.

          badmannenB Offline
          badmannenB Offline
          badmannen
          wrote on last edited by
          #477

          @neverdie
          Just tried it by mounting an "empty" 328P in the node just with the
          fuses set to:
          0xE2
          0xDA
          0xFE

          and with the MYSBootloader .

          Amazing ! . worked at the first try! (this time around =D )

          ( tried and failed a couple of times earlier, but I know I burned 0xFD instead of 0xFE so set the BOD to the wrong value, and that does not work )

          rPi 3 - UNO R3 - Mini - Nano - custom

          1 Reply Last reply
          1
          • NeverDieN NeverDie

            Let us know when you get it to FOTA update.

            badmannenB Offline
            badmannenB Offline
            badmannen
            wrote on last edited by
            #478

            @neverdie Actually... I run into another problem ..

            After I make a FOTA and upload a sketch . it runs as it should, no problem.

            But if I try to update it again , it never tries to upload the sketch to the node.

            The only thing I could find that was clever to do to make it work ok with a battery node was to use smartSleep();
            which I do ... is there anything else in the code that needs to be present ?

            rPi 3 - UNO R3 - Mini - Nano - custom

            1 Reply Last reply
            0
            • NeverDieN Offline
              NeverDieN Offline
              NeverDie
              Hero Member
              wrote on last edited by
              #479

              Hopefully someone who knows can chime in.

              badmannenB 1 Reply Last reply
              0
              • NeverDieN NeverDie

                Hopefully someone who knows can chime in.

                badmannenB Offline
                badmannenB Offline
                badmannen
                wrote on last edited by
                #480

                @neverdie OK, that person who knows something is now ME ! =D ... RTFM ... as always , it worked strangely enough to update ONCE with some slightly wrong Fuses set... reloaded the bootloader with soem correct fuses agian .. ( hopefully alst time .. and VOILA! now it works to update the node multiple times .. yeaa.

                rPi 3 - UNO R3 - Mini - Nano - custom

                1 Reply Last reply
                1
                • NeverDieN Offline
                  NeverDieN Offline
                  NeverDie
                  Hero Member
                  wrote on last edited by
                  #481

                  What were the winning fuse settings that you finally settled on using? Trust me, a year from now you won't remember, and you'll be glad you posted it.

                  1 Reply Last reply
                  1
                  • badmannenB Offline
                    badmannenB Offline
                    badmannen
                    wrote on last edited by
                    #482

                    OK MY solution was actually the fuses that I said earlier . but confused myself by changing them back and forth a couple of times and downgraded Arduino to the previous version etc.

                    So the fuses for my barebone 328P are:

                    proMYSBL8.bootloader.low_fuses=0xE2
                    proMYSBL8.bootloader.high_fuses=0xDA
                    proMYSBL8.bootloader.extended_fuses=0xFE

                    the biggest issue I had was probably with ARduino IDE .. that one I enver manged to set the fuses ( I read somewhere it should.. but maybe I´m wrong) . Anyway it works when I set the fuses and upload it with AVRDUDESS.

                    (note: hello me 1 year into the future, just do what I say ! )
                    =)

                    rPi 3 - UNO R3 - Mini - Nano - custom

                    1 Reply Last reply
                    1
                    • badmannenB Offline
                      badmannenB Offline
                      badmannen
                      wrote on last edited by badmannen
                      #483

                      I just add another note to myself ( And anyone else that lost their hair wondering why the bootloader was lost....)

                      DO NOT UPLOAD SKETCH ONLY WITH USBASP ... it deletes the bootloader .
                      yes I know it is mentioned on the foru m.. just found it .. but I mention it again...

                      rPi 3 - UNO R3 - Mini - Nano - custom

                      badmannenB 1 Reply Last reply
                      1
                      • badmannenB badmannen

                        I just add another note to myself ( And anyone else that lost their hair wondering why the bootloader was lost....)

                        DO NOT UPLOAD SKETCH ONLY WITH USBASP ... it deletes the bootloader .
                        yes I know it is mentioned on the foru m.. just found it .. but I mention it again...

                        badmannenB Offline
                        badmannenB Offline
                        badmannen
                        wrote on last edited by
                        #484

                        @badmannen

                        and here is a good simple explanation of the fuses
                        http://www.martyncurrey.com/category/atmega/

                        rPi 3 - UNO R3 - Mini - Nano - custom

                        1 Reply Last reply
                        0
                        • NeverDieN Offline
                          NeverDieN Offline
                          NeverDie
                          Hero Member
                          wrote on last edited by
                          #485

                          FYI: If you run the ceramic resonator at 8mhz, with the zero wake up fuse setting, you can wake the atmega328p up in less than 4usec. This is a huge power savings compared to all other options.

                          badmannenB 1 Reply Last reply
                          1
                          • NeverDieN NeverDie

                            FYI: If you run the ceramic resonator at 8mhz, with the zero wake up fuse setting, you can wake the atmega328p up in less than 4usec. This is a huge power savings compared to all other options.

                            badmannenB Offline
                            badmannenB Offline
                            badmannen
                            wrote on last edited by
                            #486

                            @neverdie aa thanks for the info. Might be useful for some other nodes I will do.

                            rPi 3 - UNO R3 - Mini - Nano - custom

                            NeverDieN 1 Reply Last reply
                            0
                            • badmannenB badmannen

                              @neverdie aa thanks for the info. Might be useful for some other nodes I will do.

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

                              @badmannen You're welcome. I even measured it on an oscope just to be sure, so I'm certain it is true.

                              1 Reply Last reply
                              1
                              • badmannenB Offline
                                badmannenB Offline
                                badmannen
                                wrote on last edited by
                                #488

                                This style?
                                € 1,09 8%OFF | 20pcs Ceramic Resonators ZTT 4M 6M 8M 10M 12M 16M 4/6/8/10/12/16MHZ DIP-3 Crystal Frequency Element
                                https://s.click.aliexpress.com/e/mRfXWk8Nd

                                rPi 3 - UNO R3 - Mini - Nano - custom

                                NeverDieN 1 Reply Last reply
                                0
                                • badmannenB badmannen

                                  This style?
                                  € 1,09 8%OFF | 20pcs Ceramic Resonators ZTT 4M 6M 8M 10M 12M 16M 4/6/8/10/12/16MHZ DIP-3 Crystal Frequency Element
                                  https://s.click.aliexpress.com/e/mRfXWk8Nd

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

                                  @badmannen no. It's built in. You already have it.

                                  badmannenB 1 Reply Last reply
                                  0
                                  • NeverDieN NeverDie

                                    @badmannen no. It's built in. You already have it.

                                    badmannenB Offline
                                    badmannenB Offline
                                    badmannen
                                    wrote on last edited by
                                    #490

                                    @neverdie aa ok sorry got confused there for a second. I'm running the internal, so I guess I will pop them off again now then and burn that fuse for a quicker startup 👍🏻

                                    rPi 3 - UNO R3 - Mini - Nano - custom

                                    NeverDieN 1 Reply Last reply
                                    0
                                    • badmannenB badmannen

                                      @neverdie aa ok sorry got confused there for a second. I'm running the internal, so I guess I will pop them off again now then and burn that fuse for a quicker startup 👍🏻

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

                                      @badmannen yes, it must be the internal resonator.

                                      1 Reply Last reply
                                      0
                                      • Grzegorz BG Offline
                                        Grzegorz BG Offline
                                        Grzegorz B
                                        wrote on last edited by
                                        #492

                                        Hello, will there be a good soul that will help improve the program? I know what the error is but I have no idea how to correct it.

                                          interruptReturn = sleep(PRIMARY_BUTTON_PIN-2, CHANGE, SECONDARY_BUTTON_PIN-2, CHANGE, ONE_DAY_SLEEP_TIME);
                                        

                                        when i change

                                        PRIMARY_BUTTON_PIN
                                        

                                        the interruptReturn = 1, but when i change

                                        SECONDARY_BUTTON_PIN
                                        

                                        the interruptReturn = 0.
                                        My question is how can i chane it to send 1 and 1 by both contactrons.

                                        Full code:

                                        //#define MY_DEBUG
                                        #define MY_RADIO_NRF24
                                        #define MY_NODE_ID 100
                                        #define MY_PARENT_NODE_ID 0
                                        #define MY_PARENT_NODE_IS_STATIC
                                        
                                        #include <MySensors.h>
                                        #include "Vcc.h"
                                        
                                        #define SKETCH_NAME "WindowSlimSensor2pcs_smallR"
                                        
                                        #define PRIMARY_CHILD_ID 1
                                        #define PRIMARY_BUTTON_PIN 2
                                        #define SECONDARY_CHILD_ID 2
                                        #define SECONDARY_BUTTON_PIN 3
                                        #define BATTERY_REPORT_DAY 2   // Desired heartbeat interval when inactive. Maximum heartbeat/report interval is equal to this due to the dayCounter.
                                        #define BATTERY_REPORT_BY_IRT_CYCLE 10  // Adjust this according to usage frequency.
                                        #define ONE_DAY_SLEEP_TIME 86400000
                                        
                                        //#define BATTERY 3
                                        
                                        MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED);
                                        MyMessage msg2(SECONDARY_CHILD_ID, V_TRIPPED);
                                        //MyMessage msg3(BATTERY, V_CUSTOM);
                                        
                                        int dayCounter = 0;
                                        int irtCounter = 0;
                                        bool interruptReturn=false;
                                        const float VccMin   = 1.7;           // Minimum expected Vcc level, in Volts.
                                        const float VccMax   = 3.3;           // Maximum expected Vcc level, in Volts.
                                        const float VccCorrection = 3.43 / 3.455;  // Measured Vcc by multimeter divided by reported Vcc
                                        
                                        
                                        const int32_t report_interval = 8640000; // 1day -> h * m * s * ms NOTICE: milliseconds, not microseconds!
                                        
                                        Vcc vcc(VccCorrection);
                                        //Vcc vcc;
                                        #ifdef MY_DEBUG
                                        void before(){
                                            Serial.begin(9600);
                                        }
                                        #endif
                                        
                                        void setup()
                                        {
                                            pinMode(PRIMARY_BUTTON_PIN, INPUT);
                                            pinMode(SECONDARY_BUTTON_PIN, INPUT);
                                              //EXTERNAL pull-ups
                                            digitalWrite(PRIMARY_BUTTON_PIN, LOW);
                                            digitalWrite(SECONDARY_BUTTON_PIN, LOW);  
                                        }
                                        
                                        void presentation()
                                        {
                                            sendSketchInfo(SKETCH_NAME, __DATE__);
                                            present(PRIMARY_CHILD_ID, S_DOOR, "Lewe Okno");
                                            present(SECONDARY_CHILD_ID, S_DOOR, "Prawe Okno");
                                          //  present(BATTERY, S_CUSTOM);
                                        }
                                        
                                        void loop()
                                        
                                        {
                                            uint8_t reedState;
                                            uint8_t reedState2;
                                            static uint8_t lastReedState = 2;
                                            static uint8_t lastReedState2 = 2;
                                            sleep(5); // Short delay to allow buttons to properly settle
                                            reedState = digitalRead(PRIMARY_BUTTON_PIN);
                                            sleep(5); // Short delay to allow buttons to properly settle
                                            reedState2 = digitalRead(SECONDARY_BUTTON_PIN);
                                        
                                          if (!interruptReturn) { // Woke up by timer (or first run)
                                            dayCounter++; 
                                            if (dayCounter >= BATTERY_REPORT_DAY) {
                                                  dayCounter = 0;
                                                  sendBatteryReport();
                                            }
                                          }
                                          else {    // Woke up by pin change
                                                    irtCounter++;
                                                sleep(5); 
                                          
                                              // Woke up by pin change
                                              if (reedState != lastReedState) {
                                                send(msg.set(reedState==HIGH ? 1 : 0));
                                                lastReedState = reedState;
                                            }
                                              if (reedState2 != lastReedState2) {
                                                send(msg2.set(reedState2==HIGH ? 1 : 0));
                                                lastReedState2 = reedState2;
                                            }
                                              if (irtCounter>=BATTERY_REPORT_BY_IRT_CYCLE) {
                                                irtCounter=0;
                                                sendBatteryReport();
                                              }
                                            
                                          }
                                        
                                          // Sleep until something happens with the sensor,   or one sleep_time has passed since last awake.
                                          interruptReturn = sleep(PRIMARY_BUTTON_PIN-2, CHANGE, SECONDARY_BUTTON_PIN-2, CHANGE, ONE_DAY_SLEEP_TIME);
                                          
                                        } 
                                        
                                        void sendBatteryReport() {
                                                  uint8_t batteryPercent = (uint8_t)vcc.Read_Perc(VccMin, VccMax);
                                                  sendBatteryLevel(batteryPercent);
                                        }
                                        
                                        
                                        mfalkviddM 1 Reply Last reply
                                        0
                                        • Grzegorz BG Grzegorz B

                                          Hello, will there be a good soul that will help improve the program? I know what the error is but I have no idea how to correct it.

                                            interruptReturn = sleep(PRIMARY_BUTTON_PIN-2, CHANGE, SECONDARY_BUTTON_PIN-2, CHANGE, ONE_DAY_SLEEP_TIME);
                                          

                                          when i change

                                          PRIMARY_BUTTON_PIN
                                          

                                          the interruptReturn = 1, but when i change

                                          SECONDARY_BUTTON_PIN
                                          

                                          the interruptReturn = 0.
                                          My question is how can i chane it to send 1 and 1 by both contactrons.

                                          Full code:

                                          //#define MY_DEBUG
                                          #define MY_RADIO_NRF24
                                          #define MY_NODE_ID 100
                                          #define MY_PARENT_NODE_ID 0
                                          #define MY_PARENT_NODE_IS_STATIC
                                          
                                          #include <MySensors.h>
                                          #include "Vcc.h"
                                          
                                          #define SKETCH_NAME "WindowSlimSensor2pcs_smallR"
                                          
                                          #define PRIMARY_CHILD_ID 1
                                          #define PRIMARY_BUTTON_PIN 2
                                          #define SECONDARY_CHILD_ID 2
                                          #define SECONDARY_BUTTON_PIN 3
                                          #define BATTERY_REPORT_DAY 2   // Desired heartbeat interval when inactive. Maximum heartbeat/report interval is equal to this due to the dayCounter.
                                          #define BATTERY_REPORT_BY_IRT_CYCLE 10  // Adjust this according to usage frequency.
                                          #define ONE_DAY_SLEEP_TIME 86400000
                                          
                                          //#define BATTERY 3
                                          
                                          MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED);
                                          MyMessage msg2(SECONDARY_CHILD_ID, V_TRIPPED);
                                          //MyMessage msg3(BATTERY, V_CUSTOM);
                                          
                                          int dayCounter = 0;
                                          int irtCounter = 0;
                                          bool interruptReturn=false;
                                          const float VccMin   = 1.7;           // Minimum expected Vcc level, in Volts.
                                          const float VccMax   = 3.3;           // Maximum expected Vcc level, in Volts.
                                          const float VccCorrection = 3.43 / 3.455;  // Measured Vcc by multimeter divided by reported Vcc
                                          
                                          
                                          const int32_t report_interval = 8640000; // 1day -> h * m * s * ms NOTICE: milliseconds, not microseconds!
                                          
                                          Vcc vcc(VccCorrection);
                                          //Vcc vcc;
                                          #ifdef MY_DEBUG
                                          void before(){
                                              Serial.begin(9600);
                                          }
                                          #endif
                                          
                                          void setup()
                                          {
                                              pinMode(PRIMARY_BUTTON_PIN, INPUT);
                                              pinMode(SECONDARY_BUTTON_PIN, INPUT);
                                                //EXTERNAL pull-ups
                                              digitalWrite(PRIMARY_BUTTON_PIN, LOW);
                                              digitalWrite(SECONDARY_BUTTON_PIN, LOW);  
                                          }
                                          
                                          void presentation()
                                          {
                                              sendSketchInfo(SKETCH_NAME, __DATE__);
                                              present(PRIMARY_CHILD_ID, S_DOOR, "Lewe Okno");
                                              present(SECONDARY_CHILD_ID, S_DOOR, "Prawe Okno");
                                            //  present(BATTERY, S_CUSTOM);
                                          }
                                          
                                          void loop()
                                          
                                          {
                                              uint8_t reedState;
                                              uint8_t reedState2;
                                              static uint8_t lastReedState = 2;
                                              static uint8_t lastReedState2 = 2;
                                              sleep(5); // Short delay to allow buttons to properly settle
                                              reedState = digitalRead(PRIMARY_BUTTON_PIN);
                                              sleep(5); // Short delay to allow buttons to properly settle
                                              reedState2 = digitalRead(SECONDARY_BUTTON_PIN);
                                          
                                            if (!interruptReturn) { // Woke up by timer (or first run)
                                              dayCounter++; 
                                              if (dayCounter >= BATTERY_REPORT_DAY) {
                                                    dayCounter = 0;
                                                    sendBatteryReport();
                                              }
                                            }
                                            else {    // Woke up by pin change
                                                      irtCounter++;
                                                  sleep(5); 
                                            
                                                // Woke up by pin change
                                                if (reedState != lastReedState) {
                                                  send(msg.set(reedState==HIGH ? 1 : 0));
                                                  lastReedState = reedState;
                                              }
                                                if (reedState2 != lastReedState2) {
                                                  send(msg2.set(reedState2==HIGH ? 1 : 0));
                                                  lastReedState2 = reedState2;
                                              }
                                                if (irtCounter>=BATTERY_REPORT_BY_IRT_CYCLE) {
                                                  irtCounter=0;
                                                  sendBatteryReport();
                                                }
                                              
                                            }
                                          
                                            // Sleep until something happens with the sensor,   or one sleep_time has passed since last awake.
                                            interruptReturn = sleep(PRIMARY_BUTTON_PIN-2, CHANGE, SECONDARY_BUTTON_PIN-2, CHANGE, ONE_DAY_SLEEP_TIME);
                                            
                                          } 
                                          
                                          void sendBatteryReport() {
                                                    uint8_t batteryPercent = (uint8_t)vcc.Read_Perc(VccMin, VccMax);
                                                    sendBatteryLevel(batteryPercent);
                                          }
                                          
                                          
                                          mfalkviddM Online
                                          mfalkviddM Online
                                          mfalkvidd
                                          Mod
                                          wrote on last edited by
                                          #493

                                          Welcome to the forum @Grzegorz-B

                                          Change

                                          bool interruptReturn=false;
                                          

                                          to

                                          uint8_t interruptReturn= INTERRUPT_NOT_DEFINED;
                                          

                                          and

                                          if (!interruptReturn) { // Woke up by timer (or first run)
                                          

                                          to

                                          if (interruptReturn== MY_WAKE_UP_BY_TIMER) { // Woke up by timer (or first run)
                                          

                                          Documentation for the sleep function is available at https://www.mysensors.org/download/sensor_api_20#sleeping

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


                                          17

                                          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