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. General Discussion
  3. 6/8 Buttons battery remote node

6/8 Buttons battery remote node

Scheduled Pinned Locked Moved General Discussion
53 Posts 7 Posters 6.9k Views 8 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.
  • dbemowskD dbemowsk

    @carywin Certain arduinos such as the pro minis can ONLY do interrupts on pins 2 or 3 from my understanding.

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

    @dbemowsk said in 6/8 Buttons battery remote node:

    @carywin Certain arduinos such as the pro minis can ONLY do interrupts on pins 2 or 3 from my understanding.

    IIRC, you can do interrupts from other pins too, but each is tied to a separate bank of pins, so you have to do additional testing to determine which specific pin triggered the interrupt. In the case of the voltage divider keypad, that should be no problem.

    NeverDieN CarywinC 2 Replies Last reply
    0
    • NeverDieN NeverDie

      @dbemowsk said in 6/8 Buttons battery remote node:

      @carywin Certain arduinos such as the pro minis can ONLY do interrupts on pins 2 or 3 from my understanding.

      IIRC, you can do interrupts from other pins too, but each is tied to a separate bank of pins, so you have to do additional testing to determine which specific pin triggered the interrupt. In the case of the voltage divider keypad, that should be no problem.

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

      Here's the link: https://playground.arduino.cc/Main/PinChangeInterrupt

      So, in this scenario, it would be:
      ISR (PCINT1_vect) pin change interrupt for A0 to A5

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

        Here's a revision of the earlier code so that it uses ONLY ONE PIN (namely, A0) on the Arduino. And yes, this does work on a pro mini too, because that's what I tested it on. :)

        //  Description:
        //  Use just A0 to process the 12 button keypad.  
        //  Button press is detected by interrupt set on A0.
        //  Which button was pressed is determined by an analog read of A0.
        
        // Note: sleep code borrows from Nick Gammon's Schedule J
        // Interrupt code borrows from https://playground.arduino.cc/Main/PinChangeInterrupt
        
        #include <avr/sleep.h>
        
        void pciSetup(byte pin)
        {
            *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));  // enable pin
            PCIFR  |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
            PCICR  |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
        }
        
        ISR (PCINT1_vect) // handle pin change interrupt for A0 to A5 here
         {
             //no need to do anything beyond just waking up.
         }  
        
        void setup() {
          pinMode(A0,INPUT);
          pciSetup(A0);
          Serial.begin(115200);
          Serial.println("Starting...");
          Serial.flush();
        }
        
        void loop() {
          uint16_t voltage;
        
          set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
          sleep_enable();
        
          // Do not interrupt before we go to sleep, or the
          // ISR will detach interrupts and we won't wake.
          noInterrupts ();
          
          pciSetup(A0);
          
          // turn off brown-out enable in software
          // BODS must be set to one and BODSE must be set to zero within four clock cycles
          MCUCR = bit (BODS) | bit (BODSE);
          // The BODS bit is automatically cleared after three clock cycles
          MCUCR = bit (BODS); 
          
          // We are guaranteed that the sleep_cpu call will be done
          // as the processor executes the next instruction after
          // interrupts are turned on.
          interrupts ();  // one cycle
          sleep_cpu ();   // one cycle
        
          delay(20);  //debounce the button
          voltage=analogRead(A0);  //throw out this first result
          voltage=analogRead(A0);
          if (voltage>700) {
            Serial.println(voltage);
            Serial.flush();
          }
        }
        
        1 Reply Last reply
        0
        • gohanG Offline
          gohanG Offline
          gohan
          Mod
          wrote on last edited by
          #40

          How does that integrates with mysensors?

          NeverDieN 1 Reply Last reply
          0
          • gohanG gohan

            How does that integrates with mysensors?

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

            @gohan That's your department. :)

            gohanG 1 Reply Last reply
            0
            • NeverDieN NeverDie

              @gohan That's your department. :)

              gohanG Offline
              gohanG Offline
              gohan
              Mod
              wrote on last edited by
              #42

              @neverdie well... kind of... I haven't written mysensors' core so I don't know if it will clash with normal sleep management.

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

                Here's an improved sketch that gives you the number (rather than the voltage) of the button that was pressed:

                //  Description:
                //  Use just A0 to process the 12 button keypad.  
                //  Button press is detected by interrupt set on A0.
                //  Which button was pressed is determined by an analog read of A0.
                
                // Note: sleep code borrows from Nick Gammon's Schedule J
                // Interrupt code borrows from https://playground.arduino.cc/Main/PinChangeInterrupt
                
                #include <avr/sleep.h>
                
                int key[12][3] = {  //min and max analogRead values for each key in the 3x4 keypad
                                  {0,993,1012},
                                  {1,848,865},
                                  {2,834,847},
                                  {3,800,833},
                                  {4,901,914},
                                  {5,884,900},
                                  {6,866,883},
                                  {7,948,969},
                                  {8,930,947},
                                  {9,915,929},
                                  {10,1013,1023},
                                  {11,970,992}
                                 };
                
                void pciSetup(byte pin)
                {
                    *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));  // enable pin
                    PCIFR  |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
                    PCICR  |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
                }
                
                ISR (PCINT1_vect) // handle pin change interrupt for A0 to A5 here
                 {
                     //no need to do anything beyond just waking up.
                 }  
                
                 int identifyKey(uint16_t voltage) {
                  int i=0;
                
                  while ((i<12) && ((voltage<key[i][1]) || (voltage>key[i][2]))) {
                    i++;
                  }
                  return i;
                 }
                
                void setup() {
                  pinMode(A0,INPUT);
                  pciSetup(A0);
                  Serial.begin(115200);
                  Serial.println("Starting...");
                  Serial.flush();
                }
                
                void loop() {
                  uint16_t voltage;
                
                  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
                  sleep_enable();
                
                  // Do not interrupt before we go to sleep, or the
                  // ISR will detach interrupts and we won't wake.
                  noInterrupts ();
                  
                  pciSetup(A0);
                  
                  // turn off brown-out enable in software
                  // BODS must be set to one and BODSE must be set to zero within four clock cycles
                  MCUCR = bit (BODS) | bit (BODSE);
                  // The BODS bit is automatically cleared after three clock cycles
                  MCUCR = bit (BODS); 
                  
                  // We are guaranteed that the sleep_cpu call will be done
                  // as the processor executes the next instruction after
                  // interrupts are turned on.
                  interrupts ();  // one cycle
                  sleep_cpu ();   // one cycle
                
                  delay(20);  //debounce the button
                  voltage=analogRead(A0);  //throw out this first result
                  voltage=analogRead(A0);
                  if (voltage>799) {
                    Serial.println(identifyKey(voltage));
                    Serial.flush();
                  }
                }
                
                1 Reply Last reply
                0
                • gohanG gohan

                  @carywin what is the sleep current of your node with this "interrupt hack"?

                  CarywinC Offline
                  CarywinC Offline
                  Carywin
                  wrote on last edited by
                  #44

                  @gohan Sorry I don't have a way to measure current that small, but given that it's already run for months on the original batteries, I'm going to assume it's a "normal" Atmega sleep state

                  1 Reply Last reply
                  0
                  • dbemowskD dbemowsk

                    @carywin Certain arduinos such as the pro minis can ONLY do interrupts on pins 2 or 3 from my understanding.

                    CarywinC Offline
                    CarywinC Offline
                    Carywin
                    wrote on last edited by
                    #45

                    @dbemowsk The Pro Mini does have pin change interrupts on every pin

                    dbemowskD 1 Reply Last reply
                    0
                    • NeverDieN NeverDie

                      @dbemowsk said in 6/8 Buttons battery remote node:

                      @carywin Certain arduinos such as the pro minis can ONLY do interrupts on pins 2 or 3 from my understanding.

                      IIRC, you can do interrupts from other pins too, but each is tied to a separate bank of pins, so you have to do additional testing to determine which specific pin triggered the interrupt. In the case of the voltage divider keypad, that should be no problem.

                      CarywinC Offline
                      CarywinC Offline
                      Carywin
                      wrote on last edited by
                      #46

                      @neverdie This is correct, but this testing is all handled by the EnableInterrupt library

                      1 Reply Last reply
                      0
                      • CarywinC Carywin

                        @dbemowsk The Pro Mini does have pin change interrupts on every pin

                        dbemowskD Offline
                        dbemowskD Offline
                        dbemowsk
                        wrote on last edited by
                        #47

                        @carywin I stand corrected.

                        Vera Plus running UI7 with MySensors, Sonoffs and 1-Wire devices
                        Visit my website for more Bits, Bytes and Ramblings from me: http://dan.bemowski.info/

                        1 Reply Last reply
                        0
                        • wesW Offline
                          wesW Offline
                          wes
                          wrote on last edited by wes
                          #48

                          @wes said in 6/8 Buttons battery remote node:

                          I'm planning to use some cheap RF remotes and connect a RF receiver to my RPI, which hosts both my gateway and controller.

                          I finally received the RF remotes and receiver/decoder from eBay and got them set up to talk directly to my controller - they work pretty well: https://youtu.be/9458-3IiG3Y

                          I did try a OneButton-type approach on a MySensors node, but had lots of malfunctions with long-presses (e.g. fade up 10% per second whilst the button is depressed), where the the "button pressed" message gets through, but the "button released" message is delayed or dropped.

                          Blog: https://www.wes.id.au/
                          Nodes: Arduino Pro Mini ATMega328P 3.3V 8MHz, RFM69 433MHz, Canton Power CE024 0.8-3.3V regulator & single AA battery
                          Gateway & Controller: Raspberry Pi 3 + Home Assistant

                          NeverDieN 1 Reply Last reply
                          0
                          • wesW wes

                            @wes said in 6/8 Buttons battery remote node:

                            I'm planning to use some cheap RF remotes and connect a RF receiver to my RPI, which hosts both my gateway and controller.

                            I finally received the RF remotes and receiver/decoder from eBay and got them set up to talk directly to my controller - they work pretty well: https://youtu.be/9458-3IiG3Y

                            I did try a OneButton-type approach on a MySensors node, but had lots of malfunctions with long-presses (e.g. fade up 10% per second whilst the button is depressed), where the the "button pressed" message gets through, but the "button released" message is delayed or dropped.

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

                            @wes Maybe your resistors don't have a high enough power rating for the current that's running through them? i.e. holding down the button heats them up and therefore changes their resistance? That might explain the slowness to react as expected after the button is released. After release, they cool off and eventually return within their expected resistance tolerance, at which point the expected behavior finally happens.

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

                              @NeverDie do you think a NRF5x would be better solution to make a small compact remote control?

                              NeverDieN 1 Reply Last reply
                              0
                              • gohanG gohan

                                @NeverDie do you think a NRF5x would be better solution to make a small compact remote control?

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

                                @gohan It's hard to answer a question like that in a vacuum, but in general, I do like nRF5x better than nRF24L01 beause of nRF5x's better link budget. I also like LoRa because of its great range and coverage. I have made remotes using each (and I have made posts about them), and they each have their place.

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

                                  did you post the nrf5x remote in the nrf5x topic or did you made a new one?

                                  NeverDieN 1 Reply Last reply
                                  0
                                  • gohanG gohan

                                    did you post the nrf5x remote in the nrf5x topic or did you made a new one?

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

                                    @gohan It was on the nRF5 action! thread and for LoRa it was on the CNC thread.

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


                                    15

                                    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