Sensebender programmer is not responding



  • Hi,

    I have an intermittent problem where I can not always upload my sketch to my Sensebender.

    The Sensebender is running a modified version of the Sensebender sketch and shows the expected debug on the serial monitor, indicating that it has completed the setup, and then moved into the main loop and reading the sensors with reasonable values. I just don't seem to be able to upload a new version of the sketch reliably.

    What has worked previously has been to upload the ClearEPROM sketch, and when that is sucessful, upload my modified Sensebender sketch. This is not working now.

    In my ignorance, it feels like there is some timing factor going that would allow me to upload the ClearEPROM sketch.

    Since I can see the serial debug, I assume the problem isn't with my FTDI USB adaptor.

    I've checked the soldering on the header for the FTDI and that seems good, and I assume it must be because I can see the the sketch debug in the serial monitor?

    I am using the Arduino 1.6.9 IDE on Arch Linux with the Mysensors 2.0.0 library. I've not modified the bootloader.

    I'm using the FTDI adaptor linked from the MySensors store.

    What follows is the the verbose messages from the IDE when uploading failed:

    Sketch uses 21,244 bytes (69%) of program storage space. Maximum is 30,720 bytes.
    Global variables use 861 bytes (42%) of dynamic memory, leaving 1,187 bytes for local variables. Maximum is 2,048 bytes.
    /home/singlis/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino2/bin/avrdude -C/home/singlis/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino2/etc/avrdude.conf -v -patmega328p -cstk500v1 -P/dev/ttyUSB0 -b19200 -Uflash:w:/tmp/build16801fad7f0386b38002733e635aa592.tmp/SenseBender.ino.hex:i 
    
    avrdude: Version 6.3, compiled on Jun 14 2016 at 17:17:01
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
             Copyright (c) 2007-2014 Joerg Wunsch
    
             System wide configuration file is "/home/singlis/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino2/etc/avrdude.conf"
             User configuration file is "/home/singlis/.avrduderc"
             User configuration file does not exist or is not a regular file, skipping
    
             Using Port                    : /dev/ttyUSB0
             Using Programmer              : stk500v1
             Overriding Baud Rate          : 19200
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xe8
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xda
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x1a
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xc8
    
    avrdude done.  Thank you.
    
    Problem uploading to board.  See http://www.arduino.cc/en/Guide/Troubleshooting#upload for suggestions.
    

    I've also run the programmer from the command line with increased debug verbosity:

    [singlis@localhost SenseBender]$ /home/singlis/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino2/bin/avrdude -v -v -v -v -C/home/singlis/.ardu
    ino15/packages/arduino/tools/avrdude/6.3.0-arduino2/etc/avrdude.conf -v -patmega328p -cstk500v1 -P/dev/ttyUSB0 -b19200 -Uflash:w:/tmp/buildd81c5a6658
    2a8d9d1e847e29ff4d6e6b.tmp/ClearEepromConfig.ino.hex:i 
    
    avrdude: Version 6.3, compiled on Jun 14 2016 at 17:17:01
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
             Copyright (c) 2007-2014 Joerg Wunsch
    
             System wide configuration file is "/home/singlis/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino2/etc/avrdude.conf"
             User configuration file is "/home/singlis/.avrduderc"
             User configuration file does not exist or is not a regular file, skipping
    
             Using Port                    : /dev/ttyUSB0
             Using Programmer              : stk500v1
             Overriding Baud Rate          : 19200
    avrdude: Send: 0 [30]   [20] 
    avrdude: Send: 0 [30]   [20] 
    avrdude: Send: 0 [30]   [20] 
    avrdude: ser_recv(): programmer is not responding
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
    avrdude: Send: 0 [30]   [20] 
    avrdude: ser_recv(): programmer is not responding
    avrdude: stk500_recv(): programmer is not responding
    avrdude: Send: 0 [30]   [20] 
    avrdude: Recv: . [e8] 
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xe8
    avrdude: Send: 0 [30]   [20] 
    avrdude: Recv: . [9a] 
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x9a
    avrdude: Send: 0 [30]   [20] 
    avrdude: Recv: . [1a] 
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x1a
    avrdude: Send: 0 [30]   [20] 
    avrdude: Recv: . [c8] 
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xc8
    avrdude: Send: 0 [30]   [20] 
    avrdude: Recv: . [f2] 
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xf2
    avrdude: Send: 0 [30]   [20] 
    avrdude: Recv: . [c0] 
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xc0
    avrdude: Send: 0 [30]   [20] 
    avrdude: Recv: . [aa] 
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xaa
    avrdude: Send: 0 [30]   [20] 
    avrdude: Recv: . [f2] 
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xf2
    
    avrdude done.  Thank you.
    

    Here's the log from the IDE when an upload succeeeds:

    Sketch uses 21,244 bytes (69%) of program storage space. Maximum is 30,720 bytes.
    Global variables use 861 bytes (42%) of dynamic memory, leaving 1,187 bytes for local variables. Maximum is 2,048 bytes.
    /home/singlis/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino2/bin/avrdude -C/home/singlis/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino2/etc/avrdude.conf -v -patmega328p -carduino -P/dev/ttyUSB0 -b57600 -D -Uflash:w:/tmp/build16801fad7f0386b38002733e635aa592.tmp/SenseBender.ino.hex:i 
    
    avrdude: Version 6.3, compiled on Jun 14 2016 at 17:17:01
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
             Copyright (c) 2007-2014 Joerg Wunsch
    
             System wide configuration file is "/home/singlis/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino2/etc/avrdude.conf"
             User configuration file is "/home/singlis/.avrduderc"
             User configuration file does not exist or is not a regular file, skipping
    
             Using Port                    : /dev/ttyUSB0
             Using Programmer              : arduino
             Overriding Baud Rate          : 57600
             AVR Part                      : ATmega328P
             Chip Erase delay              : 9000 us
             PAGEL                         : PD7
             BS2                           : PC2
             RESET disposition             : dedicated
             RETRY pulse                   : SCK
             serial program mode           : yes
             parallel program mode         : yes
             Timeout                       : 200
             StabDelay                     : 100
             CmdexeDelay                   : 25
             SyncLoops                     : 32
             ByteDelay                     : 0
             PollIndex                     : 3
             PollValue                     : 0x53
             Memory Detail                 :
    
                                      Block Poll               Page                       Polled
               Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
               ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
               eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
               flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
               lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
               hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
               efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
               lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
               calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
               signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
    
             Programmer Type : Arduino
             Description     : Arduino
             Hardware Version: 3
             Firmware Version: 5.0
             Vtarget         : 0.3 V
             Varef           : 0.3 V
             Oscillator      : 28.800 kHz
             SCK period      : 3.3 us
    
    avrdude: AVR device initialized and ready to accept instructions
    
    Reading | ################################################## | 100% 0.00s
    
    avrdude: Device signature = 0x1e950f (probably m328p)
    avrdude: reading input file "/tmp/build16801fad7f0386b38002733e635aa592.tmp/SenseBender.ino.hex"
    avrdude: writing flash (21244 bytes):
    
    Writing | ################################################## | 100% 4.98s
    
    avrdude: 21244 bytes of flash written
    avrdude: verifying flash memory against /tmp/build16801fad7f0386b38002733e635aa592.tmp/SenseBender.ino.hex:
    avrdude: load data flash data from input file /tmp/build16801fad7f0386b38002733e635aa592.tmp/SenseBender.ino.hex:
    avrdude: input file /tmp/build16801fad7f0386b38002733e635aa592.tmp/SenseBender.ino.hex contains 21244 bytes
    avrdude: reading on-chip flash data:
    
    Reading | ################################################## | 100% 4.17s
    
    avrdude: verifying ...
    avrdude: 21244 bytes of flash verified
    
    avrdude done.  Thank you.
    

    I've checked that the IDE board is 'Sensebender Micro' and the programmer is 'Arduino as ISP'

    I have tried powering just using the FTDI adaptor and by a 3.3v battery source.

    I have a 47uf cap on the radio. There seems to be conflicting information on the forums on if this should be 4.7uf or 47uf. I've used 47uf on the basis of what is written on the Connecting the Radio instructions.

    I've tried unplugging and re-plugging in the USB adaptor multiple times, and in the process flip flopping from /dev/ttyUSB0 to /dev/ttyUSB1.

    I've used minicom successfully in addition to the IDE as a serial monitor.

    Here's my modified Sensebender sketch for what it's worth!

    /**
     * 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 Mørch
     * 
     * 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 Mørch
     * 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 Mørch
     * 
     * 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
    //#deine MY_NODE_ID 3
    
    // 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>
    #include <BH1750.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
    #define CHILD_ID_MOT   3
    #define CHILD_ID_LIGHT 4
    
    // 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
    #define LUX_TRANSMIT_THRESHOLD 10
    
    // Pin definitions
    #define TEST_PIN       A0
    #define LED_PIN        A2
    #define ATSHA204_PIN   17 // A3
    #define MOT_PIN        3  // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
    #define LIGHT_PIN      4  // LED lights
    
    const int sha204Pin = ATSHA204_PIN;
    atsha204Class sha204(sha204Pin);
    
    SI7021 humiditySensor;
    SPIFlash flash(8, 0x1F65);
    
    BH1750 lightSensor;
    
    // Sensor messages
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msgMot(CHILD_ID_MOT, V_TRIPPED);
    MyMessage msgLight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
    
    
    #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;
    boolean lastMot = false;
    uint16_t lastLux = -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();
    
      lightSensor.begin();
    
      digitalWrite(LED_PIN, LOW);
    
      Serial.flush();
      Serial.println(F(" - Online!"));
      
      isMetric = getConfig().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);
      present(CHILD_ID_MOT, S_MOTION);
      present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
    
        
    #ifdef BATT_SENSOR
      present(BATT_SENSOR, S_POWER);
    #endif
    }
    
    
    /***********************************************
     *
     *  Main loop function
     *
     ***********************************************/
    void loop() {
      
      measureCount ++;
      sendBattery ++;
      bool forceTransmit = false;
      transmission_occured = false;
    #ifndef MY_OTA_FIRMWARE_FEATURE
      if ((measureCount == 5) && highfreq) 
      {
        clock_prescale_set(clock_div_8); // Switch to 1Mhz for the reminder of the sketch, save power.
        highfreq = false;
      } 
    #endif
      
      if (measureCount > FORCE_TRANSMIT_INTERVAL) { // force a transmission
        forceTransmit = true; 
        measureCount = 0;
      }
        
      sendTempHumidityMeasurements(forceTransmit);
      sendMotionMeasurements(forceTransmit);
      sendLightLevel(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 until interrupt comes in on motion sensor. 
      sleep(digitalPinToInterrupt(MOT_PIN), CHANGE, 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 force)
    {
      bool tx = force;
    
      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 force)
    {
      if (force) 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;
      }
    }
    
    void sendMotionMeasurements(bool force)
    {
      bool tx = force;
    
      // Read digital motion value
      bool tripped = digitalRead(MOT_PIN) == HIGH;
    
      Serial.print("Motion: ");
      Serial.println(tripped);
    
      if (tripped != lastMot) tx = true;
    
      if (tx) {
          send(msgMot.set(tripped?"1":"0"));  // Send tripped value to gw
          lastMot = tripped;
          transmission_occured = true;
      }
    }
    
    void sendLightLevel(bool force)
    {
      bool tx = force;
    
      // Read light level
      uint16_t lux = lightSensor.readLightLevel();
      uint16_t diffLux = abs(lastLux - lux);
    
      if (diffLux > LUX_TRANSMIT_THRESHOLD) tx = true;
      Serial.print(F("TempLux :"));
      Serial.println(diffLux);
    
      if (tx) {
          Serial.print("Lux: ");
          Serial.println(lux);
          send(msgMot.set(lux));  // Send tripped value to gw
          lastLux = lux;
          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..
        {
        }
      }  
    }
    

    Thanks,
    Simon.



  • I have the same problem. Any suggestions yet ?



  • @simbo said:

    I was never able to sort out the programming issue using the stock Linux Arduino IDE package.

    I spent some time installing the PlatformIO package on Arch Linux which allowed me to reliably upload to the sense bender. It was a bit of mucking about to get it installed, but it seems to work for me. Plus give me the command line any day over an IDE! 🙂



  • Hi simbo,

    I run into similar problems. I was not able to flash one of my sensebenders once. I use an FTDI with 3,3v power supply.
    I do get the serial debug output from the sensebender when running, but I am not able to flash any new sketch.

    In the board configuration I use the sensebender 8Mhz. I ordered from itead.

    What board do you use in platform.io to flash?

    I do not have an ISP. Do I need it to flash the sketch?

    Thanks.


  • Admin

    @Jochen-Scheib

    please note that you have to set the baudrate to 57k6.

    Normal arduinos are using 112k, but since we are running at 8Mhz, and with internal RC oscillator, we decided to keep it safe, and use a lower baudrate.

    In arduino, you can choose SenseBender Micro as target board (given that you have installed the board support packages from mysensors, in your arduino environment as describet here)



  • Thanks for the quick response.

    Thats what I am using. Settings in Arduino IDE are:

    board: Sensebender Micro
    processor: Atmega328 8Mhz

    Edit: I tried another FTDI, same result 😞 Both are 3.3v btw

    Edit2: I was able to flash the sensebender with an ISP. Flashing via FTDI still not working.


 

418
Online

7.9k
Users

8.8k
Topics

93.8k
Posts