Navigation

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

    flix

    @flix

    0
    Reputation
    4
    Posts
    1
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online
    Location Melbourne, Australia

    flix Follow

    Best posts made by flix

    This user hasn't posted anything yet.

    Latest posts made by flix

    • RE: Sensebender micro failing with funny characters

      @alexsh1 Thanks for the comment, there is some good tips there! I'll try re-soldering some of the connections. Funnily enough, I had wanted to increase the transmission power on 2 of my nodes (the furthest away from the controller) including this one here, and had added that at the top of my sketch. After uploading the sketch, the serial monitor still displayed a lot of garbage, but the node started successfully transmitting temperature and humidity values!

      So I've put the batteries back in and hung it up in the room, and it has been running pretty good so far. But I have my doubts how long it will last, given I didn't actually fix the serial output issue...

      On another note, is there anyway to confirm that the transmission power has been increased? I added
      #define MY_RF24_PA_LEVEL RF24_PA_MAX
      at the top of my sketch, just after defining the radio type, but it doesn't seem to have improved my transmission success rate (I realise there are lot of other factors affecting transmission success, but just wanted to check)...

      posted in Troubleshooting
      flix
      flix
    • RE: Sensebender micro failing with funny characters

      The Sensebender is normally powered by 2 x AA NiMH, and at the time the node stopped transmitting data, the voltage was at 2.6V. Powering it again by batteries, there is no data coming from it.
      Obviously, to read the serial output, I've connected it to my computer and powered it via the USB port only (no hub in between). I use the same cable and FTDI module to successfully power and read my other Sensebender's, nonethelss I tried different cables and USB ports on my computer without any success.

      posted in Troubleshooting
      flix
      flix
    • Can't find parent after changing NRF24L01+ radio

      For several months now I have been successfully using my Sensebender micro boards with some NRF24L01+ radios bought on eBay from China. On some of my furthest nodes from the gateway, I do get some data loss, so after reading on the forum about the multitude of fake radios around, I thought I would try and buy some genuine ones to see if they perform better.
      I bought these recently from Itead, and have been testing them today, but cannot get communication going with my gateway. After enabling debug mode on the Sensebender micro, I believe the serial output indicates that it can't find the parent:

      22:10:32.837 -> 16 MCO:BGN:INIT NODE,CP=RNONA---,FQ=8,REL=255,VER=2.3.2
      22:10:32.870 -> 28 TSM:INIT
      22:10:32.870 -> 28 TSF:WUR:MS=0
      22:10:32.870 -> 36 TSM:INIT:TSP OK
      22:10:32.870 -> 38 TSM:INIT:STATID=9
      22:10:32.870 -> 40 TSF:SID:OK,ID=9
      22:10:32.870 -> 43 TSM:FPAR
      22:10:32.870 -> 47 ?TSF:MSG:SEND,9-9-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
      22:10:34.893 -> 2056 !TSM:FPAR:NO REPLY
      22:10:34.893 -> 2058 TSM:FPAR
      22:10:34.893 -> 2062 ?TSF:MSG:SEND,9-9-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
      22:10:36.930 -> 4071 !TSM:FPAR:NO REPLY
      22:10:36.947 -> 4073 TSM:FPAR
      22:10:36.947 -> 4077 ?TSF:MSG:SEND,9-9-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
      22:10:38.969 -> 6086 !TSM:FPAR:NO REPLY
      22:10:38.969 -> 6088 TSM:FPAR
      22:10:38.969 -> 6092 ?TSF:MSG:SEND,9-9-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
      22:10:40.991 -> 8101 !TSM:FPAR:FAIL
      22:10:41.024 -> 8103 TSM:FAIL:CNT=1
      

      If I put the old NRF24 module back into the Sensebender micro (after powering down and up again), it successfully connects and starts transmitting data. I've tried the following without success:

      • Move node closer to gateway
      • Added a 470uF electrolytic capacitor between GND and VCC of the new NRF24L01+ board (the 'old' radio board doesn't have one, and works ok)
      • Cleared the EEPROM of the Sensebender micro before uploading the same sketch that was successfully running on it previously
      • Testing it both from the laptop USB supply and 2 x AA batteries

      Is there anything specific that needs to be done when changing radio modules? Any tips on what else I can try?

      I did notice that the new radio modules I bought seem to have less SMD components on them, see here (left is the working eBay variant, while right is the non-working Itead variant):
      20210105_223303.jpg

      The gateway is an amplified NRF24L01+ module connected to a Raspberry Pi 3+. I did compile it about a year ago, so it is probably not the latest version (though if I'm honest I am not sure how I can check), but it does work with the old radio module.
      If required, this is the code running on the Sensebender Micro (with the only changes being the addition of a node number, and some updates to the sending of battery voltage, as I believe there was/is an error in the standard code for sending the raw values):

       * 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.
       *
       *******************************
       *
       * REVISION HISTORY
       * Version 1.0 - Thomas Bowman MC8rch
       * 
       * DESCRIPTION
       * Default sensor sketch for Sensebender Micro module
       * Act as a temperature / humidity sensor by default.
       *
       * If A0 is held low while powering on, it will enter testmode, which verifies all on-board peripherals
       *  
       * Battery voltage is as battery percentage (Internal message), and optionally as a sensor value (See defines below)
       *
       *
       * Version 1.3 - Thomas Bowman MC8rch
       * Improved transmission logic, eliminating spurious transmissions (when temperatuere / humidity fluctuates 1 up and down between measurements) 
       * Added OTA boot mode, need to hold A1 low while applying power. (uses slightly more power as it's waiting for bootloader messages)
       * 
       * Version 1.4 - Thomas Bowman MC8rch
       * 
       * Corrected division in the code deciding whether to transmit or not, that resulted in generating an integer. Now it's generating floats as expected.
       * Simplified detection for OTA bootloader, now detecting if MY_OTA_FIRMWARE_FEATURE is defined. If this is defined sensebender automaticly waits 300mS after each transmission
       * Moved Battery status messages, so they are transmitted together with normal sensor updates (but only every 60th minute)
       * 
       */
      
      // Enable debug prints to serial monitor
      #define MY_DEBUG 
      
      // Define a static node address, remove if you want auto address assignment
      #define MY_NODE_ID 9
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      
      // Enable to support OTA for this node (needs DualOptiBoot boot-loader to fully work)
      #define MY_OTA_FIRMWARE_FEATURE
      
      #include <SPI.h>
      #include <MySensors.h>
      #include <Wire.h>
      #include <SI7021.h>
      #ifndef MY_OTA_FIRMWARE_FEATURE
      #include "drivers/SPIFlash/SPIFlash.cpp"
      #endif
      #include <EEPROM.h>  
      #include <sha204_lib_return_codes.h>
      #include <sha204_library.h>
      #include <RunningAverage.h>
      //#include <avr/power.h>
      
      // Uncomment the line below, to transmit battery voltage as a normal sensor value
      #define BATT_SENSOR    199
      
      #define RELEASE "1.4"
      
      #define AVERAGES 2
      
      // Child sensor ID's
      #define CHILD_ID_TEMP  1
      #define CHILD_ID_HUM   2
      
      // How many milli seconds between each measurement
      #define MEASURE_INTERVAL 60000
      
      // How many milli seconds should we wait for OTA?
      #define OTA_WAIT_PERIOD 300
      
      // FORCE_TRANSMIT_INTERVAL, this number of times of wakeup, the sensor is forced to report all values to the controller
      #define FORCE_TRANSMIT_INTERVAL 30 
      
      // When MEASURE_INTERVAL is 60000 and FORCE_TRANSMIT_INTERVAL is 30, we force a transmission every 30 minutes.
      // Between the forced transmissions a tranmission will only occur if the measured value differs from the previous measurement
      
      // HUMI_TRANSMIT_THRESHOLD tells how much the humidity should have changed since last time it was transmitted. Likewise with
      // TEMP_TRANSMIT_THRESHOLD for temperature threshold.
      #define HUMI_TRANSMIT_THRESHOLD 0.5
      #define TEMP_TRANSMIT_THRESHOLD 0.5
      
      // Pin definitions
      #define TEST_PIN       A0
      #define LED_PIN        A2
      #define ATSHA204_PIN   17 // A3
      
      const int sha204Pin = ATSHA204_PIN;
      atsha204Class sha204(sha204Pin);
      
      SI7021 humiditySensor;
      SPIFlash flash(8, 0x1F65);
      
      // Sensor messages
      MyMessage msgHum(CHILD_ID_HUM, V_HUM);
      MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
      
      #ifdef BATT_SENSOR
      MyMessage msgBatt(BATT_SENSOR, V_VOLTAGE);
      #endif
      
      // Global settings
      int measureCount = 0;
      int sendBattery = 0;
      boolean isMetric = true;
      boolean highfreq = true;
      boolean transmission_occured = false;
      
      // Storage of old measurements
      float lastTemperature = -100;
      int lastHumidity = -100;
      long lastBattery = -100;
      
      RunningAverage raHum(AVERAGES);
      
      /****************************************************
       *
       * Setup code 
       *
       ****************************************************/
      void setup() {
      
        pinMode(LED_PIN, OUTPUT);
        digitalWrite(LED_PIN, LOW);
      
        Serial.begin(115200);
        Serial.print(F("Sensebender Micro FW "));
        Serial.print(RELEASE);
        Serial.flush();
      
        // First check if we should boot into test mode
      
        pinMode(TEST_PIN,INPUT);
        digitalWrite(TEST_PIN, HIGH); // Enable pullup
        if (!digitalRead(TEST_PIN)) testMode();
      
        // Make sure that ATSHA204 is not floating
        pinMode(ATSHA204_PIN, INPUT);
        digitalWrite(ATSHA204_PIN, HIGH);
      
        digitalWrite(TEST_PIN,LOW);
      
        digitalWrite(LED_PIN, HIGH); 
      
        humiditySensor.begin();
      
        digitalWrite(LED_PIN, LOW);
      
        Serial.flush();
        Serial.println(F(" - Online!"));
      
        isMetric = getControllerConfig().isMetric;
        Serial.print(F("isMetric: ")); Serial.println(isMetric);
        raHum.clear();
        sendTempHumidityMeasurements(false);
        sendBattLevel(false);
      
      #ifdef MY_OTA_FIRMWARE_FEATURE  
        Serial.println("OTA FW update enabled");
      #endif
      
      }
      
      void presentation()  {
        sendSketchInfo("Sensebender Micro", RELEASE);
      
        present(CHILD_ID_TEMP,S_TEMP);
        present(CHILD_ID_HUM,S_HUM);
      
      #ifdef BATT_SENSOR
        present(BATT_SENSOR, S_POWER);
      #endif
      }
      
      
      /***********************************************
       *
       *  Main loop function
       *
       ***********************************************/
      void loop() {
      
        measureCount ++;
        sendBattery ++;
        bool forceTransmit = false;
        transmission_occured = false;
      
        if (measureCount >= FORCE_TRANSMIT_INTERVAL) { // force a transmission
          forceTransmit = true; 
          measureCount = 0;
        }
      
        sendTempHumidityMeasurements(forceTransmit);
      /*  if (sendBattery > 60) 
        {
           sendBattLevel(forceTransmit); // Not needed to send battery info that often
           sendBattery = 0;
        }*/
      #ifdef MY_OTA_FIRMWARE_FEATURE
        if (transmission_occured) {
            wait(OTA_WAIT_PERIOD);
        }
      #endif
      
        sleep(MEASURE_INTERVAL);  
      }
      
      
      /*********************************************
       *
       * Sends temperature and humidity from Si7021 sensor
       *
       * Parameters
       * - force : Forces transmission of a value (even if it's the same as previous measurement)
       *
       *********************************************/
      void sendTempHumidityMeasurements(bool forceTransmit)
      {
        bool tx = forceTransmit;
      
        si7021_env data = humiditySensor.getHumidityAndTemperature();
      
        raHum.addValue(data.humidityPercent);
      
        float diffTemp = abs(lastTemperature - (isMetric ? data.celsiusHundredths : data.fahrenheitHundredths)/100.0);
        float diffHum = abs(lastHumidity - raHum.getAverage());
      
        Serial.print(F("TempDiff :"));Serial.println(diffTemp);
        Serial.print(F("HumDiff  :"));Serial.println(diffHum); 
      
        if (isnan(diffHum)) tx = true; 
        if (diffTemp >= TEMP_TRANSMIT_THRESHOLD) tx = true;
        if (diffHum >= HUMI_TRANSMIT_THRESHOLD) tx = true;
      
        if (tx) {
          measureCount = 0;
          float temperature = (isMetric ? data.celsiusHundredths : data.fahrenheitHundredths) / 100.0;
      
          int humidity = data.humidityPercent;
          Serial.print("T: ");Serial.println(temperature);
          Serial.print("H: ");Serial.println(humidity);
      
          send(msgTemp.set(temperature,1));
          send(msgHum.set(humidity));
          lastTemperature = temperature;
          lastHumidity = humidity;
          transmission_occured = true;
          if (sendBattery > 60) {
           sendBattLevel(true); // Not needed to send battery info that often
           sendBattery = 0;
          }
        }
      }
      
      /********************************************
       *
       * Sends battery information (battery percentage)
       *
       * Parameters
       * - force : Forces transmission of a value
       *
       *******************************************/
      void sendBattLevel(bool forceTransmit)
      {
        if (forceTransmit) lastBattery = -1;
        long vcc = readVcc();
        if (vcc != lastBattery) {
          lastBattery = vcc;
      
      #ifdef BATT_SENSOR
          float send_voltage = float(vcc)/1000.0f;
          send(msgBatt.set(send_voltage,3));
      #endif
      
          // Calculate percentage
      
          vcc = vcc - 1900; // subtract 1.9V from vcc, as this is the lowest voltage we will operate at
      
          long percent = vcc / 14.0;
          sendBatteryLevel(percent);
          transmission_occured = true;
        }
      }
      
      /*******************************************
       *
       * Internal battery ADC measuring 
       *
       *******************************************/
      long readVcc() {
        // Read 1.1V reference against AVcc
        // set the reference to Vcc and the measurement to the internal 1.1V reference
        #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
          ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
          ADMUX = _BV(MUX5) | _BV(MUX0);
        #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
          ADcdMUX = _BV(MUX3) | _BV(MUX2);
        #else
          ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        #endif  
      
        delay(2); // Wait for Vref to settle
        ADCSRA |= _BV(ADSC); // Start conversion
        while (bit_is_set(ADCSRA,ADSC)); // measuring
      
        uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
        uint8_t high = ADCH; // unlocks both
      
        long result = (high<<8) | low;
      
        result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
        return result; // Vcc in millivolts
      
      }
      
      /****************************************************
       *
       * Verify all peripherals, and signal via the LED if any problems.
       *
       ****************************************************/
      void testMode()
      {
        uint8_t rx_buffer[SHA204_RSP_SIZE_MAX];
        uint8_t ret_code;
        byte tests = 0;
      
        digitalWrite(LED_PIN, HIGH); // Turn on LED.
        Serial.println(F(" - TestMode"));
        Serial.println(F("Testing peripherals!"));
        Serial.flush();
        Serial.print(F("-> SI7021 : ")); 
        Serial.flush();
      
        if (humiditySensor.begin()) 
        {
          Serial.println(F("ok!"));
          tests ++;
        }
        else
        {
          Serial.println(F("failed!"));
        }
        Serial.flush();
      
        Serial.print(F("-> Flash : "));
        Serial.flush();
        if (flash.initialize())
        {
          Serial.println(F("ok!"));
          tests ++;
        }
        else
        {
          Serial.println(F("failed!"));
        }
        Serial.flush();
      
      
        Serial.print(F("-> SHA204 : "));
        ret_code = sha204.sha204c_wakeup(rx_buffer);
        Serial.flush();
        if (ret_code != SHA204_SUCCESS)
        {
          Serial.print(F("Failed to wake device. Response: ")); Serial.println(ret_code, HEX);
        }
        Serial.flush();
        if (ret_code == SHA204_SUCCESS)
        {
          ret_code = sha204.getSerialNumber(rx_buffer);
          if (ret_code != SHA204_SUCCESS)
          {
            Serial.print(F("Failed to obtain device serial number. Response: ")); Serial.println(ret_code, HEX);
          }
          else
          {
            Serial.print(F("Ok (serial : "));
            for (int i=0; i<9; i++)
            {
              if (rx_buffer[i] < 0x10)
              {
                Serial.print('0'); // Because Serial.print does not 0-pad HEX
              }
              Serial.print(rx_buffer[i], HEX);
            }
            Serial.println(")");
            tests ++;
          }
      
        }
        Serial.flush();
      
        Serial.println(F("Test finished"));
      
        if (tests == 3) 
        {
          Serial.println(F("Selftest ok!"));
          while (1) // Blink OK pattern!
          {
            digitalWrite(LED_PIN, HIGH);
            delay(200);
            digitalWrite(LED_PIN, LOW);
            delay(200);
          }
        }
        else 
        {
          Serial.println(F("----> Selftest failed!"));
          while (1) // Blink FAILED pattern! Rappidly blinking..
          {
          }
        }  
      }
      
      posted in Troubleshooting
      flix
      flix
    • Sensebender micro failing with funny characters

      Hi All,
      I have an issue with a sensebender micro temperature and humidity sensor that I am looking for tips on how to troubleshoot.
      For about 7 months the sensor has been working fine (with the odd transmission failure, as it is some way from the gateway), but it recently started transmitting data intermittently, and today completely stopped. I hooked it up to a serial monitor (Arduino IDE version 1.8.12 running on Kubuntu 20.10) and realised that there are multiple unknown characters (reverse question marks, see attachment) being sent. I've read that this could be due to an incorrect baud rate, however it is set to 115200 baud and works fine with other (identical apart from the node number) sensebender micros I have running.

      I have done the following to try and troubleshoot it:

      • Replaced the NRF24 radio with a brand new one (from Itead.cc, where I bought the Sensebender micros), but no change in the serial output or transmission

      • Replaced the NRF24 radio with one from one of my other working sensebender micros, but no change in the serial output or transmission

      • Re-uploaded the Sensebender Micro sketch (this has fixed the same issue once on another sensorbender micro), but no change in the serial output or transmission

      • Cleared the EEPROM using the MySensors 'ClearEepromConfig.ino', and then re-uploading the Sensebender Micro sketch, but no change in the serial output or transmission

      While I won't rule it out, I don't think it is a power supply or radio issue, given it was working fine previously / I've tested other radios. While the serial monitor indicates there are transmission issues, I can confirm that the gateway is also working correctly, as my 4 other sensebender micros are successfully transmitting to it.

      Would it be worth re-flashing the bootloader onto it? Any other ideas I could try out? This is the 3rd sensebender micro I have displaying this issue, has anyone else come across it?
      Thanks in advance for the tips!
      Screenshot_20210104_213937.png

      posted in Troubleshooting
      flix
      flix