Navigation

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

    barrydou

    @barrydou

    5
    Reputation
    22
    Posts
    343
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online

    barrydou Follow

    Best posts made by barrydou

    • RE: 💬 Easy/Newbie PCB for MySensors

      @mfalkvidd : I think you have to change the condition in if too :

      if (batLoop > 1) {
      

      With that, batLoop = 2 when entering in the if (so the 3 values of the array are filled : 0, 1, 2), calculating the average and reseting the batLoop to 0.
      If not modify, the array will be set with batArray[3] just before entering the

      if (batLoop > 2) {
      

      Other way is to set the batArray size to 4 values, and divide by 4 (I'm actually trying that).

      posted in OpenHardware.io
      barrydou
      barrydou
    • RE: 💬 Building a Raspberry Pi Gateway

      @mfalkvidd Thank you.
      I've found that too https://www.mysensors.org/apidocs/RFM69_8h_source.html
      It's clearly indicated that DIO0 is IRQ.

      So I think with "--my-rfm69-irq-pin=" it will do the job.

      I'll test it as soon as i'll receive RFM69.

      Thank you again

      posted in Announcements
      barrydou
      barrydou
    • RE: ISR Pulse Meter Question

      No no, my intention is just to send the pulse count, every 10 or 15 minutes, with battery powered sensor (and resend the last value even if it not change, due to domoticz not reporting heartbeat, but that is another story 🙂 )

      Hourly and daily value are ok for me.

      I was using this sketch as an example just to see how it work and if it could directly do the job.
      I enabled sleep_mode.
      I was doing that with a testing arduino, directly connected to radio with jumper, and using jumper to simulate reed.
      Each time I was doing a pulse that way, the node send the information directly. I was not understanding why. So I run a minimal sketch to try to understand, and I found this thread ...

      Finally with all those informations, i think i'll do something like that:

      • The loop sleeps for 1 minute, or for the reed interrupt.
      • When the loop restart, it checked if the reed interrupt occured with the return value of sleep
        -- if yes, it increments pulse count, waits a few ms for debounce, and continues
        -- if no it continues
      • every 10 loops, a msg is send with the pulse count
      • every 60 loops, the battery level is checked
      • and then it sleeps again for 1 minute or if the reed interrupt occurs

      Thank you again for this great help

      posted in General Discussion
      barrydou
      barrydou
    • RE: ISR Pulse Meter Question

      Hello

      Here is my last code for my gas meter. If it could help somebody

      /*
       * 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-2018 Sensnology AB
       * Full contributor list: https://github.com/mysensors/MySensors/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.
       *
       *******************************
       *
       * REVISION HISTORY
       * Version 1.0 - Henrik Ekblad
       * Version 1.1 - GizMoCuz
       *
       * DESCRIPTION
       * Use this sensor to measure volume and flow of your house water meter.
       * You need to set the correct pulsefactor of your meter (pulses per m3).
       * The sensor starts by fetching current volume reading from gateway (VAR 1).
       * Reports both volume and flow back to gateway.
       *
       * Unfortunately millis() won't increment when the Arduino is in
       * sleepmode. So we cannot make this sensor sleep if we also want
       * to calculate/report flow.
       * http://www.mysensors.org/build/pulse_water
       */
      
      // Enable debug prints to serial monitor
      #define MY_DEBUG
      
      // Enable and select radio type attached
      #define MY_RADIO_RF24
      
      #include <MySensors.h>
      
      #define DIGITAL_INPUT_SENSOR 3                  // The digital input you attached your sensor.  (Only 2 and 3 generates interrupt!)
      #define CHILD_ID 1                              // Id of the sensor child
      
      unsigned long loopNumber = 0;
      unsigned long lastLoopSend = 0;
      
      MyMessage volumeMsg(CHILD_ID, V_VOLUME);
      MyMessage lastCounterMsg(CHILD_ID, V_VAR1);
      
      volatile uint32_t pulseCount = 0;
      bool pcReceived = false;
      double volume = 0;
      
      //=========================
      // BATTERY MEASURER
      // VOLTAGE DIVIDER SETUP
      // 1M, 470K divider across battery and using internal ADC ref of 1.1V
      // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
      // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
      // 3.44/1023 = Volts per bit = 0.003363075
      #define VBAT_PER_BITS 0.003363075
      #define VMIN 2.2                                  //  Vmin (radio Min Volt)=1.9V (564v)
      #define VMAX 3.2                                  //  Vmax = (2xAA bat)=3.0V (892v)
      int batteryPcnt = 0;                              // Calc value for battery %
      int batLoop = 0;                                  // Loop to help calc average
      int batArray[4];                                  // Array to store value for average calc.
      int BATTERY_SENSE_PIN = A0;                       // select the input pin for the battery sense point
      //=========================
      
      
      void setup() {
        // initialize our digital pins internal pullup resistor so one pulse switches from high to low (less distortion)
        pinMode(DIGITAL_INPUT_SENSOR, INPUT_PULLUP);
      
        pulseCount = 0;
      
        // Fetch last known pulse count value from gw
        request(CHILD_ID, V_VAR1);
      
        //Battery
        analogReference(INTERNAL);
        Serial.print("With Battery VMax (100%) = "); Serial.print(VMAX); Serial.print("volts and Vmin (0%) = "); Serial.print(VMIN); Serial.println(" volts");
        Serial.print("Battery Percent 25%/50%/75% calculates to: "); Serial.print(((VMAX - VMIN) / 4) + VMIN); Serial.print("/"); Serial.print(((VMAX - VMIN) / 2) + VMIN); Serial.print("/"); Serial.println(VMAX - ((VMAX - VMIN) / 4));
        delay(1000);
        int sensorValue = analogRead(BATTERY_SENSE_PIN);
        delay(50);
        float Vbat  = sensorValue * VBAT_PER_BITS;
        int batteryPcnt = static_cast<int>(((Vbat - VMIN) / (VMAX - VMIN)) * 100.);
        Serial.print("Current battery are measured to (please confirm!): "); Serial.print(batteryPcnt); Serial.print(" % - Or "); Serial.print(Vbat); Serial.println(" Volts");
      
      
      }
      
      void presentation()
      {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Gas Meter", "2.0");
      
        // Register this device as Water flow sensor
        present(CHILD_ID, S_GAS);
      }
      
      //=========================
      // BATTERY MEASURER
      void MeasureBattery() //The battery calculations
      {
        delay(500);
        // Battery monitoring reading
        int sensorValue = analogRead(BATTERY_SENSE_PIN);
        delay(500);
      
        // Calculate the battery in %
        float Vbat  = sensorValue * VBAT_PER_BITS;
        int batteryPcnt = static_cast<int>(((Vbat - VMIN) / (VMAX - VMIN)) * 100.);
        Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.print(" %"); Serial.print("Battery Voltage: "); Serial.print(Vbat); Serial.println(" Volts");
      
        // Add it to array so we get an average of 3 (3x20min)
        batArray[batLoop] = batteryPcnt;
      
        if (batLoop > 2) {
          batteryPcnt = (batArray[0] + batArray[1] + batArray[2] + batArray[3]);
          batteryPcnt = batteryPcnt / 4;
      
          if (batteryPcnt > 100) {
            batteryPcnt = 100;
          }
          Serial.print("Battery Average (Send): "); Serial.print(batteryPcnt); Serial.println(" %");
          sendBatteryLevel(batteryPcnt);
          batLoop = 0;
        }
        else
        {
          batLoop++;
        }
      }
      
      void loop() {
        if (!pcReceived) {
          //Last Pulsecount not yet received from controller, request it again
          request(CHILD_ID, V_VAR1);
          wait(1000);
          return;
        }
        Serial.print("loopNumer=");
        Serial.println(loopNumber);
      
        if (loopNumber % 60 == 0) {
          Serial.println("Measuring Battery");
          //=========================
          // BATTERY MEASURER
          MeasureBattery();
          //=========================
        }
        if (loopNumber % 10 == 0) {
          Serial.println("Sending pulse Count");
          volume = ((double)pulseCount / ((double)1000));
          send(volumeMsg.set(volume,4));
          send(lastCounterMsg.set(pulseCount));
        }
        Serial.println("I'm sleeping");
        int8_t cause = sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), FALLING, 60000);
        Serial.print("WakeUp , cause:");
        Serial.print(cause);
        Serial.print("(pin interrupt :");
        Serial.print(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR));
        Serial.println(";-1=timer)");
      
        if (cause == digitalPinToInterrupt(DIGITAL_INPUT_SENSOR)) {
          pulseCount++;
          wait(100);
        }
        Serial.print("Pulsecount=");
        Serial.println(pulseCount);
      
        loopNumber++;
      
      }
      
      void receive(const MyMessage &message)
      {
          if (message.type==V_VAR1) {
              uint32_t gwPulseCount=message.getULong();
              pulseCount += gwPulseCount;
              Serial.print("Received last pulse count from gw:");
              Serial.println(pulseCount);
              pcReceived = true;
          }
      }```
      posted in General Discussion
      barrydou
      barrydou

    Latest posts made by barrydou

    • RE: RFM69 Sleep Mode - high current when sleeping

      @evb it's for doing a gasmeter, counting with a reed sensor.
      But for my tests, the read sensor is not connected. So nothing wakeup the interrupt.
      I just send every 10 minutes the counter, as a keepalive. (Domoticz don't put the sensors as "red" )

      First, I was doing test with newbie pcb, and I had strange values.
      So I remove everything, and I do test with breadboard and dupont cable.

      I just have the arduino pro mini, and the rfm69 solder on a nrf2rfm69 board and a 0.1uF capacitor.
      I have 2AA alkaline battery, connected to the VCC/GND pin of arduino and to 3.3V/GND of NRF2RFM adapter.
      I measure the current on the cable between battery + and 3,3V of NRF2RFM69 (like in your photo)

      I have no scope, so I can't check NSS/MOSI/... and so on. But the transmissions are OK, and everything is working well, except current when sleeping.

      I had no time today to do more test today. I will double check everything as soon as possible, try your sketch

      posted in Hardware
      barrydou
      barrydou
    • RE: RFM69 Sleep Mode - high current when sleeping

      Hello

      Thank you for your time. Here is my complete sketch.

      If arduino goes to sleep and wakeup and so on, I think that I'll see lot of messages sended.
      I suspect my RFM69 to have some quality problems. But i'm not sure. I'll try to change it. as soon as i will receive new one from china.

      // Enable debug prints to serial monitor
      #define MY_DEBUG
      
      // Enable and select radio type attached
      #define   MY_RADIO_RFM69
      #define MY_RFM69_NEW_DRIVER
      
      #include <MySensors.h>
      
      #define DIGITAL_INPUT_SENSOR 3                  // The digital input you attached your sensor.  (Only 2 and 3 generates interrupt!)
      #define CHILD_ID 1                              // Id of the sensor child
      
      MyMessage volumeMsg(CHILD_ID, V_VOLUME);
      MyMessage lastCounterMsg(CHILD_ID, V_VAR1);
      
      volatile uint32_t pulseCount = 0;
      bool pcReceived = false;
      unsigned long loopNumber = 0;
      
      //=========================
      // BATTERY MEASURER
      // VOLTAGE DIVIDER SETUP
      // 1M, 470K divider across battery and using internal ADC ref of 1.1V
      // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
      // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
      // 3.44/1023 = Volts per bit = 0.003363075
      #define VBAT_PER_BITS 0.003363075
      #define VMIN 2.0                                  //  Vmin (radio Min Volt)=1.9V (564v)
      #define VMAX 3.2                                  //  Vmax = (2xAA bat)=3.0V (892v)
      int batLoop = 0;                                  // Loop to help calc average
      int batArray[4];                                  // Array to store value for average calc.
      int BATTERY_SENSE_PIN = A0;                       // select the input pin for the battery sense point
      //=========================
      
      
      void setup() {
        // initialize our digital pins internal pullup resistor so one pulse switches from high to low (less distortion)
        pinMode(DIGITAL_INPUT_SENSOR, INPUT_PULLUP);
      
        pulseCount = 0;
        // Fetch last known pulse count value from gw
        request(CHILD_ID, V_VAR1);
      
        //Battery
        analogReference(INTERNAL);
      
        //On attend le resultat avant de passer dans la boucle
        wait(1000);
      
      }
      
      void presentation()
      {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Gas Meter", "2.0");
      
        // Register this device as Water flow sensor
        present(CHILD_ID, S_GAS);
      }
      
      //=========================
      // BATTERY MEASURER
      void MeasureBattery() //The battery calculations
      {
        delay(500);
        // Battery monitoring reading
        int sensorValue = analogRead(BATTERY_SENSE_PIN);
        delay(500);
      
        // Calculate the battery in %
        float Vbat  = sensorValue * VBAT_PER_BITS;
        int batteryPcnt = static_cast<int>(((Vbat - VMIN) / (VMAX - VMIN)) * 100.);
      #ifdef MY_DEBUG
        Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.print(" %"); Serial.print("Battery Voltage: "); Serial.print(Vbat); Serial.println(" Volts");
      #endif
      
        if (batteryPcnt > 100) {
          batteryPcnt = 100;
        }
        if (batteryPcnt < 0) {
          batteryPcnt = 0;
        }
      
        // Add it to array so we get an average of 3 (3x20min)
        batArray[batLoop] = batteryPcnt;
      
        if (batLoop > 2) {
          batteryPcnt = (batArray[0] + batArray[1] + batArray[2] + batArray[3]);
          batteryPcnt = batteryPcnt / 4;
      #ifdef MY_DEBUG
          Serial.print("Battery Average (Send): "); Serial.print(batteryPcnt); Serial.println(" %");
      #endif
          sendBatteryLevel(batteryPcnt);
          batLoop = 0;
        }
        else
        {
          batLoop++;
        }
      }
      
      void loop() {
        if (!pcReceived) {
          //Last Pulsecount not yet received from controller, request it again
          request(CHILD_ID, V_VAR1);
          wait(1000);
          return;
        }
      
        if (loopNumber % 12 == 0) {
          Serial.println("Measuring Battery");
          //=========================
          // BATTERY MEASURER
          MeasureBattery();
          //=========================
        }
      
      #ifdef MY_DEBUG
        Serial.println("I'm sleeping");
      #endif
        int8_t cause = sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), FALLING, 600000);
      #ifdef MY_DEBUG
        Serial.print("WakeUp , cause:");
        Serial.print(cause);
        Serial.print("(pin interrupt :");
        Serial.print(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR));
        Serial.println(";-1=timer)");
      #endif
      
        if (cause == digitalPinToInterrupt(DIGITAL_INPUT_SENSOR)) {
          pulseCount++;
          // softwaredebounce, on ignore toute entree pendant 100ms
          wait(100);
        }
      
      
      #ifdef MY_DEBUG
        Serial.print("Pulsecount=");
        Serial.println(pulseCount);
        Serial.println("Sending pulse Count");
      #endif
        double volume = 0;
        volume = ((double)pulseCount / ((double)1000));
        send(volumeMsg.set(volume, 4));
        send(lastCounterMsg.set(pulseCount));
      
        loopNumber++;
      
      }
      
      void receive(const MyMessage &message)
      {
        if (message.type == V_VAR1) {
          uint32_t gwPulseCount = message.getULong();
          if (!pcReceived) {
            pulseCount = gwPulseCount;
      #ifdef MY_DEBUG
            Serial.print("Received last pulse count from gw:");
            Serial.println(pulseCount);
      #endif
            pcReceived = true;
          }
        }
      }
      
      posted in Hardware
      barrydou
      barrydou
    • RFM69 Sleep Mode - high current when sleeping

      Re: RFM69 sleep mode

      Hello

      I'm back with my high current in sleep mode. After changing my multimeter, challenging my arduino configuration, doing lot of test loosing my hairs, i finally found that it is my rfm69w that consume 2mA in sleep mode.

      I use

      #define   MY_RADIO_RFM69
      #define MY_RFM69_NEW_DRIVER
      

      to configure RFM69

      I sleep wit the sleep functon

      int8_t cause = sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), FALLING, 600000);
      

      I measure the current directly in the 3.3V of the rfm69. In the meantime, the arduino mini is less than 50uA.

      What could I do debug such a situation ?

      Thank you for your help

      posted in Hardware
      barrydou
      barrydou
    • RE: [Solved] Easy PCB - current when sleeping

      Thank you for your answer

      I'm trying to compare with only pro mini and rfm69 on a test plate, and 2 AA batteries. I have strange result, and i'm doubting about my multimeter.
      I'll continue testing and will tell you

      posted in Hardware
      barrydou
      barrydou
    • [Solved] Easy PCB - current when sleeping

      Re: 💬 Easy/Newbie PCB for MySensors

      Hello

      I'm building a gas meter sensor with easy pcb, with 3.3v / 8mhz arduino pro mini, a rfm69w (with an nrf2rfm adapter).
      I remove led and voltage regulator on the arduino board.
      The easy pcb is configured with battery booster and voltage divider (1mohm and 470kohm).
      I use internal pullup to get read sensor of the gas meter (pin 3 used with interrupt)

      Everything is working fine, but when sleeping, my multimeter said 400uA.

      In the main time, I have this board from aliexpress, and with the same sketch use 40uA (ten times less), with a voltage regulator included and 16mhz clock
      https://fr.aliexpress.com/item/33006101437.html?spm=a2g0o.productlist.0.0.1424881cHzQI0F&algo_pvid=16f38802-af52-43e2-a2d1-7e3c2a84733f&algo_expid=16f38802-af52-43e2-a2d1-7e3c2a84733f-0&btsid=2100bb5116098762728804034e5d33&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

      Is it normal ? Is it Arduino pro mini that consume much more than the development board? is there a special way to investigate it ?

      Thank you for your ideas and advice.

      Suitable for Arduino 3.3V RFM95 RFM69CW RFM12 RFM69HCW RFM92 RFM98 RFM96 Wireless LoRa module development board

      $2.63
      posted in Hardware
      barrydou
      barrydou
    • RE: Kicad library for dc-dc step up booster

      @sundberg84 thank you again. I'll do like you say 🙂

      posted in KiCad
      barrydou
      barrydou
    • RE: Kicad library for dc-dc step up booster

      @bjacobse I've seen them, but as @sundberg84 asked me, it's already finished booster, the one linked in mysensors store.
      I'm looking something like the one used on Easy/Newbie PCB.

      Can I use something like "Conn_01x03_MountingPin" ?

      I'm starting kicad, I already have used easy/newbie pcb for my first sensors, but I need to design a board for an existing raingauge not working anymore (used by an old meteo station). I want to keep the mechanical part, and replace the electronical board.

      Thank's for your help

      posted in KiCad
      barrydou
      barrydou
    • Kicad library for dc-dc step up booster

      Hello

      Does somebody have library for dc-dc step up booster please ?

      posted in KiCad
      barrydou
      barrydou
    • RE: 💬 Building a Raspberry Pi Gateway

      @mfalkvidd Thank you.
      I've found that too https://www.mysensors.org/apidocs/RFM69_8h_source.html
      It's clearly indicated that DIO0 is IRQ.

      So I think with "--my-rfm69-irq-pin=" it will do the job.

      I'll test it as soon as i'll receive RFM69.

      Thank you again

      posted in Announcements
      barrydou
      barrydou